@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.
- package/__tests__/client-config-redaction.test.ts +192 -0
- package/__tests__/data-api-boolean-checkbox-coercion.test.ts +143 -0
- package/__tests__/data-api-safe-query.test.ts +3 -1
- package/__tests__/data-update-item-runtime.test.ts +116 -0
- package/__tests__/raw-query-param-binding.test.ts +216 -0
- package/__tests__/runtime-template-token-resolution.test.ts +38 -0
- package/dist/cjs/data-api-route-generator.d.ts.map +1 -1
- package/dist/cjs/data-api-route-generator.js +92 -6
- package/dist/cjs/data-api-route-generator.js.map +1 -1
- package/dist/cjs/executor-generator.d.ts.map +1 -1
- package/dist/cjs/executor-generator.js +31 -0
- package/dist/cjs/executor-generator.js.map +1 -1
- package/dist/cjs/nodes/data/data-delete-item.d.ts.map +1 -1
- package/dist/cjs/nodes/data/data-delete-item.js +15 -4
- package/dist/cjs/nodes/data/data-delete-item.js.map +1 -1
- package/dist/cjs/nodes/data/data-raw-query.d.ts.map +1 -1
- package/dist/cjs/nodes/data/data-raw-query.js +7 -1
- package/dist/cjs/nodes/data/data-raw-query.js.map +1 -1
- package/dist/cjs/nodes/data/data-select.d.ts.map +1 -1
- package/dist/cjs/nodes/data/data-select.js +51 -3
- package/dist/cjs/nodes/data/data-select.js.map +1 -1
- package/dist/cjs/nodes/data/data-update-item.d.ts.map +1 -1
- package/dist/cjs/nodes/data/data-update-item.js +58 -5
- package/dist/cjs/nodes/data/data-update-item.js.map +1 -1
- package/dist/cjs/nodes/general/general-extract-form-data.d.ts.map +1 -1
- package/dist/cjs/nodes/general/general-extract-form-data.js +37 -1
- package/dist/cjs/nodes/general/general-extract-form-data.js.map +1 -1
- package/dist/cjs/segment-splitter.d.ts +26 -2
- package/dist/cjs/segment-splitter.d.ts.map +1 -1
- package/dist/cjs/segment-splitter.js +45 -1
- package/dist/cjs/segment-splitter.js.map +1 -1
- package/dist/cjs/sql-query-validator.d.ts +40 -0
- package/dist/cjs/sql-query-validator.d.ts.map +1 -1
- package/dist/cjs/sql-query-validator.js +49 -1
- package/dist/cjs/sql-query-validator.js.map +1 -1
- package/dist/cjs/tsconfig.tsbuildinfo +1 -1
- package/dist/cjs/workflow-component-plugin.d.ts.map +1 -1
- package/dist/cjs/workflow-component-plugin.js +22 -8
- package/dist/cjs/workflow-component-plugin.js.map +1 -1
- package/dist/cjs/workflow-project-plugin.d.ts.map +1 -1
- package/dist/cjs/workflow-project-plugin.js +8 -2
- package/dist/cjs/workflow-project-plugin.js.map +1 -1
- package/dist/esm/data-api-route-generator.d.ts.map +1 -1
- package/dist/esm/data-api-route-generator.js +92 -6
- package/dist/esm/data-api-route-generator.js.map +1 -1
- package/dist/esm/executor-generator.d.ts.map +1 -1
- package/dist/esm/executor-generator.js +31 -0
- package/dist/esm/executor-generator.js.map +1 -1
- package/dist/esm/nodes/data/data-delete-item.d.ts.map +1 -1
- package/dist/esm/nodes/data/data-delete-item.js +15 -4
- package/dist/esm/nodes/data/data-delete-item.js.map +1 -1
- package/dist/esm/nodes/data/data-raw-query.d.ts.map +1 -1
- package/dist/esm/nodes/data/data-raw-query.js +7 -1
- package/dist/esm/nodes/data/data-raw-query.js.map +1 -1
- package/dist/esm/nodes/data/data-select.d.ts.map +1 -1
- package/dist/esm/nodes/data/data-select.js +51 -3
- package/dist/esm/nodes/data/data-select.js.map +1 -1
- package/dist/esm/nodes/data/data-update-item.d.ts.map +1 -1
- package/dist/esm/nodes/data/data-update-item.js +58 -5
- package/dist/esm/nodes/data/data-update-item.js.map +1 -1
- package/dist/esm/nodes/general/general-extract-form-data.d.ts.map +1 -1
- package/dist/esm/nodes/general/general-extract-form-data.js +37 -1
- package/dist/esm/nodes/general/general-extract-form-data.js.map +1 -1
- package/dist/esm/segment-splitter.d.ts +26 -2
- package/dist/esm/segment-splitter.d.ts.map +1 -1
- package/dist/esm/segment-splitter.js +42 -0
- package/dist/esm/segment-splitter.js.map +1 -1
- package/dist/esm/sql-query-validator.d.ts +40 -0
- package/dist/esm/sql-query-validator.d.ts.map +1 -1
- package/dist/esm/sql-query-validator.js +47 -0
- package/dist/esm/sql-query-validator.js.map +1 -1
- package/dist/esm/tsconfig.tsbuildinfo +1 -1
- package/dist/esm/workflow-component-plugin.d.ts.map +1 -1
- package/dist/esm/workflow-component-plugin.js +23 -9
- package/dist/esm/workflow-component-plugin.js.map +1 -1
- package/dist/esm/workflow-project-plugin.d.ts.map +1 -1
- package/dist/esm/workflow-project-plugin.js +9 -3
- package/dist/esm/workflow-project-plugin.js.map +1 -1
- package/package.json +4 -4
- package/src/data-api-route-generator.ts +92 -6
- package/src/executor-generator.ts +31 -0
- package/src/nodes/data/data-delete-item.ts +15 -4
- package/src/nodes/data/data-raw-query.ts +7 -1
- package/src/nodes/data/data-select.ts +48 -3
- package/src/nodes/data/data-update-item.ts +62 -5
- package/src/nodes/general/general-extract-form-data.ts +37 -1
- package/src/segment-splitter.ts +49 -0
- package/src/sql-query-validator.ts +64 -0
- package/src/workflow-component-plugin.ts +23 -3
- package/src/workflow-project-plugin.ts +18 -3
|
@@ -137,6 +137,44 @@ describe('workflow runtime template-token resolution', () => {
|
|
|
137
137
|
expect(utils.finalizeResolvedConfig('data-select', cfg)).toBeNull()
|
|
138
138
|
expect(cfg.filters[0].value).toBeNull()
|
|
139
139
|
})
|
|
140
|
+
|
|
141
|
+
// An unresolvable {{…}} template EXPRESSION/embedded token left in a filter
|
|
142
|
+
// value would otherwise reach SQL as literal text (run d9a24741 reservations
|
|
143
|
+
// filter: "{{state.filterDateEnd || '2099-12-31'}} 23:59:59").
|
|
144
|
+
it('DROPS a data-select filter whose value still holds an unresolved {{…}} (optional-filter degrade)', () => {
|
|
145
|
+
const cfg = {
|
|
146
|
+
filters: [
|
|
147
|
+
{ field: 'status', value: 'active', operator: '=' },
|
|
148
|
+
{
|
|
149
|
+
field: 'start_time',
|
|
150
|
+
value: "{{state.filterDateEnd || '2099-12-31'}} 23:59:59",
|
|
151
|
+
operator: '<=',
|
|
152
|
+
},
|
|
153
|
+
],
|
|
154
|
+
}
|
|
155
|
+
const error = utils.finalizeResolvedConfig('data-select', cfg)
|
|
156
|
+
expect(error).toBeNull()
|
|
157
|
+
expect(cfg.filters).toHaveLength(1)
|
|
158
|
+
expect(cfg.filters[0].field).toBe('status')
|
|
159
|
+
})
|
|
160
|
+
|
|
161
|
+
it('ERRORS on an unresolved {{…}} filter for a WRITE (never an unscoped mutation)', () => {
|
|
162
|
+
const cfg = {
|
|
163
|
+
tableName: 'guests',
|
|
164
|
+
filters: [{ field: 'id', value: '{{Current Page Entity.guest_id}}', operator: '=' }],
|
|
165
|
+
}
|
|
166
|
+
const error = utils.finalizeResolvedConfig('data-update-item', cfg)
|
|
167
|
+
expect(error).toContain('unresolved template')
|
|
168
|
+
expect(cfg.filters).toHaveLength(0)
|
|
169
|
+
})
|
|
170
|
+
|
|
171
|
+
it('keeps a fully-resolved filter value untouched', () => {
|
|
172
|
+
const cfg = {
|
|
173
|
+
filters: [{ field: 'start_time', value: '2026-07-08 23:59:59', operator: '<=' }],
|
|
174
|
+
}
|
|
175
|
+
expect(utils.finalizeResolvedConfig('data-select', cfg)).toBeNull()
|
|
176
|
+
expect(cfg.filters).toHaveLength(1)
|
|
177
|
+
})
|
|
140
178
|
})
|
|
141
179
|
|
|
142
180
|
describe('executeNodes routes the validation error to the workflow error handler', () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-api-route-generator.d.ts","sourceRoot":"","sources":["../../src/data-api-route-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAaH,eAAO,MAAM,iBAAiB,kBAAmB,IAAI,MAAM,CAAC,KAAG,OAO9D,CAAA;AAED,MAAM,WAAW,mBAAmB;IAIlC,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAQ3B,qBAAqB,CAAC,EAAE,OAAO,CAAA;IAI/B,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED,eAAO,MAAM,oBAAoB,aAAa,mBAAmB,KAAQ,
|
|
1
|
+
{"version":3,"file":"data-api-route-generator.d.ts","sourceRoot":"","sources":["../../src/data-api-route-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAaH,eAAO,MAAM,iBAAiB,kBAAmB,IAAI,MAAM,CAAC,KAAG,OAO9D,CAAA;AAED,MAAM,WAAW,mBAAmB;IAIlC,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAQ3B,qBAAqB,CAAC,EAAE,OAAO,CAAA;IAI/B,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED,eAAO,MAAM,oBAAoB,aAAa,mBAAmB,KAAQ,MA+0BxE,CAAA"}
|
|
@@ -153,9 +153,26 @@ async function safeQuery(client, sql, params, mode) {
|
|
|
153
153
|
}
|
|
154
154
|
}
|
|
155
155
|
|
|
156
|
-
function
|
|
156
|
+
function isSkippableFilterValue(value) {
|
|
157
|
+
if (value === undefined || value === null) return true;
|
|
158
|
+
if (typeof value === 'string' && value.trim() === '') return true;
|
|
159
|
+
if (Array.isArray(value) && value.length === 0) return true;
|
|
160
|
+
return false;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
function isAllSentinelFilterValue(value, filter) {
|
|
164
|
+
if (typeof value !== 'string') return false;
|
|
165
|
+
var normalized = value.trim().toLowerCase();
|
|
166
|
+
if (filter && typeof filter.treatAsAll === 'string' && filter.treatAsAll.trim().toLowerCase() === normalized) {
|
|
167
|
+
return true;
|
|
168
|
+
}
|
|
169
|
+
return normalized === 'all' || normalized === 'any' || normalized === 'everything' || normalized === '__all__';
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
function buildWhereClause(filters, queryParams, startIndex, options) {
|
|
157
173
|
var conditions = [];
|
|
158
174
|
var paramIndex = startIndex;
|
|
175
|
+
var skipOptionalEmpty = !!(options && options.skipOptionalEmpty);
|
|
159
176
|
|
|
160
177
|
if (!filters || !Array.isArray(filters) || filters.length === 0) {
|
|
161
178
|
return { clause: '', paramIndex: paramIndex };
|
|
@@ -171,6 +188,7 @@ function buildWhereClause(filters, queryParams, startIndex) {
|
|
|
171
188
|
var operand = f.operand || f.operator || '=';
|
|
172
189
|
|
|
173
190
|
if (value === undefined) continue;
|
|
191
|
+
if (skipOptionalEmpty && (isSkippableFilterValue(value) || isAllSentinelFilterValue(value, f))) continue;
|
|
174
192
|
|
|
175
193
|
if (Array.isArray(value)) {
|
|
176
194
|
if (value.length === 0) continue;
|
|
@@ -188,6 +206,37 @@ function buildWhereClause(filters, queryParams, startIndex) {
|
|
|
188
206
|
conditions.push(field + ' IS NOT NULL');
|
|
189
207
|
}
|
|
190
208
|
} else {
|
|
209
|
+
var normalizedOperand = String(operand || '=').toLowerCase();
|
|
210
|
+
if (normalizedOperand === 'contains' || normalizedOperand === 'not_contains' || normalizedOperand === 'not-contains') {
|
|
211
|
+
if (isSkippableFilterValue(value)) {
|
|
212
|
+
conditions.push('FALSE');
|
|
213
|
+
continue;
|
|
214
|
+
}
|
|
215
|
+
conditions.push(field + (normalizedOperand === 'contains' ? ' ILIKE ' : ' NOT ILIKE ') + '$' + paramIndex);
|
|
216
|
+
queryParams.push('%' + String(value) + '%');
|
|
217
|
+
paramIndex++;
|
|
218
|
+
continue;
|
|
219
|
+
}
|
|
220
|
+
if (normalizedOperand === 'startswith' || normalizedOperand === 'starts_with' || normalizedOperand === 'starts-with') {
|
|
221
|
+
if (isSkippableFilterValue(value)) {
|
|
222
|
+
conditions.push('FALSE');
|
|
223
|
+
continue;
|
|
224
|
+
}
|
|
225
|
+
conditions.push(field + ' ILIKE $' + paramIndex);
|
|
226
|
+
queryParams.push(String(value) + '%');
|
|
227
|
+
paramIndex++;
|
|
228
|
+
continue;
|
|
229
|
+
}
|
|
230
|
+
if (normalizedOperand === 'endswith' || normalizedOperand === 'ends_with' || normalizedOperand === 'ends-with') {
|
|
231
|
+
if (isSkippableFilterValue(value)) {
|
|
232
|
+
conditions.push('FALSE');
|
|
233
|
+
continue;
|
|
234
|
+
}
|
|
235
|
+
conditions.push(field + ' ILIKE $' + paramIndex);
|
|
236
|
+
queryParams.push('%' + String(value));
|
|
237
|
+
paramIndex++;
|
|
238
|
+
continue;
|
|
239
|
+
}
|
|
191
240
|
var validOps = ['=', '!=', '>', '<', '>=', '<=', 'LIKE', 'ILIKE'];
|
|
192
241
|
var sqlOp = validOps.indexOf(operand) !== -1 ? operand : '=';
|
|
193
242
|
conditions.push(field + ' ' + sqlOp + ' $' + paramIndex);
|
|
@@ -230,7 +279,7 @@ async function handleSelect(client, body) {
|
|
|
230
279
|
var cols = selectedColumns.length > 0 ? selectedColumns.join(', ') : '*';
|
|
231
280
|
var sql = 'SELECT ' + cols + ' FROM ' + tableName;
|
|
232
281
|
|
|
233
|
-
var where = buildWhereClause(filters, queryParams, 1);
|
|
282
|
+
var where = buildWhereClause(filters, queryParams, 1, { skipOptionalEmpty: true });
|
|
234
283
|
sql += where.clause;
|
|
235
284
|
|
|
236
285
|
if (sorts.length > 0) {
|
|
@@ -255,7 +304,11 @@ async function handleSelect(client, body) {
|
|
|
255
304
|
// Validate the raw user-provided query for forbidden operations
|
|
256
305
|
assertQuerySafe(rawQueryUserPart);
|
|
257
306
|
sql = rawQueryUserPart;
|
|
258
|
-
|
|
307
|
+
// SECURITY: the raw override fully replaces the assembled SELECT, so bind the
|
|
308
|
+
// security net's $N params for it, never inline text. rawQueryUserPartParams
|
|
309
|
+
// carries the workflow values (already resolved by the executor) that back the
|
|
310
|
+
// $1, $2, … placeholders the net emitted into rawQueryUserPart.
|
|
311
|
+
queryParams = Array.isArray(body.rawQueryUserPartParams) ? body.rawQueryUserPartParams : [];
|
|
259
312
|
}
|
|
260
313
|
|
|
261
314
|
// Final validation of the assembled query
|
|
@@ -266,7 +319,7 @@ async function handleSelect(client, body) {
|
|
|
266
319
|
|
|
267
320
|
var countSql = 'SELECT COUNT(*) FROM ' + tableName;
|
|
268
321
|
var countParams = [];
|
|
269
|
-
var countWhere = buildWhereClause(filters, countParams, 1);
|
|
322
|
+
var countWhere = buildWhereClause(filters, countParams, 1, { skipOptionalEmpty: true });
|
|
270
323
|
countSql += countWhere.clause;
|
|
271
324
|
var countResult = await safeQuery(client, countSql, countParams, 'count');
|
|
272
325
|
var count = parseInt(countResult.rows[0].count, 10);
|
|
@@ -283,7 +336,7 @@ async function handleCount(client, body) {
|
|
|
283
336
|
|
|
284
337
|
var queryParams = [];
|
|
285
338
|
var sql = 'SELECT COUNT(*) FROM ' + tableName;
|
|
286
|
-
var where = buildWhereClause(filters, queryParams, 1);
|
|
339
|
+
var where = buildWhereClause(filters, queryParams, 1, { skipOptionalEmpty: true });
|
|
287
340
|
sql += where.clause;
|
|
288
341
|
|
|
289
342
|
var result = await safeQuery(client, sql, queryParams, 'count');
|
|
@@ -317,8 +370,31 @@ function splitCommaOrPgArrayString(val) {
|
|
|
317
370
|
return s.split(',').map(function(x) { return x.trim(); }).filter(Boolean);
|
|
318
371
|
}
|
|
319
372
|
|
|
373
|
+
// HTML checkbox convention: a checked box submits a truthy string value
|
|
374
|
+
// ('on' by default, or the input's own value attribute); an UNCHECKED box
|
|
375
|
+
// is omitted from FormData entirely, which general-extract-form-data (the
|
|
376
|
+
// client-side node that builds the workflow payload) represents as '' /
|
|
377
|
+
// undefined - never false. Without this branch that '' fell through to
|
|
378
|
+
// the generic empty-string-to-null guard below and was written as SQL
|
|
379
|
+
// NULL instead of false: a silent "not featured" -> NULL data corruption
|
|
380
|
+
// in the common case (breaks any WHERE is_featured = true/false filter,
|
|
381
|
+
// since NULL fails three-valued-logic equality), and a hard 23502
|
|
382
|
+
// not-null-violation whenever the boolean column itself is NOT NULL - the
|
|
383
|
+
// exact "update failed" error reported for an unchecked "feature this item"
|
|
384
|
+
// checkbox. "Not submitted" always means unchecked/false for an HTML
|
|
385
|
+
// checkbox, so this mapping is unambiguous and safe for every boolean
|
|
386
|
+
// column, not just one page's flag.
|
|
387
|
+
var BOOLEAN_TRUE_STRINGS = { 'on': 1, 'true': 1, '1': 1 };
|
|
388
|
+
|
|
320
389
|
function coerceValueForPgColumn(col, val, colTypes) {
|
|
321
390
|
var dt = colTypes[col];
|
|
391
|
+
if (dt === 'boolean') {
|
|
392
|
+
if (typeof val === 'boolean') return val;
|
|
393
|
+
if (val === undefined || val === null) return false;
|
|
394
|
+
if (typeof val === 'number') return val !== 0;
|
|
395
|
+
if (typeof val === 'string') return !!BOOLEAN_TRUE_STRINGS[val.trim().toLowerCase()];
|
|
396
|
+
return false;
|
|
397
|
+
}
|
|
322
398
|
if (dt !== 'ARRAY') return val;
|
|
323
399
|
if (val == null) return val;
|
|
324
400
|
if (Array.isArray(val)) return val;
|
|
@@ -647,6 +723,16 @@ async function handleRawQuery(client, body, req) {
|
|
|
647
723
|
return { rows: [], error: 'No query provided' };
|
|
648
724
|
}
|
|
649
725
|
|
|
726
|
+
// SECURITY: bind the workflow's context/state values as POSITIONAL parameters
|
|
727
|
+
// ($1, $2, …) instead of interpolating them into the SQL text. The generation
|
|
728
|
+
// net rewrites every {{state.X}}/{{Current User.id}}/… value interpolation into
|
|
729
|
+
// a $N placeholder and moves the {{…}} token into this sibling params array; the
|
|
730
|
+
// executor resolves those tokens to concrete values before POSTing, so here they
|
|
731
|
+
// arrive as plain bound values. A bound value can never terminate a string literal
|
|
732
|
+
// or alter query structure — SQL injection is impossible for the value class.
|
|
733
|
+
// Legacy raw queries carry no params array and run unparameterized (backward-compat).
|
|
734
|
+
var params = Array.isArray(body.params) ? body.params : [];
|
|
735
|
+
|
|
650
736
|
// Validate the raw query for forbidden operations before execution
|
|
651
737
|
assertQuerySafe(query);
|
|
652
738
|
|
|
@@ -654,7 +740,7 @@ async function handleRawQuery(client, body, req) {
|
|
|
654
740
|
await ensurePgVector(client);
|
|
655
741
|
}
|
|
656
742
|
|
|
657
|
-
var result = await safeQuery(client, query,
|
|
743
|
+
var result = await safeQuery(client, query, params, 'raw-query');
|
|
658
744
|
var rows = Array.isArray(result.rows) ? result.rows : [];
|
|
659
745
|
|
|
660
746
|
// 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,mDAA0D;AAE1D,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;IAC9B,aAAa;IACb,kBAAkB;IAClB,kBAAkB;IAClB,kBAAkB;IAClB,YAAY;IACZ,gBAAgB;CACjB,CAAC,CAAA;AAEK,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;AAPY,QAAA,iBAAiB,qBAO7B;AAqBM,MAAM,oBAAoB,GAAG,CAAC,UAA+B,EAAE,EAAU,EAAE;IAChF,MAAM,aAAa,GAAG,IAAA,wCAAwB,GAAE,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
|
|
1
|
+
{"version":3,"file":"data-api-route-generator.js","sourceRoot":"","sources":["../../src/data-api-route-generator.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG;;;AAEH,mDAA0D;AAE1D,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;IAC9B,aAAa;IACb,kBAAkB;IAClB,kBAAkB;IAClB,kBAAkB;IAClB,YAAY;IACZ,gBAAgB;CACjB,CAAC,CAAA;AAEK,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;AAPY,QAAA,iBAAiB,qBAO7B;AAqBM,MAAM,oBAAoB,GAAG,CAAC,UAA+B,EAAE,EAAU,EAAE;IAChF,MAAM,aAAa,GAAG,IAAA,wCAAwB,GAAE,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;AA/0BY,QAAA,oBAAoB,wBA+0BhC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor-generator.d.ts","sourceRoot":"","sources":["../../src/executor-generator.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,8BAA8B,QAAO,
|
|
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"}
|
|
@@ -297,6 +297,37 @@ function finalizeResolvedConfig(nodeType, config) {
|
|
|
297
297
|
}
|
|
298
298
|
}
|
|
299
299
|
walk(config, false);
|
|
300
|
+
|
|
301
|
+
// BACKSTOP: a data-node FILTER value that STILL holds a literal {{…}} token
|
|
302
|
+
// after resolution is an unresolvable template — a JS expression, an embedded
|
|
303
|
+
// token, or an unknown root the runtime never substitutes (run d9a24741:
|
|
304
|
+
// "{{state.filterDateEnd || '2099-12-31'}} 23:59:59" and
|
|
305
|
+
// "{{Current Page Entity.guest_id}}"). Left alone it reaches SQL as literal
|
|
306
|
+
// text and breaks the query. For a READ (data-select / data-count) DROP the
|
|
307
|
+
// clause — the optional-filter idiom degrades to "no filter" (more rows, never
|
|
308
|
+
// a crash). For a WRITE the filter scopes the mutation, so an unscoped/partial
|
|
309
|
+
// filter is unsafe → surface a validation error (same posture as the
|
|
310
|
+
// route-param sentinel above).
|
|
311
|
+
if (isDataNode && config && Array.isArray(config.filters)) {
|
|
312
|
+
var isReadNode = nodeType === 'data-select' || nodeType === 'data-count';
|
|
313
|
+
var keptFilters = [];
|
|
314
|
+
for (var fi = 0; fi < config.filters.length; fi++) {
|
|
315
|
+
var filt = config.filters[fi];
|
|
316
|
+
var fval = filt && typeof filt === 'object'
|
|
317
|
+
? (filt.value !== undefined ? filt.value : filt.destination)
|
|
318
|
+
: undefined;
|
|
319
|
+
if (typeof fval === 'string' && /\\{\\{[\\s\\S]*?\\}\\}/.test(fval)) {
|
|
320
|
+
if (!isReadNode && !error) {
|
|
321
|
+
var fcol = (filt && (filt.column || filt.field || filt.source)) || 'filter';
|
|
322
|
+
error = 'Filter on "' + fcol + '" carries an unresolved template ({{…}}) and cannot safely scope this write';
|
|
323
|
+
}
|
|
324
|
+
continue; // drop the unresolvable clause
|
|
325
|
+
}
|
|
326
|
+
keptFilters.push(filt);
|
|
327
|
+
}
|
|
328
|
+
config.filters = keptFilters;
|
|
329
|
+
}
|
|
330
|
+
|
|
300
331
|
return error;
|
|
301
332
|
}
|
|
302
333
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor-generator.js","sourceRoot":"","sources":["../../src/executor-generator.ts"],"names":[],"mappings":";;;AAAO,MAAM,8BAA8B,GAAG,GAAW,EAAE;IACzD,OAAO
|
|
1
|
+
{"version":3,"file":"executor-generator.js","sourceRoot":"","sources":["../../src/executor-generator.ts"],"names":[],"mappings":";;;AAAO,MAAM,8BAA8B,GAAG,GAAW,EAAE;IACzD,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAi/BR,CAAA;AACD,CAAC,CAAA;AAn/BY,QAAA,8BAA8B,kCAm/B1C;AAEM,MAAM,yBAAyB,GAAG,GAAW,EAAE;IACpD,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAscR,CAAA;AACD,CAAC,CAAA;AAxcY,QAAA,yBAAyB,6BAwcrC;AAEM,MAAM,yBAAyB,GAAG,GAAW,EAAE;IACpD,OAAO;;;CAGR,CAAA;AACD,CAAC,CAAA;AALY,QAAA,yBAAyB,6BAKrC"}
|
|
@@ -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;
|
|
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"}
|
|
@@ -26,7 +26,13 @@ async function data_delete_item(config, context) {
|
|
|
26
26
|
__col +
|
|
27
27
|
'" needs a page route param not available here; nothing deleted (workflow continues)');
|
|
28
28
|
}
|
|
29
|
-
return {
|
|
29
|
+
return {
|
|
30
|
+
deletedId: null,
|
|
31
|
+
success: true,
|
|
32
|
+
deletedCount: 0,
|
|
33
|
+
affected: 0,
|
|
34
|
+
__skippedUnavailableFilter: true,
|
|
35
|
+
};
|
|
30
36
|
}
|
|
31
37
|
}
|
|
32
38
|
try {
|
|
@@ -46,17 +52,22 @@ async function data_delete_item(config, context) {
|
|
|
46
52
|
deletedId: null,
|
|
47
53
|
success: false,
|
|
48
54
|
deletedCount: 0,
|
|
55
|
+
affected: 0,
|
|
49
56
|
error: data.error || 'Delete item failed',
|
|
50
57
|
};
|
|
51
58
|
}
|
|
59
|
+
// `affected` mirrors `deletedCount` so a success gate authored against either
|
|
60
|
+
// synonym resolves (the AI schema historically advertised `affected`).
|
|
61
|
+
const __deleted = data.deletedCount || 0;
|
|
52
62
|
return {
|
|
53
63
|
deletedId: data.deletedId || null,
|
|
54
|
-
success:
|
|
55
|
-
deletedCount:
|
|
64
|
+
success: __deleted > 0,
|
|
65
|
+
deletedCount: __deleted,
|
|
66
|
+
affected: __deleted,
|
|
56
67
|
};
|
|
57
68
|
}
|
|
58
69
|
catch (err) {
|
|
59
|
-
return { deletedId: null, success: false, error: err.message };
|
|
70
|
+
return { deletedId: null, success: false, affected: 0, error: err.message };
|
|
60
71
|
}
|
|
61
72
|
}
|
|
62
73
|
exports.dataDeleteItem = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-delete-item.js","sourceRoot":"","sources":["../../../../src/nodes/data/data-delete-item.ts"],"names":[],"mappings":";;;AAAA,oCAAgE;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,
|
|
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;
|
|
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"}
|
|
@@ -5,12 +5,18 @@ const types_1 = require("../types");
|
|
|
5
5
|
async function data_raw_query(config, context) {
|
|
6
6
|
const dataSourceId = config.dataSourceId;
|
|
7
7
|
const query = config.query;
|
|
8
|
+
// SECURITY: values that back the query's $N placeholders ride here as bound
|
|
9
|
+
// params, never interpolated into the SQL text. The generation net stored each
|
|
10
|
+
// as a {{…}} token; resolveConfig has already substituted them to concrete
|
|
11
|
+
// values by the time this handler runs. Empty/absent when the query is a static
|
|
12
|
+
// literal (backward-compat: the API route then runs it unparameterized).
|
|
13
|
+
const params = Array.isArray(config.params) ? config.params : [];
|
|
8
14
|
const baseUrl = (context && context.__baseUrl) || '';
|
|
9
15
|
try {
|
|
10
16
|
const response = await fetch(baseUrl + '/api/data/' + dataSourceId + '/raw-query', {
|
|
11
17
|
method: 'POST',
|
|
12
18
|
headers: { 'Content-Type': 'application/json' },
|
|
13
|
-
body: JSON.stringify({ query }),
|
|
19
|
+
body: JSON.stringify({ query, params }),
|
|
14
20
|
});
|
|
15
21
|
const data = await response.json();
|
|
16
22
|
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,oCAAgE;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;
|
|
1
|
+
{"version":3,"file":"data-raw-query.js","sourceRoot":"","sources":["../../../../src/nodes/data/data-raw-query.ts"],"names":[],"mappings":";;;AAAA,oCAAgE;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;AACY,QAAA,YAAY,GAAyB;IAChD,QAAQ,EAAE,gBAAgB;IAC1B,YAAY,EAAE,QAAQ;IACtB,eAAe;QACb,OAAO,IAAA,uBAAe,EAAC,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;
|
|
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"}
|
|
@@ -11,7 +11,52 @@ async function data_select(config, context) {
|
|
|
11
11
|
const limit = config.limit;
|
|
12
12
|
const skip = config.skip;
|
|
13
13
|
const rawQueryUserPart = config.rawQueryUserPart;
|
|
14
|
+
// SECURITY: bound values that back the raw override's $N placeholders. The
|
|
15
|
+
// generation net emitted them alongside rawQueryUserPart; resolveConfig has
|
|
16
|
+
// already substituted the {{…}} tokens to concrete values here.
|
|
17
|
+
const rawQueryUserPartParams = Array.isArray(config.rawQueryUserPartParams)
|
|
18
|
+
? config.rawQueryUserPartParams
|
|
19
|
+
: [];
|
|
14
20
|
const baseUrl = (context && context.__baseUrl) || '';
|
|
21
|
+
function isEmptyFilterValue(value) {
|
|
22
|
+
if (value === undefined || value === null)
|
|
23
|
+
return true;
|
|
24
|
+
if (typeof value === 'string' && value.trim() === '')
|
|
25
|
+
return true;
|
|
26
|
+
if (Array.isArray(value) && value.length === 0)
|
|
27
|
+
return true;
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
function isAllSentinel(value, filter) {
|
|
31
|
+
if (typeof value !== 'string')
|
|
32
|
+
return false;
|
|
33
|
+
const normalized = value.trim().toLowerCase();
|
|
34
|
+
const configured = filter && filter.treatAsAll;
|
|
35
|
+
if (typeof configured === 'string' && configured.trim().toLowerCase() === normalized) {
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
return (normalized === 'all' ||
|
|
39
|
+
normalized === 'any' ||
|
|
40
|
+
normalized === 'everything' ||
|
|
41
|
+
normalized === '__all__');
|
|
42
|
+
}
|
|
43
|
+
function shouldSkipOptionalFilter(filter) {
|
|
44
|
+
if (!filter)
|
|
45
|
+
return true;
|
|
46
|
+
const value = filter.destination !== undefined ? filter.destination : filter.value;
|
|
47
|
+
if (isEmptyFilterValue(value))
|
|
48
|
+
return true;
|
|
49
|
+
if (isAllSentinel(value, filter))
|
|
50
|
+
return true;
|
|
51
|
+
if (Array.isArray(filter.skipIfValue) && filter.skipIfValue.indexOf(value) !== -1)
|
|
52
|
+
return true;
|
|
53
|
+
if (filter.skipIfEmpty === true && isEmptyFilterValue(value))
|
|
54
|
+
return true;
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
const effectiveFilters = filters.filter(function (filter) {
|
|
58
|
+
return !shouldSkipOptionalFilter(filter);
|
|
59
|
+
});
|
|
15
60
|
// A filter whose value is the unresolved route-param sentinel (see
|
|
16
61
|
// resolveTemplateTokenString in runtime-utils) — e.g. a select scoped to
|
|
17
62
|
// {{Current Page Entity.id}} that runs on a page with no such route param
|
|
@@ -20,8 +65,8 @@ async function data_select(config, context) {
|
|
|
20
65
|
// WHOLE workflow (a single unresolvable filter must never kill the note-create
|
|
21
66
|
// submit). Never fall through to an unscoped query. Observable via the warn +
|
|
22
67
|
// the __skippedUnavailableFilter marker.
|
|
23
|
-
for (let __fi = 0; __fi <
|
|
24
|
-
const __f =
|
|
68
|
+
for (let __fi = 0; __fi < effectiveFilters.length; __fi++) {
|
|
69
|
+
const __f = effectiveFilters[__fi];
|
|
25
70
|
if (__f &&
|
|
26
71
|
(__f.value === '__TQ_UNRESOLVED_ROUTE_PARAM__' ||
|
|
27
72
|
__f.destination === '__TQ_UNRESOLVED_ROUTE_PARAM__')) {
|
|
@@ -35,7 +80,7 @@ async function data_select(config, context) {
|
|
|
35
80
|
}
|
|
36
81
|
}
|
|
37
82
|
try {
|
|
38
|
-
const payload = { tableName, filters, sorts, selectedColumns };
|
|
83
|
+
const payload = { tableName, filters: effectiveFilters, sorts, selectedColumns };
|
|
39
84
|
if (limit !== undefined && limit !== null) {
|
|
40
85
|
payload.limit = limit;
|
|
41
86
|
}
|
|
@@ -44,6 +89,9 @@ async function data_select(config, context) {
|
|
|
44
89
|
}
|
|
45
90
|
if (rawQueryUserPart) {
|
|
46
91
|
payload.rawQueryUserPart = rawQueryUserPart;
|
|
92
|
+
if (rawQueryUserPartParams.length > 0) {
|
|
93
|
+
payload.rawQueryUserPartParams = rawQueryUserPartParams;
|
|
94
|
+
}
|
|
47
95
|
}
|
|
48
96
|
const response = await fetch(baseUrl + '/api/data/' + dataSourceId + '/select', {
|
|
49
97
|
method: 'POST',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-select.js","sourceRoot":"","sources":["../../../../src/nodes/data/data-select.ts"],"names":[],"mappings":";;;AAAA,oCAAgE;AAEhE,KAAK,UAAU,WAAW,CAAC,MAAW,EAAE,OAAY;IAClD,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,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAA;IAChC,MAAM,eAAe,GAAG,MAAM,CAAC,eAAe,IAAI,EAAE,CAAA;IACpD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAA;IAC1B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAA;IACxB,MAAM,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAA;IAChD,MAAM,OAAO,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,CAAA;IAEpD,mEAAmE;IACnE,yEAAyE;IACzE,0EAA0E;IAC1E,4EAA4E;IAC5E,+EAA+E;IAC/E,+EAA+E;IAC/E,8EAA8E;IAC9E,yCAAyC;IACzC,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,
|
|
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;
|
|
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"}
|
|
@@ -27,7 +27,13 @@ async function data_update_item(config, context) {
|
|
|
27
27
|
__col +
|
|
28
28
|
'" needs a page route param not available here; no rows updated (workflow continues)');
|
|
29
29
|
}
|
|
30
|
-
return {
|
|
30
|
+
return {
|
|
31
|
+
id: null,
|
|
32
|
+
updatedCount: 0,
|
|
33
|
+
affected: 0,
|
|
34
|
+
success: true,
|
|
35
|
+
__skippedUnavailableFilter: true,
|
|
36
|
+
};
|
|
31
37
|
}
|
|
32
38
|
}
|
|
33
39
|
if (Array.isArray(columnMappings)) {
|
|
@@ -47,6 +53,44 @@ async function data_update_item(config, context) {
|
|
|
47
53
|
}
|
|
48
54
|
}
|
|
49
55
|
}
|
|
56
|
+
// A columnMapping whose resolved value is `undefined` means its binding never
|
|
57
|
+
// produced a value: an unread page-entity column, or (most commonly) an empty
|
|
58
|
+
// form field that general-extract-form-data omits by default. Sending it would
|
|
59
|
+
// write NULL and break a NOT NULL column — run d9a24741 blanked
|
|
60
|
+
// guests.full_name from an un-prefilled guest_name input. OMIT such mappings so
|
|
61
|
+
// the column keeps its stored value. (An intentional null — e.g. a route-param
|
|
62
|
+
// sentinel degraded above — is preserved: only `undefined` is dropped.)
|
|
63
|
+
let effectiveColumnMappings = columnMappings;
|
|
64
|
+
if (Array.isArray(columnMappings)) {
|
|
65
|
+
effectiveColumnMappings = columnMappings.filter(function (__m) {
|
|
66
|
+
return !(__m && typeof __m === 'object' && __m.value === undefined);
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
else if (columnMappings && typeof columnMappings === 'object') {
|
|
70
|
+
effectiveColumnMappings = {};
|
|
71
|
+
const __ck = Object.keys(columnMappings);
|
|
72
|
+
for (let __ci = 0; __ci < __ck.length; __ci++) {
|
|
73
|
+
if (columnMappings[__ck[__ci]] !== undefined) {
|
|
74
|
+
;
|
|
75
|
+
effectiveColumnMappings[__ck[__ci]] = columnMappings[__ck[__ci]];
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
const __hasWrites = Array.isArray(effectiveColumnMappings)
|
|
80
|
+
? effectiveColumnMappings.length > 0
|
|
81
|
+
: !!effectiveColumnMappings && Object.keys(effectiveColumnMappings).length > 0;
|
|
82
|
+
if (!__hasWrites) {
|
|
83
|
+
// Nothing resolvable to write — never send an empty UPDATE (the DB would
|
|
84
|
+
// reject it / touch nothing). Report a clean zero-row no-op so a downstream
|
|
85
|
+
// updatedCount/affected gate takes its "no change" branch.
|
|
86
|
+
return {
|
|
87
|
+
id: null,
|
|
88
|
+
updatedCount: 0,
|
|
89
|
+
affected: 0,
|
|
90
|
+
success: true,
|
|
91
|
+
__skippedEmptyUpdate: true,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
50
94
|
// Same anonymous-user hint as data-create-item — a workflow that
|
|
51
95
|
// updates a row written by a guest must be able to re-stamp its
|
|
52
96
|
// ownership column with the same anon UUID rather than NULL.
|
|
@@ -67,7 +111,12 @@ async function data_update_item(config, context) {
|
|
|
67
111
|
}
|
|
68
112
|
}
|
|
69
113
|
try {
|
|
70
|
-
const reqBody = {
|
|
114
|
+
const reqBody = {
|
|
115
|
+
tableName,
|
|
116
|
+
filters,
|
|
117
|
+
columnMappings: effectiveColumnMappings,
|
|
118
|
+
returnUpdated: true,
|
|
119
|
+
};
|
|
71
120
|
if (__anonymousUserId) {
|
|
72
121
|
reqBody.__anonymousUserId = __anonymousUserId;
|
|
73
122
|
}
|
|
@@ -83,12 +132,16 @@ async function data_update_item(config, context) {
|
|
|
83
132
|
});
|
|
84
133
|
const data = await response.json();
|
|
85
134
|
if (!response.ok) {
|
|
86
|
-
return { id: null, updatedCount: 0, error: data.error || 'Update item failed' };
|
|
135
|
+
return { id: null, updatedCount: 0, affected: 0, error: data.error || 'Update item failed' };
|
|
87
136
|
}
|
|
88
|
-
|
|
137
|
+
// `affected` mirrors `updatedCount` — a success gate authored against either
|
|
138
|
+
// synonym (the AI schema historically advertised `affected`) must resolve.
|
|
139
|
+
// Placed after the row spread so it can't be shadowed by a table column.
|
|
140
|
+
const __updated = data.updatedCount || 0;
|
|
141
|
+
return Object.assign(Object.assign({ id: data.id || null }, (data.item || {})), { updatedCount: __updated, affected: __updated });
|
|
89
142
|
}
|
|
90
143
|
catch (err) {
|
|
91
|
-
return { id: null, updatedCount: 0, error: err.message };
|
|
144
|
+
return { id: null, updatedCount: 0, affected: 0, error: err.message };
|
|
92
145
|
}
|
|
93
146
|
}
|
|
94
147
|
exports.dataUpdateItem = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-update-item.js","sourceRoot":"","sources":["../../../../src/nodes/data/data-update-item.ts"],"names":[],"mappings":";;;AAAA,oCAAgE;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,cAAc,GAAG,MAAM,CAAC,cAAc,IAAI,EAAE,CAAA;IAClD,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,qEAAqE;IACrE,8EAA8E;IAC9E,gFAAgF;IAChF,+EAA+E;IAC/E,+EAA+E;IAC/E,8EAA8E;IAC9E,iFAAiF;IACjF,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,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,EAAE,
|
|
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;
|
|
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"}
|