@teleporthq/teleport-plugin-next-workflows 0.43.32 → 0.43.34

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 (90) hide show
  1. package/__tests__/client-config-redaction.test.ts +192 -0
  2. package/__tests__/data-api-boolean-checkbox-coercion.test.ts +143 -0
  3. package/__tests__/data-api-safe-query.test.ts +3 -1
  4. package/__tests__/data-update-item-runtime.test.ts +116 -0
  5. package/__tests__/raw-query-param-binding.test.ts +216 -0
  6. package/__tests__/runtime-template-token-resolution.test.ts +38 -0
  7. package/dist/cjs/data-api-route-generator.d.ts.map +1 -1
  8. package/dist/cjs/data-api-route-generator.js +92 -6
  9. package/dist/cjs/data-api-route-generator.js.map +1 -1
  10. package/dist/cjs/executor-generator.d.ts.map +1 -1
  11. package/dist/cjs/executor-generator.js +31 -0
  12. package/dist/cjs/executor-generator.js.map +1 -1
  13. package/dist/cjs/nodes/data/data-delete-item.d.ts.map +1 -1
  14. package/dist/cjs/nodes/data/data-delete-item.js +15 -4
  15. package/dist/cjs/nodes/data/data-delete-item.js.map +1 -1
  16. package/dist/cjs/nodes/data/data-raw-query.d.ts.map +1 -1
  17. package/dist/cjs/nodes/data/data-raw-query.js +7 -1
  18. package/dist/cjs/nodes/data/data-raw-query.js.map +1 -1
  19. package/dist/cjs/nodes/data/data-select.d.ts.map +1 -1
  20. package/dist/cjs/nodes/data/data-select.js +51 -3
  21. package/dist/cjs/nodes/data/data-select.js.map +1 -1
  22. package/dist/cjs/nodes/data/data-update-item.d.ts.map +1 -1
  23. package/dist/cjs/nodes/data/data-update-item.js +58 -5
  24. package/dist/cjs/nodes/data/data-update-item.js.map +1 -1
  25. package/dist/cjs/nodes/general/general-extract-form-data.d.ts.map +1 -1
  26. package/dist/cjs/nodes/general/general-extract-form-data.js +37 -1
  27. package/dist/cjs/nodes/general/general-extract-form-data.js.map +1 -1
  28. package/dist/cjs/segment-splitter.d.ts +26 -2
  29. package/dist/cjs/segment-splitter.d.ts.map +1 -1
  30. package/dist/cjs/segment-splitter.js +45 -1
  31. package/dist/cjs/segment-splitter.js.map +1 -1
  32. package/dist/cjs/sql-query-validator.d.ts +40 -0
  33. package/dist/cjs/sql-query-validator.d.ts.map +1 -1
  34. package/dist/cjs/sql-query-validator.js +49 -1
  35. package/dist/cjs/sql-query-validator.js.map +1 -1
  36. package/dist/cjs/tsconfig.tsbuildinfo +1 -1
  37. package/dist/cjs/workflow-component-plugin.d.ts.map +1 -1
  38. package/dist/cjs/workflow-component-plugin.js +22 -8
  39. package/dist/cjs/workflow-component-plugin.js.map +1 -1
  40. package/dist/cjs/workflow-project-plugin.d.ts.map +1 -1
  41. package/dist/cjs/workflow-project-plugin.js +8 -2
  42. package/dist/cjs/workflow-project-plugin.js.map +1 -1
  43. package/dist/esm/data-api-route-generator.d.ts.map +1 -1
  44. package/dist/esm/data-api-route-generator.js +92 -6
  45. package/dist/esm/data-api-route-generator.js.map +1 -1
  46. package/dist/esm/executor-generator.d.ts.map +1 -1
  47. package/dist/esm/executor-generator.js +31 -0
  48. package/dist/esm/executor-generator.js.map +1 -1
  49. package/dist/esm/nodes/data/data-delete-item.d.ts.map +1 -1
  50. package/dist/esm/nodes/data/data-delete-item.js +15 -4
  51. package/dist/esm/nodes/data/data-delete-item.js.map +1 -1
  52. package/dist/esm/nodes/data/data-raw-query.d.ts.map +1 -1
  53. package/dist/esm/nodes/data/data-raw-query.js +7 -1
  54. package/dist/esm/nodes/data/data-raw-query.js.map +1 -1
  55. package/dist/esm/nodes/data/data-select.d.ts.map +1 -1
  56. package/dist/esm/nodes/data/data-select.js +51 -3
  57. package/dist/esm/nodes/data/data-select.js.map +1 -1
  58. package/dist/esm/nodes/data/data-update-item.d.ts.map +1 -1
  59. package/dist/esm/nodes/data/data-update-item.js +58 -5
  60. package/dist/esm/nodes/data/data-update-item.js.map +1 -1
  61. package/dist/esm/nodes/general/general-extract-form-data.d.ts.map +1 -1
  62. package/dist/esm/nodes/general/general-extract-form-data.js +37 -1
  63. package/dist/esm/nodes/general/general-extract-form-data.js.map +1 -1
  64. package/dist/esm/segment-splitter.d.ts +26 -2
  65. package/dist/esm/segment-splitter.d.ts.map +1 -1
  66. package/dist/esm/segment-splitter.js +42 -0
  67. package/dist/esm/segment-splitter.js.map +1 -1
  68. package/dist/esm/sql-query-validator.d.ts +40 -0
  69. package/dist/esm/sql-query-validator.d.ts.map +1 -1
  70. package/dist/esm/sql-query-validator.js +47 -0
  71. package/dist/esm/sql-query-validator.js.map +1 -1
  72. package/dist/esm/tsconfig.tsbuildinfo +1 -1
  73. package/dist/esm/workflow-component-plugin.d.ts.map +1 -1
  74. package/dist/esm/workflow-component-plugin.js +23 -9
  75. package/dist/esm/workflow-component-plugin.js.map +1 -1
  76. package/dist/esm/workflow-project-plugin.d.ts.map +1 -1
  77. package/dist/esm/workflow-project-plugin.js +9 -3
  78. package/dist/esm/workflow-project-plugin.js.map +1 -1
  79. package/package.json +4 -4
  80. package/src/data-api-route-generator.ts +92 -6
  81. package/src/executor-generator.ts +31 -0
  82. package/src/nodes/data/data-delete-item.ts +15 -4
  83. package/src/nodes/data/data-raw-query.ts +7 -1
  84. package/src/nodes/data/data-select.ts +48 -3
  85. package/src/nodes/data/data-update-item.ts +62 -5
  86. package/src/nodes/general/general-extract-form-data.ts +37 -1
  87. package/src/segment-splitter.ts +49 -0
  88. package/src/sql-query-validator.ts +64 -0
  89. package/src/workflow-component-plugin.ts +23 -3
  90. package/src/workflow-project-plugin.ts +18 -3
