@whitewall/blip-sdk 0.0.178 → 0.0.180

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.
@@ -0,0 +1,165 @@
1
+ import type { Action, ContentActionItem, State } from '../types/flow.ts'
2
+
3
+ export type MinifiedAction = {
4
+ type: string
5
+ settings: Record<string, unknown>
6
+ conditions?: Array<{
7
+ source: string
8
+ variable?: string
9
+ comparison: string
10
+ operator?: string
11
+ values: Array<string>
12
+ }>
13
+ }
14
+
15
+ export type MinifiedInput = {
16
+ bypass: boolean
17
+ variable?: string
18
+ validation?: { rule: string; regex?: string; type?: string; error: string }
19
+ expiration?: string
20
+ conditions?: MinifiedAction['conditions']
21
+ }
22
+
23
+ export type MinifiedOutput = {
24
+ stateId: string
25
+ stateName?: string
26
+ typeOfStateId?: string
27
+ conditions?: MinifiedAction['conditions']
28
+ }
29
+
30
+ export type MinifiedState = {
31
+ id: string
32
+ name: string
33
+ root?: boolean
34
+ enteringActions?: Array<MinifiedAction>
35
+ contentActions?: Array<{ action?: MinifiedAction; input?: MinifiedInput }>
36
+ leavingActions?: Array<MinifiedAction>
37
+ outputs?: Array<MinifiedOutput>
38
+ defaultOutput: { stateId: string; stateName?: string; typeOfStateId?: string }
39
+ afterStateChangedActions?: Array<MinifiedAction>
40
+ localActions?: Array<MinifiedAction>
41
+ }
42
+
43
+ function minifyConditions(
44
+ conditions?: Array<{
45
+ source: string
46
+ variable?: string
47
+ comparison: string
48
+ operator?: string
49
+ values: Array<string>
50
+ }>,
51
+ ): MinifiedAction['conditions'] | undefined {
52
+ if (!conditions || conditions.length === 0) return undefined
53
+ return conditions.map((c) => ({
54
+ source: c.source,
55
+ ...(c.variable ? { variable: c.variable } : {}),
56
+ comparison: c.comparison,
57
+ ...(c.operator ? { operator: c.operator } : {}),
58
+ values: c.values,
59
+ }))
60
+ }
61
+
62
+ function minifyActionSettings(settings: Record<string, unknown>): Record<string, unknown> {
63
+ const clone = { ...settings }
64
+ delete clone.$invalid
65
+ delete clone.id
66
+ return clone
67
+ }
68
+
69
+ export function minifyAction(action: Action): MinifiedAction {
70
+ const result: MinifiedAction = {
71
+ type: action.type,
72
+ settings: minifyActionSettings(action.settings as Record<string, unknown>),
73
+ }
74
+ const conditions = minifyConditions(action.conditions as MinifiedAction['conditions'])
75
+ if (conditions) result.conditions = conditions
76
+ return result
77
+ }
78
+
79
+ function minifyInput(input: ContentActionItem['input']): MinifiedInput | undefined {
80
+ if (!input) return undefined
81
+ const result: MinifiedInput = { bypass: input.bypass }
82
+ if (input.variable) result.variable = input.variable
83
+ if (input.validation) {
84
+ result.validation = {
85
+ rule: input.validation.rule,
86
+ ...(input.validation.regex ? { regex: input.validation.regex } : {}),
87
+ ...(input.validation.type ? { type: input.validation.type } : {}),
88
+ error: input.validation.error,
89
+ }
90
+ }
91
+ if (input.expiration) result.expiration = input.expiration
92
+ const conditions = minifyConditions(input.conditions as MinifiedAction['conditions'])
93
+ if (conditions) result.conditions = conditions
94
+ return result
95
+ }
96
+
97
+ export function isChatStateSendMessage(item: ContentActionItem): boolean {
98
+ return item.action?.type === 'SendMessage' && item.action.$typeOfContent === 'chat-state'
99
+ }
100
+
101
+ export function resolveStateName(stateId: string, flow: Record<string, State>): string | undefined {
102
+ const state = flow[stateId]
103
+ return state?.$title
104
+ }
105
+
106
+ function minifyOutput(
107
+ output: { stateId: string; typeOfStateId?: string; conditions?: Array<unknown>; $invalid?: boolean },
108
+ flow: Record<string, State>,
109
+ ): MinifiedOutput {
110
+ const result: MinifiedOutput = {
111
+ stateId: output.stateId,
112
+ }
113
+ const name = resolveStateName(output.stateId, flow)
114
+ if (name) result.stateName = name
115
+ if (output.typeOfStateId) result.typeOfStateId = output.typeOfStateId
116
+ if ('conditions' in output && Array.isArray(output.conditions) && output.conditions.length > 0) {
117
+ result.conditions = minifyConditions(output.conditions as MinifiedAction['conditions'])
118
+ }
119
+ return result
120
+ }
121
+
122
+ export function minifyState(stateId: string, state: State, flow: Record<string, State>): MinifiedState {
123
+ const result: MinifiedState = {
124
+ id: stateId,
125
+ name: state.$title,
126
+ defaultOutput: {
127
+ stateId: state.$defaultOutput.stateId,
128
+ ...(resolveStateName(state.$defaultOutput.stateId, flow)
129
+ ? { stateName: resolveStateName(state.$defaultOutput.stateId, flow) }
130
+ : {}),
131
+ ...(state.$defaultOutput.typeOfStateId ? { typeOfStateId: state.$defaultOutput.typeOfStateId } : {}),
132
+ },
133
+ }
134
+
135
+ if (state.root) result.root = true
136
+
137
+ const enteringActions = state.$enteringCustomActions.map(minifyAction)
138
+ if (enteringActions.length > 0) result.enteringActions = enteringActions
139
+
140
+ const contentActions = state.$contentActions
141
+ .filter((item: ContentActionItem) => !isChatStateSendMessage(item))
142
+ .map((item: ContentActionItem) => {
143
+ const entry: { action?: MinifiedAction; input?: MinifiedInput } = {}
144
+ if (item.action) entry.action = minifyAction(item.action)
145
+ const input = minifyInput(item.input)
146
+ if (input) entry.input = input
147
+ return entry
148
+ })
149
+ .filter((entry: { action?: MinifiedAction; input?: MinifiedInput }) => entry.action || entry.input)
150
+ if (contentActions.length > 0) result.contentActions = contentActions
151
+
152
+ const leavingActions = state.$leavingCustomActions.map(minifyAction)
153
+ if (leavingActions.length > 0) result.leavingActions = leavingActions
154
+
155
+ const outputs = state.$conditionOutputs.map((o: State['$conditionOutputs'][number]) => minifyOutput(o, flow))
156
+ if (outputs.length > 0) result.outputs = outputs
157
+
158
+ const afterStateChangedActions = (state.$afterStateChangedActions ?? []).map(minifyAction)
159
+ if (afterStateChangedActions.length > 0) result.afterStateChangedActions = afterStateChangedActions
160
+
161
+ const localActions = (state.$localCustomActions ?? []).map(minifyAction)
162
+ if (localActions.length > 0) result.localActions = localActions
163
+
164
+ return result
165
+ }