@teleporthq/teleport-plugin-next-workflows 0.43.75 → 0.44.1
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__/_helpers/fake-store-database.ts +428 -0
- package/__tests__/_helpers/invoice-store.ts +382 -0
- package/__tests__/booking-calendar-feed-route.test.ts +494 -0
- package/__tests__/custom-node-result-taken-branch.test.ts +107 -0
- package/__tests__/data-api-date-parser.test.ts +45 -0
- package/__tests__/email-locale-senders.test.ts +3 -1
- package/__tests__/email-sender-name.test.ts +513 -0
- package/__tests__/graph-utils-topological-order.test.ts +155 -1
- package/__tests__/invoice-billing-details.test.ts +384 -0
- package/__tests__/invoice-data-access-replace.test.ts +236 -2
- package/__tests__/invoice-order-items-settle.test.ts +1 -1
- package/__tests__/invoice-payment-email.test.ts +191 -0
- package/__tests__/invoice-regenerate-email.test.ts +288 -0
- package/__tests__/invoice-regenerate-route.test.ts +9 -7
- package/__tests__/invoice-reservation.test.ts +1 -1
- package/__tests__/invoice-tender.test.ts +1 -1
- package/__tests__/middleware-admin-panel-roles.test.ts +127 -0
- package/__tests__/page-arrival-remount.test.ts +247 -0
- package/__tests__/payment-drivers-module.test.ts +19 -0
- package/__tests__/raw-query-error-code.test.ts +47 -0
- package/__tests__/runtime-template-token-resolution.test.ts +16 -0
- package/__tests__/segment-reply-changed-keys.test.ts +31 -0
- package/__tests__/segment-route-skipped-branch.test.ts +101 -0
- package/__tests__/segment-splitter-checkout-order.test.ts +306 -0
- package/__tests__/streaming-on-end-env-filter.test.ts +18 -18
- package/__tests__/streaming-on-end-order.test.ts +387 -0
- package/dist/cjs/account-delete-route-generator.d.ts +1 -0
- package/dist/cjs/account-delete-route-generator.d.ts.map +1 -1
- package/dist/cjs/account-delete-route-generator.js +2 -1
- package/dist/cjs/account-delete-route-generator.js.map +1 -1
- package/dist/cjs/api-route-generator.d.ts.map +1 -1
- package/dist/cjs/api-route-generator.js +23 -13
- package/dist/cjs/api-route-generator.js.map +1 -1
- package/dist/cjs/auth-generator.d.ts +1 -0
- package/dist/cjs/auth-generator.d.ts.map +1 -1
- package/dist/cjs/auth-generator.js +77 -28
- package/dist/cjs/auth-generator.js.map +1 -1
- package/dist/cjs/booking-calendar-feed-route-generator.d.ts +28 -0
- package/dist/cjs/booking-calendar-feed-route-generator.d.ts.map +1 -0
- package/dist/cjs/booking-calendar-feed-route-generator.js +296 -0
- package/dist/cjs/booking-calendar-feed-route-generator.js.map +1 -0
- package/dist/cjs/data-api-route-generator.d.ts.map +1 -1
- package/dist/cjs/data-api-route-generator.js +6 -1
- 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 +39 -28
- package/dist/cjs/executor-generator.js.map +1 -1
- package/dist/cjs/graph-utils.d.ts +31 -1
- package/dist/cjs/graph-utils.d.ts.map +1 -1
- package/dist/cjs/graph-utils.js +112 -10
- package/dist/cjs/graph-utils.js.map +1 -1
- package/dist/cjs/index.d.ts +1 -1
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +2 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/invoice/api-routes-code.d.ts +12 -3
- package/dist/cjs/invoice/api-routes-code.d.ts.map +1 -1
- package/dist/cjs/invoice/api-routes-code.js +152 -21
- package/dist/cjs/invoice/api-routes-code.js.map +1 -1
- package/dist/cjs/invoice/data-access-code.d.ts.map +1 -1
- package/dist/cjs/invoice/data-access-code.js +133 -21
- package/dist/cjs/invoice/data-access-code.js.map +1 -1
- package/dist/cjs/invoice/email-sender-code.d.ts.map +1 -1
- package/dist/cjs/invoice/email-sender-code.js +15 -25
- package/dist/cjs/invoice/email-sender-code.js.map +1 -1
- package/dist/cjs/invoice/index.js +1 -1
- package/dist/cjs/invoice/index.js.map +1 -1
- package/dist/cjs/invoice/invoice-assembly-code.d.ts.map +1 -1
- package/dist/cjs/invoice/invoice-assembly-code.js +50 -6
- package/dist/cjs/invoice/invoice-assembly-code.js.map +1 -1
- package/dist/cjs/invoice/invoice-html-code.d.ts.map +1 -1
- package/dist/cjs/invoice/invoice-html-code.js +13 -2
- package/dist/cjs/invoice/invoice-html-code.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 +11 -1
- package/dist/cjs/nodes/data/data-raw-query.js.map +1 -1
- package/dist/cjs/nodes/email/email-mailgun.d.ts.map +1 -1
- package/dist/cjs/nodes/email/email-mailgun.js +4 -2
- package/dist/cjs/nodes/email/email-mailgun.js.map +1 -1
- package/dist/cjs/nodes/email/email-postmark.d.ts.map +1 -1
- package/dist/cjs/nodes/email/email-postmark.js +5 -2
- package/dist/cjs/nodes/email/email-postmark.js.map +1 -1
- package/dist/cjs/nodes/email/email-resend.d.ts.map +1 -1
- package/dist/cjs/nodes/email/email-resend.js +5 -2
- package/dist/cjs/nodes/email/email-resend.js.map +1 -1
- package/dist/cjs/nodes/email/email-sendgrid.d.ts.map +1 -1
- package/dist/cjs/nodes/email/email-sendgrid.js +8 -2
- package/dist/cjs/nodes/email/email-sendgrid.js.map +1 -1
- package/dist/cjs/nodes/general/general-custom-js.d.ts.map +1 -1
- package/dist/cjs/nodes/general/general-custom-js.js +11 -0
- package/dist/cjs/nodes/general/general-custom-js.js.map +1 -1
- package/dist/cjs/nodes/storage/storage-local-remove.d.ts.map +1 -1
- package/dist/cjs/nodes/storage/storage-local-remove.js +2 -0
- package/dist/cjs/nodes/storage/storage-local-remove.js.map +1 -1
- package/dist/cjs/nodes/storage/storage-local-set.d.ts.map +1 -1
- package/dist/cjs/nodes/storage/storage-local-set.js +4 -0
- package/dist/cjs/nodes/storage/storage-local-set.js.map +1 -1
- package/dist/cjs/page-arrival.d.ts +10 -0
- package/dist/cjs/page-arrival.d.ts.map +1 -0
- package/dist/cjs/page-arrival.js +86 -0
- package/dist/cjs/page-arrival.js.map +1 -0
- package/dist/cjs/payments/index.d.ts +10 -4
- package/dist/cjs/payments/index.d.ts.map +1 -1
- package/dist/cjs/payments/index.js +18 -7
- package/dist/cjs/payments/index.js.map +1 -1
- package/dist/cjs/segment-splitter.d.ts.map +1 -1
- package/dist/cjs/segment-splitter.js +65 -27
- package/dist/cjs/segment-splitter.js.map +1 -1
- package/dist/cjs/transactional-email-code.d.ts.map +1 -1
- package/dist/cjs/transactional-email-code.js +32 -18
- package/dist/cjs/transactional-email-code.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 +35 -149
- 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 +16 -4
- package/dist/cjs/workflow-project-plugin.js.map +1 -1
- package/dist/cjs/workflow-scope.d.ts +19 -0
- package/dist/cjs/workflow-scope.d.ts.map +1 -0
- package/dist/cjs/workflow-scope.js +147 -0
- package/dist/cjs/workflow-scope.js.map +1 -0
- package/dist/esm/account-delete-route-generator.d.ts +1 -0
- package/dist/esm/account-delete-route-generator.d.ts.map +1 -1
- package/dist/esm/account-delete-route-generator.js +2 -1
- package/dist/esm/account-delete-route-generator.js.map +1 -1
- package/dist/esm/api-route-generator.d.ts.map +1 -1
- package/dist/esm/api-route-generator.js +23 -13
- package/dist/esm/api-route-generator.js.map +1 -1
- package/dist/esm/auth-generator.d.ts +1 -0
- package/dist/esm/auth-generator.d.ts.map +1 -1
- package/dist/esm/auth-generator.js +77 -28
- package/dist/esm/auth-generator.js.map +1 -1
- package/dist/esm/booking-calendar-feed-route-generator.d.ts +28 -0
- package/dist/esm/booking-calendar-feed-route-generator.d.ts.map +1 -0
- package/dist/esm/booking-calendar-feed-route-generator.js +291 -0
- package/dist/esm/booking-calendar-feed-route-generator.js.map +1 -0
- package/dist/esm/data-api-route-generator.d.ts.map +1 -1
- package/dist/esm/data-api-route-generator.js +6 -1
- 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 +39 -28
- package/dist/esm/executor-generator.js.map +1 -1
- package/dist/esm/graph-utils.d.ts +31 -1
- package/dist/esm/graph-utils.d.ts.map +1 -1
- package/dist/esm/graph-utils.js +109 -9
- package/dist/esm/graph-utils.js.map +1 -1
- package/dist/esm/index.d.ts +1 -1
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/invoice/api-routes-code.d.ts +12 -3
- package/dist/esm/invoice/api-routes-code.d.ts.map +1 -1
- package/dist/esm/invoice/api-routes-code.js +152 -21
- package/dist/esm/invoice/api-routes-code.js.map +1 -1
- package/dist/esm/invoice/data-access-code.d.ts.map +1 -1
- package/dist/esm/invoice/data-access-code.js +133 -21
- package/dist/esm/invoice/data-access-code.js.map +1 -1
- package/dist/esm/invoice/email-sender-code.d.ts.map +1 -1
- package/dist/esm/invoice/email-sender-code.js +15 -25
- package/dist/esm/invoice/email-sender-code.js.map +1 -1
- package/dist/esm/invoice/index.js +1 -1
- package/dist/esm/invoice/index.js.map +1 -1
- package/dist/esm/invoice/invoice-assembly-code.d.ts.map +1 -1
- package/dist/esm/invoice/invoice-assembly-code.js +50 -6
- package/dist/esm/invoice/invoice-assembly-code.js.map +1 -1
- package/dist/esm/invoice/invoice-html-code.d.ts.map +1 -1
- package/dist/esm/invoice/invoice-html-code.js +13 -2
- package/dist/esm/invoice/invoice-html-code.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 +11 -1
- package/dist/esm/nodes/data/data-raw-query.js.map +1 -1
- package/dist/esm/nodes/email/email-mailgun.d.ts.map +1 -1
- package/dist/esm/nodes/email/email-mailgun.js +4 -2
- package/dist/esm/nodes/email/email-mailgun.js.map +1 -1
- package/dist/esm/nodes/email/email-postmark.d.ts.map +1 -1
- package/dist/esm/nodes/email/email-postmark.js +5 -2
- package/dist/esm/nodes/email/email-postmark.js.map +1 -1
- package/dist/esm/nodes/email/email-resend.d.ts.map +1 -1
- package/dist/esm/nodes/email/email-resend.js +5 -2
- package/dist/esm/nodes/email/email-resend.js.map +1 -1
- package/dist/esm/nodes/email/email-sendgrid.d.ts.map +1 -1
- package/dist/esm/nodes/email/email-sendgrid.js +8 -2
- package/dist/esm/nodes/email/email-sendgrid.js.map +1 -1
- package/dist/esm/nodes/general/general-custom-js.d.ts.map +1 -1
- package/dist/esm/nodes/general/general-custom-js.js +11 -0
- package/dist/esm/nodes/general/general-custom-js.js.map +1 -1
- package/dist/esm/nodes/storage/storage-local-remove.d.ts.map +1 -1
- package/dist/esm/nodes/storage/storage-local-remove.js +2 -0
- package/dist/esm/nodes/storage/storage-local-remove.js.map +1 -1
- package/dist/esm/nodes/storage/storage-local-set.d.ts.map +1 -1
- package/dist/esm/nodes/storage/storage-local-set.js +4 -0
- package/dist/esm/nodes/storage/storage-local-set.js.map +1 -1
- package/dist/esm/page-arrival.d.ts +10 -0
- package/dist/esm/page-arrival.d.ts.map +1 -0
- package/dist/esm/page-arrival.js +81 -0
- package/dist/esm/page-arrival.js.map +1 -0
- package/dist/esm/payments/index.d.ts +10 -4
- package/dist/esm/payments/index.d.ts.map +1 -1
- package/dist/esm/payments/index.js +16 -6
- package/dist/esm/payments/index.js.map +1 -1
- package/dist/esm/segment-splitter.d.ts.map +1 -1
- package/dist/esm/segment-splitter.js +66 -28
- package/dist/esm/segment-splitter.js.map +1 -1
- package/dist/esm/transactional-email-code.d.ts.map +1 -1
- package/dist/esm/transactional-email-code.js +32 -18
- package/dist/esm/transactional-email-code.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 +32 -146
- 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 +16 -4
- package/dist/esm/workflow-project-plugin.js.map +1 -1
- package/dist/esm/workflow-scope.d.ts +19 -0
- package/dist/esm/workflow-scope.d.ts.map +1 -0
- package/dist/esm/workflow-scope.js +142 -0
- package/dist/esm/workflow-scope.js.map +1 -0
- package/package.json +4 -4
- package/src/account-delete-route-generator.ts +3 -1
- package/src/api-route-generator.ts +23 -13
- package/src/auth-generator.ts +83 -26
- package/src/booking-calendar-feed-route-generator.ts +293 -0
- package/src/data-api-route-generator.ts +6 -1
- package/src/executor-generator.ts +39 -28
- package/src/graph-utils.ts +143 -11
- package/src/index.ts +1 -0
- package/src/invoice/api-routes-code.ts +166 -21
- package/src/invoice/data-access-code.ts +139 -21
- package/src/invoice/email-sender-code.ts +15 -25
- package/src/invoice/index.ts +1 -1
- package/src/invoice/invoice-assembly-code.ts +50 -6
- package/src/invoice/invoice-html-code.ts +13 -2
- package/src/nodes/data/data-raw-query.ts +11 -1
- package/src/nodes/email/email-mailgun.ts +11 -2
- package/src/nodes/email/email-postmark.ts +12 -2
- package/src/nodes/email/email-resend.ts +12 -2
- package/src/nodes/email/email-sendgrid.ts +15 -2
- package/src/nodes/general/general-custom-js.ts +10 -0
- package/src/nodes/storage/storage-local-remove.ts +4 -0
- package/src/nodes/storage/storage-local-set.ts +6 -0
- package/src/page-arrival.ts +115 -0
- package/src/payments/index.ts +18 -5
- package/src/segment-splitter.ts +90 -36
- package/src/transactional-email-code.ts +32 -21
- package/src/workflow-component-plugin.ts +43 -188
- package/src/workflow-project-plugin.ts +17 -4
- package/src/workflow-scope.ts +184 -0
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The bookings' calendar feeds: `pages/api/bookings/ical/[file].js`, emitted
|
|
3
|
+
* when the UIDL carries `bookingCalendars.feedStatement`.
|
|
4
|
+
*
|
|
5
|
+
* Each calendar link of a site's bookings is an iCalendar (RFC 5545) feed that
|
|
6
|
+
* Airbnb, Booking.com, Vrbo or Google Calendar import to block the dates the
|
|
7
|
+
* site has booked. The editor builds the one statement behind every feed (its
|
|
8
|
+
* tables and columns are the editor's business); the generated route only runs
|
|
9
|
+
* it with the link's key and writes the rows out as a calendar.
|
|
10
|
+
*/
|
|
11
|
+
import { FileType } from '@teleporthq/teleport-types';
|
|
12
|
+
import { generatePgClientCode } from './pg-client-code';
|
|
13
|
+
import { getDatabaseDriverDependencies } from './auth-generator';
|
|
14
|
+
/**
|
|
15
|
+
* The route's source (CommonJS). GET or HEAD `/api/bookings/ical/<key>.ics`:
|
|
16
|
+
* - another method → 405 with `Allow: GET, HEAD`;
|
|
17
|
+
* - a key of the wrong shape, or one the statement returns no calendar row
|
|
18
|
+
* for → 404 (the key is the link's only credential, so both look the same);
|
|
19
|
+
* - a failed query → 500 'Calendar unavailable', the cause logged only;
|
|
20
|
+
* - else 200 with the calendar, never cached. An event row with a missing or
|
|
21
|
+
* invalid value is left out rather than failing the whole feed.
|
|
22
|
+
*/
|
|
23
|
+
export const generateBookingCalendarFeedRoute = (feedStatement) => {
|
|
24
|
+
return `'use strict';
|
|
25
|
+
|
|
26
|
+
// GENERATED — see generateBookingCalendarFeedRoute in
|
|
27
|
+
// @teleporthq/teleport-plugin-next-workflows/src/booking-calendar-feed-route-generator.ts.
|
|
28
|
+
//
|
|
29
|
+
// The iCalendar feed of one calendar link of the site's bookings: Airbnb,
|
|
30
|
+
// Booking.com, Vrbo or Google Calendar poll it and block the booked dates.
|
|
31
|
+
${generatePgClientCode()}
|
|
32
|
+
|
|
33
|
+
// Built by the editor: $1 is the link's key. It returns one 'calendar' row and
|
|
34
|
+
// one 'event' row per blocked period.
|
|
35
|
+
var FEED_STATEMENT = ${JSON.stringify(feedStatement)};
|
|
36
|
+
var FEED_FILE_RE = /^([A-Za-z0-9_-]{20,80})[.]ics$/;
|
|
37
|
+
var DATE_RE = /^([0-9]{4})([0-9]{2})([0-9]{2})$/;
|
|
38
|
+
var DATE_TIME_RE = /^([0-9]{4})([0-9]{2})([0-9]{2})T([0-9]{2})([0-9]{2})([0-9]{2})Z$/;
|
|
39
|
+
var TEXT_TYPE = 'text/plain; charset=utf-8';
|
|
40
|
+
var CALENDAR_TYPE = 'text/calendar; charset=utf-8';
|
|
41
|
+
var CRLF = String.fromCharCode(13, 10);
|
|
42
|
+
var BACKSLASH = String.fromCharCode(92);
|
|
43
|
+
// RFC 5545: a content line is at most 75 octets, the line break excluded.
|
|
44
|
+
var MAX_LINE_OCTETS = 75;
|
|
45
|
+
|
|
46
|
+
// RFC 5545 TEXT: a backslash, semicolon or comma is escaped with a backslash
|
|
47
|
+
// and every line break is written as the two characters backslash and n.
|
|
48
|
+
// Other control characters are not allowed in TEXT, so they are dropped.
|
|
49
|
+
function icalText(value) {
|
|
50
|
+
var text = String(value == null ? '' : value);
|
|
51
|
+
var out = '';
|
|
52
|
+
for (var i = 0; i < text.length; i++) {
|
|
53
|
+
var ch = text.charAt(i);
|
|
54
|
+
var code = text.charCodeAt(i);
|
|
55
|
+
if (ch === BACKSLASH || ch === ';' || ch === ',') {
|
|
56
|
+
out += BACKSLASH + ch;
|
|
57
|
+
} else if (code === 13 || code === 10) {
|
|
58
|
+
// CRLF, a lone CR and a lone LF are each one line break.
|
|
59
|
+
if (code === 13 && text.charCodeAt(i + 1) === 10) {
|
|
60
|
+
i += 1;
|
|
61
|
+
}
|
|
62
|
+
out += BACKSLASH + 'n';
|
|
63
|
+
} else if (code === 9 || (code >= 32 && code !== 127)) {
|
|
64
|
+
out += ch;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return out;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// One content line, folded: a continuation line starts with one space (which
|
|
71
|
+
// counts toward its 75 octets), and no fold splits a UTF-8 character.
|
|
72
|
+
function icalFold(line) {
|
|
73
|
+
var out = '';
|
|
74
|
+
var used = 0;
|
|
75
|
+
for (var i = 0; i < line.length; i++) {
|
|
76
|
+
var ch = line.charAt(i);
|
|
77
|
+
var code = line.charCodeAt(i);
|
|
78
|
+
var octets = code < 0x80 ? 1 : code < 0x800 ? 2 : 3;
|
|
79
|
+
if (code >= 0xd800 && code <= 0xdbff) {
|
|
80
|
+
var low = line.charCodeAt(i + 1);
|
|
81
|
+
if (low >= 0xdc00 && low <= 0xdfff) {
|
|
82
|
+
// A surrogate pair is one 4-octet character.
|
|
83
|
+
ch = line.slice(i, i + 2);
|
|
84
|
+
octets = 4;
|
|
85
|
+
i += 1;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
if (used + octets > MAX_LINE_OCTETS) {
|
|
89
|
+
out += CRLF + ' ';
|
|
90
|
+
used = 1;
|
|
91
|
+
}
|
|
92
|
+
out += ch;
|
|
93
|
+
used += octets;
|
|
94
|
+
}
|
|
95
|
+
return out + CRLF;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// all_day as Postgres hands it over: a boolean, or 't' / 'f' / 'true' / 'false'.
|
|
99
|
+
// null for anything else.
|
|
100
|
+
function icalAllDay(value) {
|
|
101
|
+
if (value === true || value === false) {
|
|
102
|
+
return value;
|
|
103
|
+
}
|
|
104
|
+
var text = String(value == null ? '' : value).trim().toLowerCase();
|
|
105
|
+
if (text === 't' || text === 'true') {
|
|
106
|
+
return true;
|
|
107
|
+
}
|
|
108
|
+
if (text === 'f' || text === 'false') {
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// 'YYYYMMDD' (all day) or 'YYYYMMDDTHHMMSSZ' naming a real day and time, else
|
|
115
|
+
// null — a value like 20260231 would otherwise reach the importing calendar.
|
|
116
|
+
function icalDateValue(value, allDay) {
|
|
117
|
+
if (typeof value !== 'string') {
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
var text = value.trim();
|
|
121
|
+
var match = (allDay ? DATE_RE : DATE_TIME_RE).exec(text);
|
|
122
|
+
if (!match) {
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
var parts = [];
|
|
126
|
+
for (var i = 1; i <= 6; i++) {
|
|
127
|
+
parts.push(allDay && i > 3 ? 0 : Number(match[i]));
|
|
128
|
+
}
|
|
129
|
+
var date = new Date(Date.UTC(parts[0], parts[1] - 1, parts[2], parts[3], parts[4], parts[5]));
|
|
130
|
+
var actual = [
|
|
131
|
+
date.getUTCFullYear(),
|
|
132
|
+
date.getUTCMonth() + 1,
|
|
133
|
+
date.getUTCDate(),
|
|
134
|
+
date.getUTCHours(),
|
|
135
|
+
date.getUTCMinutes(),
|
|
136
|
+
date.getUTCSeconds(),
|
|
137
|
+
];
|
|
138
|
+
return actual.join(',') === parts.join(',') ? text : null;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// The VEVENT lines of one event row, or null when a value is missing or invalid.
|
|
142
|
+
function icalEventLines(row, stamp) {
|
|
143
|
+
var uid = row.uid == null ? '' : String(row.uid).trim();
|
|
144
|
+
var allDay = icalAllDay(row.all_day);
|
|
145
|
+
if (uid === '' || allDay === null) {
|
|
146
|
+
return null;
|
|
147
|
+
}
|
|
148
|
+
var start = icalDateValue(row.start_value, allDay);
|
|
149
|
+
var end = icalDateValue(row.end_value, allDay);
|
|
150
|
+
// The end is exclusive, so it must come after the start. Two values of the
|
|
151
|
+
// same format compare correctly as strings.
|
|
152
|
+
if (start === null || end === null || end <= start) {
|
|
153
|
+
return null;
|
|
154
|
+
}
|
|
155
|
+
var valueParam = allDay ? ';VALUE=DATE:' : ':';
|
|
156
|
+
return [
|
|
157
|
+
'BEGIN:VEVENT',
|
|
158
|
+
'UID:' + icalText(uid),
|
|
159
|
+
'DTSTAMP:' + stamp,
|
|
160
|
+
'DTSTART' + valueParam + start,
|
|
161
|
+
'DTEND' + valueParam + end,
|
|
162
|
+
'SUMMARY:' + icalText(row.summary),
|
|
163
|
+
'TRANSP:OPAQUE',
|
|
164
|
+
'END:VEVENT',
|
|
165
|
+
];
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// 'YYYYMMDDTHHMMSSZ' of an instant, in UTC.
|
|
169
|
+
function icalStamp(date) {
|
|
170
|
+
var iso = date.toISOString();
|
|
171
|
+
return (
|
|
172
|
+
iso.slice(0, 4) + iso.slice(5, 7) + iso.slice(8, 10) + 'T' +
|
|
173
|
+
iso.slice(11, 13) + iso.slice(14, 16) + iso.slice(17, 19) + 'Z'
|
|
174
|
+
);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
function icalCalendar(calendarRow, rows, now) {
|
|
178
|
+
var stamp = icalStamp(now);
|
|
179
|
+
var lines = [
|
|
180
|
+
'BEGIN:VCALENDAR',
|
|
181
|
+
'VERSION:2.0',
|
|
182
|
+
'PRODID:-//TeleportHQ//Bookings//EN',
|
|
183
|
+
'CALSCALE:GREGORIAN',
|
|
184
|
+
'METHOD:PUBLISH',
|
|
185
|
+
'X-WR-CALNAME:' + icalText(calendarRow.calendar_name),
|
|
186
|
+
'REFRESH-INTERVAL;VALUE=DURATION:PT30M',
|
|
187
|
+
'X-PUBLISHED-TTL:PT30M',
|
|
188
|
+
];
|
|
189
|
+
for (var i = 0; i < rows.length; i++) {
|
|
190
|
+
if (rows[i] && rows[i].kind === 'event') {
|
|
191
|
+
var eventLines = icalEventLines(rows[i], stamp);
|
|
192
|
+
if (eventLines) {
|
|
193
|
+
lines = lines.concat(eventLines);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
lines.push('END:VCALENDAR');
|
|
198
|
+
var body = '';
|
|
199
|
+
for (var j = 0; j < lines.length; j++) {
|
|
200
|
+
body += icalFold(lines[j]);
|
|
201
|
+
}
|
|
202
|
+
return body;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// Never cached: a booking can block a date between two polls. A HEAD request
|
|
206
|
+
// gets the headers GET would, without the body.
|
|
207
|
+
function icalSend(res, status, contentType, body, headOnly) {
|
|
208
|
+
res.statusCode = status;
|
|
209
|
+
res.setHeader('Content-Type', contentType);
|
|
210
|
+
res.setHeader('Cache-Control', 'no-store');
|
|
211
|
+
res.setHeader('Content-Length', String(Buffer.byteLength(body, 'utf8')));
|
|
212
|
+
if (headOnly) {
|
|
213
|
+
res.end();
|
|
214
|
+
} else {
|
|
215
|
+
res.end(body);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
module.exports = async function handler(req, res) {
|
|
220
|
+
if (req.method !== 'GET' && req.method !== 'HEAD') {
|
|
221
|
+
res.setHeader('Allow', 'GET, HEAD');
|
|
222
|
+
return icalSend(res, 405, TEXT_TYPE, 'Method not allowed', false);
|
|
223
|
+
}
|
|
224
|
+
var headOnly = req.method === 'HEAD';
|
|
225
|
+
var file = req.query && typeof req.query.file === 'string' ? req.query.file : '';
|
|
226
|
+
var fileMatch = FEED_FILE_RE.exec(file);
|
|
227
|
+
if (!fileMatch) {
|
|
228
|
+
return icalSend(res, 404, TEXT_TYPE, 'Not found', headOnly);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
var rows = null;
|
|
232
|
+
var client = null;
|
|
233
|
+
try {
|
|
234
|
+
client = getClient();
|
|
235
|
+
await client.connect();
|
|
236
|
+
var result = await client.query(FEED_STATEMENT, [fileMatch[1]]);
|
|
237
|
+
rows = result && Array.isArray(result.rows) ? result.rows : [];
|
|
238
|
+
} catch (e) {
|
|
239
|
+
console.error('[bookings-ical] calendar feed query failed:', e && e.message ? e.message : e);
|
|
240
|
+
} finally {
|
|
241
|
+
if (client) {
|
|
242
|
+
try { await client.end(); } catch (e) {}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
if (rows === null) {
|
|
246
|
+
return icalSend(res, 500, TEXT_TYPE, 'Calendar unavailable', headOnly);
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
var calendarRow = null;
|
|
250
|
+
for (var i = 0; i < rows.length && calendarRow === null; i++) {
|
|
251
|
+
if (rows[i] && rows[i].kind === 'calendar') {
|
|
252
|
+
calendarRow = rows[i];
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
if (calendarRow === null) {
|
|
256
|
+
return icalSend(res, 404, TEXT_TYPE, 'Not found', headOnly);
|
|
257
|
+
}
|
|
258
|
+
res.setHeader('Content-Disposition', 'inline; filename="' + file + '"');
|
|
259
|
+
return icalSend(res, 200, CALENDAR_TYPE, icalCalendar(calendarRow, rows, new Date()), headOnly);
|
|
260
|
+
};
|
|
261
|
+
`;
|
|
262
|
+
};
|
|
263
|
+
/**
|
|
264
|
+
* Emits the feed route when the UIDL names a feed statement, plus the `pg`
|
|
265
|
+
* driver it connects with (already present on a project with a Teleport
|
|
266
|
+
* database, which every bookings site has).
|
|
267
|
+
*/
|
|
268
|
+
export const generateBookingCalendarFeedFiles = (structure) => {
|
|
269
|
+
var _a;
|
|
270
|
+
const feedStatement = (_a = structure.uidl.bookingCalendars) === null || _a === void 0 ? void 0 : _a.feedStatement;
|
|
271
|
+
if (typeof feedStatement !== 'string' || feedStatement.trim() === '') {
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
structure.files.set('bookings-ical-feed-route', {
|
|
275
|
+
path: ['pages', 'api', 'bookings', 'ical'],
|
|
276
|
+
files: [
|
|
277
|
+
{
|
|
278
|
+
name: '[file]',
|
|
279
|
+
fileType: FileType.JS,
|
|
280
|
+
content: generateBookingCalendarFeedRoute(feedStatement),
|
|
281
|
+
},
|
|
282
|
+
],
|
|
283
|
+
});
|
|
284
|
+
const driverDependencies = getDatabaseDriverDependencies('teleport');
|
|
285
|
+
for (const [pkg, version] of Object.entries(driverDependencies)) {
|
|
286
|
+
if (!structure.dependencies[pkg]) {
|
|
287
|
+
structure.dependencies[pkg] = version;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
};
|
|
291
|
+
//# sourceMappingURL=booking-calendar-feed-route-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"booking-calendar-feed-route-generator.js","sourceRoot":"","sources":["../../src/booking-calendar-feed-route-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,QAAQ,EAA0B,MAAM,4BAA4B,CAAA;AAC7E,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,EAAE,6BAA6B,EAAE,MAAM,kBAAkB,CAAA;AAEhE;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,gCAAgC,GAAG,CAAC,aAAqB,EAAU,EAAE;IAChF,OAAO;;;;;;;EAOP,oBAAoB,EAAE;;;;uBAID,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkOnD,CAAA;AACD,CAAC,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,gCAAgC,GAAG,CAAC,SAAiC,EAAQ,EAAE;;IAC1F,MAAM,aAAa,GAAG,MAAA,SAAS,CAAC,IAAI,CAAC,gBAAgB,0CAAE,aAAa,CAAA;IACpE,IAAI,OAAO,aAAa,KAAK,QAAQ,IAAI,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QACpE,OAAM;KACP;IAED,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,0BAA0B,EAAE;QAC9C,IAAI,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,CAAC;QAC1C,KAAK,EAAE;YACL;gBACE,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,QAAQ,CAAC,EAAE;gBACrB,OAAO,EAAE,gCAAgC,CAAC,aAAa,CAAC;aACzD;SACF;KACF,CAAC,CAAA;IAEF,MAAM,kBAAkB,GAAG,6BAA6B,CAAC,UAAU,CAAC,CAAA;IACpE,KAAK,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE;QAC/D,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE;YAChC,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,OAAO,CAAA;SACtC;KACF;AACH,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-api-route-generator.d.ts","sourceRoot":"","sources":["../../src/data-api-route-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,EAAE,aAAa,EAAe,MAAM,6BAA6B,CAAA;AAexE,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;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,uBAAuB,EAAE,aAAa,CAAC,MAAM,CASzD,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,gBAAgB,CAAC,CACtD,CAAA;AAEpC,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;AAIH,OAAO,EAAE,aAAa,EAAe,MAAM,6BAA6B,CAAA;AAexE,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;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,uBAAuB,EAAE,aAAa,CAAC,MAAM,CASzD,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,gBAAgB,CAAC,CACtD,CAAA;AAEpC,eAAO,MAAM,oBAAoB,aAAa,mBAAmB,KAAQ,MAsqCxE,CAAA"}
|
|
@@ -73,7 +73,12 @@ export const generateDataAPIRoute = (options = {}) => {
|
|
|
73
73
|
const lowStockThreshold = typeof options.lowStockThreshold === 'number' && options.lowStockThreshold >= 0
|
|
74
74
|
? options.lowStockThreshold
|
|
75
75
|
: 5;
|
|
76
|
-
return `const { Client } = require('pg');
|
|
76
|
+
return `const { Client, types: pgTypes } = require('pg');
|
|
77
|
+
// A DATE stays the day it names, whatever the server's time zone: node-pg would read it as
|
|
78
|
+
// local midnight, which a server east of UTC sends as the day before.
|
|
79
|
+
if (pgTypes && typeof pgTypes.setTypeParser === 'function') {
|
|
80
|
+
pgTypes.setTypeParser(1082, (value) => value);
|
|
81
|
+
}
|
|
77
82
|
${
|
|
78
83
|
// The session cookie is resolved from the REQUEST rather than from
|
|
79
84
|
// process.env.NEXTAUTH_URL — see session-cookie-resolver.ts. Reading it the
|
|
@@ -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;AAC1D,OAAO,EAAE,wCAAwC,EAAE,MAAM,2BAA2B,CAAA;AACpF,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AAExE,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;IAC9B,aAAa;IACb,kBAAkB;IAClB,kBAAkB;IAClB,kBAAkB;IAClB,YAAY;IACZ,gBAAgB;IAChB,uEAAuE;IACvE,0EAA0E;IAC1E,sCAAsC;IACtC,yBAAyB;CAC1B,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;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAA0B;IAC5D,mBAAmB;IACnB,2BAA2B;IAC3B,oBAAoB;IACpB,yBAAyB;IACzB,yBAAyB;IACzB,oBAAoB;IACpB,0BAA0B;IAC1B,GAAG,aAAa,CAAC,oBAAoB;CACtC,CAAA;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAC/B,aAAa,CAAC,oBAAoB,CAAA;AAEpC,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;
|
|
1
|
+
{"version":3,"file":"data-api-route-generator.js","sourceRoot":"","sources":["../../src/data-api-route-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor-generator.d.ts","sourceRoot":"","sources":["../../src/executor-generator.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EAGlB,MAAM,gBAAgB,CAAA;AAGvB,MAAM,WAAW,yBAAyB;IACxC;;;;;OAKG;IACH,YAAY,CAAC,EAAE,iBAAiB,CAAA;CACjC;AAID,eAAO,MAAM,8BAA8B,aAAa,yBAAyB,KAAQ,
|
|
1
|
+
{"version":3,"file":"executor-generator.d.ts","sourceRoot":"","sources":["../../src/executor-generator.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EAGlB,MAAM,gBAAgB,CAAA;AAGvB,MAAM,WAAW,yBAAyB;IACxC;;;;;OAKG;IACH,YAAY,CAAC,EAAE,iBAAiB,CAAA;CACjC;AAID,eAAO,MAAM,8BAA8B,aAAa,yBAAyB,KAAQ,MAy+CxF,CAAA;AAED,eAAO,MAAM,yBAAyB,QAAO,MA+nB5C,CAAA"}
|
|
@@ -371,8 +371,19 @@ function applyTemplateParams(text, params) {
|
|
|
371
371
|
function finalizeResolvedConfig(nodeType, config) {
|
|
372
372
|
var isDataNode = typeof nodeType === 'string' && nodeType.indexOf('data-') === 0;
|
|
373
373
|
var error = null;
|
|
374
|
+
// A config value may be a live element (a trigger's target handed to a
|
|
375
|
+
// custom-js node) or an object that refers back to itself: walking into a
|
|
376
|
+
// DOM node follows its React fibers forever (a page's every element-bound
|
|
377
|
+
// behavior died with "Maximum call stack size exceeded"). Elements are
|
|
378
|
+
// left as they are; an object is walked once.
|
|
379
|
+
var seen = typeof WeakSet === 'function' ? new WeakSet() : null;
|
|
374
380
|
function walk(obj, insideFilters) {
|
|
375
381
|
if (!obj || typeof obj !== 'object') return;
|
|
382
|
+
if (typeof obj.nodeType === 'number' && typeof obj.nodeName === 'string') return;
|
|
383
|
+
if (seen) {
|
|
384
|
+
if (seen.has(obj)) return;
|
|
385
|
+
seen.add(obj);
|
|
386
|
+
}
|
|
376
387
|
if (Array.isArray(obj)) {
|
|
377
388
|
for (var ai = 0; ai < obj.length; ai++) walk(obj[ai], insideFilters);
|
|
378
389
|
return;
|
|
@@ -1382,15 +1393,31 @@ var SEGMENT_REPLY_PRIVATE_KEYS = {
|
|
|
1382
1393
|
// be echoed back wholesale (every earlier node's result, the trigger, the whole
|
|
1383
1394
|
// page state), so each round trip carried the page twice over and the network
|
|
1384
1395
|
// tab showed every node's data on every hop.
|
|
1396
|
+
//
|
|
1397
|
+
// A node marked \`keepResultOnServer\` is the exception: its result serves the
|
|
1398
|
+
// nodes after it in the same segment and never leaves the server (a statement's
|
|
1399
|
+
// rows read only to build what the browser may see, a sender's recipients).
|
|
1400
|
+
// Nothing in a later segment can read it.
|
|
1401
|
+
// The nodes whose result the client branches on: never kept on the server.
|
|
1402
|
+
function isBranchingNodeType(type) {
|
|
1403
|
+
return type === 'general-if-statement' || type === 'general-switch';
|
|
1404
|
+
}
|
|
1405
|
+
|
|
1385
1406
|
function segmentReply(segmentConfig, context, snapshot) {
|
|
1386
1407
|
var reply = {};
|
|
1387
1408
|
var own = {};
|
|
1409
|
+
var kept = {};
|
|
1388
1410
|
var nodes = (segmentConfig && segmentConfig.nodes) || [];
|
|
1389
|
-
for (var ni = 0; ni < nodes.length; ni++)
|
|
1411
|
+
for (var ni = 0; ni < nodes.length; ni++) {
|
|
1412
|
+
own[nodes[ni].id] = true;
|
|
1413
|
+
if (nodes[ni].config && nodes[ni].config.keepResultOnServer === true && !isBranchingNodeType(nodes[ni].type)) {
|
|
1414
|
+
kept[nodes[ni].id] = true;
|
|
1415
|
+
}
|
|
1416
|
+
}
|
|
1390
1417
|
var keys = Object.keys(context);
|
|
1391
1418
|
for (var i = 0; i < keys.length; i++) {
|
|
1392
1419
|
var key = keys[i];
|
|
1393
|
-
if (SEGMENT_REPLY_PRIVATE_KEYS[key]) continue;
|
|
1420
|
+
if (SEGMENT_REPLY_PRIVATE_KEYS[key] || kept[key]) continue;
|
|
1394
1421
|
var value = context[key];
|
|
1395
1422
|
if (value === undefined) continue;
|
|
1396
1423
|
if (own[key] || !snapshot || !Object.prototype.hasOwnProperty.call(snapshot, key)) {
|
|
@@ -1481,6 +1508,7 @@ module.exports = {
|
|
|
1481
1508
|
fatalNodeResultMessage,
|
|
1482
1509
|
continuesOnError,
|
|
1483
1510
|
isFireAndForgetNode,
|
|
1511
|
+
isBranchingNodeType,
|
|
1484
1512
|
startFireAndForgetNode,
|
|
1485
1513
|
registerPendingNodePromise,
|
|
1486
1514
|
settlePendingNodePromises
|
|
@@ -1804,25 +1832,19 @@ function findStreamingAINodes(allNodes, allEdges) {
|
|
|
1804
1832
|
const n = allNodes[ni];
|
|
1805
1833
|
if (aiTypes.indexOf(n.type) >= 0 && n.config && n.config.streaming) {
|
|
1806
1834
|
let onStreamEdge = null;
|
|
1807
|
-
let onEndEdge = null;
|
|
1808
1835
|
for (let ei = 0; ei < allEdges.length; ei++) {
|
|
1809
|
-
if (allEdges[ei].source === n.id)
|
|
1810
|
-
if (allEdges[ei].sourceHandle === 'on-stream') onStreamEdge = allEdges[ei];
|
|
1811
|
-
if (allEdges[ei].sourceHandle === 'on-end') onEndEdge = allEdges[ei];
|
|
1812
|
-
}
|
|
1836
|
+
if (allEdges[ei].source === n.id && allEdges[ei].sourceHandle === 'on-stream') onStreamEdge = allEdges[ei];
|
|
1813
1837
|
}
|
|
1814
1838
|
const onStreamNodes = onStreamEdge ? utils.collectBranchNodes(onStreamEdge.target, allNodes, allEdges, n.id) : [];
|
|
1815
|
-
|
|
1816
|
-
map[n.id] = { node: n, onStreamNodes: onStreamNodes, onEndNodes: onEndNodes };
|
|
1839
|
+
map[n.id] = { node: n, onStreamNodes: onStreamNodes };
|
|
1817
1840
|
}
|
|
1818
1841
|
}
|
|
1819
1842
|
return map;
|
|
1820
1843
|
}
|
|
1821
1844
|
|
|
1822
|
-
// A streaming AI node's on-stream
|
|
1823
|
-
//
|
|
1824
|
-
//
|
|
1825
|
-
// server segments with full configs; the browser bundle only ships their
|
|
1845
|
+
// A streaming AI node's on-stream branch is collected from the FULL workflow
|
|
1846
|
+
// node list, so it may contain server nodes. Those already execute inside their
|
|
1847
|
+
// own server segments with full configs; the browser bundle only ships their
|
|
1826
1848
|
// config redacted down to the client-safe whitelist (segment-splitter's
|
|
1827
1849
|
// redactServerNodeConfig), so executing them here with CLIENT handlers both
|
|
1828
1850
|
// double-executes them and crashes on the missing config. Emitted nodes carry
|
|
@@ -1835,7 +1857,6 @@ function clientExecutableBranchNodes(branchNodes) {
|
|
|
1835
1857
|
async function callStreamingServerSegment(segmentUrl, context, streamingInfo, allNodes, allEdges, clientHandlers, workflowConfig, executionId, stateKeys) {
|
|
1836
1858
|
const prunedContext = pruneContext(context, stateKeys);
|
|
1837
1859
|
const handledNodeIds = {};
|
|
1838
|
-
const streamedNodeIds = {};
|
|
1839
1860
|
// Same relative-URL problem as callServerSegment above — required even
|
|
1840
1861
|
// for streaming segments because a server-side caller (e.g. an AI
|
|
1841
1862
|
// chat webhook) would otherwise fail to parse the URL.
|
|
@@ -1882,7 +1903,6 @@ async function callStreamingServerSegment(segmentUrl, context, streamingInfo, al
|
|
|
1882
1903
|
try { data = JSON.parse(jsonStr); } catch(e) { continue; }
|
|
1883
1904
|
|
|
1884
1905
|
if (data.type === 'chunk' && data.nodeId) {
|
|
1885
|
-
streamedNodeIds[data.nodeId] = true;
|
|
1886
1906
|
context[data.nodeId] = { chunk: data.chunk, fullResponse: data.fullResponse };
|
|
1887
1907
|
const info = streamingInfo[data.nodeId];
|
|
1888
1908
|
if (info && info.onStreamNodes.length > 0) {
|
|
@@ -1897,22 +1917,13 @@ async function callStreamingServerSegment(segmentUrl, context, streamingInfo, al
|
|
|
1897
1917
|
} else if (data.type === 'node-result' && data.nodeId) {
|
|
1898
1918
|
context[data.nodeId] = data.result;
|
|
1899
1919
|
} else if (data.type === 'done') {
|
|
1920
|
+
// The on-end branch is not run here: its steps sit in the segments after
|
|
1921
|
+
// this one, and the caller runs those in graph order, so a browser step
|
|
1922
|
+
// waits for the server steps before it (the chat's "Bump Conversation
|
|
1923
|
+
// After Reply" -> "Get Chat Messages for Final Update").
|
|
1900
1924
|
if (data.results) {
|
|
1901
1925
|
mergeServerResults(context, data.results, workflowConfig && workflowConfig.triggerNodeId);
|
|
1902
1926
|
}
|
|
1903
|
-
const streamedKeys = Object.keys(streamedNodeIds);
|
|
1904
|
-
for (let sk = 0; sk < streamedKeys.length; sk++) {
|
|
1905
|
-
const endInfo = streamingInfo[streamedKeys[sk]];
|
|
1906
|
-
if (endInfo && endInfo.onEndNodes.length > 0) {
|
|
1907
|
-
const runnableEndNodes = clientExecutableBranchNodes(endInfo.onEndNodes);
|
|
1908
|
-
if (runnableEndNodes.length > 0) {
|
|
1909
|
-
await utils.executeNodes(runnableEndNodes, allEdges, context, clientHandlers, workflowConfig, null, executionId);
|
|
1910
|
-
}
|
|
1911
|
-
for (let eni = 0; eni < endInfo.onEndNodes.length; eni++) {
|
|
1912
|
-
handledNodeIds[endInfo.onEndNodes[eni].id] = true;
|
|
1913
|
-
}
|
|
1914
|
-
}
|
|
1915
|
-
}
|
|
1916
1927
|
} else if (data.type === 'error') {
|
|
1917
1928
|
throw new Error(data.error || 'Streaming workflow segment failed');
|
|
1918
1929
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor-generator.js","sourceRoot":"","sources":["../../src/executor-generator.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,8BAA8B,EAC9B,iCAAiC,GAClC,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAE,+BAA+B,EAAE,MAAM,0CAA0C,CAAA;AAY1F,MAAM,gBAAgB,GAAsB,EAAE,OAAO,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,CAAA;AAE9E,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,UAAqC,EAAE,EAAU,EAAE;IAChG,OAAO;;;;;;;;;EASP,8BAA8B,CAAC,OAAO,CAAC,YAAY,IAAI,gBAAgB,CAAC;EACxE,iCAAiC,EAAE;EACnC,+BAA+B,EAAE
|
|
1
|
+
{"version":3,"file":"executor-generator.js","sourceRoot":"","sources":["../../src/executor-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,7 +11,37 @@ export declare const getEdgesTo: (nodeId: string, edges: UIDLWorkflowEdge[]) =>
|
|
|
11
11
|
* loop collections, custom-js params, …).
|
|
12
12
|
*/
|
|
13
13
|
export declare const collectWorkflowContextNodeIds: (value: unknown, out: Set<string>) => void;
|
|
14
|
-
|
|
14
|
+
/**
|
|
15
|
+
* Where a node runs once the segment splitter places it, or `null` for a node
|
|
16
|
+
* that runs wherever the node before it ran (an if-statement), so it never
|
|
17
|
+
* forces a switch between browser and server.
|
|
18
|
+
*/
|
|
19
|
+
export type ExecutionSide = 'client' | 'server';
|
|
20
|
+
export type ExecutionSideOf = (node: UIDLWorkflowNode) => ExecutionSide | null;
|
|
21
|
+
/**
|
|
22
|
+
* Every dependency each node waits for: the source of each edge into it (but a
|
|
23
|
+
* loop's back edge) and every node whose output it reads through a
|
|
24
|
+
* `workflowContext` reference. Listed per SOURCE, in edge order then reference
|
|
25
|
+
* order — the order the topological sort below releases them in.
|
|
26
|
+
*/
|
|
27
|
+
export declare const getDependents: (nodes: UIDLWorkflowNode[], edges: UIDLWorkflowEdge[]) => Record<string, string[]>;
|
|
28
|
+
/**
|
|
29
|
+
* Whether two nodes can never both run: they lie on different branches of the
|
|
30
|
+
* same if-statement or switch, and the runtime skips everything reachable from
|
|
31
|
+
* the branch it did not take.
|
|
32
|
+
*/
|
|
33
|
+
export declare const getNeverRunTogether: (nodes: UIDLWorkflowNode[], edges: UIDLWorkflowEdge[]) => (a: string, b: string) => boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Kahn's order, the lowest `stepNumber` first among the nodes ready to run.
|
|
36
|
+
*
|
|
37
|
+
* With `sideOf` (the segment splitter), a ready node that stays on the side
|
|
38
|
+
* the previous node ran on may go ahead of lower-step nodes on the other side —
|
|
39
|
+
* one client/server switch fewer, so one server round trip fewer — but only of
|
|
40
|
+
* nodes it never runs together with. A refusal branch's toast waits for the
|
|
41
|
+
* main chain's server steps; two steps that both run keep their order, which
|
|
42
|
+
* custom JavaScript reads `params` by.
|
|
43
|
+
*/
|
|
44
|
+
export declare const getTopologicalOrder: (nodes: UIDLWorkflowNode[], edges: UIDLWorkflowEdge[], sideOf?: ExecutionSideOf) => string[];
|
|
15
45
|
export declare const getLoopBodyNodes: (loopNodeId: string, edges: UIDLWorkflowEdge[]) => string[];
|
|
16
46
|
export declare const getParallelBranches: (parallelNodeId: string, edges: UIDLWorkflowEdge[]) => {
|
|
17
47
|
branchStartIds: string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graph-utils.d.ts","sourceRoot":"","sources":["../../src/graph-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAE9F,eAAO,MAAM,WAAW,UACf,gBAAgB,EAAE,UACjB,MAAM,KACb,gBAAgB,GAAG,SAErB,CAAA;AAED,eAAO,MAAM,mBAAmB,WAAY,MAAM,SAAS,gBAAgB,EAAE,KAAG,MAAM,EAErF,CAAA;AAED,eAAO,MAAM,eAAe,WAAY,MAAM,SAAS,gBAAgB,EAAE,KAAG,MAAM,EAEjF,CAAA;AAED,eAAO,MAAM,YAAY,WAAY,MAAM,SAAS,gBAAgB,EAAE,KAAG,gBAAgB,EAExF,CAAA;AAED,eAAO,MAAM,UAAU,WAAY,MAAM,SAAS,gBAAgB,EAAE,KAAG,gBAAgB,EAEtF,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,6BAA6B,UAAW,OAAO,OAAO,IAAI,MAAM,CAAC,KAAG,IAahF,CAAA;AAED,eAAO,MAAM,mBAAmB,UACvB,gBAAgB,EAAE,SAClB,gBAAgB,EAAE,
|
|
1
|
+
{"version":3,"file":"graph-utils.d.ts","sourceRoot":"","sources":["../../src/graph-utils.ts"],"names":[],"mappings":"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"}
|