@@ -149,9 +149,26 @@ async function safeQuery(client, sql, params, mode) {
149
149
  }
150
150
  }
151
151
 
152
- function buildWhereClause(filters, queryParams, startIndex) {
152
+ function isSkippableFilterValue(value) {
153
+ if (value === undefined || value === null) return true;
154
+ if (typeof value === 'string' && value.trim() === '') return true;
155
+ if (Array.isArray(value) && value.length === 0) return true;
156
+ return false;
157
+ }
158
+
159
+ function isAllSentinelFilterValue(value, filter) {
160
+ if (typeof value !== 'string') return false;
161
+ var normalized = value.trim().toLowerCase();
162
+ if (filter && typeof filter.treatAsAll === 'string' && filter.treatAsAll.trim().toLowerCase() === normalized) {
163
+ return true;
164
+ }
165
+ return normalized === 'all' || normalized === 'any' || normalized === 'everything' || normalized === '__all__';
166
+ }
167
+
168
+ function buildWhereClause(filters, queryParams, startIndex, options) {
153
169
  var conditions = [];
154
170
  var paramIndex = startIndex;
171
+ var skipOptionalEmpty = !!(options && options.skipOptionalEmpty);
155
172
 
156
173
  if (!filters || !Array.isArray(filters) || filters.length === 0) {
157
174
  return { clause: '', paramIndex: paramIndex };
@@ -167,6 +184,7 @@ function buildWhereClause(filters, queryParams, startIndex) {
167
184
  var operand = f.operand || f.operator || '=';
168
185
 
169
186
  if (value === undefined) continue;
187
+ if (skipOptionalEmpty && (isSkippableFilterValue(value) || isAllSentinelFilterValue(value, f))) continue;
170
188
 
171
189
  if (Array.isArray(value)) {
172
190
  if (value.length === 0) continue;
@@ -184,6 +202,37 @@ function buildWhereClause(filters, queryParams, startIndex) {
184
202
  conditions.push(field + ' IS NOT NULL');
185
203
  }
186
204
  } else {
205
+ var normalizedOperand = String(operand || '=').toLowerCase();
206
+ if (normalizedOperand === 'contains' || normalizedOperand === 'not_contains' || normalizedOperand === 'not-contains') {
207
+ if (isSkippableFilterValue(value)) {
208
+ conditions.push('FALSE');
209
+ continue;
210
+ }
211
+ conditions.push(field + (normalizedOperand === 'contains' ? ' ILIKE ' : ' NOT ILIKE ') + '$' + paramIndex);
212
+ queryParams.push('%' + String(value) + '%');
213
+ paramIndex++;
214
+ continue;
215
+ }
216
+ if (normalizedOperand === 'startswith' || normalizedOperand === 'starts_with' || normalizedOperand === 'starts-with') {
217
+ if (isSkippableFilterValue(value)) {
218
+ conditions.push('FALSE');
219
+ continue;
220
+ }
221
+ conditions.push(field + ' ILIKE $' + paramIndex);
222
+ queryParams.push(String(value) + '%');
223
+ paramIndex++;
224
+ continue;
225
+ }
226
+ if (normalizedOperand === 'endswith' || normalizedOperand === 'ends_with' || normalizedOperand === 'ends-with') {
227
+ if (isSkippableFilterValue(value)) {
228
+ conditions.push('FALSE');
229
+ continue;
230
+ }
231
+ conditions.push(field + ' ILIKE $' + paramIndex);
232
+ queryParams.push('%' + String(value));
233
+ paramIndex++;
234
+ continue;
235
+ }
187
236
  var validOps = ['=', '!=', '>', '<', '>=', '<=', 'LIKE', 'ILIKE'];
188
237
  var sqlOp = validOps.indexOf(operand) !== -1 ? operand : '=';
189
238
  conditions.push(field + ' ' + sqlOp + ' $' + paramIndex);
@@ -226,7 +275,7 @@ async function handleSelect(client, body) {
226
275
  var cols = selectedColumns.length > 0 ? selectedColumns.join(', ') : '*';
227
276
  var sql = 'SELECT ' + cols + ' FROM ' + tableName;
228
277
 
229
- var where = buildWhereClause(filters, queryParams, 1);
278
+ var where = buildWhereClause(filters, queryParams, 1, { skipOptionalEmpty: true });
230
279
  sql += where.clause;
231
280
 
232
281
  if (sorts.length > 0) {
@@ -251,7 +300,11 @@ async function handleSelect(client, body) {
251
300
  // Validate the raw user-provided query for forbidden operations
252
301
  assertQuerySafe(rawQueryUserPart);
253
302
  sql = rawQueryUserPart;
254
- queryParams = [];
303
+ // SECURITY: the raw override fully replaces the assembled SELECT, so bind the
304
+ // security net's $N params for it, never inline text. rawQueryUserPartParams
305
+ // carries the workflow values (already resolved by the executor) that back the
306
+ // $1, $2, … placeholders the net emitted into rawQueryUserPart.
307
+ queryParams = Array.isArray(body.rawQueryUserPartParams) ? body.rawQueryUserPartParams : [];
255
308
  }
256
309
 
257
310
  // Final validation of the assembled query
@@ -262,7 +315,7 @@ async function handleSelect(client, body) {
262
315
 
263
316
  var countSql = 'SELECT COUNT(*) FROM ' + tableName;
264
317
  var countParams = [];
265
- var countWhere = buildWhereClause(filters, countParams, 1);
318
+ var countWhere = buildWhereClause(filters, countParams, 1, { skipOptionalEmpty: true });
266
319
  countSql += countWhere.clause;
267
320
  var countResult = await safeQuery(client, countSql, countParams, 'count');
268
321
  var count = parseInt(countResult.rows[0].count, 10);
@@ -279,7 +332,7 @@ async function handleCount(client, body) {
279
332
 
280
333
  var queryParams = [];
281
334
  var sql = 'SELECT COUNT(*) FROM ' + tableName;
282
- var where = buildWhereClause(filters, queryParams, 1);
335
+ var where = buildWhereClause(filters, queryParams, 1, { skipOptionalEmpty: true });
283
336
  sql += where.clause;
284
337
 
285
338
  var result = await safeQuery(client, sql, queryParams, 'count');
@@ -313,8 +366,31 @@ function splitCommaOrPgArrayString(val) {
313
366
  return s.split(',').map(function(x) { return x.trim(); }).filter(Boolean);
314
367
  }
315
368
 
369
+ // HTML checkbox convention: a checked box submits a truthy string value
370
+ // ('on' by default, or the input's own value attribute); an UNCHECKED box
371
+ // is omitted from FormData entirely, which general-extract-form-data (the
372
+ // client-side node that builds the workflow payload) represents as '' /
373
+ // undefined - never false. Without this branch that '' fell through to
374
+ // the generic empty-string-to-null guard below and was written as SQL
375
+ // NULL instead of false: a silent "not featured" -> NULL data corruption
376
+ // in the common case (breaks any WHERE is_featured = true/false filter,
377
+ // since NULL fails three-valued-logic equality), and a hard 23502
378
+ // not-null-violation whenever the boolean column itself is NOT NULL - the
379
+ // exact "update failed" error reported for an unchecked "feature this item"
380
+ // checkbox. "Not submitted" always means unchecked/false for an HTML
381
+ // checkbox, so this mapping is unambiguous and safe for every boolean
382
+ // column, not just one page's flag.
383
+ var BOOLEAN_TRUE_STRINGS = { 'on': 1, 'true': 1, '1': 1 };
384
+
316
385
  function coerceValueForPgColumn(col, val, colTypes) {
317
386
  var dt = colTypes[col];
387
+ if (dt === 'boolean') {
388
+ if (typeof val === 'boolean') return val;
389
+ if (val === undefined || val === null) return false;
390
+ if (typeof val === 'number') return val !== 0;
391
+ if (typeof val === 'string') return !!BOOLEAN_TRUE_STRINGS[val.trim().toLowerCase()];
392
+ return false;
393
+ }
318
394
  if (dt !== 'ARRAY') return val;
319
395
  if (val == null) return val;
320
396
  if (Array.isArray(val)) return val;
@@ -643,6 +719,16 @@ async function handleRawQuery(client, body, req) {
643
719
  return { rows: [], error: 'No query provided' };
644
720
  }
645
721
 
722
+ // SECURITY: bind the workflow's context/state values as POSITIONAL parameters
723
+ // ($1, $2, …) instead of interpolating them into the SQL text. The generation
724
+ // net rewrites every {{state.X}}/{{Current User.id}}/… value interpolation into
725
+ // a $N placeholder and moves the {{…}} token into this sibling params array; the
726
+ // executor resolves those tokens to concrete values before POSTing, so here they
727
+ // arrive as plain bound values. A bound value can never terminate a string literal
728
+ // or alter query structure — SQL injection is impossible for the value class.
729
+ // Legacy raw queries carry no params array and run unparameterized (backward-compat).
730
+ var params = Array.isArray(body.params) ? body.params : [];
731
+
646
732
  // Validate the raw query for forbidden operations before execution
647
733
  assertQuerySafe(query);
648
734
 
@@ -650,7 +736,7 @@ async function handleRawQuery(client, body, req) {
650
736
  await ensurePgVector(client);
651
737
  }
652
738
 
653
- var result = await safeQuery(client, query, [], 'raw-query');
739
+ var result = await safeQuery(client, query, params, 'raw-query');
654
740
  var rows = Array.isArray(result.rows) ? result.rows : [];
655
741
 
656
742
  // Auto-fire the low-stock alert when the workflow runs the post-
@@ -1 +1 @@
1
- {"version":3,"file":"data-api-route-generator.js","sourceRoot":"","sources":["../../src/data-api-route-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAA;AAE1D,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;IAC9B,aAAa;IACb,kBAAkB;IAClB,kBAAkB;IAClB,kBAAkB;IAClB,YAAY;IACZ,gBAAgB;CACjB,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,aAA0B,EAAW,EAAE;IACvE,KAAK,MAAM,EAAE,IAAI,aAAa,EAAE;QAC9B,IAAI,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;YAC3B,OAAO,IAAI,CAAA;SACZ;KACF;IACD,OAAO,KAAK,CAAA;AACd,CAAC,CAAA;AAqBD,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,UAA+B,EAAE,EAAU,EAAE;IAChF,MAAM,aAAa,GAAG,wBAAwB,EAAE,CAAA;IAChD,MAAM,cAAc,GAAG,OAAO,CAAC,kBAAkB,IAAI,IAAI,CAAA;IACzD,MAAM,qBAAqB,GAAG,CAAC,CAAC,OAAO,CAAC,qBAAqB,CAAA;IAC7D,MAAM,iBAAiB,GACrB,OAAO,OAAO,CAAC,iBAAiB,KAAK,QAAQ,IAAI,OAAO,CAAC,iBAAiB,IAAI,CAAC;QAC7E,CAAC,CAAC,OAAO,CAAC,iBAAiB;QAC3B,CAAC,CAAC,CAAC,CAAA;IAEP,OAAO;EAEP,cAAc,CAAC,CAAC,CAAC,kDAAkD,CAAC,CAAC,CAAC,EACxE,4BAA4B,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC;mCACvB,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC;8BAC1C,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC;EAC7D,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyuBd,CAAA;AACD,CAAC,CAAA"}
1
+ {"version":3,"file":"data-api-route-generator.js","sourceRoot":"","sources":["../../src/data-api-route-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAA;AAE1D,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;IAC9B,aAAa;IACb,kBAAkB;IAClB,kBAAkB;IAClB,kBAAkB;IAClB,YAAY;IACZ,gBAAgB;CACjB,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,aAA0B,EAAW,EAAE;IACvE,KAAK,MAAM,EAAE,IAAI,aAAa,EAAE;QAC9B,IAAI,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;YAC3B,OAAO,IAAI,CAAA;SACZ;KACF;IACD,OAAO,KAAK,CAAA;AACd,CAAC,CAAA;AAqBD,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,UAA+B,EAAE,EAAU,EAAE;IAChF,MAAM,aAAa,GAAG,wBAAwB,EAAE,CAAA;IAChD,MAAM,cAAc,GAAG,OAAO,CAAC,kBAAkB,IAAI,IAAI,CAAA;IACzD,MAAM,qBAAqB,GAAG,CAAC,CAAC,OAAO,CAAC,qBAAqB,CAAA;IAC7D,MAAM,iBAAiB,GACrB,OAAO,OAAO,CAAC,iBAAiB,KAAK,QAAQ,IAAI,OAAO,CAAC,iBAAiB,IAAI,CAAC;QAC7E,CAAC,CAAC,OAAO,CAAC,iBAAiB;QAC3B,CAAC,CAAC,CAAC,CAAA;IAEP,OAAO;EAEP,cAAc,CAAC,CAAC,CAAC,kDAAkD,CAAC,CAAC,CAAC,EACxE,4BAA4B,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC;mCACvB,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC;8BAC1C,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC;EAC7D,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+zBd,CAAA;AACD,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"executor-generator.d.ts","sourceRoot":"","sources":["../../src/executor-generator.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,8BAA8B,QAAO,MAo9BjD,CAAA;AAED,eAAO,MAAM,yBAAyB,QAAO,MAwc5C,CAAA;AAED,eAAO,MAAM,yBAAyB,QAAO,MAK5C,CAAA"}
1
+ {"version":3,"file":"executor-generator.d.ts","sourceRoot":"","sources":["../../src/executor-generator.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,8BAA8B,QAAO,MAm/BjD,CAAA;AAED,eAAO,MAAM,yBAAyB,QAAO,MAwc5C,CAAA;AAED,eAAO,MAAM,yBAAyB,QAAO,MAK5C,CAAA"}
@@ -294,6 +294,37 @@ function finalizeResolvedConfig(nodeType, config) {
294
294
  }
295
295
  }
296
296
  walk(config, false);
297
+
298
+ // BACKSTOP: a data-node FILTER value that STILL holds a literal {{…}} token
299
+ // after resolution is an unresolvable template — a JS expression, an embedded
300
+ // token, or an unknown root the runtime never substitutes (run d9a24741:
301
+ // "{{state.filterDateEnd || '2099-12-31'}} 23:59:59" and
302
+ // "{{Current Page Entity.guest_id}}"). Left alone it reaches SQL as literal
303
+ // text and breaks the query. For a READ (data-select / data-count) DROP the
304
+ // clause — the optional-filter idiom degrades to "no filter" (more rows, never
305
+ // a crash). For a WRITE the filter scopes the mutation, so an unscoped/partial
306
+ // filter is unsafe → surface a validation error (same posture as the
307
+ // route-param sentinel above).
308
+ if (isDataNode && config && Array.isArray(config.filters)) {
309
+ var isReadNode = nodeType === 'data-select' || nodeType === 'data-count';
310
+ var keptFilters = [];
311
+ for (var fi = 0; fi < config.filters.length; fi++) {
312
+ var filt = config.filters[fi];
313
+ var fval = filt && typeof filt === 'object'
314
+ ? (filt.value !== undefined ? filt.value : filt.destination)
315
+ : undefined;
316
+ if (typeof fval === 'string' && /\\{\\{[\\s\\S]*?\\}\\}/.test(fval)) {
317
+ if (!isReadNode && !error) {
318
+ var fcol = (filt && (filt.column || filt.field || filt.source)) || 'filter';
319
+ error = 'Filter on "' + fcol + '" carries an unresolved template ({{…}}) and cannot safely scope this write';
320
+ }
321
+ continue; // drop the unresolvable clause
322
+ }
323
+ keptFilters.push(filt);
324
+ }
325
+ config.filters = keptFilters;
326
+ }
327
+
297
328
  return error;
298
329
  }
299
330
 
@@ -1 +1 @@
1
- {"version":3,"file":"executor-generator.js","sourceRoot":"","sources":["../../src/executor-generator.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,8BAA8B,GAAG,GAAW,EAAE;IACzD,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAk9BR,CAAA;AACD,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,yBAAyB,GAAG,GAAW,EAAE;IACpD,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAscR,CAAA;AACD,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,yBAAyB,GAAG,GAAW,EAAE;IACpD,OAAO;;;CAGR,CAAA;AACD,CAAC,CAAA"}
1
+ {"version":3,"file":"executor-generator.js","sourceRoot":"","sources":["../../src/executor-generator.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,8BAA8B,GAAG,GAAW,EAAE;IACzD,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAi/BR,CAAA;AACD,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,yBAAyB,GAAG,GAAW,EAAE;IACpD,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAscR,CAAA;AACD,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,yBAAyB,GAAG,GAAW,EAAE;IACpD,OAAO;;;CAGR,CAAA;AACD,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"data-delete-item.d.ts","sourceRoot":"","sources":["../../../../src/nodes/data/data-delete-item.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAmB,MAAM,UAAU,CAAA;AAkEhE,eAAO,MAAM,cAAc,EAAE,oBAM5B,CAAA"}
1
+ {"version":3,"file":"data-delete-item.d.ts","sourceRoot":"","sources":["../../../../src/nodes/data/data-delete-item.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAmB,MAAM,UAAU,CAAA;AA6EhE,eAAO,MAAM,cAAc,EAAE,oBAM5B,CAAA"}
@@ -23,7 +23,13 @@ async function data_delete_item(config, context) {
23
23
  __col +
24
24
  '" needs a page route param not available here; nothing deleted (workflow continues)');
25
25
  }
26
- return { deletedId: null, success: true, deletedCount: 0, __skippedUnavailableFilter: true };
26
+ return {
27
+ deletedId: null,
28
+ success: true,
29
+ deletedCount: 0,
30
+ affected: 0,
31
+ __skippedUnavailableFilter: true,
32
+ };
27
33
  }
28
34
  }
29
35
  try {
@@ -43,17 +49,22 @@ async function data_delete_item(config, context) {
43
49
  deletedId: null,
44
50
  success: false,
45
51
  deletedCount: 0,
52
+ affected: 0,
46
53
  error: data.error || 'Delete item failed',
47
54
  };
48
55
  }
56
+ // `affected` mirrors `deletedCount` so a success gate authored against either
57
+ // synonym resolves (the AI schema historically advertised `affected`).
58
+ const __deleted = data.deletedCount || 0;
49
59
  return {
50
60
  deletedId: data.deletedId || null,
51
- success: (data.deletedCount || 0) > 0,
52
- deletedCount: data.deletedCount || 0,
61
+ success: __deleted > 0,
62
+ deletedCount: __deleted,
63
+ affected: __deleted,
53
64
  };
54
65
  }
55
66
  catch (err) {
56
- return { deletedId: null, success: false, error: err.message };
67
+ return { deletedId: null, success: false, affected: 0, error: err.message };
57
68
  }
58
69
  }
59
70
  export const dataDeleteItem = {
@@ -1 +1 @@
1
- {"version":3,"file":"data-delete-item.js","sourceRoot":"","sources":["../../../../src/nodes/data/data-delete-item.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,eAAe,EAAE,MAAM,UAAU,CAAA;AAEhE,KAAK,UAAU,gBAAgB,CAAC,MAAW,EAAE,OAAY;IACvD,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,CAAA;IACxC,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAA;IAClC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAA;IACpC,MAAM,OAAO,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,CAAA;IACpD,MAAM,KAAK,GAAI,UAAkB,CAAC,OAAO,IAAK,UAAkB,CAAC,OAAO,CAAC,GAAG,CAAA;IAE5E,sEAAsE;IACtE,wEAAwE;IACxE,wEAAwE;IACxE,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE;QAChD,MAAM,GAAG,GAAQ,OAAO,CAAC,IAAI,CAAC,CAAA;QAC9B,IACE,GAAG;YACH,CAAC,GAAG,CAAC,KAAK,KAAK,+BAA+B;gBAC5C,GAAG,CAAC,WAAW,KAAK,+BAA+B,CAAC,EACtD;YACA,wEAAwE;YACxE,mEAAmE;YACnE,uEAAuE;YACvE,4DAA4D;YAC5D,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,KAAK,IAAI,SAAS,CAAA;YAChE,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,CAAC,IAAI,EAAE;gBAClD,OAAO,CAAC,IAAI,CACV,2DAA2D;oBACzD,KAAK;oBACL,qFAAqF,CACxF,CAAA;aACF;YACD,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,EAAE,0BAA0B,EAAE,IAAI,EAAE,CAAA;SAC7F;KACF;IAED,IAAI;QACF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,GAAG,YAAY,GAAG,YAAY,GAAG,SAAS,EAAE;YAC9E,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,2EAA2E;gBAC3E,sEAAsE;gBACtE,wBAAwB,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,eAAe,CAAC,IAAI,EAAE;aACjE;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;SAC7C,CAAC,CAAA;QAEF,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;QAElC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;YAChB,OAAO;gBACL,SAAS,EAAE,IAAI;gBACf,OAAO,EAAE,KAAK;gBACd,YAAY,EAAE,CAAC;gBACf,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,oBAAoB;aAC1C,CAAA;SACF;QACD,OAAO;YACL,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI;YACjC,OAAO,EAAE,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,CAAC,GAAG,CAAC;YACrC,YAAY,EAAE,IAAI,CAAC,YAAY,IAAI,CAAC;SACrC,CAAA;KACF;IAAC,OAAO,GAAY,EAAE;QACrB,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,CAAA;KAC1E;AACH,CAAC;AACD,MAAM,CAAC,MAAM,cAAc,GAAyB;IAClD,QAAQ,EAAE,kBAAkB;IAC5B,YAAY,EAAE,QAAQ;IACtB,eAAe;QACb,OAAO,eAAe,CAAC,gBAAgB,CAAC,CAAA;IAC1C,CAAC;CACF,CAAA"}
1
+ {"version":3,"file":"data-delete-item.js","sourceRoot":"","sources":["../../../../src/nodes/data/data-delete-item.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"data-raw-query.d.ts","sourceRoot":"","sources":["../../../../src/nodes/data/data-raw-query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAmB,MAAM,UAAU,CAAA;AAyBhE,eAAO,MAAM,YAAY,EAAE,oBAM1B,CAAA"}
1
+ {"version":3,"file":"data-raw-query.d.ts","sourceRoot":"","sources":["../../../../src/nodes/data/data-raw-query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAmB,MAAM,UAAU,CAAA;AA+BhE,eAAO,MAAM,YAAY,EAAE,oBAM1B,CAAA"}
@@ -2,12 +2,18 @@ import { handlerToString } from '../types';
2
2
  async function data_raw_query(config, context) {
3
3
  const dataSourceId = config.dataSourceId;
4
4
  const query = config.query;
5
+ // SECURITY: values that back the query's $N placeholders ride here as bound
6
+ // params, never interpolated into the SQL text. The generation net stored each
7
+ // as a {{…}} token; resolveConfig has already substituted them to concrete
8
+ // values by the time this handler runs. Empty/absent when the query is a static
9
+ // literal (backward-compat: the API route then runs it unparameterized).
10
+ const params = Array.isArray(config.params) ? config.params : [];
5
11
  const baseUrl = (context && context.__baseUrl) || '';
6
12
  try {
7
13
  const response = await fetch(baseUrl + '/api/data/' + dataSourceId + '/raw-query', {
8
14
  method: 'POST',
9
15
  headers: { 'Content-Type': 'application/json' },
10
- body: JSON.stringify({ query }),
16
+ body: JSON.stringify({ query, params }),
11
17
  });
12
18
  const data = await response.json();
13
19
  if (!response.ok) {
@@ -1 +1 @@
1
- {"version":3,"file":"data-raw-query.js","sourceRoot":"","sources":["../../../../src/nodes/data/data-raw-query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,eAAe,EAAE,MAAM,UAAU,CAAA;AAEhE,KAAK,UAAU,cAAc,CAAC,MAAW,EAAE,OAAY;IACrD,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,CAAA;IACxC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAA;IAC1B,MAAM,OAAO,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,CAAA;IAEpD,IAAI;QACF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,GAAG,YAAY,GAAG,YAAY,GAAG,YAAY,EAAE;YACjF,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC;SAChC,CAAC,CAAA;QAEF,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;QAElC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;YAChB,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,kBAAkB,EAAE,CAAA;SACzE;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE,CAAA;QAC5B,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;KAC9B;IAAC,OAAO,GAAY,EAAE;QACrB,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,CAAA;KAC/D;AACH,CAAC;AACD,MAAM,CAAC,MAAM,YAAY,GAAyB;IAChD,QAAQ,EAAE,gBAAgB;IAC1B,YAAY,EAAE,QAAQ;IACtB,eAAe;QACb,OAAO,eAAe,CAAC,cAAc,CAAC,CAAA;IACxC,CAAC;CACF,CAAA"}
1
+ {"version":3,"file":"data-raw-query.js","sourceRoot":"","sources":["../../../../src/nodes/data/data-raw-query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,eAAe,EAAE,MAAM,UAAU,CAAA;AAEhE,KAAK,UAAU,cAAc,CAAC,MAAW,EAAE,OAAY;IACrD,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,CAAA;IACxC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAA;IAC1B,4EAA4E;IAC5E,+EAA+E;IAC/E,2EAA2E;IAC3E,gFAAgF;IAChF,yEAAyE;IACzE,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAA;IAChE,MAAM,OAAO,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,CAAA;IAEpD,IAAI;QACF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,GAAG,YAAY,GAAG,YAAY,GAAG,YAAY,EAAE;YACjF,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;SACxC,CAAC,CAAA;QAEF,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;QAElC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;YAChB,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,kBAAkB,EAAE,CAAA;SACzE;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE,CAAA;QAC5B,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;KAC9B;IAAC,OAAO,GAAY,EAAE;QACrB,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,CAAA;KAC/D;AACH,CAAC;AACD,MAAM,CAAC,MAAM,YAAY,GAAyB;IAChD,QAAQ,EAAE,gBAAgB;IAC1B,YAAY,EAAE,QAAQ;IACtB,eAAe;QACb,OAAO,eAAe,CAAC,cAAc,CAAC,CAAA;IACxC,CAAC;CACF,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"data-select.d.ts","sourceRoot":"","sources":["../../../../src/nodes/data/data-select.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAmB,MAAM,UAAU,CAAA;AAoEhE,eAAO,MAAM,UAAU,EAAE,oBAMxB,CAAA"}
1
+ {"version":3,"file":"data-select.d.ts","sourceRoot":"","sources":["../../../../src/nodes/data/data-select.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAmB,MAAM,UAAU,CAAA;AAiHhE,eAAO,MAAM,UAAU,EAAE,oBAMxB,CAAA"}
@@ -8,7 +8,52 @@ async function data_select(config, context) {
8
8
  const limit = config.limit;
9
9
  const skip = config.skip;
10
10
  const rawQueryUserPart = config.rawQueryUserPart;
11
+ // SECURITY: bound values that back the raw override's $N placeholders. The
12
+ // generation net emitted them alongside rawQueryUserPart; resolveConfig has
13
+ // already substituted the {{…}} tokens to concrete values here.
14
+ const rawQueryUserPartParams = Array.isArray(config.rawQueryUserPartParams)
15
+ ? config.rawQueryUserPartParams
16
+ : [];
11
17
  const baseUrl = (context && context.__baseUrl) || '';
18
+ function isEmptyFilterValue(value) {
19
+ if (value === undefined || value === null)
20
+ return true;
21
+ if (typeof value === 'string' && value.trim() === '')
22
+ return true;
23
+ if (Array.isArray(value) && value.length === 0)
24
+ return true;
25
+ return false;
26
+ }
27
+ function isAllSentinel(value, filter) {
28
+ if (typeof value !== 'string')
29
+ return false;
30
+ const normalized = value.trim().toLowerCase();
31
+ const configured = filter && filter.treatAsAll;
32
+ if (typeof configured === 'string' && configured.trim().toLowerCase() === normalized) {
33
+ return true;
34
+ }
35
+ return (normalized === 'all' ||
36
+ normalized === 'any' ||
37
+ normalized === 'everything' ||
38
+ normalized === '__all__');
39
+ }
40
+ function shouldSkipOptionalFilter(filter) {
41
+ if (!filter)
42
+ return true;
43
+ const value = filter.destination !== undefined ? filter.destination : filter.value;
44
+ if (isEmptyFilterValue(value))
45
+ return true;
46
+ if (isAllSentinel(value, filter))
47
+ return true;
48
+ if (Array.isArray(filter.skipIfValue) && filter.skipIfValue.indexOf(value) !== -1)
49
+ return true;
50
+ if (filter.skipIfEmpty === true && isEmptyFilterValue(value))
51
+ return true;
52
+ return false;
53
+ }
54
+ const effectiveFilters = filters.filter(function (filter) {
55
+ return !shouldSkipOptionalFilter(filter);
56
+ });
12
57
  // A filter whose value is the unresolved route-param sentinel (see
13
58
  // resolveTemplateTokenString in runtime-utils) — e.g. a select scoped to
14
59
  // {{Current Page Entity.id}} that runs on a page with no such route param
@@ -17,8 +62,8 @@ async function data_select(config, context) {
17
62
  // WHOLE workflow (a single unresolvable filter must never kill the note-create
18
63
  // submit). Never fall through to an unscoped query. Observable via the warn +
19
64
  // the __skippedUnavailableFilter marker.
20
- for (let __fi = 0; __fi < filters.length; __fi++) {
21
- const __f = filters[__fi];
65
+ for (let __fi = 0; __fi < effectiveFilters.length; __fi++) {
66
+ const __f = effectiveFilters[__fi];
22
67
  if (__f &&
23
68
  (__f.value === '__TQ_UNRESOLVED_ROUTE_PARAM__' ||
24
69
  __f.destination === '__TQ_UNRESOLVED_ROUTE_PARAM__')) {
@@ -32,7 +77,7 @@ async function data_select(config, context) {
32
77
  }
33
78
  }
34
79
  try {
35
- const payload = { tableName, filters, sorts, selectedColumns };
80
+ const payload = { tableName, filters: effectiveFilters, sorts, selectedColumns };
36
81
  if (limit !== undefined && limit !== null) {
37
82
  payload.limit = limit;
38
83
  }
@@ -41,6 +86,9 @@ async function data_select(config, context) {
41
86
  }
42
87
  if (rawQueryUserPart) {
43
88
  payload.rawQueryUserPart = rawQueryUserPart;
89
+ if (rawQueryUserPartParams.length > 0) {
90
+ payload.rawQueryUserPartParams = rawQueryUserPartParams;
91
+ }
44
92
  }
45
93
  const response = await fetch(baseUrl + '/api/data/' + dataSourceId + '/select', {
46
94
  method: 'POST',
@@ -1 +1 @@
1
- {"version":3,"file":"data-select.js","sourceRoot":"","sources":["../../../../src/nodes/data/data-select.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"data-select.js","sourceRoot":"","sources":["../../../../src/nodes/data/data-select.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"data-update-item.d.ts","sourceRoot":"","sources":["../../../../src/nodes/data/data-update-item.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAmB,MAAM,UAAU,CAAA;AAmGhE,eAAO,MAAM,cAAc,EAAE,oBAM5B,CAAA"}
1
+ {"version":3,"file":"data-update-item.d.ts","sourceRoot":"","sources":["../../../../src/nodes/data/data-update-item.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAmB,MAAM,UAAU,CAAA;AA4JhE,eAAO,MAAM,cAAc,EAAE,oBAM5B,CAAA"}
@@ -24,7 +24,13 @@ async function data_update_item(config, context) {
24
24
  __col +
25
25
  '" needs a page route param not available here; no rows updated (workflow continues)');
26
26
  }
27
- return { id: null, updatedCount: 0, success: true, __skippedUnavailableFilter: true };
27
+ return {
28
+ id: null,
29
+ updatedCount: 0,
30
+ affected: 0,
31
+ success: true,
32
+ __skippedUnavailableFilter: true,
33
+ };
28
34
  }
29
35
  }
30
36
  if (Array.isArray(columnMappings)) {
@@ -44,6 +50,44 @@ async function data_update_item(config, context) {
44
50
  }
45
51
  }
46
52
  }
53
+ // A columnMapping whose resolved value is `undefined` means its binding never
54
+ // produced a value: an unread page-entity column, or (most commonly) an empty
55
+ // form field that general-extract-form-data omits by default. Sending it would
56
+ // write NULL and break a NOT NULL column — run d9a24741 blanked
57
+ // guests.full_name from an un-prefilled guest_name input. OMIT such mappings so
58
+ // the column keeps its stored value. (An intentional null — e.g. a route-param
59
+ // sentinel degraded above — is preserved: only `undefined` is dropped.)
60
+ let effectiveColumnMappings = columnMappings;
61
+ if (Array.isArray(columnMappings)) {
62
+ effectiveColumnMappings = columnMappings.filter(function (__m) {
63
+ return !(__m && typeof __m === 'object' && __m.value === undefined);
64
+ });
65
+ }
66
+ else if (columnMappings && typeof columnMappings === 'object') {
67
+ effectiveColumnMappings = {};
68
+ const __ck = Object.keys(columnMappings);
69
+ for (let __ci = 0; __ci < __ck.length; __ci++) {
70
+ if (columnMappings[__ck[__ci]] !== undefined) {
71
+ ;
72
+ effectiveColumnMappings[__ck[__ci]] = columnMappings[__ck[__ci]];
73
+ }
74
+ }
75
+ }
76
+ const __hasWrites = Array.isArray(effectiveColumnMappings)
77
+ ? effectiveColumnMappings.length > 0
78
+ : !!effectiveColumnMappings && Object.keys(effectiveColumnMappings).length > 0;
79
+ if (!__hasWrites) {
80
+ // Nothing resolvable to write — never send an empty UPDATE (the DB would
81
+ // reject it / touch nothing). Report a clean zero-row no-op so a downstream
82
+ // updatedCount/affected gate takes its "no change" branch.
83
+ return {
84
+ id: null,
85
+ updatedCount: 0,
86
+ affected: 0,
87
+ success: true,
88
+ __skippedEmptyUpdate: true,
89
+ };
90
+ }
47
91
  // Same anonymous-user hint as data-create-item — a workflow that
48
92
  // updates a row written by a guest must be able to re-stamp its
49
93
  // ownership column with the same anon UUID rather than NULL.
@@ -64,7 +108,12 @@ async function data_update_item(config, context) {
64
108
  }
65
109
  }
66
110
  try {
67
- const reqBody = { tableName, filters, columnMappings, returnUpdated: true };
111
+ const reqBody = {
112
+ tableName,
113
+ filters,
114
+ columnMappings: effectiveColumnMappings,
115
+ returnUpdated: true,
116
+ };
68
117
  if (__anonymousUserId) {
69
118
  reqBody.__anonymousUserId = __anonymousUserId;
70
119
  }
@@ -80,12 +129,16 @@ async function data_update_item(config, context) {
80
129
  });
81
130
  const data = await response.json();
82
131
  if (!response.ok) {
83
- return { id: null, updatedCount: 0, error: data.error || 'Update item failed' };
132
+ return { id: null, updatedCount: 0, affected: 0, error: data.error || 'Update item failed' };
84
133
  }
85
- return Object.assign(Object.assign({ id: data.id || null }, (data.item || {})), { updatedCount: data.updatedCount || 0 });
134
+ // `affected` mirrors `updatedCount` a success gate authored against either
135
+ // synonym (the AI schema historically advertised `affected`) must resolve.
136
+ // Placed after the row spread so it can't be shadowed by a table column.
137
+ const __updated = data.updatedCount || 0;
138
+ return Object.assign(Object.assign({ id: data.id || null }, (data.item || {})), { updatedCount: __updated, affected: __updated });
86
139
  }
87
140
  catch (err) {
88
- return { id: null, updatedCount: 0, error: err.message };
141
+ return { id: null, updatedCount: 0, affected: 0, error: err.message };
89
142
  }
90
143
  }
91
144
  export const dataUpdateItem = {
@@ -1 +1 @@
1
- {"version":3,"file":"data-update-item.js","sourceRoot":"","sources":["../../../../src/nodes/data/data-update-item.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"data-update-item.js","sourceRoot":"","sources":["../../../../src/nodes/data/data-update-item.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"general-extract-form-data.d.ts","sourceRoot":"","sources":["../../../../src/nodes/general/general-extract-form-data.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAmB,MAAM,UAAU,CAAA;AA2KhE,eAAO,MAAM,sBAAsB,EAAE,oBAMpC,CAAA"}
1
+ {"version":3,"file":"general-extract-form-data.d.ts","sourceRoot":"","sources":["../../../../src/nodes/general/general-extract-form-data.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAmB,MAAM,UAAU,CAAA;AA+MhE,eAAO,MAAM,sBAAsB,EAAE,oBAMpC,CAAA"}
@@ -93,10 +93,46 @@ async function general_extract_form_data(config, context) {
93
93
  }
94
94
  }
95
95
  const fieldKeys = Object.keys(fields);
96
- const result = { fields };
96
+ const result = { fields, formData: fields };
97
97
  for (let fi = 0; fi < fieldKeys.length; fi++) {
98
98
  result[fieldKeys[fi]] = fields[fieldKeys[fi]];
99
99
  }
100
+ // Workflows generated/imported from HTML often refer to a form control by
101
+ // its DOM id (`class-session-select`) while FormData exposes submitted
102
+ // values by name (`class_session_id`). Preserve the canonical name keys
103
+ // above, and add non-overwriting aliases for id/data-form-field-id so both
104
+ // conventions resolve to the same submitted value.
105
+ try {
106
+ const addAlias = (alias, name) => {
107
+ if (!alias || !name)
108
+ return;
109
+ if (fields[name] === undefined)
110
+ return;
111
+ if (result[alias] === undefined) {
112
+ result[alias] = fields[name];
113
+ }
114
+ };
115
+ const controls = formEl.querySelectorAll('input[name], select[name], textarea[name], button[name]');
116
+ for (let ci = 0; ci < controls.length; ci++) {
117
+ const control = controls[ci];
118
+ addAlias(control.id, control.name);
119
+ addAlias(control.getAttribute('data-form-field-id'), control.name);
120
+ }
121
+ const outsideControls = document.querySelectorAll('input[name], select[name], textarea[name], button[name]');
122
+ for (let oi = 0; oi < outsideControls.length; oi++) {
123
+ const control = outsideControls[oi];
124
+ if (formEl.contains(control))
125
+ continue;
126
+ const ownerForm = control.closest('form');
127
+ if (ownerForm && ownerForm !== formEl)
128
+ continue;
129
+ addAlias(control.id, control.name);
130
+ addAlias(control.getAttribute('data-form-field-id'), control.name);
131
+ }
132
+ }
133
+ catch (_aliasErr) {
134
+ /* aliases are best-effort; canonical name-based fields remain intact */
135
+ }
100
136
  // Diagnostic: surface any required inputs whose value is empty at extraction
101
137
  // time so downstream custom-JS validators have something concrete to report
102
138
  // instead of a generic "please fill in all required fields" message.