@oomol-lab/open-flow 0.1.0-beta.73 → 0.1.0-beta.75
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/LICENSE +36 -0
- package/NOTICE +7 -0
- package/README.md +41 -0
- package/dist/browser/{ContentIcon-CUQHjQIw.js → ContentIcon-FCpKiwjp.js} +2 -1
- package/dist/browser/{FlowCanvas-Dtf8_cQp.js → FlowCanvas-dzRBnlUT.js} +1 -1
- package/dist/browser/{createResourceDialog-BWJkjiOO.js → createResourceDialog-BeYDdUl-.js} +2 -2
- package/dist/browser/{dialog-CUy_fwx9.js → dialog-ZtpsFbl4.js} +337 -31
- package/dist/browser/{exportSvg-BOoy7-Db.js → exportSvg-DqXw1yf-.js} +2 -2
- package/dist/browser/{flowChanges-CgSnSqqP.js → flowChanges-b_5UobFj.js} +586 -87
- package/dist/browser/{flowWorkspace-Bf7H-r0t.js → flowWorkspace-ItojZbO4.js} +21162 -20242
- package/dist/browser/preview.css +254 -179
- package/dist/browser/preview.js +22201 -20625
- package/dist/browser/{typeScriptSession-B0hC-C8y.js → typeScriptSession-CSRwWmZm.js} +1 -1
- package/dist/browser/ui.css +72 -2
- package/dist/browser/workbench.css +254 -179
- package/dist/browser/workbench.js +22 -78
- package/dist/browser/{workbenchSelect-C3e4J93X.js → workbenchSelect-M441Lz0d.js} +1 -1
- package/dist/command/index.js +42 -42
- package/dist/common/authoring.d.ts +5 -5
- package/dist/common/authoringExamples.d.ts +3 -2
- package/dist/common/authoringFields.d.ts +1 -1
- package/dist/common/authoringSchema.d.ts +95 -8
- package/dist/common/connector-proxy.d.ts +1 -1
- package/dist/common/control-api-conformance.d.ts +1 -1
- package/dist/common/control-api-conformance.js +119 -31
- package/dist/common/control-api.d.ts +4 -3
- package/dist/common/control-api.js +117 -29
- package/dist/common/control-requests.d.ts +5 -4
- package/dist/common/control-requests.js +437 -103
- package/dist/common/cron-trigger.d.ts +1 -1
- package/dist/common/decision.d.ts +1 -1
- package/dist/common/draftOperations.d.ts +1 -1
- package/dist/common/engine-contract.d.ts +4 -2
- package/dist/common/event-source-definition.d.ts +1 -1
- package/dist/common/flow-agent.d.ts +1 -1
- package/dist/{browser → common}/flow-authoring-node.d.ts +3 -3
- package/dist/{browser → common}/flow-authoring.js +131 -30
- package/dist/{browser → common}/flow-change-schema.d.ts +177 -6
- package/dist/{browser → common}/flow-change.d.ts +35 -15
- package/dist/{browser → common}/flow-change.js +133 -32
- package/dist/common/flow-connectionUsage.d.ts +1 -1
- package/dist/common/flow-encoding.d.ts +1 -1
- package/dist/common/flow-encoding.js +89 -23
- package/dist/common/flow-errorHandling.d.ts +1 -1
- package/dist/common/flow-graph.d.ts +3 -2
- package/dist/common/flow-modules.d.ts +1 -1
- package/dist/common/flow-promptTemplate.d.ts +1 -1
- package/dist/common/flow-retry.d.ts +2 -2
- package/dist/common/flow-semantics.d.ts +1 -1
- package/dist/common/flow-semantics.js +966 -614
- package/dist/common/flow-workflowFile.d.ts +1 -1
- package/dist/common/flowInspection.d.ts +3 -3
- package/dist/common/http-request.d.ts +156 -0
- package/dist/common/http-request.js +5254 -0
- package/dist/common/integration-trigger.d.ts +1 -1
- package/dist/common/licenses.md +118 -1
- package/dist/common/liveDetails.d.ts +1 -1
- package/dist/common/mcp.d.ts +5 -4
- package/dist/common/mcp.js +117 -29
- package/dist/common/openapi.d.ts +1 -1
- package/dist/common/poll-trigger.d.ts +1 -1
- package/dist/common/run-events.js +11 -9
- package/dist/common/run-results.d.ts +8 -1
- package/dist/common/runtime-contract.d.ts +8 -2
- package/dist/common/runtime-contract.js +25 -5
- package/dist/common/scheduler-checkpoint.d.ts +1 -1
- package/dist/common/scheduler-dependencies.d.ts +1 -1
- package/dist/common/scheduler-node-execution.d.ts +1 -1
- package/dist/common/scheduler.d.ts +3 -3
- package/dist/common/scheduler.js +101 -33
- package/dist/common/trigger-catalog.d.ts +1 -1
- package/dist/common/trigger-config-options.d.ts +1 -1
- package/dist/common/trigger-config.d.ts +1 -1
- package/dist/common/trigger-contract.d.ts +2 -2
- package/dist/common/trigger-localization.d.ts +1 -1
- package/dist/common/webhook-response.d.ts +1 -3
- package/dist/common/webhook-trigger.d.ts +1 -1
- package/dist/common/webhook-trigger.js +12 -11
- package/dist/common/workflow.d.ts +17 -1
- package/dist/common/workflow.js +68 -22
- package/dist/index.d.ts +6 -3
- package/package.json +11 -6
- package/skills/open-flow/references/flow-authoring.md +1 -0
- package/skills/open-flow/references/flow-n8n-conversion.md +19 -15
- package/src/base/common/json.ts +90 -0
- package/src/canvas/common/commands.ts +15 -0
- package/src/connector/common/actionSchema.ts +168 -0
- package/src/connector/common/proxy.ts +44 -0
- package/src/control/common/api.ts +1506 -0
- package/src/control/common/authoring.ts +923 -0
- package/src/control/common/authoringCondition.ts +110 -0
- package/src/control/common/authoringDiagnosticFields.ts +136 -0
- package/src/control/common/authoringExamples.ts +200 -0
- package/src/control/common/authoringFields.ts +53 -0
- package/src/control/common/authoringLlm.ts +70 -0
- package/src/control/common/authoringOpenApi.ts +129 -0
- package/src/control/common/authoringSchema.ts +410 -0
- package/src/control/common/authoringTools.ts +123 -0
- package/src/control/common/authoringTriggers.ts +26 -0
- package/src/control/common/checkDecoders.ts +65 -0
- package/src/control/common/conformance.ts +1989 -0
- package/src/control/common/connectorDecoders.ts +370 -0
- package/src/control/common/connectorQueries.ts +61 -0
- package/src/control/common/decoding.ts +60 -0
- package/src/control/common/draftOperations.ts +61 -0
- package/src/control/common/errors.ts +114 -0
- package/src/control/common/eventSourceSchemas.ts +13 -0
- package/src/control/common/eventSources.ts +186 -0
- package/src/control/common/flowDecoders.ts +153 -0
- package/src/control/common/flowInspection.ts +181 -0
- package/src/control/common/flowNotifications.ts +37 -0
- package/src/control/common/liveDetails.ts +124 -0
- package/src/control/common/mcp.ts +241 -0
- package/src/control/common/mcpConformance.ts +142 -0
- package/src/control/common/providerAccess.ts +28 -0
- package/src/control/common/providerIconSprite.ts +42 -0
- package/src/control/common/publicationDecoders.ts +98 -0
- package/src/control/common/random.ts +16 -0
- package/src/control/common/requests.ts +112 -0
- package/src/control/common/resultQuery.ts +8 -0
- package/src/control/common/results.ts +176 -0
- package/src/control/common/revisionDecoders.ts +52 -0
- package/src/control/common/runDecoders.ts +240 -0
- package/src/control/common/triggerCatalog.ts +89 -0
- package/src/control/common/triggerDecoders.ts +175 -0
- package/src/decision/common/decision.ts +168 -0
- package/src/event-source/common/catalog.generated.json +65 -0
- package/src/event-source/common/definition.ts +66 -0
- package/src/event-source/common/index.ts +99 -0
- package/src/execution/common/checkpoint.ts +311 -0
- package/src/execution/common/dependencies.ts +440 -0
- package/src/execution/common/engineContract.ts +84 -0
- package/src/execution/common/events.ts +331 -0
- package/src/execution/common/node-execution.ts +469 -0
- package/src/execution/common/runLifecycle.ts +250 -0
- package/src/execution/common/runtime.ts +563 -0
- package/src/execution/common/scheduler.ts +697 -0
- package/src/execution/common/wait.ts +36 -0
- package/src/flow/common/agent.ts +305 -0
- package/src/flow/common/authoring.ts +30 -0
- package/src/flow/common/change.ts +1037 -0
- package/src/flow/common/changeSchema.ts +792 -0
- package/src/flow/common/codePermissions.ts +2 -0
- package/src/flow/common/condition.ts +265 -0
- package/src/flow/common/connectionUsage.ts +131 -0
- package/src/flow/common/edgeChanges.ts +35 -0
- package/src/flow/common/encoding.ts +437 -0
- package/src/flow/common/errorHandling.ts +34 -0
- package/src/flow/common/graph.ts +898 -0
- package/src/flow/common/inputValue.ts +16 -0
- package/src/flow/common/json.ts +8 -0
- package/src/flow/common/moduleChanges.ts +31 -0
- package/src/flow/common/modules.ts +292 -0
- package/src/flow/common/nodeChanges.ts +762 -0
- package/src/flow/common/portChanges.ts +36 -0
- package/src/flow/common/promptTemplate.ts +15 -0
- package/src/flow/common/retry.ts +20 -0
- package/src/flow/common/schema.ts +162 -0
- package/src/flow/common/schemaCompare.ts +176 -0
- package/src/flow/common/schemaComparer.ts +178 -0
- package/src/flow/common/schemaKeywords.ts +53 -0
- package/src/flow/common/semantics.ts +531 -0
- package/src/flow/common/sourceField.ts +35 -0
- package/src/flow/common/triggerScheduleSchema.ts +8 -0
- package/src/flow/common/wait.ts +30 -0
- package/src/flow/common/webhookMethod.ts +7 -0
- package/src/flow/common/webhookResponse.ts +71 -0
- package/src/flow/common/workflowFile.ts +97 -0
- package/src/http/common/authBindings.ts +12 -0
- package/src/http/common/headers.ts +5 -0
- package/src/http/common/httpRequest.ts +251 -0
- package/src/json-schema-subset/checker/array.ts +142 -0
- package/src/json-schema-subset/checker/cache.ts +57 -0
- package/src/json-schema-subset/checker/checker.ts +230 -0
- package/src/json-schema-subset/checker/enumAndConst.ts +113 -0
- package/src/json-schema-subset/checker/equals.ts +93 -0
- package/src/json-schema-subset/checker/numeric/checker.ts +50 -0
- package/src/json-schema-subset/checker/numeric/float.ts +121 -0
- package/src/json-schema-subset/checker/numeric/index.ts +1 -0
- package/src/json-schema-subset/checker/numeric/integer.ts +119 -0
- package/src/json-schema-subset/checker/numeric/integerNormalizer.ts +72 -0
- package/src/json-schema-subset/checker/object.ts +354 -0
- package/src/json-schema-subset/checker/range.ts +91 -0
- package/src/json-schema-subset/checker/string.ts +60 -0
- package/src/json-schema-subset/checker/tools/index.ts +3 -0
- package/src/json-schema-subset/checker/tools/mark.ts +82 -0
- package/src/json-schema-subset/checker/tools/quantum.ts +106 -0
- package/src/json-schema-subset/checker/tools/range.ts +210 -0
- package/src/json-schema-subset/checker/validator.ts +23 -0
- package/src/json-schema-subset/compiler/array.ts +163 -0
- package/src/json-schema-subset/compiler/combination.ts +109 -0
- package/src/json-schema-subset/compiler/common.ts +99 -0
- package/src/json-schema-subset/compiler/compiler.ts +188 -0
- package/src/json-schema-subset/compiler/enumAndConst.ts +75 -0
- package/src/json-schema-subset/compiler/index.ts +11 -0
- package/src/json-schema-subset/compiler/object.ts +411 -0
- package/src/json-schema-subset/compiler/primitive.ts +144 -0
- package/src/json-schema-subset/compiler/utils.ts +24 -0
- package/src/json-schema-subset/compiler/wrapper.ts +192 -0
- package/src/json-schema-subset/error.ts +55 -0
- package/src/json-schema-subset/expression/calculator.ts +442 -0
- package/src/json-schema-subset/expression/combination.ts +49 -0
- package/src/json-schema-subset/expression/expression.ts +191 -0
- package/src/json-schema-subset/expression/index.ts +25 -0
- package/src/json-schema-subset/expression/result.ts +88 -0
- package/src/json-schema-subset/expression/types.ts +36 -0
- package/src/json-schema-subset/extends/extendsContext.ts +89 -0
- package/src/json-schema-subset/extends/index.ts +2 -0
- package/src/json-schema-subset/extends/types.ts +12 -0
- package/src/json-schema-subset/global.ts +60 -0
- package/src/json-schema-subset/index.ts +8 -0
- package/src/json-schema-subset/preprocessing.ts +74 -0
- package/src/json-schema-subset/types.ts +8 -0
- package/src/json-schema-subset/utils.ts +95 -0
- package/src/localization/common/languages.ts +118 -0
- package/src/localization/common/timeZone.ts +25 -0
- package/src/openapi/common/openapi.ts +459 -0
- package/src/trigger/common/config.ts +56 -0
- package/src/trigger/common/configOptions.ts +15 -0
- package/src/trigger/common/configSchema.ts +8 -0
- package/src/trigger/common/contract.ts +132 -0
- package/src/trigger/common/cron.ts +151 -0
- package/src/trigger/common/integration.ts +498 -0
- package/src/trigger/common/poll.ts +187 -0
- package/src/trigger/common/webhook.ts +413 -0
- package/src/trigger/providers/airtable/locales/fr.json +18 -0
- package/src/trigger/providers/airtable/locales/ja.json +18 -0
- package/src/trigger/providers/airtable/locales/ko.json +18 -0
- package/src/trigger/providers/airtable/locales/ru.json +18 -0
- package/src/trigger/providers/airtable/locales/zh-CN.json +18 -0
- package/src/trigger/providers/airtable/locales/zh-TW.json +18 -0
- package/src/trigger/providers/asana/locales/fr.json +15 -0
- package/src/trigger/providers/asana/locales/ja.json +15 -0
- package/src/trigger/providers/asana/locales/ko.json +15 -0
- package/src/trigger/providers/asana/locales/ru.json +15 -0
- package/src/trigger/providers/asana/locales/zh-CN.json +15 -0
- package/src/trigger/providers/asana/locales/zh-TW.json +15 -0
- package/src/trigger/providers/calendly/locales/fr.json +16 -0
- package/src/trigger/providers/calendly/locales/ja.json +16 -0
- package/src/trigger/providers/calendly/locales/ko.json +16 -0
- package/src/trigger/providers/calendly/locales/ru.json +16 -0
- package/src/trigger/providers/calendly/locales/zh-CN.json +16 -0
- package/src/trigger/providers/calendly/locales/zh-TW.json +16 -0
- package/src/trigger/providers/catalog.generated.json +4996 -0
- package/src/trigger/providers/clickup/locales/fr.json +16 -0
- package/src/trigger/providers/clickup/locales/ja.json +16 -0
- package/src/trigger/providers/clickup/locales/ko.json +16 -0
- package/src/trigger/providers/clickup/locales/ru.json +16 -0
- package/src/trigger/providers/clickup/locales/zh-CN.json +16 -0
- package/src/trigger/providers/clickup/locales/zh-TW.json +16 -0
- package/src/trigger/providers/definitions.ts +19 -0
- package/src/trigger/providers/feishu/locales/fr.json +20 -0
- package/src/trigger/providers/feishu/locales/ja.json +20 -0
- package/src/trigger/providers/feishu/locales/ko.json +20 -0
- package/src/trigger/providers/feishu/locales/ru.json +20 -0
- package/src/trigger/providers/feishu/locales/zh-CN.json +20 -0
- package/src/trigger/providers/feishu/locales/zh-TW.json +20 -0
- package/src/trigger/providers/fieldDescriptions.ts +392 -0
- package/src/trigger/providers/fieldLabels.ts +256 -0
- package/src/trigger/providers/fireflies/locales/fr.json +17 -0
- package/src/trigger/providers/fireflies/locales/ja.json +17 -0
- package/src/trigger/providers/fireflies/locales/ko.json +17 -0
- package/src/trigger/providers/fireflies/locales/ru.json +17 -0
- package/src/trigger/providers/fireflies/locales/zh-CN.json +17 -0
- package/src/trigger/providers/fireflies/locales/zh-TW.json +17 -0
- package/src/trigger/providers/github/locales/fr.json +30 -0
- package/src/trigger/providers/github/locales/ja.json +30 -0
- package/src/trigger/providers/github/locales/ko.json +30 -0
- package/src/trigger/providers/github/locales/ru.json +30 -0
- package/src/trigger/providers/github/locales/zh-CN.json +30 -0
- package/src/trigger/providers/github/locales/zh-TW.json +30 -0
- package/src/trigger/providers/gitlab/locales/fr.json +18 -0
- package/src/trigger/providers/gitlab/locales/ja.json +18 -0
- package/src/trigger/providers/gitlab/locales/ko.json +18 -0
- package/src/trigger/providers/gitlab/locales/ru.json +18 -0
- package/src/trigger/providers/gitlab/locales/zh-CN.json +18 -0
- package/src/trigger/providers/gitlab/locales/zh-TW.json +18 -0
- package/src/trigger/providers/gmail/locales/fr.json +18 -0
- package/src/trigger/providers/gmail/locales/ja.json +18 -0
- package/src/trigger/providers/gmail/locales/ko.json +18 -0
- package/src/trigger/providers/gmail/locales/ru.json +18 -0
- package/src/trigger/providers/gmail/locales/zh-CN.json +18 -0
- package/src/trigger/providers/gmail/locales/zh-TW.json +18 -0
- package/src/trigger/providers/google-calendar/locales/fr.json +15 -0
- package/src/trigger/providers/google-calendar/locales/ja.json +15 -0
- package/src/trigger/providers/google-calendar/locales/ko.json +15 -0
- package/src/trigger/providers/google-calendar/locales/ru.json +15 -0
- package/src/trigger/providers/google-calendar/locales/zh-CN.json +15 -0
- package/src/trigger/providers/google-calendar/locales/zh-TW.json +15 -0
- package/src/trigger/providers/google-drive/locales/fr.json +48 -0
- package/src/trigger/providers/google-drive/locales/ja.json +48 -0
- package/src/trigger/providers/google-drive/locales/ko.json +48 -0
- package/src/trigger/providers/google-drive/locales/ru.json +48 -0
- package/src/trigger/providers/google-drive/locales/zh-CN.json +48 -0
- package/src/trigger/providers/google-drive/locales/zh-TW.json +48 -0
- package/src/trigger/providers/google-sheets/locales/fr.json +19 -0
- package/src/trigger/providers/google-sheets/locales/ja.json +19 -0
- package/src/trigger/providers/google-sheets/locales/ko.json +19 -0
- package/src/trigger/providers/google-sheets/locales/ru.json +19 -0
- package/src/trigger/providers/google-sheets/locales/zh-CN.json +19 -0
- package/src/trigger/providers/google-sheets/locales/zh-TW.json +19 -0
- package/src/trigger/providers/intercom/locales/fr.json +17 -0
- package/src/trigger/providers/intercom/locales/ja.json +17 -0
- package/src/trigger/providers/intercom/locales/ko.json +17 -0
- package/src/trigger/providers/intercom/locales/ru.json +17 -0
- package/src/trigger/providers/intercom/locales/zh-CN.json +17 -0
- package/src/trigger/providers/intercom/locales/zh-TW.json +17 -0
- package/src/trigger/providers/jira/locales/fr.json +17 -0
- package/src/trigger/providers/jira/locales/ja.json +17 -0
- package/src/trigger/providers/jira/locales/ko.json +17 -0
- package/src/trigger/providers/jira/locales/ru.json +17 -0
- package/src/trigger/providers/jira/locales/zh-CN.json +17 -0
- package/src/trigger/providers/jira/locales/zh-TW.json +17 -0
- package/src/trigger/providers/linear/locales/fr.json +13 -0
- package/src/trigger/providers/linear/locales/ja.json +13 -0
- package/src/trigger/providers/linear/locales/ko.json +13 -0
- package/src/trigger/providers/linear/locales/ru.json +13 -0
- package/src/trigger/providers/linear/locales/zh-CN.json +13 -0
- package/src/trigger/providers/linear/locales/zh-TW.json +13 -0
- package/src/trigger/providers/locales/fr.ts +71 -0
- package/src/trigger/providers/locales/ja.ts +71 -0
- package/src/trigger/providers/locales/ko.ts +71 -0
- package/src/trigger/providers/locales/ru.ts +71 -0
- package/src/trigger/providers/locales/zh-CN.ts +71 -0
- package/src/trigger/providers/locales/zh-TW.ts +71 -0
- package/src/trigger/providers/localization.ts +59 -0
- package/src/trigger/providers/notion/locales/fr.json +16 -0
- package/src/trigger/providers/notion/locales/ja.json +16 -0
- package/src/trigger/providers/notion/locales/ko.json +16 -0
- package/src/trigger/providers/notion/locales/ru.json +16 -0
- package/src/trigger/providers/notion/locales/zh-CN.json +16 -0
- package/src/trigger/providers/notion/locales/zh-TW.json +16 -0
- package/src/trigger/providers/one-drive/locales/fr.json +16 -0
- package/src/trigger/providers/one-drive/locales/ja.json +16 -0
- package/src/trigger/providers/one-drive/locales/ko.json +16 -0
- package/src/trigger/providers/one-drive/locales/ru.json +16 -0
- package/src/trigger/providers/one-drive/locales/zh-CN.json +16 -0
- package/src/trigger/providers/one-drive/locales/zh-TW.json +16 -0
- package/src/trigger/providers/outlook/locales/fr.json +18 -0
- package/src/trigger/providers/outlook/locales/ja.json +18 -0
- package/src/trigger/providers/outlook/locales/ko.json +18 -0
- package/src/trigger/providers/outlook/locales/ru.json +18 -0
- package/src/trigger/providers/outlook/locales/zh-CN.json +18 -0
- package/src/trigger/providers/outlook/locales/zh-TW.json +18 -0
- package/src/trigger/providers/pandadoc/locales/fr.json +12 -0
- package/src/trigger/providers/pandadoc/locales/ja.json +12 -0
- package/src/trigger/providers/pandadoc/locales/ko.json +12 -0
- package/src/trigger/providers/pandadoc/locales/ru.json +12 -0
- package/src/trigger/providers/pandadoc/locales/zh-CN.json +12 -0
- package/src/trigger/providers/pandadoc/locales/zh-TW.json +12 -0
- package/src/trigger/providers/pipedrive/locales/fr.json +15 -0
- package/src/trigger/providers/pipedrive/locales/ja.json +15 -0
- package/src/trigger/providers/pipedrive/locales/ko.json +15 -0
- package/src/trigger/providers/pipedrive/locales/ru.json +15 -0
- package/src/trigger/providers/pipedrive/locales/zh-CN.json +15 -0
- package/src/trigger/providers/pipedrive/locales/zh-TW.json +15 -0
- package/src/trigger/providers/remote.ts +163 -0
- package/src/trigger/providers/resend/locales/fr.json +16 -0
- package/src/trigger/providers/resend/locales/ja.json +16 -0
- package/src/trigger/providers/resend/locales/ko.json +16 -0
- package/src/trigger/providers/resend/locales/ru.json +16 -0
- package/src/trigger/providers/resend/locales/zh-CN.json +16 -0
- package/src/trigger/providers/resend/locales/zh-TW.json +16 -0
- package/src/trigger/providers/sentry/locales/fr.json +19 -0
- package/src/trigger/providers/sentry/locales/ja.json +19 -0
- package/src/trigger/providers/sentry/locales/ko.json +19 -0
- package/src/trigger/providers/sentry/locales/ru.json +19 -0
- package/src/trigger/providers/sentry/locales/zh-CN.json +19 -0
- package/src/trigger/providers/sentry/locales/zh-TW.json +19 -0
- package/src/trigger/providers/shopify/locales/fr.json +18 -0
- package/src/trigger/providers/shopify/locales/ja.json +18 -0
- package/src/trigger/providers/shopify/locales/ko.json +18 -0
- package/src/trigger/providers/shopify/locales/ru.json +18 -0
- package/src/trigger/providers/shopify/locales/zh-CN.json +18 -0
- package/src/trigger/providers/shopify/locales/zh-TW.json +18 -0
- package/src/trigger/providers/slack/locales/fr.json +18 -0
- package/src/trigger/providers/slack/locales/ja.json +18 -0
- package/src/trigger/providers/slack/locales/ko.json +18 -0
- package/src/trigger/providers/slack/locales/ru.json +18 -0
- package/src/trigger/providers/slack/locales/zh-CN.json +18 -0
- package/src/trigger/providers/slack/locales/zh-TW.json +18 -0
- package/src/trigger/providers/slackbot/locales/fr.json +23 -0
- package/src/trigger/providers/slackbot/locales/ja.json +23 -0
- package/src/trigger/providers/slackbot/locales/ko.json +23 -0
- package/src/trigger/providers/slackbot/locales/ru.json +23 -0
- package/src/trigger/providers/slackbot/locales/zh-CN.json +23 -0
- package/src/trigger/providers/slackbot/locales/zh-TW.json +23 -0
- package/src/trigger/providers/source-events.ts +25 -0
- package/src/trigger/providers/stripe/locales/fr.json +17 -0
- package/src/trigger/providers/stripe/locales/ja.json +17 -0
- package/src/trigger/providers/stripe/locales/ko.json +17 -0
- package/src/trigger/providers/stripe/locales/ru.json +17 -0
- package/src/trigger/providers/stripe/locales/zh-CN.json +17 -0
- package/src/trigger/providers/stripe/locales/zh-TW.json +17 -0
- package/src/trigger/providers/tally/locales/fr.json +12 -0
- package/src/trigger/providers/tally/locales/ja.json +12 -0
- package/src/trigger/providers/tally/locales/ko.json +12 -0
- package/src/trigger/providers/tally/locales/ru.json +12 -0
- package/src/trigger/providers/tally/locales/zh-CN.json +12 -0
- package/src/trigger/providers/tally/locales/zh-TW.json +12 -0
- package/src/trigger/providers/telegram/locales/fr.json +17 -0
- package/src/trigger/providers/telegram/locales/ja.json +17 -0
- package/src/trigger/providers/telegram/locales/ko.json +17 -0
- package/src/trigger/providers/telegram/locales/ru.json +17 -0
- package/src/trigger/providers/telegram/locales/zh-CN.json +17 -0
- package/src/trigger/providers/telegram/locales/zh-TW.json +17 -0
- package/src/trigger/providers/typeform/locales/fr.json +12 -0
- package/src/trigger/providers/typeform/locales/ja.json +12 -0
- package/src/trigger/providers/typeform/locales/ko.json +12 -0
- package/src/trigger/providers/typeform/locales/ru.json +12 -0
- package/src/trigger/providers/typeform/locales/zh-CN.json +12 -0
- package/src/trigger/providers/typeform/locales/zh-TW.json +12 -0
- package/src/trigger/providers/vercel/locales/fr.json +18 -0
- package/src/trigger/providers/vercel/locales/ja.json +18 -0
- package/src/trigger/providers/vercel/locales/ko.json +18 -0
- package/src/trigger/providers/vercel/locales/ru.json +18 -0
- package/src/trigger/providers/vercel/locales/zh-CN.json +18 -0
- package/src/trigger/providers/vercel/locales/zh-TW.json +18 -0
- package/src/trigger/providers/woocommerce/locales/fr.json +19 -0
- package/src/trigger/providers/woocommerce/locales/ja.json +19 -0
- package/src/trigger/providers/woocommerce/locales/ko.json +19 -0
- package/src/trigger/providers/woocommerce/locales/ru.json +19 -0
- package/src/trigger/providers/woocommerce/locales/zh-CN.json +19 -0
- package/src/trigger/providers/woocommerce/locales/zh-TW.json +19 -0
- package/src/trigger/providers/zendesk/locales/fr.json +15 -0
- package/src/trigger/providers/zendesk/locales/ja.json +15 -0
- package/src/trigger/providers/zendesk/locales/ko.json +15 -0
- package/src/trigger/providers/zendesk/locales/ru.json +15 -0
- package/src/trigger/providers/zendesk/locales/zh-CN.json +15 -0
- package/src/trigger/providers/zendesk/locales/zh-TW.json +15 -0
- package/src/trigger/providers/zoom/locales/fr.json +17 -0
- package/src/trigger/providers/zoom/locales/ja.json +17 -0
- package/src/trigger/providers/zoom/locales/ko.json +17 -0
- package/src/trigger/providers/zoom/locales/ru.json +17 -0
- package/src/trigger/providers/zoom/locales/zh-CN.json +17 -0
- package/src/trigger/providers/zoom/locales/zh-TW.json +17 -0
- package/src/types/index.ts +112 -0
- package/src/workflow/common/workflow.ts +273 -0
- package/dist/browser/lib-DrKav3HG.js +0 -11403
- /package/dist/{browser → common}/flow-authoring-edge.d.ts +0 -0
- /package/dist/{browser → common}/flow-authoring-module.d.ts +0 -0
- /package/dist/{browser → common}/flow-authoring.d.ts +0 -0
- /package/dist/{browser → common}/flow-input-value.d.ts +0 -0
- /package/dist/{browser → common}/webhook-method.d.ts +0 -0
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
export type VariableBundle<K extends string> = {
|
|
2
|
+
[P in K]: boolean
|
|
3
|
+
} & {
|
|
4
|
+
toInt32(): number
|
|
5
|
+
toString(): string
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export class VariableBundleDescription<K extends string> {
|
|
9
|
+
public readonly keys: readonly K[]
|
|
10
|
+
private readonly clazz: { new (int32: number): VariableBundleImpls<K> }
|
|
11
|
+
|
|
12
|
+
public constructor(_keys: readonly K[]) {
|
|
13
|
+
const keys = Object.freeze(_keys.toSorted())
|
|
14
|
+
if (keys.length > 32) {
|
|
15
|
+
throw new Error(`cannot define ${keys.length} keys which is greater than 32`)
|
|
16
|
+
}
|
|
17
|
+
this.keys = keys
|
|
18
|
+
this.clazz = class extends VariableBundleImpls<K> {
|
|
19
|
+
public constructor(int32: number) {
|
|
20
|
+
super(keys, int32)
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
for (const [i, key] of this.keys.entries()) {
|
|
24
|
+
const mask = 1 << i
|
|
25
|
+
|
|
26
|
+
Object.defineProperty(this.clazz.prototype, key, {
|
|
27
|
+
enumerable: true,
|
|
28
|
+
get: function get(this: VariableBundleImpls<K>): boolean {
|
|
29
|
+
return !!(this.int32 & mask)
|
|
30
|
+
},
|
|
31
|
+
set: function set(this: VariableBundleImpls<K>, value: boolean): void {
|
|
32
|
+
if (value) {
|
|
33
|
+
this.int32 |= mask
|
|
34
|
+
} else {
|
|
35
|
+
this.int32 &= ~mask
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
})
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
public toBundle(): VariableBundle<K>
|
|
43
|
+
public toBundle(int32: number): VariableBundle<K>
|
|
44
|
+
public toBundle(variable: Partial<Record<K, boolean>>): VariableBundle<K>
|
|
45
|
+
|
|
46
|
+
public toBundle(variable?: number | Partial<Record<K, boolean>>): VariableBundle<K> {
|
|
47
|
+
let int32 = 0
|
|
48
|
+
|
|
49
|
+
if (typeof variable === 'number') {
|
|
50
|
+
int32 = variable
|
|
51
|
+
} else if (variable) {
|
|
52
|
+
for (const [i, key] of this.keys.entries()) {
|
|
53
|
+
if (variable[key]) {
|
|
54
|
+
int32 |= 1 << i
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return new this.clazz(int32) as VariableBundle<K>
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
class VariableBundleImpls<K extends string> {
|
|
63
|
+
private readonly keys: readonly K[]
|
|
64
|
+
protected int32: number
|
|
65
|
+
|
|
66
|
+
public constructor(keys: readonly K[], int32: number) {
|
|
67
|
+
this.keys = keys
|
|
68
|
+
this.int32 = int32
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
public toInt32(): number {
|
|
72
|
+
return this.int32
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
public toString(): string {
|
|
76
|
+
const object: Record<string, boolean> = {}
|
|
77
|
+
for (const key of this.keys) {
|
|
78
|
+
object[key] = (this as unknown as Record<string, boolean>)[key]
|
|
79
|
+
}
|
|
80
|
+
return JSON.stringify(object)
|
|
81
|
+
}
|
|
82
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import type { ExpressionResult, ExpressionSingleResult } from '../../expression/index.ts'
|
|
2
|
+
import type { VariableBundle } from './mark.ts'
|
|
3
|
+
|
|
4
|
+
import { ExpressionMaskList } from '../../expression/index.ts'
|
|
5
|
+
import { VariableBundleDescription } from './mark.ts'
|
|
6
|
+
|
|
7
|
+
export interface Quantum<K extends string> {
|
|
8
|
+
readonly keys: readonly K[]
|
|
9
|
+
variable(variable?: Partial<Record<K, boolean>>): QuantumVariable<K>
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
13
|
+
export type QuantumVariableType<Q extends Quantum<any>> = VariableBundle<Q['keys'][0]>
|
|
14
|
+
|
|
15
|
+
export interface QuantumVariable<K extends string> extends Iterable<VariableBundle<K>> {
|
|
16
|
+
assign(other: QuantumVariable<K>): this
|
|
17
|
+
push(expression: ExpressionResult, calculate: QuantumCalculator<K>): void
|
|
18
|
+
update(invoker: (variable: VariableBundle<K>) => void): void
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export type QuantumCalculator<K extends string> = (singleExpression: ExpressionSingleResult, variable: VariableBundle<K>) => void
|
|
22
|
+
|
|
23
|
+
export function makeQuantum<K extends string>(keys: readonly K[]): Quantum<K> {
|
|
24
|
+
return new QuantumImpls(keys)
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
class QuantumImpls<K extends string> {
|
|
28
|
+
private readonly description: VariableBundleDescription<K>
|
|
29
|
+
|
|
30
|
+
public constructor(keys: readonly K[]) {
|
|
31
|
+
this.description = new VariableBundleDescription(keys)
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
public get keys(): readonly K[] {
|
|
35
|
+
return this.description.keys
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
public variable(variable?: Partial<Record<K, boolean>>): QuantumVariable<K> {
|
|
39
|
+
let int32: number | undefined
|
|
40
|
+
if (variable) {
|
|
41
|
+
int32 = this.description.toBundle(variable).toInt32()
|
|
42
|
+
}
|
|
43
|
+
return new QuantumVariableImpls(this.description, int32)
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
class QuantumVariableImpls<K extends string> implements QuantumVariable<K> {
|
|
48
|
+
private readonly description: VariableBundleDescription<K>
|
|
49
|
+
private values: Set<number> = new Set()
|
|
50
|
+
|
|
51
|
+
public constructor(description: VariableBundleDescription<K>, int32?: number) {
|
|
52
|
+
this.description = description
|
|
53
|
+
if (int32 !== undefined) {
|
|
54
|
+
this.values.add(int32)
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
public [Symbol.iterator](): Iterator<VariableBundle<K>> {
|
|
59
|
+
const iterator = this.values[Symbol.iterator]()
|
|
60
|
+
return {
|
|
61
|
+
next: (): IteratorResult<VariableBundle<K>> => {
|
|
62
|
+
const result = iterator.next()
|
|
63
|
+
if (result.done) {
|
|
64
|
+
return result
|
|
65
|
+
} else {
|
|
66
|
+
return {
|
|
67
|
+
done: false,
|
|
68
|
+
value: this.description.toBundle(result.value),
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
public assign(other: QuantumVariable<K>): this {
|
|
76
|
+
const { values } = other as QuantumVariableImpls<K>
|
|
77
|
+
for (const int32 of values) {
|
|
78
|
+
this.values.add(int32)
|
|
79
|
+
}
|
|
80
|
+
return this
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
public push(expression: ExpressionResult, calculate: QuantumCalculator<K>): void {
|
|
84
|
+
const nextValues = new Set<number>()
|
|
85
|
+
for (const int32 of this.values) {
|
|
86
|
+
for (const [singleExpression, mask] of ExpressionMaskList) {
|
|
87
|
+
if (expression & mask) {
|
|
88
|
+
const variable = this.description.toBundle(int32)
|
|
89
|
+
calculate(singleExpression, variable)
|
|
90
|
+
nextValues.add(variable.toInt32())
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
this.values = nextValues
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
public update(invoker: (variable: VariableBundle<K>) => void): void {
|
|
98
|
+
const nextValues = new Set<number>()
|
|
99
|
+
for (const int32 of this.values) {
|
|
100
|
+
const variable = this.description.toBundle(int32)
|
|
101
|
+
invoker(variable)
|
|
102
|
+
nextValues.add(variable.toInt32())
|
|
103
|
+
}
|
|
104
|
+
this.values = nextValues
|
|
105
|
+
}
|
|
106
|
+
}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
export type Range = readonly [Point, Point]
|
|
2
|
+
export type Point = {
|
|
3
|
+
readonly num: number
|
|
4
|
+
readonly exclusive: boolean
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export type Splitter = {
|
|
8
|
+
readonly left?: SplitterSide
|
|
9
|
+
readonly right?: SplitterSide
|
|
10
|
+
readonly center?: Range
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export type SplitterSide = {
|
|
14
|
+
readonly fromLeft: boolean
|
|
15
|
+
readonly range: Range
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function splitRange(range1: Range, range2: Range): Splitter {
|
|
19
|
+
const [min1] = range1
|
|
20
|
+
const [min2] = range2
|
|
21
|
+
|
|
22
|
+
if (min1.num < min2.num) {
|
|
23
|
+
return splitRangeLessBranch(range1, range2)
|
|
24
|
+
} else if (min1.num > min2.num) {
|
|
25
|
+
return splitRangeGreaterBranch(range1, range2)
|
|
26
|
+
} else {
|
|
27
|
+
return splitRangeEqualsBranch(range1, range2)
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function splitRangeLessBranch(range1: Range, range2: Range): Splitter {
|
|
32
|
+
const [min1, max1] = range1
|
|
33
|
+
const [min2, max2] = range2
|
|
34
|
+
|
|
35
|
+
if (max1.num <= min2.num) {
|
|
36
|
+
const exclusive1 = max1.exclusive
|
|
37
|
+
const exclusive2 = min2.exclusive
|
|
38
|
+
if (max1.num < min2.num || exclusive1 || exclusive2) {
|
|
39
|
+
return {
|
|
40
|
+
left: { fromLeft: true, range: range1 },
|
|
41
|
+
right: { fromLeft: false, range: range2 },
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
if (max1.num <= max2.num) {
|
|
46
|
+
let hasRight = true
|
|
47
|
+
let isLeftRangeOverride = false
|
|
48
|
+
|
|
49
|
+
if (max1.num === max2.num) {
|
|
50
|
+
const exclusive1 = max1.exclusive
|
|
51
|
+
const exclusive2 = max2.exclusive
|
|
52
|
+
hasRight = exclusive1 !== exclusive2
|
|
53
|
+
isLeftRangeOverride = !exclusive1 && exclusive2
|
|
54
|
+
}
|
|
55
|
+
if (!isLeftRangeOverride) {
|
|
56
|
+
let right: SplitterSide | undefined
|
|
57
|
+
if (hasRight) {
|
|
58
|
+
right = {
|
|
59
|
+
fromLeft: false,
|
|
60
|
+
range: [reversalExclusive(max1), max2],
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return {
|
|
64
|
+
left: {
|
|
65
|
+
fromLeft: true,
|
|
66
|
+
range: [min1, reversalExclusive(min2)],
|
|
67
|
+
},
|
|
68
|
+
center: [min2, max1],
|
|
69
|
+
right,
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// if (max1.num > max2.num || (max1.num === max2.num && max1.exclusive === false && max2.exclusive === true))
|
|
74
|
+
{
|
|
75
|
+
return {
|
|
76
|
+
left: {
|
|
77
|
+
fromLeft: true,
|
|
78
|
+
range: [min1, reversalExclusive(min2)],
|
|
79
|
+
},
|
|
80
|
+
center: [min2, max2],
|
|
81
|
+
right: {
|
|
82
|
+
fromLeft: true,
|
|
83
|
+
range: [reversalExclusive(max2), max1],
|
|
84
|
+
},
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function splitRangeGreaterBranch(range1: Range, range2: Range): Splitter {
|
|
90
|
+
const [min1, max1] = range1
|
|
91
|
+
const [min2, max2] = range2
|
|
92
|
+
|
|
93
|
+
if (min1.num >= max2.num) {
|
|
94
|
+
const exclusive1 = max2.exclusive
|
|
95
|
+
const exclusive2 = min1.exclusive
|
|
96
|
+
if (min1.num > max2.num || exclusive1 || exclusive2) {
|
|
97
|
+
return {
|
|
98
|
+
left: { fromLeft: false, range: range2 },
|
|
99
|
+
right: { fromLeft: true, range: range1 },
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
if (max2.num <= max1.num) {
|
|
104
|
+
let hasRight = true
|
|
105
|
+
let isRightRangeOverride = false
|
|
106
|
+
|
|
107
|
+
if (max1.num === max2.num) {
|
|
108
|
+
const exclusive1 = max2.exclusive
|
|
109
|
+
const exclusive2 = max1.exclusive
|
|
110
|
+
hasRight = exclusive1 !== exclusive2
|
|
111
|
+
isRightRangeOverride = !exclusive1 && exclusive2
|
|
112
|
+
}
|
|
113
|
+
if (!isRightRangeOverride) {
|
|
114
|
+
let right: SplitterSide | undefined
|
|
115
|
+
if (hasRight) {
|
|
116
|
+
right = {
|
|
117
|
+
fromLeft: true,
|
|
118
|
+
range: [reversalExclusive(max2), max1],
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return {
|
|
122
|
+
left: {
|
|
123
|
+
fromLeft: false,
|
|
124
|
+
range: [min2, reversalExclusive(min1)],
|
|
125
|
+
},
|
|
126
|
+
center: [min1, max2],
|
|
127
|
+
right,
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
// if (max2.num > max1.num || (max2.num === max1.num && max2.exclusive === false && max1.exclusive === true))
|
|
132
|
+
{
|
|
133
|
+
return {
|
|
134
|
+
left: {
|
|
135
|
+
fromLeft: false,
|
|
136
|
+
range: [min2, reversalExclusive(min1)],
|
|
137
|
+
},
|
|
138
|
+
center: [min1, max1],
|
|
139
|
+
right: {
|
|
140
|
+
fromLeft: false,
|
|
141
|
+
range: [reversalExclusive(max1), max2],
|
|
142
|
+
},
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function splitRangeEqualsBranch(range1: Range, range2: Range): Splitter {
|
|
148
|
+
const [min1, max1] = range1
|
|
149
|
+
const [min2, max2] = range2
|
|
150
|
+
const exclusive1 = min1.exclusive
|
|
151
|
+
const exclusive2 = min2.exclusive
|
|
152
|
+
|
|
153
|
+
let left: SplitterSide | undefined
|
|
154
|
+
let centerBegin = min1
|
|
155
|
+
|
|
156
|
+
if (!exclusive1 && exclusive2) {
|
|
157
|
+
centerBegin = min2
|
|
158
|
+
left = {
|
|
159
|
+
fromLeft: true,
|
|
160
|
+
range: [min1, reversalExclusive(min2)],
|
|
161
|
+
}
|
|
162
|
+
} else if (exclusive1 && !exclusive2) {
|
|
163
|
+
left = {
|
|
164
|
+
fromLeft: false,
|
|
165
|
+
range: [min2, reversalExclusive(min1)],
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
if (max1.num <= max2.num) {
|
|
169
|
+
let hasRight = true
|
|
170
|
+
let isLeftRangeOverride = false
|
|
171
|
+
if (max1.num === max2.num) {
|
|
172
|
+
const maxExclusive1 = max1.exclusive
|
|
173
|
+
const maxExclusive2 = max2.exclusive
|
|
174
|
+
hasRight = maxExclusive1 !== maxExclusive2
|
|
175
|
+
isLeftRangeOverride = !maxExclusive1 && maxExclusive2
|
|
176
|
+
}
|
|
177
|
+
if (!isLeftRangeOverride) {
|
|
178
|
+
let right: SplitterSide | undefined
|
|
179
|
+
if (hasRight) {
|
|
180
|
+
right = {
|
|
181
|
+
fromLeft: false,
|
|
182
|
+
range: [reversalExclusive(max1), max2],
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return {
|
|
186
|
+
left,
|
|
187
|
+
center: [centerBegin, max1],
|
|
188
|
+
right,
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
// if (max1.num > max2.num || (max1.num === max2.num && max1.exclusive === false && max2.exclusive === true))
|
|
193
|
+
{
|
|
194
|
+
return {
|
|
195
|
+
left,
|
|
196
|
+
center: [centerBegin, max2],
|
|
197
|
+
right: {
|
|
198
|
+
fromLeft: true,
|
|
199
|
+
range: [reversalExclusive(max2), max1],
|
|
200
|
+
},
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
function reversalExclusive(point: Point): Point {
|
|
206
|
+
return {
|
|
207
|
+
num: point.num,
|
|
208
|
+
exclusive: !point.exclusive,
|
|
209
|
+
}
|
|
210
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { CompiledSchema } from '../compiler/index.ts'
|
|
2
|
+
|
|
3
|
+
export const ValidResult = Object.freeze({
|
|
4
|
+
Valid: 0,
|
|
5
|
+
Invalid: 1,
|
|
6
|
+
Unknown: 2,
|
|
7
|
+
})
|
|
8
|
+
|
|
9
|
+
export type ValidResult = (typeof ValidResult)[keyof typeof ValidResult]
|
|
10
|
+
|
|
11
|
+
export function valid<E>(compiledSchema: CompiledSchema<E>, value: unknown): ValidResult {
|
|
12
|
+
const isValid = compiledSchema.isValid
|
|
13
|
+
if (isValid) {
|
|
14
|
+
const result = isValid(value)
|
|
15
|
+
if (result === true) {
|
|
16
|
+
return ValidResult.Valid
|
|
17
|
+
} else {
|
|
18
|
+
return ValidResult.Invalid
|
|
19
|
+
}
|
|
20
|
+
} else {
|
|
21
|
+
return ValidResult.Unknown
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import type { JSONSchema7, JSONSchema7Definition } from 'json-schema'
|
|
2
|
+
import type { JSONDelegate } from '../types.ts'
|
|
3
|
+
import type { Schema } from '../types.ts'
|
|
4
|
+
import type { Context } from './common.ts'
|
|
5
|
+
import type { InputSchema } from './compiler.ts'
|
|
6
|
+
import type { CompiledSchema } from './wrapper.ts'
|
|
7
|
+
|
|
8
|
+
import { joinPath, recordWarn, unwrapJSONSchema7Definition } from './common.ts'
|
|
9
|
+
import { compileSchema } from './compiler.ts'
|
|
10
|
+
import { cleanEmptyValues } from './utils.ts'
|
|
11
|
+
import { wrapCompiledSchema, CompiledKind, getKind, toNever, isCompiledSchema } from './wrapper.ts'
|
|
12
|
+
|
|
13
|
+
export function compileArraySchema<E>(context: Context<E>, schema: InputSchema): CompiledSchema<E> | null {
|
|
14
|
+
let items = compileItems(context, schema)
|
|
15
|
+
let maxItems = getItemsLimit(context, 'maxItems', schema)
|
|
16
|
+
const minItems = getItemsLimit(context, 'minItems', schema)
|
|
17
|
+
const contains = compileContains(context, schema)
|
|
18
|
+
const uniqueItems = schema.uniqueItems
|
|
19
|
+
|
|
20
|
+
// Undefined means no value is required, while null represents a compilation error.
|
|
21
|
+
let additionalItems: Schema<E> | false | null | undefined
|
|
22
|
+
|
|
23
|
+
if (Array.isArray(items)) {
|
|
24
|
+
additionalItems = compileAdditionalItems(context, schema)
|
|
25
|
+
} else if (schema.additionalItems) {
|
|
26
|
+
// Additional items are ignored when items is not an array.
|
|
27
|
+
// See https://datatracker.ietf.org/doc/html/draft-handrews-json-schema-validation-01#section-6.4.2.
|
|
28
|
+
recordWarn(context, 'it is needless when items is not array', 'additionalItems')
|
|
29
|
+
}
|
|
30
|
+
if (!items || !contains || additionalItems === null) {
|
|
31
|
+
return null
|
|
32
|
+
}
|
|
33
|
+
let isNever = false
|
|
34
|
+
let updateMaxItems = false
|
|
35
|
+
|
|
36
|
+
if (Array.isArray(items)) {
|
|
37
|
+
if (maxItems !== undefined && maxItems <= items.length) {
|
|
38
|
+
items = items.splice(maxItems)
|
|
39
|
+
additionalItems = variableToNever(additionalItems, context.delegate)
|
|
40
|
+
}
|
|
41
|
+
const firstNeverItemIndex = items.findIndex((item) => getKind(item) === CompiledKind.Never)
|
|
42
|
+
|
|
43
|
+
if (firstNeverItemIndex !== -1) {
|
|
44
|
+
items = items.splice(firstNeverItemIndex)
|
|
45
|
+
additionalItems = variableToNever(additionalItems, context.delegate)
|
|
46
|
+
if (maxItems === undefined) {
|
|
47
|
+
maxItems = items.length
|
|
48
|
+
updateMaxItems = true
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
if (minItems !== undefined && items.length < minItems) {
|
|
52
|
+
recordWarn(context, `length(${items.length}) of items if less than minItems(${minItems})`)
|
|
53
|
+
isNever = true
|
|
54
|
+
}
|
|
55
|
+
if (items.length === 0 && additionalItems && getKind(additionalItems) === CompiledKind.Never) {
|
|
56
|
+
isNever = true
|
|
57
|
+
}
|
|
58
|
+
} else if (getKind(items) === CompiledKind.Never) {
|
|
59
|
+
isNever = true
|
|
60
|
+
}
|
|
61
|
+
if (maxItems !== undefined && minItems !== undefined && maxItems < minItems) {
|
|
62
|
+
if (!updateMaxItems) {
|
|
63
|
+
recordWarn(context, `maxItems(${maxItems}) is less than minItems(${minItems})`)
|
|
64
|
+
}
|
|
65
|
+
isNever = true
|
|
66
|
+
}
|
|
67
|
+
const kind = isNever ? CompiledKind.Never : CompiledKind.Array
|
|
68
|
+
const mergedSchema = cleanEmptyValues({
|
|
69
|
+
type: 'array',
|
|
70
|
+
items,
|
|
71
|
+
contains,
|
|
72
|
+
uniqueItems,
|
|
73
|
+
maxItems,
|
|
74
|
+
minItems,
|
|
75
|
+
additionalItems: additionalItems!,
|
|
76
|
+
})
|
|
77
|
+
return wrapCompiledSchema(kind, mergedSchema as JSONSchema7, context.delegate, context.path)
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function compileItems<E>(context: Context<E>, { items }: InputSchema): Schema<E> | Schema<E>[] | null {
|
|
81
|
+
if (!items) {
|
|
82
|
+
return wrapCompiledSchema(CompiledKind.Any, {}, context.delegate, context.path)
|
|
83
|
+
}
|
|
84
|
+
if (Array.isArray(items)) {
|
|
85
|
+
const schemas: Schema<E>[] = []
|
|
86
|
+
let hasAnyError = false
|
|
87
|
+
for (const [i, item] of items.entries()) {
|
|
88
|
+
const subContext = joinPath(context, 'items', i)
|
|
89
|
+
const schema = compileSchema(subContext, unwrapJSONSchema7Definition(item))
|
|
90
|
+
if (!schema) {
|
|
91
|
+
hasAnyError = true
|
|
92
|
+
continue
|
|
93
|
+
}
|
|
94
|
+
schemas.push(schema)
|
|
95
|
+
}
|
|
96
|
+
if (hasAnyError) {
|
|
97
|
+
return null
|
|
98
|
+
}
|
|
99
|
+
return schemas
|
|
100
|
+
} else {
|
|
101
|
+
const subContext = joinPath(context, 'items')
|
|
102
|
+
const itemsSchema = unwrapJSONSchema7Definition(items as JSONSchema7Definition)
|
|
103
|
+
const schema = compileSchema(subContext, itemsSchema)
|
|
104
|
+
|
|
105
|
+
return schema
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
function getItemsLimit<E>(context: Context<E>, name: 'maxItems' | 'minItems', schema: InputSchema): number | undefined {
|
|
110
|
+
const propertiesLimit = schema[name]
|
|
111
|
+
if (propertiesLimit === undefined) {
|
|
112
|
+
return undefined
|
|
113
|
+
}
|
|
114
|
+
if (Number.isNaN(propertiesLimit)) {
|
|
115
|
+
recordWarn(context, 'find NaN', name)
|
|
116
|
+
return undefined
|
|
117
|
+
}
|
|
118
|
+
if (propertiesLimit < 0) {
|
|
119
|
+
recordWarn(context, `find invalid number ${propertiesLimit}`, name)
|
|
120
|
+
return undefined
|
|
121
|
+
}
|
|
122
|
+
return propertiesLimit
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
function compileContains<E>(context: Context<E>, { contains }: InputSchema): Schema<E> | null {
|
|
126
|
+
if (!contains) {
|
|
127
|
+
return wrapCompiledSchema(CompiledKind.Any, {}, context.delegate, context.path)
|
|
128
|
+
}
|
|
129
|
+
const subContext = joinPath(context, 'contains')
|
|
130
|
+
const containsSchema = unwrapJSONSchema7Definition(contains)
|
|
131
|
+
|
|
132
|
+
return compileSchema(subContext, containsSchema)
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
function compileAdditionalItems<E>(context: Context<E>, { additionalItems }: InputSchema): Schema<E> | false | null {
|
|
136
|
+
switch (typeof additionalItems) {
|
|
137
|
+
case 'boolean': {
|
|
138
|
+
if (additionalItems) {
|
|
139
|
+
return wrapCompiledSchema(CompiledKind.Any, {}, context.delegate, context.path)
|
|
140
|
+
} else {
|
|
141
|
+
return false
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
case 'object': {
|
|
145
|
+
const subContext = joinPath(context, 'additionalItems')
|
|
146
|
+
const compiledSchema = compileSchema(subContext, additionalItems)
|
|
147
|
+
return compiledSchema
|
|
148
|
+
}
|
|
149
|
+
default: {
|
|
150
|
+
return wrapCompiledSchema(CompiledKind.Any, {}, context.delegate, context.path)
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
function variableToNever<T, E>(schema: Schema<E> | T | undefined, delegate?: JSONDelegate<E>): Schema<E> | T {
|
|
156
|
+
if (schema === undefined) {
|
|
157
|
+
return wrapCompiledSchema(CompiledKind.Never, { type: 'string', maxLength: 0, minLength: 1 }, delegate)
|
|
158
|
+
} else if (isCompiledSchema(schema)) {
|
|
159
|
+
return getKind(schema) === CompiledKind.Never ? schema : toNever(schema as CompiledSchema<E>)
|
|
160
|
+
} else {
|
|
161
|
+
return schema
|
|
162
|
+
}
|
|
163
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import type { JSONSchema7Definition } from 'json-schema'
|
|
2
|
+
import type { Schema } from '../types.ts'
|
|
3
|
+
import type { JSONDelegate } from '../types.ts'
|
|
4
|
+
import type { DeepReadonly } from '../utils.ts'
|
|
5
|
+
import type { Context } from './common.ts'
|
|
6
|
+
import type { CompiledSchema } from './wrapper.ts'
|
|
7
|
+
|
|
8
|
+
import { joinPath, unwrapJSONSchema7Definition, recordError } from './common.ts'
|
|
9
|
+
import { compileSchema } from './compiler.ts'
|
|
10
|
+
import { getKind, CompiledKind, wrapCompiledSchema } from './wrapper.ts'
|
|
11
|
+
|
|
12
|
+
export type CombinationKeys = 'allOf' | 'anyOf' | 'oneOf'
|
|
13
|
+
export const COMBINATION_KEYS: readonly CombinationKeys[] = Object.freeze(['allOf', 'anyOf', 'oneOf'])
|
|
14
|
+
|
|
15
|
+
export function compileCombinationSchema<E>(
|
|
16
|
+
context: Context<E>,
|
|
17
|
+
key: CombinationKeys,
|
|
18
|
+
combinationList: DeepReadonly<JSONSchema7Definition[]>,
|
|
19
|
+
delegate?: JSONDelegate<E>,
|
|
20
|
+
): CompiledSchema<E> | null {
|
|
21
|
+
if (combinationList.length === 0) {
|
|
22
|
+
recordError(context, 'disable empty list', key)
|
|
23
|
+
return null
|
|
24
|
+
}
|
|
25
|
+
const compiledCombinationList: Schema<E>[] = []
|
|
26
|
+
|
|
27
|
+
for (const [i, element] of combinationList.entries()) {
|
|
28
|
+
const subContext = joinPath(context, key, i)
|
|
29
|
+
const schema = unwrapJSONSchema7Definition(element)
|
|
30
|
+
const compiledSchema = compileSchema(subContext, schema)
|
|
31
|
+
if (compiledSchema) {
|
|
32
|
+
compiledCombinationList.push(compiledSchema)
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
if (compiledCombinationList.length < combinationList.length) {
|
|
36
|
+
return null
|
|
37
|
+
}
|
|
38
|
+
let anyCount = 0
|
|
39
|
+
let neverCount = 0
|
|
40
|
+
|
|
41
|
+
for (const compiledSchema of compiledCombinationList) {
|
|
42
|
+
switch (getKind(compiledSchema)) {
|
|
43
|
+
case CompiledKind.Any: {
|
|
44
|
+
anyCount += 1
|
|
45
|
+
break
|
|
46
|
+
}
|
|
47
|
+
case CompiledKind.Never: {
|
|
48
|
+
neverCount += 1
|
|
49
|
+
break
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
let kind: CompiledKind = CompiledKind.Combination
|
|
54
|
+
|
|
55
|
+
switch (key) {
|
|
56
|
+
case 'allOf': {
|
|
57
|
+
if (neverCount > 0) {
|
|
58
|
+
kind = CompiledKind.Never
|
|
59
|
+
} else if (anyCount === compiledCombinationList.length) {
|
|
60
|
+
kind = CompiledKind.Any
|
|
61
|
+
} else if (!areAllTypesTheSame(compiledCombinationList)) {
|
|
62
|
+
kind = CompiledKind.Never
|
|
63
|
+
}
|
|
64
|
+
break
|
|
65
|
+
}
|
|
66
|
+
case 'anyOf': {
|
|
67
|
+
if (anyCount > 0) {
|
|
68
|
+
kind = CompiledKind.Any
|
|
69
|
+
} else if (neverCount === compiledCombinationList.length) {
|
|
70
|
+
kind = CompiledKind.Never
|
|
71
|
+
}
|
|
72
|
+
break
|
|
73
|
+
}
|
|
74
|
+
case 'oneOf': {
|
|
75
|
+
if (anyCount > 1) {
|
|
76
|
+
// More than one unconstrained branch violates oneOf because at least two branches will match.
|
|
77
|
+
kind = CompiledKind.Never
|
|
78
|
+
} else if (neverCount === compiledCombinationList.length) {
|
|
79
|
+
kind = CompiledKind.Never
|
|
80
|
+
} else if (anyCount === 1 && neverCount === compiledCombinationList.length - 1) {
|
|
81
|
+
kind = CompiledKind.Any
|
|
82
|
+
}
|
|
83
|
+
break
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return wrapCompiledSchema(kind, { [key]: compiledCombinationList }, delegate, context.path)
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function areAllTypesTheSame<E>(combinationList: Schema<E>[]): boolean {
|
|
90
|
+
let lastKind: CompiledKind | null = null
|
|
91
|
+
for (const schema of combinationList) {
|
|
92
|
+
const kind = getKind(schema)
|
|
93
|
+
switch (kind) {
|
|
94
|
+
case CompiledKind.Any:
|
|
95
|
+
case CompiledKind.Never: {
|
|
96
|
+
break
|
|
97
|
+
}
|
|
98
|
+
default: {
|
|
99
|
+
if (lastKind === null) {
|
|
100
|
+
lastKind = kind
|
|
101
|
+
} else if (lastKind !== kind) {
|
|
102
|
+
return false
|
|
103
|
+
}
|
|
104
|
+
break
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return true
|
|
109
|
+
}
|