@teleporthq/teleport-plugin-next-workflows 0.43.74 → 0.44.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 (148) hide show
  1. package/__tests__/booking-calendar-feed-route.test.ts +494 -0
  2. package/__tests__/custom-node-result-taken-branch.test.ts +107 -0
  3. package/__tests__/data-api-date-parser.test.ts +45 -0
  4. package/__tests__/emit-custom-event-channel.test.ts +13 -0
  5. package/__tests__/invoice-billing-details.test.ts +278 -0
  6. package/__tests__/middleware-admin-panel-roles.test.ts +127 -0
  7. package/__tests__/page-arrival-remount.test.ts +247 -0
  8. package/__tests__/payment-driver-stripe.test.ts +23 -0
  9. package/__tests__/payment-drivers-module.test.ts +19 -0
  10. package/__tests__/payment-subscription-nodes.test.ts +8 -0
  11. package/__tests__/raw-query-error-code.test.ts +47 -0
  12. package/__tests__/runtime-template-token-resolution.test.ts +16 -0
  13. package/__tests__/segment-reply-changed-keys.test.ts +31 -0
  14. package/__tests__/segment-route-skipped-branch.test.ts +101 -0
  15. package/dist/cjs/api-route-generator.d.ts.map +1 -1
  16. package/dist/cjs/api-route-generator.js +23 -13
  17. package/dist/cjs/api-route-generator.js.map +1 -1
  18. package/dist/cjs/auth-generator.d.ts.map +1 -1
  19. package/dist/cjs/auth-generator.js +75 -27
  20. package/dist/cjs/auth-generator.js.map +1 -1
  21. package/dist/cjs/booking-calendar-feed-route-generator.d.ts +28 -0
  22. package/dist/cjs/booking-calendar-feed-route-generator.d.ts.map +1 -0
  23. package/dist/cjs/booking-calendar-feed-route-generator.js +296 -0
  24. package/dist/cjs/booking-calendar-feed-route-generator.js.map +1 -0
  25. package/dist/cjs/data-api-route-generator.d.ts +6 -8
  26. package/dist/cjs/data-api-route-generator.d.ts.map +1 -1
  27. package/dist/cjs/data-api-route-generator.js +12 -16
  28. package/dist/cjs/data-api-route-generator.js.map +1 -1
  29. package/dist/cjs/executor-generator.d.ts.map +1 -1
  30. package/dist/cjs/executor-generator.js +30 -2
  31. package/dist/cjs/executor-generator.js.map +1 -1
  32. package/dist/cjs/index.d.ts +1 -1
  33. package/dist/cjs/index.d.ts.map +1 -1
  34. package/dist/cjs/index.js +2 -1
  35. package/dist/cjs/index.js.map +1 -1
  36. package/dist/cjs/invoice/invoice-assembly-code.d.ts.map +1 -1
  37. package/dist/cjs/invoice/invoice-assembly-code.js +46 -6
  38. package/dist/cjs/invoice/invoice-assembly-code.js.map +1 -1
  39. package/dist/cjs/invoice/invoice-html-code.d.ts.map +1 -1
  40. package/dist/cjs/invoice/invoice-html-code.js +10 -2
  41. package/dist/cjs/invoice/invoice-html-code.js.map +1 -1
  42. package/dist/cjs/nodes/data/data-raw-query.d.ts.map +1 -1
  43. package/dist/cjs/nodes/data/data-raw-query.js +11 -1
  44. package/dist/cjs/nodes/data/data-raw-query.js.map +1 -1
  45. package/dist/cjs/nodes/general/general-custom-js.d.ts.map +1 -1
  46. package/dist/cjs/nodes/general/general-custom-js.js +11 -0
  47. package/dist/cjs/nodes/general/general-custom-js.js.map +1 -1
  48. package/dist/cjs/nodes/general/general-emit-custom-event.d.ts.map +1 -1
  49. package/dist/cjs/nodes/general/general-emit-custom-event.js +3 -1
  50. package/dist/cjs/nodes/general/general-emit-custom-event.js.map +1 -1
  51. package/dist/cjs/page-arrival.d.ts +10 -0
  52. package/dist/cjs/page-arrival.d.ts.map +1 -0
  53. package/dist/cjs/page-arrival.js +86 -0
  54. package/dist/cjs/page-arrival.js.map +1 -0
  55. package/dist/cjs/payments/drivers/stripe-driver-code.d.ts.map +1 -1
  56. package/dist/cjs/payments/drivers/stripe-driver-code.js +11 -0
  57. package/dist/cjs/payments/drivers/stripe-driver-code.js.map +1 -1
  58. package/dist/cjs/payments/index.d.ts +10 -4
  59. package/dist/cjs/payments/index.d.ts.map +1 -1
  60. package/dist/cjs/payments/index.js +18 -7
  61. package/dist/cjs/payments/index.js.map +1 -1
  62. package/dist/cjs/tsconfig.tsbuildinfo +1 -1
  63. package/dist/cjs/workflow-component-plugin.d.ts.map +1 -1
  64. package/dist/cjs/workflow-component-plugin.js +35 -149
  65. package/dist/cjs/workflow-component-plugin.js.map +1 -1
  66. package/dist/cjs/workflow-project-plugin.d.ts.map +1 -1
  67. package/dist/cjs/workflow-project-plugin.js +14 -4
  68. package/dist/cjs/workflow-project-plugin.js.map +1 -1
  69. package/dist/cjs/workflow-scope.d.ts +19 -0
  70. package/dist/cjs/workflow-scope.d.ts.map +1 -0
  71. package/dist/cjs/workflow-scope.js +147 -0
  72. package/dist/cjs/workflow-scope.js.map +1 -0
  73. package/dist/esm/api-route-generator.d.ts.map +1 -1
  74. package/dist/esm/api-route-generator.js +23 -13
  75. package/dist/esm/api-route-generator.js.map +1 -1
  76. package/dist/esm/auth-generator.d.ts.map +1 -1
  77. package/dist/esm/auth-generator.js +75 -27
  78. package/dist/esm/auth-generator.js.map +1 -1
  79. package/dist/esm/booking-calendar-feed-route-generator.d.ts +28 -0
  80. package/dist/esm/booking-calendar-feed-route-generator.d.ts.map +1 -0
  81. package/dist/esm/booking-calendar-feed-route-generator.js +291 -0
  82. package/dist/esm/booking-calendar-feed-route-generator.js.map +1 -0
  83. package/dist/esm/data-api-route-generator.d.ts +6 -8
  84. package/dist/esm/data-api-route-generator.d.ts.map +1 -1
  85. package/dist/esm/data-api-route-generator.js +13 -17
  86. package/dist/esm/data-api-route-generator.js.map +1 -1
  87. package/dist/esm/executor-generator.d.ts.map +1 -1
  88. package/dist/esm/executor-generator.js +30 -2
  89. package/dist/esm/executor-generator.js.map +1 -1
  90. package/dist/esm/index.d.ts +1 -1
  91. package/dist/esm/index.d.ts.map +1 -1
  92. package/dist/esm/index.js +1 -1
  93. package/dist/esm/index.js.map +1 -1
  94. package/dist/esm/invoice/invoice-assembly-code.d.ts.map +1 -1
  95. package/dist/esm/invoice/invoice-assembly-code.js +46 -6
  96. package/dist/esm/invoice/invoice-assembly-code.js.map +1 -1
  97. package/dist/esm/invoice/invoice-html-code.d.ts.map +1 -1
  98. package/dist/esm/invoice/invoice-html-code.js +10 -2
  99. package/dist/esm/invoice/invoice-html-code.js.map +1 -1
  100. package/dist/esm/nodes/data/data-raw-query.d.ts.map +1 -1
  101. package/dist/esm/nodes/data/data-raw-query.js +11 -1
  102. package/dist/esm/nodes/data/data-raw-query.js.map +1 -1
  103. package/dist/esm/nodes/general/general-custom-js.d.ts.map +1 -1
  104. package/dist/esm/nodes/general/general-custom-js.js +11 -0
  105. package/dist/esm/nodes/general/general-custom-js.js.map +1 -1
  106. package/dist/esm/nodes/general/general-emit-custom-event.d.ts.map +1 -1
  107. package/dist/esm/nodes/general/general-emit-custom-event.js +3 -1
  108. package/dist/esm/nodes/general/general-emit-custom-event.js.map +1 -1
  109. package/dist/esm/page-arrival.d.ts +10 -0
  110. package/dist/esm/page-arrival.d.ts.map +1 -0
  111. package/dist/esm/page-arrival.js +81 -0
  112. package/dist/esm/page-arrival.js.map +1 -0
  113. package/dist/esm/payments/drivers/stripe-driver-code.d.ts.map +1 -1
  114. package/dist/esm/payments/drivers/stripe-driver-code.js +11 -0
  115. package/dist/esm/payments/drivers/stripe-driver-code.js.map +1 -1
  116. package/dist/esm/payments/index.d.ts +10 -4
  117. package/dist/esm/payments/index.d.ts.map +1 -1
  118. package/dist/esm/payments/index.js +16 -6
  119. package/dist/esm/payments/index.js.map +1 -1
  120. package/dist/esm/tsconfig.tsbuildinfo +1 -1
  121. package/dist/esm/workflow-component-plugin.d.ts.map +1 -1
  122. package/dist/esm/workflow-component-plugin.js +32 -146
  123. package/dist/esm/workflow-component-plugin.js.map +1 -1
  124. package/dist/esm/workflow-project-plugin.d.ts.map +1 -1
  125. package/dist/esm/workflow-project-plugin.js +14 -4
  126. package/dist/esm/workflow-project-plugin.js.map +1 -1
  127. package/dist/esm/workflow-scope.d.ts +19 -0
  128. package/dist/esm/workflow-scope.d.ts.map +1 -0
  129. package/dist/esm/workflow-scope.js +142 -0
  130. package/dist/esm/workflow-scope.js.map +1 -0
  131. package/package.json +4 -4
  132. package/src/api-route-generator.ts +23 -13
  133. package/src/auth-generator.ts +80 -25
  134. package/src/booking-calendar-feed-route-generator.ts +293 -0
  135. package/src/data-api-route-generator.ts +14 -19
  136. package/src/executor-generator.ts +30 -2
  137. package/src/index.ts +1 -0
  138. package/src/invoice/invoice-assembly-code.ts +46 -6
  139. package/src/invoice/invoice-html-code.ts +10 -2
  140. package/src/nodes/data/data-raw-query.ts +11 -1
  141. package/src/nodes/general/general-custom-js.ts +10 -0
  142. package/src/nodes/general/general-emit-custom-event.ts +3 -1
  143. package/src/page-arrival.ts +115 -0
  144. package/src/payments/drivers/stripe-driver-code.ts +11 -0
  145. package/src/payments/index.ts +18 -5
  146. package/src/workflow-component-plugin.ts +43 -188
  147. package/src/workflow-project-plugin.ts +15 -4
  148. package/src/workflow-scope.ts +184 -0
@@ -0,0 +1,184 @@
1
+ import { UIDLWorkflow, UIDLWorkflows } from '@teleporthq/teleport-types'
2
+
3
+ /**
4
+ * Which workflows belong to a page or a component, and which element a
5
+ * lifecycle trigger is bound to. Shared by the workflow plugin, which emits the
6
+ * workflows, and by the page-arrival check, which has to reach the same verdict
7
+ * for the components a page renders.
8
+ */
9
+
10
+ /**
11
+ * Trigger types that run as LIFECYCLE code (no React event prop) but are still
12
+ * bound to ONE element, so the workflow only belongs on the page that renders
13
+ * it. Returns the DOM id to prune against, or null when the trigger is not
14
+ * element-scoped.
15
+ *
16
+ * Same fallback chain as the element-trigger branch: the HTML id first, the
17
+ * project-document node id only as a last resort.
18
+ */
19
+ export const resolveLifecycleTriggerElementId = (
20
+ triggerType: string,
21
+ config: Record<string, unknown>
22
+ ): string | null => {
23
+ if (
24
+ triggerType !== 'event-element-visible' &&
25
+ triggerType !== 'event-chapter-reached' &&
26
+ triggerType !== 'event-scene-scrolled-past'
27
+ ) {
28
+ return null
29
+ }
30
+ return ((config.elementHtmlId || config.nodeId) as string) || null
31
+ }
32
+
33
+ // Component-scope triggers match by emitted component name. The GUI stamps the
34
+ // name at export time, but generators may re-case or strip spaces during
35
+ // resolution, so equality is checked case/separator-insensitively.
36
+ const normalizeComponentName = (name: string): string =>
37
+ (name || '').toLowerCase().replace(/[^a-z0-9]/g, '')
38
+
39
+ export const getRelevantWorkflows = (
40
+ workflows: UIDLWorkflows,
41
+ uidl: any,
42
+ isPage: boolean
43
+ ): UIDLWorkflow[] => {
44
+ const relevant: UIDLWorkflow[] = []
45
+ const pageId = uidl.outputOptions?.pageId || uidl.outputOptions?.fileName || uidl.name || ''
46
+
47
+ const allWorkflows = Object.values(workflows.workflows) as UIDLWorkflow[]
48
+ allWorkflows.forEach((wf: UIDLWorkflow) => {
49
+ const trigger = wf.trigger
50
+
51
+ if (trigger.type === 'event-cron-triggered') {
52
+ return
53
+ }
54
+
55
+ if (trigger.type === 'event-webhook-received') {
56
+ return
57
+ }
58
+
59
+ if (trigger.type === 'event-state-change') {
60
+ const cfg = trigger.config || {}
61
+ const stateDefs = cfg.stateDefinitions as
62
+ | Array<{
63
+ pageOrComponentId?: string
64
+ pageOrComponentName?: string
65
+ name?: string
66
+ stateDefinitionId?: string
67
+ }>
68
+ | undefined
69
+
70
+ let boundContainerType = cfg.boundContainerType as string | undefined
71
+ if (!boundContainerType) {
72
+ if (stateDefs?.some((s) => s.pageOrComponentName)) {
73
+ boundContainerType = 'component'
74
+ } else if (!isPage && stateDefs && stateDefs.length > 0) {
75
+ boundContainerType = 'component'
76
+ } else {
77
+ boundContainerType = 'page'
78
+ }
79
+ }
80
+
81
+ const matchesContainer = boundContainerType === 'page' ? isPage : !isPage
82
+ if (!matchesContainer) {
83
+ return
84
+ }
85
+
86
+ const boundFromConfig = cfg.boundPageOrComponentId as string | undefined
87
+ const matchesByName =
88
+ !!stateDefs &&
89
+ stateDefs.some((sd) => sd.pageOrComponentName && sd.pageOrComponentName === uidl.name)
90
+ const matchesById =
91
+ boundFromConfig === pageId ||
92
+ (!!stateDefs && stateDefs.some((sd) => sd.pageOrComponentId === pageId))
93
+
94
+ if (matchesByName || matchesById) {
95
+ relevant.push(wf)
96
+ }
97
+ return
98
+ }
99
+
100
+ if (trigger.type === 'event-global-state-change') {
101
+ if (!isPage) {
102
+ return
103
+ }
104
+ const selectedPages = trigger.config.selectedPages as Array<{ id: string }> | undefined
105
+ if (
106
+ selectedPages &&
107
+ selectedPages.length > 0 &&
108
+ !selectedPages.some((p) => p.id === pageId)
109
+ ) {
110
+ return
111
+ }
112
+ relevant.push(wf)
113
+ return
114
+ }
115
+
116
+ if (trigger.scope === 'global') {
117
+ return
118
+ }
119
+
120
+ if (trigger.scope === 'component') {
121
+ if (isPage) {
122
+ return
123
+ }
124
+ const cfg = trigger.config || {}
125
+ const cfgName = (cfg.componentName as string) || ''
126
+ const cfgId = (cfg.componentId as string) || ''
127
+ const matches =
128
+ (cfgName &&
129
+ (cfgName === uidl.name ||
130
+ normalizeComponentName(cfgName) === normalizeComponentName(uidl.name))) ||
131
+ (cfgId && cfgId === pageId)
132
+ if (matches) {
133
+ relevant.push(wf)
134
+ }
135
+ return
136
+ }
137
+
138
+ if (trigger.scope === 'page' && isPage) {
139
+ const triggerPageId = trigger.config.pageId as string
140
+ const selectedPages = trigger.config.selectedPages as Array<{ id: string }> | undefined
141
+
142
+ if (trigger.type === 'event-page-loaded') {
143
+ const allPages = trigger.config.allPages === true
144
+ if (allPages) {
145
+ relevant.push(wf)
146
+ return
147
+ }
148
+ // Unscoped page-loaded workflows are SKIPPED, not injected everywhere.
149
+ // Silently fanning out to every page masks mis-scoped workflows whose
150
+ // state target lives in a component (the setter no-ops on pages).
151
+ if (!triggerPageId && (!selectedPages || selectedPages.length === 0)) {
152
+ return
153
+ }
154
+ }
155
+
156
+ if (triggerPageId && triggerPageId !== pageId) {
157
+ return
158
+ }
159
+
160
+ if (selectedPages && !selectedPages.some((p) => p.id === pageId)) {
161
+ return
162
+ }
163
+
164
+ relevant.push(wf)
165
+ return
166
+ }
167
+
168
+ if (trigger.scope === 'element') {
169
+ // If the element-scoped trigger specifies which pages it belongs to, filter by page.
170
+ // This prevents including ALL element-scoped workflows on every page (massive bloat).
171
+ const elementSelectedPages = trigger.config.selectedPages as Array<{ id: string }> | undefined
172
+ if (isPage && elementSelectedPages && elementSelectedPages.length > 0) {
173
+ if (!elementSelectedPages.some((p) => p.id === pageId)) {
174
+ return
175
+ }
176
+ }
177
+
178
+ relevant.push(wf)
179
+ return
180
+ }
181
+ })
182
+
183
+ return relevant
184
+ }