@haiiro/docuflow 0.0.11 → 0.0.13
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/README.md +45 -9
- package/manifest.json +117 -16
- package/package.json +6 -3
- package/public/app/docflow-app.css +2 -0
- package/public/app/docflow-app.js +94 -0
- package/src/front-components/docflow-documents.front-component.mjs +42 -42
- package/src/front-components/docflow-documents.front-component.tsx +336 -128
- package/src/front-components/docflow-processes.front-component.mjs +35 -35
- package/src/front-components/docflow-processes.front-component.tsx +527 -131
- package/src/front-components/docflow-tasks.front-component.mjs +46 -41
- package/src/front-components/docflow-tasks.front-component.tsx +489 -132
- package/src/front-components/launch-process.front-component.mjs +75 -0
- package/src/front-components/launch-process.front-component.tsx +270 -0
- package/src/front-components/process-steps.front-component.mjs +25 -25
- package/src/front-components/process-steps.front-component.tsx +55 -10
- package/src/front-components/task-form.front-component.mjs +46 -41
- package/src/logic-functions/bitrix-app.logic-function.mjs +424 -198
- package/src/logic-functions/bitrix-app.logic-function.ts +54 -82
- package/src/logic-functions/bitrix-install.logic-function.mjs +0 -11
- package/src/logic-functions/bitrix-install.logic-function.ts +0 -3
- package/src/logic-functions/capture-file.logic-function.mjs +2 -1
- package/src/logic-functions/docflow-app-session.logic-function.mjs +60043 -0
- package/src/logic-functions/docflow-app-session.logic-function.ts +54 -0
- package/src/logic-functions/docflow-app.logic-function.mjs +60122 -0
- package/src/logic-functions/docflow-app.logic-function.ts +37 -0
- package/src/logic-functions/hand-out-form-step.logic-function.mjs +2 -1
- package/src/logic-functions/launch-process.logic-function.mjs +113 -29
- package/src/logic-functions/launch-process.logic-function.ts +83 -22
- package/src/logic-functions/on-workflow-run-updated.logic-function.mjs +2 -1
- package/src/logic-functions/publish-process.logic-function.mjs +119519 -0
- package/src/logic-functions/publish-process.logic-function.ts +91 -0
- package/src/logic-functions/save-launch-fields.logic-function.mjs +178 -10
- package/src/logic-functions/save-launch-fields.logic-function.ts +24 -6
|
@@ -1673,37 +1673,6 @@ var __anyHandler = {
|
|
|
1673
1673
|
var __anyStub = new Proxy(() => void 0, __anyHandler);
|
|
1674
1674
|
var defineLogicFunction = __defineFactoryStub;
|
|
1675
1675
|
|
|
1676
|
-
// src/shared/api/rest-filter.util.ts
|
|
1677
|
-
var UNSAFE_FILTER_CHARACTERS = /[()[\]'",]/g;
|
|
1678
|
-
var sanitizeFilterText = (text) => text.replace(UNSAFE_FILTER_CHARACTERS, " ").trim();
|
|
1679
|
-
var quote = (value) => `'${sanitizeFilterText(value)}'`;
|
|
1680
|
-
var restEq = (field, value) => `${field}[eq]:${quote(value)}`;
|
|
1681
|
-
var restNeq = (field, value) => `${field}[neq]:${quote(value)}`;
|
|
1682
|
-
var restIsNull = (field) => `${field}[is]:NULL`;
|
|
1683
|
-
var restAnd = (...conditions) => {
|
|
1684
|
-
const present = conditions.filter(
|
|
1685
|
-
(condition) => condition !== void 0
|
|
1686
|
-
);
|
|
1687
|
-
return present.length === 0 ? void 0 : `and(${present.join(",")})`;
|
|
1688
|
-
};
|
|
1689
|
-
var restOr = (...conditions) => `or(${conditions.join(",")})`;
|
|
1690
|
-
|
|
1691
|
-
// src/shared/api/rest-response.util.ts
|
|
1692
|
-
var readDataValue = (response) => {
|
|
1693
|
-
const data = response?.data;
|
|
1694
|
-
if (typeof data !== "object" || data === null) {
|
|
1695
|
-
return void 0;
|
|
1696
|
-
}
|
|
1697
|
-
return Object.values(data)[0];
|
|
1698
|
-
};
|
|
1699
|
-
var readRestList = (response) => {
|
|
1700
|
-
const value = readDataValue(response);
|
|
1701
|
-
return {
|
|
1702
|
-
records: Array.isArray(value) ? value : [],
|
|
1703
|
-
pageInfo: response?.pageInfo ?? {}
|
|
1704
|
-
};
|
|
1705
|
-
};
|
|
1706
|
-
|
|
1707
1676
|
// src/shared/bitrix/bitrix.util.ts
|
|
1708
1677
|
var BITRIX_OAUTH_TOKEN_URL = "https://oauth.bitrix.info/oauth/token/";
|
|
1709
1678
|
var BITRIX_PORTAL_KV_KEY = "bitrix:portal";
|
|
@@ -1839,101 +1808,78 @@ var callBitrix = async ({
|
|
|
1839
1808
|
return body.result;
|
|
1840
1809
|
};
|
|
1841
1810
|
|
|
1842
|
-
// src/shared/docflow.
|
|
1843
|
-
var
|
|
1844
|
-
var
|
|
1845
|
-
var
|
|
1846
|
-
var
|
|
1811
|
+
// src/shared/app/docflow-app.util.ts
|
|
1812
|
+
var DOCFLOW_APP_SECTIONS = ["tasks", "processes", "documents"];
|
|
1813
|
+
var readDocflowAppSection = (value) => DOCFLOW_APP_SECTIONS.find((section) => section === value) ?? "tasks";
|
|
1814
|
+
var SESSION_RENEW_BEFORE_MS = 10 * 60 * 1e3;
|
|
1815
|
+
var SESSION_EXPIRY_MARGIN_MS = 60 * 1e3;
|
|
1847
1816
|
|
|
1848
|
-
//
|
|
1849
|
-
|
|
1850
|
-
var n = (n4) => !(0, import_guards.isUndefined)(n4) && !(0, import_guards.isNull)(n4);
|
|
1851
|
-
|
|
1852
|
-
// node_modules/twenty-sdk/dist/logic-function/index.mjs
|
|
1853
|
-
var import_guards2 = __toESM(require_build(), 1);
|
|
1817
|
+
// src/server/bitrix-member.ts
|
|
1818
|
+
import { randomBytes } from "node:crypto";
|
|
1854
1819
|
|
|
1855
|
-
//
|
|
1856
|
-
var
|
|
1857
|
-
|
|
1858
|
-
|
|
1859
|
-
}
|
|
1860
|
-
function unsafeStringify(arr, offset = 0) {
|
|
1861
|
-
return (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + "-" + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + "-" + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + "-" + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + "-" + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase();
|
|
1862
|
-
}
|
|
1863
|
-
|
|
1864
|
-
// node_modules/uuid/dist-node/rng.js
|
|
1865
|
-
import { randomFillSync } from "node:crypto";
|
|
1866
|
-
var rnds8Pool = new Uint8Array(256);
|
|
1867
|
-
var poolPtr = rnds8Pool.length;
|
|
1868
|
-
function rng() {
|
|
1869
|
-
if (poolPtr > rnds8Pool.length - 16) {
|
|
1870
|
-
randomFillSync(rnds8Pool);
|
|
1871
|
-
poolPtr = 0;
|
|
1872
|
-
}
|
|
1873
|
-
return rnds8Pool.slice(poolPtr, poolPtr += 16);
|
|
1874
|
-
}
|
|
1875
|
-
|
|
1876
|
-
// node_modules/uuid/dist-node/native.js
|
|
1877
|
-
import { randomUUID } from "node:crypto";
|
|
1878
|
-
var native_default = { randomUUID };
|
|
1820
|
+
// src/shared/api/rest-filter.util.ts
|
|
1821
|
+
var UNSAFE_FILTER_CHARACTERS = /[()[\]'",]/g;
|
|
1822
|
+
var sanitizeFilterText = (text) => text.replace(UNSAFE_FILTER_CHARACTERS, " ").trim();
|
|
1823
|
+
var quote = (value) => `'${sanitizeFilterText(value)}'`;
|
|
1824
|
+
var restEq = (field, value) => `${field}[eq]:${quote(value)}`;
|
|
1879
1825
|
|
|
1880
|
-
//
|
|
1881
|
-
|
|
1882
|
-
|
|
1883
|
-
|
|
1884
|
-
|
|
1885
|
-
throw new Error("Random bytes length must be >= 16");
|
|
1886
|
-
}
|
|
1887
|
-
rnds[6] = rnds[6] & 15 | 64;
|
|
1888
|
-
rnds[8] = rnds[8] & 63 | 128;
|
|
1889
|
-
if (buf) {
|
|
1890
|
-
offset = offset || 0;
|
|
1891
|
-
if (offset < 0 || offset + 16 > buf.length) {
|
|
1892
|
-
throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);
|
|
1893
|
-
}
|
|
1894
|
-
for (let i5 = 0; i5 < 16; ++i5) {
|
|
1895
|
-
buf[offset + i5] = rnds[i5];
|
|
1896
|
-
}
|
|
1897
|
-
return buf;
|
|
1898
|
-
}
|
|
1899
|
-
return unsafeStringify(rnds);
|
|
1900
|
-
}
|
|
1901
|
-
function v4(options, buf, offset) {
|
|
1902
|
-
if (native_default.randomUUID && !buf && !options) {
|
|
1903
|
-
return native_default.randomUUID();
|
|
1826
|
+
// src/shared/api/rest-response.util.ts
|
|
1827
|
+
var readDataValue = (response) => {
|
|
1828
|
+
const data = response?.data;
|
|
1829
|
+
if (typeof data !== "object" || data === null) {
|
|
1830
|
+
return void 0;
|
|
1904
1831
|
}
|
|
1905
|
-
return
|
|
1906
|
-
}
|
|
1907
|
-
var
|
|
1832
|
+
return Object.values(data)[0];
|
|
1833
|
+
};
|
|
1834
|
+
var readRestList = (response) => {
|
|
1835
|
+
const value = readDataValue(response);
|
|
1836
|
+
return {
|
|
1837
|
+
records: Array.isArray(value) ? value : [],
|
|
1838
|
+
pageInfo: response?.pageInfo ?? {},
|
|
1839
|
+
totalCount: response?.totalCount
|
|
1840
|
+
};
|
|
1841
|
+
};
|
|
1842
|
+
var readRestRecord = (response) => {
|
|
1843
|
+
const value = readDataValue(response);
|
|
1844
|
+
return typeof value === "object" && value !== null && !Array.isArray(value) ? value : void 0;
|
|
1845
|
+
};
|
|
1908
1846
|
|
|
1909
|
-
//
|
|
1910
|
-
var
|
|
1911
|
-
|
|
1847
|
+
// src/shared/bitrix/bitrix-user.util.ts
|
|
1848
|
+
var readText = (value) => typeof value === "string" ? value.trim() : "";
|
|
1849
|
+
var readBitrixUserEmail = (user) => {
|
|
1850
|
+
const email = readText(user.EMAIL);
|
|
1851
|
+
return email.length > 0 ? email.toLowerCase() : void 0;
|
|
1852
|
+
};
|
|
1853
|
+
var readBitrixUserName = (user) => {
|
|
1854
|
+
const firstName = readText(user.NAME);
|
|
1855
|
+
const lastName = [readText(user.LAST_NAME), readText(user.SECOND_NAME)].filter((part) => part.length > 0).join(" ");
|
|
1856
|
+
return { firstName, lastName };
|
|
1857
|
+
};
|
|
1912
1858
|
|
|
1913
1859
|
// node_modules/twenty-client-sdk/dist/chunk-Dqa2HsxW.mjs
|
|
1914
|
-
var
|
|
1915
|
-
var
|
|
1916
|
-
var
|
|
1860
|
+
var e = Object.create;
|
|
1861
|
+
var t = Object.defineProperty;
|
|
1862
|
+
var n = Object.getOwnPropertyDescriptor;
|
|
1917
1863
|
var r = Object.getOwnPropertyNames;
|
|
1918
1864
|
var i = Object.getPrototypeOf;
|
|
1919
1865
|
var a = Object.prototype.hasOwnProperty;
|
|
1920
1866
|
var o = (e3, t4) => () => (t4 || (e3((t4 = { exports: {} }).exports, t4), e3 = null), t4.exports);
|
|
1921
1867
|
var s = (e3, n4) => {
|
|
1922
1868
|
let r4 = {};
|
|
1923
|
-
for (var i5 in e3)
|
|
1869
|
+
for (var i5 in e3) t(r4, i5, {
|
|
1924
1870
|
get: e3[i5],
|
|
1925
1871
|
enumerable: true
|
|
1926
1872
|
});
|
|
1927
|
-
return n4 ||
|
|
1873
|
+
return n4 || t(r4, Symbol.toStringTag, { value: "Module" }), r4;
|
|
1928
1874
|
};
|
|
1929
1875
|
var c = (e3, i5, o5, s5) => {
|
|
1930
|
-
if (i5 && typeof i5 == "object" || typeof i5 == "function") for (var c4 = r(i5), l5 = 0, u4 = c4.length, d2; l5 < u4; l5++) d2 = c4[l5], !a.call(e3, d2) && d2 !== o5 &&
|
|
1876
|
+
if (i5 && typeof i5 == "object" || typeof i5 == "function") for (var c4 = r(i5), l5 = 0, u4 = c4.length, d2; l5 < u4; l5++) d2 = c4[l5], !a.call(e3, d2) && d2 !== o5 && t(e3, d2, {
|
|
1931
1877
|
get: ((e4) => i5[e4]).bind(null, d2),
|
|
1932
|
-
enumerable: !(s5 =
|
|
1878
|
+
enumerable: !(s5 = n(i5, d2)) || s5.enumerable
|
|
1933
1879
|
});
|
|
1934
1880
|
return e3;
|
|
1935
1881
|
};
|
|
1936
|
-
var l = (n4, r4, a5) => (a5 = n4 == null ? {} :
|
|
1882
|
+
var l = (n4, r4, a5) => (a5 = n4 == null ? {} : e(i(n4)), c(r4 || !n4 || !n4.__esModule ? t(a5, "default", {
|
|
1937
1883
|
value: n4,
|
|
1938
1884
|
enumerable: true
|
|
1939
1885
|
}) : a5, n4));
|
|
@@ -61274,7 +61220,201 @@ var u2 = class {
|
|
|
61274
61220
|
}
|
|
61275
61221
|
};
|
|
61276
61222
|
|
|
61223
|
+
// src/shared/docflow.constants.ts
|
|
61224
|
+
var DOCFLOW_LAUNCH_PARAMETERS_KEY = "smbDocflowParameters";
|
|
61225
|
+
var LAUNCH_PARAMETERS_STEP_INPUT = `{{trigger.${DOCFLOW_LAUNCH_PARAMETERS_KEY}}}`;
|
|
61226
|
+
|
|
61227
|
+
// src/server/records.ts
|
|
61228
|
+
var clients = {
|
|
61229
|
+
person: new u2(),
|
|
61230
|
+
application: new u2({ runAs: "application" })
|
|
61231
|
+
};
|
|
61232
|
+
var restClient = (runAs) => clients[runAs];
|
|
61233
|
+
|
|
61234
|
+
// src/server/bitrix-member.ts
|
|
61235
|
+
var callMetadataGraphql = async ({
|
|
61236
|
+
query,
|
|
61237
|
+
variables,
|
|
61238
|
+
token
|
|
61239
|
+
}) => {
|
|
61240
|
+
const apiUrl = process.env.TWENTY_API_URL?.replace(/\/$/, "");
|
|
61241
|
+
if (apiUrl === void 0 || apiUrl.length === 0) {
|
|
61242
|
+
throw new Error("TWENTY_API_URL is not set");
|
|
61243
|
+
}
|
|
61244
|
+
const headers = {
|
|
61245
|
+
"content-type": "application/json"
|
|
61246
|
+
};
|
|
61247
|
+
if (token !== void 0 && token.length > 0) {
|
|
61248
|
+
headers.authorization = `Bearer ${token}`;
|
|
61249
|
+
}
|
|
61250
|
+
const response = await fetch(`${apiUrl}/metadata`, {
|
|
61251
|
+
method: "POST",
|
|
61252
|
+
headers,
|
|
61253
|
+
body: JSON.stringify({ query, variables })
|
|
61254
|
+
});
|
|
61255
|
+
const body = await response.json().catch(() => null);
|
|
61256
|
+
const [firstError] = body?.errors ?? [];
|
|
61257
|
+
if (firstError !== void 0 || body?.data === void 0) {
|
|
61258
|
+
throw new Error(firstError?.message ?? `Metadata request failed with ${response.status}`);
|
|
61259
|
+
}
|
|
61260
|
+
return body.data;
|
|
61261
|
+
};
|
|
61262
|
+
var findMemberByEmail = async (email) => readRestList(
|
|
61263
|
+
await restClient("application").get("/rest/workspaceMembers", {
|
|
61264
|
+
query: { filter: restEq("userEmail", email), limit: 1 }
|
|
61265
|
+
})
|
|
61266
|
+
).records[0];
|
|
61267
|
+
var loadWorkspaceInvite = async () => {
|
|
61268
|
+
const token = process.env.TWENTY_APP_APPLICATION_ACCESS_TOKEN ?? process.env.TWENTY_APP_ACCESS_TOKEN;
|
|
61269
|
+
const data = await callMetadataGraphql({
|
|
61270
|
+
query: `query {
|
|
61271
|
+
currentWorkspace { id inviteHash isPublicInviteLinkEnabled }
|
|
61272
|
+
}`,
|
|
61273
|
+
token
|
|
61274
|
+
});
|
|
61275
|
+
const inviteHash = data.currentWorkspace.inviteHash?.trim() ?? "";
|
|
61276
|
+
if (inviteHash.length === 0) {
|
|
61277
|
+
throw new Error("\u0423 \u043A\u043E\u043C\u043F\u0430\u043D\u0438\u0438 \u0432 CRM \u043D\u0435\u0442 \u0441\u0441\u044B\u043B\u043A\u0438-\u043F\u0440\u0438\u0433\u043B\u0430\u0448\u0435\u043D\u0438\u044F \u0434\u043B\u044F \u043D\u043E\u0432\u044B\u0445 \u0441\u043E\u0442\u0440\u0443\u0434\u043D\u0438\u043A\u043E\u0432");
|
|
61278
|
+
}
|
|
61279
|
+
if (data.currentWorkspace.isPublicInviteLinkEnabled === false) {
|
|
61280
|
+
throw new Error(
|
|
61281
|
+
"\u0412 CRM \u0432\u044B\u043A\u043B\u044E\u0447\u0435\u043D\u0430 \u043F\u0443\u0431\u043B\u0438\u0447\u043D\u0430\u044F \u0441\u0441\u044B\u043B\u043A\u0430-\u043F\u0440\u0438\u0433\u043B\u0430\u0448\u0435\u043D\u0438\u0435. \u0412\u043A\u043B\u044E\u0447\u0438\u0442\u0435 \u0435\u0451 \u0432 \xAB\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u2192 \u0423\u0447\u0430\u0441\u0442\u043D\u0438\u043A\u0438\xBB, \u0447\u0442\u043E\u0431\u044B \u0441\u043E\u0442\u0440\u0443\u0434\u043D\u0438\u043A\u0438 \u0438\u0437 \u0411\u0438\u0442\u0440\u0438\u043A\u044124 \u043F\u043E\u044F\u0432\u043B\u044F\u043B\u0438\u0441\u044C \u0441\u0430\u043C\u0438."
|
|
61282
|
+
);
|
|
61283
|
+
}
|
|
61284
|
+
return {
|
|
61285
|
+
id: data.currentWorkspace.id,
|
|
61286
|
+
inviteHash,
|
|
61287
|
+
isPublicInviteLinkEnabled: true
|
|
61288
|
+
};
|
|
61289
|
+
};
|
|
61290
|
+
var signUpMember = async (email, workspace) => {
|
|
61291
|
+
await callMetadataGraphql({
|
|
61292
|
+
query: `mutation SignUpInWorkspace(
|
|
61293
|
+
$email: String!
|
|
61294
|
+
$password: String!
|
|
61295
|
+
$workspaceId: UUID
|
|
61296
|
+
$workspaceInviteHash: String
|
|
61297
|
+
$locale: String
|
|
61298
|
+
) {
|
|
61299
|
+
signUpInWorkspace(
|
|
61300
|
+
email: $email
|
|
61301
|
+
password: $password
|
|
61302
|
+
workspaceId: $workspaceId
|
|
61303
|
+
workspaceInviteHash: $workspaceInviteHash
|
|
61304
|
+
locale: $locale
|
|
61305
|
+
) { workspace { id } }
|
|
61306
|
+
}`,
|
|
61307
|
+
variables: {
|
|
61308
|
+
email,
|
|
61309
|
+
password: randomBytes(24).toString("base64url"),
|
|
61310
|
+
workspaceId: workspace.id,
|
|
61311
|
+
workspaceInviteHash: workspace.inviteHash,
|
|
61312
|
+
locale: "ru-RU"
|
|
61313
|
+
}
|
|
61314
|
+
});
|
|
61315
|
+
};
|
|
61316
|
+
var nameIsEmpty = (member) => {
|
|
61317
|
+
const firstName = member.name?.firstName?.trim() ?? "";
|
|
61318
|
+
const lastName = member.name?.lastName?.trim() ?? "";
|
|
61319
|
+
return firstName.length === 0 && lastName.length === 0;
|
|
61320
|
+
};
|
|
61321
|
+
var applyBitrixName = async (member, user) => {
|
|
61322
|
+
const name = readBitrixUserName(user);
|
|
61323
|
+
if (name.firstName.length === 0 && name.lastName.length === 0) {
|
|
61324
|
+
return member;
|
|
61325
|
+
}
|
|
61326
|
+
if (!nameIsEmpty(member) && member.name?.firstName === name.firstName && member.name?.lastName === name.lastName) {
|
|
61327
|
+
return member;
|
|
61328
|
+
}
|
|
61329
|
+
if (!nameIsEmpty(member)) {
|
|
61330
|
+
return member;
|
|
61331
|
+
}
|
|
61332
|
+
return readRestRecord(
|
|
61333
|
+
await restClient("application").patch(`/rest/workspaceMembers/${member.id}`, { name })
|
|
61334
|
+
) ?? { ...member, name };
|
|
61335
|
+
};
|
|
61336
|
+
var findOrCreateWorkspaceMemberFromBitrix = async (user) => {
|
|
61337
|
+
const email = readBitrixUserEmail(user);
|
|
61338
|
+
if (email === void 0) {
|
|
61339
|
+
return void 0;
|
|
61340
|
+
}
|
|
61341
|
+
const existing = await findMemberByEmail(email);
|
|
61342
|
+
if (existing !== void 0) {
|
|
61343
|
+
return applyBitrixName(existing, user);
|
|
61344
|
+
}
|
|
61345
|
+
const workspace = await loadWorkspaceInvite();
|
|
61346
|
+
await signUpMember(email, workspace);
|
|
61347
|
+
const created = await findMemberByEmail(email);
|
|
61348
|
+
if (created === void 0) {
|
|
61349
|
+
throw new Error("\u0421\u043E\u0442\u0440\u0443\u0434\u043D\u0438\u043A \u0441\u043E\u0437\u0434\u0430\u043D \u0432 CRM, \u043D\u043E \u0437\u0430\u043F\u0438\u0441\u044C \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u0430 \u043F\u043E \u043F\u043E\u0447\u0442\u0435");
|
|
61350
|
+
}
|
|
61351
|
+
return applyBitrixName(created, user);
|
|
61352
|
+
};
|
|
61353
|
+
|
|
61354
|
+
// node_modules/twenty-sdk/dist/logic-function/isDefined-Dtu5EYqP-CMNeFg4z.mjs
|
|
61355
|
+
var import_guards = __toESM(require_build(), 1);
|
|
61356
|
+
var n2 = (n4) => !(0, import_guards.isUndefined)(n4) && !(0, import_guards.isNull)(n4);
|
|
61357
|
+
|
|
61277
61358
|
// node_modules/twenty-sdk/dist/logic-function/index.mjs
|
|
61359
|
+
var import_guards2 = __toESM(require_build(), 1);
|
|
61360
|
+
|
|
61361
|
+
// node_modules/uuid/dist-node/stringify.js
|
|
61362
|
+
var byteToHex = [];
|
|
61363
|
+
for (let i5 = 0; i5 < 256; ++i5) {
|
|
61364
|
+
byteToHex.push((i5 + 256).toString(16).slice(1));
|
|
61365
|
+
}
|
|
61366
|
+
function unsafeStringify(arr, offset = 0) {
|
|
61367
|
+
return (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + "-" + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + "-" + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + "-" + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + "-" + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase();
|
|
61368
|
+
}
|
|
61369
|
+
|
|
61370
|
+
// node_modules/uuid/dist-node/rng.js
|
|
61371
|
+
import { randomFillSync } from "node:crypto";
|
|
61372
|
+
var rnds8Pool = new Uint8Array(256);
|
|
61373
|
+
var poolPtr = rnds8Pool.length;
|
|
61374
|
+
function rng() {
|
|
61375
|
+
if (poolPtr > rnds8Pool.length - 16) {
|
|
61376
|
+
randomFillSync(rnds8Pool);
|
|
61377
|
+
poolPtr = 0;
|
|
61378
|
+
}
|
|
61379
|
+
return rnds8Pool.slice(poolPtr, poolPtr += 16);
|
|
61380
|
+
}
|
|
61381
|
+
|
|
61382
|
+
// node_modules/uuid/dist-node/native.js
|
|
61383
|
+
import { randomUUID } from "node:crypto";
|
|
61384
|
+
var native_default = { randomUUID };
|
|
61385
|
+
|
|
61386
|
+
// node_modules/uuid/dist-node/v4.js
|
|
61387
|
+
function _v4(options, buf, offset) {
|
|
61388
|
+
options = options || {};
|
|
61389
|
+
const rnds = options.random ?? options.rng?.() ?? rng();
|
|
61390
|
+
if (rnds.length < 16) {
|
|
61391
|
+
throw new Error("Random bytes length must be >= 16");
|
|
61392
|
+
}
|
|
61393
|
+
rnds[6] = rnds[6] & 15 | 64;
|
|
61394
|
+
rnds[8] = rnds[8] & 63 | 128;
|
|
61395
|
+
if (buf) {
|
|
61396
|
+
offset = offset || 0;
|
|
61397
|
+
if (offset < 0 || offset + 16 > buf.length) {
|
|
61398
|
+
throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);
|
|
61399
|
+
}
|
|
61400
|
+
for (let i5 = 0; i5 < 16; ++i5) {
|
|
61401
|
+
buf[offset + i5] = rnds[i5];
|
|
61402
|
+
}
|
|
61403
|
+
return buf;
|
|
61404
|
+
}
|
|
61405
|
+
return unsafeStringify(rnds);
|
|
61406
|
+
}
|
|
61407
|
+
function v4(options, buf, offset) {
|
|
61408
|
+
if (native_default.randomUUID && !buf && !options) {
|
|
61409
|
+
return native_default.randomUUID();
|
|
61410
|
+
}
|
|
61411
|
+
return _v4(options, buf, offset);
|
|
61412
|
+
}
|
|
61413
|
+
var v4_default = v4;
|
|
61414
|
+
|
|
61415
|
+
// node_modules/twenty-sdk/dist/logic-function/index.mjs
|
|
61416
|
+
var l4 = __toESM(require_react(), 1);
|
|
61417
|
+
import { MetadataApiClient as u3 } from "twenty-client-sdk/metadata";
|
|
61278
61418
|
var f2 = Object.defineProperty;
|
|
61279
61419
|
var p2 = (e3, t4) => () => (t4 || (e3((t4 = { exports: {} }).exports, t4), e3 = null), t4.exports);
|
|
61280
61420
|
var m2 = (e3, t4) => {
|
|
@@ -71982,17 +72122,17 @@ var gp2 = {
|
|
|
71982
72122
|
};
|
|
71983
72123
|
var _p = /* @__PURE__ */ new WeakSet();
|
|
71984
72124
|
var vp = /* @__PURE__ */ new WeakMap();
|
|
71985
|
-
var yp2 = (t4) =>
|
|
72125
|
+
var yp2 = (t4) => n2(t4) && !(typeof t4 == "object" && _p.has(t4));
|
|
71986
72126
|
var bp = (e3) => typeof e3 == "object" && !!e3 && !Array.isArray(e3);
|
|
71987
72127
|
var xp2 = (t4) => {
|
|
71988
|
-
if (!
|
|
72128
|
+
if (!n2(t4) || t4 === "") return true;
|
|
71989
72129
|
if (Array.isArray(t4)) return t4.length === 0;
|
|
71990
72130
|
if (!bp(t4) || t4 instanceof Date) return false;
|
|
71991
72131
|
if (_p.has(t4)) return true;
|
|
71992
72132
|
let n4 = vp.get(t4);
|
|
71993
72133
|
if (n4 === W2.RICH_TEXT) return !(0, import_guards2.isNonEmptyString)(t4.markdown) || t4.markdown.trim().length === 0;
|
|
71994
|
-
let i5 =
|
|
71995
|
-
return (
|
|
72134
|
+
let i5 = n2(n4) ? gp2[n4] : void 0;
|
|
72135
|
+
return (n2(i5) ? i5.map((e3) => t4[e3]) : Object.values(t4)).every(xp2);
|
|
71996
72136
|
};
|
|
71997
72137
|
var Sp2 = {
|
|
71998
72138
|
isDefined: {
|
|
@@ -116675,7 +116815,7 @@ var Vj2 = (t4, n4) => {
|
|
|
116675
116815
|
if (!(0, import_guards2.isString)(n4)) return;
|
|
116676
116816
|
let r4 = n4.split("."), i5 = t4;
|
|
116677
116817
|
for (let t5 of r4) {
|
|
116678
|
-
if (!
|
|
116818
|
+
if (!n2(i5) || !(0, import_guards2.isObject)(i5) || Bj2.has(t5) || !Object.prototype.hasOwnProperty.call(i5, t5)) return;
|
|
116679
116819
|
i5 = i5[t5];
|
|
116680
116820
|
}
|
|
116681
116821
|
return i5;
|
|
@@ -116683,7 +116823,7 @@ var Vj2 = (t4, n4) => {
|
|
|
116683
116823
|
var Hj2 = (e3, n4) => (r4, i5) => (0, import_guards2.isNonEmptyArray)(r4) ? r4[e3]((e4) => n4(Vj2(e4, i5))) : false;
|
|
116684
116824
|
var Uj = (e3, n4) => (r4, i5, a5) => (0, import_guards2.isNonEmptyArray)(r4) ? r4[e3]((e4) => n4(Vj2(e4, i5), a5)) : false;
|
|
116685
116825
|
var Wj2 = new ph2();
|
|
116686
|
-
Wj2.functions.isDefined = (t4) =>
|
|
116826
|
+
Wj2.functions.isDefined = (t4) => n2(t4), Wj2.functions.isNonEmptyString = (e3) => (0, import_guards2.isNonEmptyString)(e3), Wj2.functions.includes = (e3, t4) => Array.isArray(e3) && e3.includes(t4), Wj2.functions.arrayLength = (e3) => Array.isArray(e3) ? e3.length : 0, Wj2.functions.every = Hj2("every", Boolean), Wj2.functions.everyDefined = Hj2("every", n2), Wj2.functions.some = Hj2("some", Boolean), Wj2.functions.someDefined = Hj2("some", n2), Wj2.functions.someNonEmptyString = Hj2("some", import_guards2.isNonEmptyString), Wj2.functions.none = Hj2("every", (e3) => !e3), Wj2.functions.noneDefined = Hj2("every", (t4) => !n2(t4)), Wj2.functions.everyEquals = Uj("every", (e3, t4) => e3 === t4), Wj2.functions.someEquals = Uj("some", (e3, t4) => e3 === t4), Wj2.functions.noneEquals = Uj("every", (e3, t4) => e3 !== t4), Wj2.functions.includesEvery = Uj("every", (e3, t4) => Array.isArray(e3) && e3.includes(t4)), Wj2.functions.includesSome = Uj("some", (e3, t4) => Array.isArray(e3) && e3.includes(t4)), Wj2.functions.includesNone = Uj("every", (e3, t4) => Array.isArray(e3) && !e3.includes(t4));
|
|
116687
116827
|
var Kj2 = [
|
|
116688
116828
|
"yyyy.MM.dd",
|
|
116689
116829
|
"yyyy/MM/dd",
|
|
@@ -118752,7 +118892,7 @@ var jF2 = (e3) => {
|
|
|
118752
118892
|
var MF2 = /{{([^{}]+)}}/g;
|
|
118753
118893
|
function* NF2(t4) {
|
|
118754
118894
|
if ((0, import_guards2.isString)(t4)) {
|
|
118755
|
-
for (let [, n4] of t4.matchAll(MF2))
|
|
118895
|
+
for (let [, n4] of t4.matchAll(MF2)) n2(n4) && (yield n4);
|
|
118756
118896
|
return;
|
|
118757
118897
|
}
|
|
118758
118898
|
if ((0, import_guards2.isObject)(t4)) for (let e3 of Object.values(t4)) yield* NF2(e3);
|
|
@@ -118772,9 +118912,9 @@ var FF2 = (e3, t4) => {
|
|
|
118772
118912
|
return i5[e3.length][t4.length];
|
|
118773
118913
|
};
|
|
118774
118914
|
var IF2 = (t4) => {
|
|
118775
|
-
if (!
|
|
118915
|
+
if (!n2(t4) || !Kf2(t4) || Array.isArray(t4)) return false;
|
|
118776
118916
|
let n4 = Object.values(t4);
|
|
118777
|
-
return n4.length === 0 ? false : n4.every((t5) =>
|
|
118917
|
+
return n4.length === 0 ? false : n4.every((t5) => n2(t5) && Kf2(t5) && Wf2(t5.isLeaf));
|
|
118778
118918
|
};
|
|
118779
118919
|
var LF2 = (e3, t4 = []) => {
|
|
118780
118920
|
let n4 = [];
|
|
@@ -118790,21 +118930,21 @@ var RF2 = ({ schema: t4, propertyPath: n4 }) => {
|
|
|
118790
118930
|
let r4 = t4;
|
|
118791
118931
|
for (let t5 = 0; t5 < n4.length; t5++) {
|
|
118792
118932
|
let i5 = n4[t5];
|
|
118793
|
-
if (!
|
|
118933
|
+
if (!n2(i5)) return;
|
|
118794
118934
|
if (!(0, import_guards2.isObject)(r4)) return {
|
|
118795
118935
|
validPrefix: n4.slice(0, t5),
|
|
118796
118936
|
failedSegment: i5,
|
|
118797
118937
|
availableKeys: []
|
|
118798
118938
|
};
|
|
118799
118939
|
let o5 = r4[i5];
|
|
118800
|
-
if (!
|
|
118940
|
+
if (!n2(o5)) return {
|
|
118801
118941
|
validPrefix: n4.slice(0, t5),
|
|
118802
118942
|
failedSegment: i5,
|
|
118803
118943
|
availableKeys: Object.keys(r4)
|
|
118804
118944
|
};
|
|
118805
118945
|
if (o5.isLeaf) {
|
|
118806
118946
|
let r5 = n4[t5 + 1];
|
|
118807
|
-
return
|
|
118947
|
+
return n2(r5) ? {
|
|
118808
118948
|
validPrefix: n4.slice(0, t5 + 1),
|
|
118809
118949
|
failedSegment: r5,
|
|
118810
118950
|
availableKeys: []
|
|
@@ -118841,9 +118981,9 @@ var KF2 = (e3, t4) => {
|
|
|
118841
118981
|
};
|
|
118842
118982
|
var qF2 = (t4, n4) => {
|
|
118843
118983
|
let [r4, ...i5] = n4;
|
|
118844
|
-
if (!
|
|
118984
|
+
if (!n2(r4)) return zF2;
|
|
118845
118985
|
let a5 = t4[r4];
|
|
118846
|
-
return BF2(a5) ? WF2(a5, i5) :
|
|
118986
|
+
return BF2(a5) ? WF2(a5, i5) : n2(a5) ? i5.length === 0 ? { found: true } : bp(a5) ? qF2(a5, i5) : zF2 : zF2;
|
|
118847
118987
|
};
|
|
118848
118988
|
var JF2 = (e3, t4) => t4.length === 0 || !bp(e3) ? zF2 : VF2(e3) ? GF2(e3.fields, t4) : HF2(e3) ? KF2(e3, t4) : qF2(e3, t4);
|
|
118849
118989
|
var YF2 = ({ schema: e3, propertyPath: t4 }) => JF2(e3, t4);
|
|
@@ -118854,7 +118994,7 @@ var XF2 = (t4) => {
|
|
|
118854
118994
|
let e3 = i5.value;
|
|
118855
118995
|
if (VF2(e3)) for (let t5 of XF2(e3.fields)) n4.push(`${r4}.${t5}`);
|
|
118856
118996
|
else if (bp(e3)) for (let t5 of XF2(e3)) n4.push(`${r4}.${t5}`);
|
|
118857
|
-
} else if (
|
|
118997
|
+
} else if (n2(i5) && (n4.push(r4), bp(i5))) for (let e3 of XF2(i5)) n4.push(`${r4}.${e3}`);
|
|
118858
118998
|
return n4;
|
|
118859
118999
|
};
|
|
118860
119000
|
var ZF2 = (t4) => {
|
|
@@ -118866,7 +119006,7 @@ var ZF2 = (t4) => {
|
|
|
118866
119006
|
n4.push("first");
|
|
118867
119007
|
for (let e3 of ZF2(t4.first.value)) n4.push(`first.${e3}`);
|
|
118868
119008
|
}
|
|
118869
|
-
return
|
|
119009
|
+
return n2(t4.all) && n4.push("all"), n4.push("totalCount"), n4;
|
|
118870
119010
|
}
|
|
118871
119011
|
return XF2(t4);
|
|
118872
119012
|
};
|
|
@@ -118885,7 +119025,7 @@ var tI2 = ({ schema: n4, propertyPath: r4, referencedStepId: i5 }) => {
|
|
|
118885
119025
|
schema: n4,
|
|
118886
119026
|
propertyPath: r4
|
|
118887
119027
|
});
|
|
118888
|
-
if (!
|
|
119028
|
+
if (!n2(a5)) return [];
|
|
118889
119029
|
let o5 = eI2(a5.failedSegment, a5.availableKeys).map((e3) => [
|
|
118890
119030
|
i5,
|
|
118891
119031
|
...a5.validPrefix,
|
|
@@ -118901,7 +119041,7 @@ var nI2 = ({ workflow: t4, graph: n4, stepsById: r4 }) => {
|
|
|
118901
119041
|
let s5 = PF2(o5.settings?.input), c4 = n4.ancestorsByStepId.get(o5.id) ?? /* @__PURE__ */ new Set();
|
|
118902
119042
|
for (let n5 of s5) {
|
|
118903
119043
|
let s6 = jF2(n5), l5 = s6[0];
|
|
118904
|
-
if (!
|
|
119044
|
+
if (!n2(l5)) {
|
|
118905
119045
|
i5.push({
|
|
118906
119046
|
severity: "error",
|
|
118907
119047
|
code: "VARIABLE_INVALID_PATH",
|
|
@@ -118950,8 +119090,8 @@ var nI2 = ({ workflow: t4, graph: n4, stepsById: r4 }) => {
|
|
|
118950
119090
|
var rI2 = ({ step: n4, variable: r4, pathSegments: i5, referencedStepId: o5, isTriggerReference: s5, trigger: c4, stepsById: l5 }) => {
|
|
118951
119091
|
let u4 = i5.slice(1);
|
|
118952
119092
|
if (u4.length === 0) return [];
|
|
118953
|
-
let d2 = s5 ? c4?.settings?.outputSchema : l5.get(o5)?.settings?.outputSchema, f3 =
|
|
118954
|
-
if (!
|
|
119093
|
+
let d2 = s5 ? c4?.settings?.outputSchema : l5.get(o5)?.settings?.outputSchema, f3 = n2(d2) && (0, import_guards2.isObject)(d2) && !Array.isArray(d2) && Object.keys(d2).length === 0;
|
|
119094
|
+
if (!n2(d2) || f3) return [];
|
|
118955
119095
|
if (!YF2({
|
|
118956
119096
|
schema: d2,
|
|
118957
119097
|
propertyPath: u4
|
|
@@ -118967,7 +119107,7 @@ var rI2 = ({ step: n4, variable: r4, pathSegments: i5, referencedStepId: o5, isT
|
|
|
118967
119107
|
message: `Step "${n4.name ?? n4.id}" references variable "{{${r4}}}" but the path "${u4.join(".")}" was not found in the output of step "${o5}".`,
|
|
118968
119108
|
stepId: n4.id,
|
|
118969
119109
|
path: r4,
|
|
118970
|
-
...
|
|
119110
|
+
...n2(s6) ? { hint: s6 } : {},
|
|
118971
119111
|
...(0, import_guards2.isNonEmptyArray)(i6) ? { suggestions: i6 } : {},
|
|
118972
119112
|
...(0, import_guards2.isNonEmptyArray)(a5) ? { availablePaths: a5 } : {}
|
|
118973
119113
|
}];
|
|
@@ -119151,7 +119291,7 @@ sI2.extend({ input: V2({
|
|
|
119151
119291
|
fieldName: z2()
|
|
119152
119292
|
}).optional()
|
|
119153
119293
|
}).superRefine((t4, n4) => {
|
|
119154
|
-
t4.strategy === "LOAD_BALANCED" && !
|
|
119294
|
+
t4.strategy === "LOAD_BALANCED" && !n2(t4.loadBalance) && n4.addIssue({
|
|
119155
119295
|
code: Cf2.custom,
|
|
119156
119296
|
path: ["loadBalance"],
|
|
119157
119297
|
message: "loadBalance is required when strategy is LOAD_BALANCED"
|
|
@@ -119167,7 +119307,7 @@ var NI2 = (e3) => {
|
|
|
119167
119307
|
};
|
|
119168
119308
|
var PI2 = (t4) => {
|
|
119169
119309
|
let n4 = t4.settings?.input;
|
|
119170
|
-
if (
|
|
119310
|
+
if (n2(n4) && (0, import_guards2.isObject)(n4)) return n4;
|
|
119171
119311
|
};
|
|
119172
119312
|
var FI2 = (e3) => {
|
|
119173
119313
|
let t4 = new Set(e3.nextStepIds ?? []);
|
|
@@ -119176,13 +119316,13 @@ var FI2 = (e3) => {
|
|
|
119176
119316
|
return [...t4];
|
|
119177
119317
|
};
|
|
119178
119318
|
var II2 = ({ trigger: t4, steps: n4 }) => {
|
|
119179
|
-
let r4 = /* @__PURE__ */ new Map(), i5 =
|
|
119319
|
+
let r4 = /* @__PURE__ */ new Map(), i5 = n2(t4?.nextStepIds) ? t4.nextStepIds.filter(n2) : [];
|
|
119180
119320
|
r4.set(AF2, i5);
|
|
119181
119321
|
for (let e3 of n4 ?? []) r4.set(e3.id, FI2(e3));
|
|
119182
119322
|
let a5 = /* @__PURE__ */ new Set(), o5 = [AF2];
|
|
119183
119323
|
for (; o5.length > 0; ) {
|
|
119184
119324
|
let t5 = o5.shift();
|
|
119185
|
-
if (!(!
|
|
119325
|
+
if (!(!n2(t5) || a5.has(t5))) {
|
|
119186
119326
|
a5.add(t5);
|
|
119187
119327
|
for (let e3 of r4.get(t5) ?? []) a5.has(e3) || o5.push(e3);
|
|
119188
119328
|
}
|
|
@@ -119228,10 +119368,10 @@ var RI2 = ({ workflow: t4, graph: n4 }) => {
|
|
|
119228
119368
|
return;
|
|
119229
119369
|
}
|
|
119230
119370
|
let d2 = o5.get(t5), f3 = `${t5}:${c4.join(",")}`;
|
|
119231
|
-
if (!
|
|
119371
|
+
if (!n2(d2) || a5.has(f3)) return;
|
|
119232
119372
|
i5.add(t5), NI2(d2) && (d2.settings.input.initialLoopStepIds ?? []).forEach((e3) => s5(e3, [...c4, t5], t5));
|
|
119233
119373
|
let p3 = d2.type === kF2.ITERATOR ? d2.nextStepIds ?? [] : n4.childrenByStepId.get(t5) ?? [];
|
|
119234
|
-
|
|
119374
|
+
n2(u4) && p3.length === 0 && r4.push({
|
|
119235
119375
|
severity: "error",
|
|
119236
119376
|
code: "ITERATOR_MISSING_RETURN",
|
|
119237
119377
|
stepId: t5,
|
|
@@ -119248,7 +119388,7 @@ var zI2 = ({ workflow: t4, graph: n4 }) => {
|
|
|
119248
119388
|
message: `Duplicate step id "${e3.id}". Every step id must be unique within the workflow.`,
|
|
119249
119389
|
stepId: e3.id
|
|
119250
119390
|
}), o5.add(e3.id);
|
|
119251
|
-
let s5 = (t4.trigger?.nextStepIds ?? []).filter(
|
|
119391
|
+
let s5 = (t4.trigger?.nextStepIds ?? []).filter(n2);
|
|
119252
119392
|
zj2(i5) && s5.length === 0 && r4.push({
|
|
119253
119393
|
severity: "error",
|
|
119254
119394
|
code: "TRIGGER_HAS_NO_NEXT_STEP",
|
|
@@ -119286,7 +119426,7 @@ var BI = (t4) => {
|
|
|
119286
119426
|
message: `If/Else step "${t4.name ?? t4.id}" should have at least two branches (a condition branch and an else branch).`,
|
|
119287
119427
|
stepId: t4.id
|
|
119288
119428
|
});
|
|
119289
|
-
let o5 = r4?.stepFilterGroups, s5 = new Set((Array.isArray(o5) ? o5 : []).filter(
|
|
119429
|
+
let o5 = r4?.stepFilterGroups, s5 = new Set((Array.isArray(o5) ? o5 : []).filter(n2).map((e3) => e3.id));
|
|
119290
119430
|
for (let r5 of a5) {
|
|
119291
119431
|
let i6 = r5?.nextStepIds;
|
|
119292
119432
|
(!Array.isArray(i6) || i6.length === 0) && n4.push({
|
|
@@ -119294,7 +119434,7 @@ var BI = (t4) => {
|
|
|
119294
119434
|
code: "IF_ELSE_BRANCH_HAS_NO_NEXT_STEP",
|
|
119295
119435
|
message: `A branch of If/Else step "${t4.name ?? t4.id}" is not connected to any step.`,
|
|
119296
119436
|
stepId: t4.id
|
|
119297
|
-
}),
|
|
119437
|
+
}), n2(r5?.filterGroupId) && !s5.has(r5.filterGroupId) && n4.push({
|
|
119298
119438
|
severity: "error",
|
|
119299
119439
|
code: "INVALID_STEP_PARAMS",
|
|
119300
119440
|
message: `A branch of If/Else step "${t4.name ?? t4.id}" references filter group "${r5.filterGroupId}", which does not exist.`,
|
|
@@ -119383,7 +119523,7 @@ var YI2 = gd2("type", [
|
|
|
119383
119523
|
fieldUniversalIdentifier: Wl2()
|
|
119384
119524
|
}).optional()
|
|
119385
119525
|
}).superRefine((t4, n4) => {
|
|
119386
|
-
t4.strategy === "LOAD_BALANCED" && !
|
|
119526
|
+
t4.strategy === "LOAD_BALANCED" && !n2(t4.loadBalance) && n4.addIssue({
|
|
119387
119527
|
code: "custom",
|
|
119388
119528
|
path: ["loadBalance"],
|
|
119389
119529
|
message: "loadBalance is required when strategy is LOAD_BALANCED"
|
|
@@ -119577,7 +119717,6 @@ var renderBitrixPage = ({
|
|
|
119577
119717
|
title,
|
|
119578
119718
|
message,
|
|
119579
119719
|
crmUrl,
|
|
119580
|
-
tasks,
|
|
119581
119720
|
isInstall
|
|
119582
119721
|
}) => `<!doctype html>
|
|
119583
119722
|
<html lang="ru">
|
|
@@ -119591,73 +119730,140 @@ var renderBitrixPage = ({
|
|
|
119591
119730
|
h1 { font-size: 20px; margin: 0 0 8px; }
|
|
119592
119731
|
p { color: #666; margin: 0 0 16px; }
|
|
119593
119732
|
a.button { display: inline-block; padding: 8px 16px; border-radius: 8px; background: #1961ed; color: #fff; text-decoration: none; }
|
|
119594
|
-
ul { list-style: none; padding: 0; margin: 16px 0 0; }
|
|
119595
|
-
li { padding: 8px 0; border-top: 1px solid #eee; display: flex; justify-content: space-between; gap: 16px; }
|
|
119596
|
-
li a { color: #1961ed; text-decoration: none; }
|
|
119597
|
-
.due { color: #999; white-space: nowrap; }
|
|
119598
119733
|
</style>
|
|
119599
119734
|
</head>
|
|
119600
119735
|
<body>
|
|
119601
119736
|
<h1>${escapeHtml(title)}</h1>
|
|
119602
119737
|
<p>${escapeHtml(message)}</p>
|
|
119603
119738
|
${crmUrl !== void 0 ? `<a class="button" href="${escapeHtml(crmUrl)}" target="_blank" rel="noopener">\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u043E\u043E\u0431\u043E\u0440\u043E\u0442</a>` : ""}
|
|
119604
|
-
${tasks.length > 0 ? `<ul>${tasks.map(
|
|
119605
|
-
(task) => `<li>${task.url !== void 0 ? `<a href="${escapeHtml(task.url)}" target="_blank" rel="noopener">${escapeHtml(task.title)}</a>` : escapeHtml(task.title)}<span class="due">${escapeHtml(task.dueAt ?? "")}</span></li>`
|
|
119606
|
-
).join("")}</ul>` : ""}
|
|
119607
119739
|
${isInstall ? "<script>if (window.BX24) { BX24.init(function () { BX24.installFinish(); }); }</script>" : ""}
|
|
119608
119740
|
</body>
|
|
119609
119741
|
</html>`;
|
|
119610
119742
|
|
|
119743
|
+
// src/server/crm-url.ts
|
|
119744
|
+
var getCrmUrl = () => {
|
|
119745
|
+
const value = process.env.CRM_PUBLIC_URL?.trim();
|
|
119746
|
+
return value !== void 0 && /^https?:\/\//.test(value) ? value.replace(/\/$/, "") : void 0;
|
|
119747
|
+
};
|
|
119748
|
+
|
|
119749
|
+
// package.json
|
|
119750
|
+
var package_default = {
|
|
119751
|
+
name: "@haiiro/docuflow",
|
|
119752
|
+
version: "0.0.13",
|
|
119753
|
+
description: "NorDiv \u0414\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u043E\u043E\u0431\u043E\u0440\u043E\u0442: \u0437\u0430\u0434\u0430\u043D\u0438\u044F \u0441 \u043F\u043E\u043B\u044F\u043C\u0438, \u043F\u0440\u043E\u0446\u0435\u0441\u0441\u044B \u0441 \u0437\u0430\u043F\u0443\u0441\u043A\u043E\u043C \u043F\u043E \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0430\u043C, \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u044B \u0441\u043E \u0432\u0441\u0435\u0445 \u0437\u0430\u043F\u0438\u0441\u0435\u0439, \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0411\u0438\u0442\u0440\u0438\u043A\u044124",
|
|
119754
|
+
license: "AGPL-3.0-only",
|
|
119755
|
+
publishConfig: {
|
|
119756
|
+
access: "public",
|
|
119757
|
+
registry: "https://registry.npmjs.org/"
|
|
119758
|
+
},
|
|
119759
|
+
bin: {
|
|
119760
|
+
"nordiv-docuflow": "bin/install.mjs"
|
|
119761
|
+
},
|
|
119762
|
+
files: [
|
|
119763
|
+
"bin/**/*",
|
|
119764
|
+
"manifest.json",
|
|
119765
|
+
"front-component-shared-dependencies.mjs",
|
|
119766
|
+
"yarn.lock",
|
|
119767
|
+
"src/**/*",
|
|
119768
|
+
"public/**/*",
|
|
119769
|
+
"README.md",
|
|
119770
|
+
"tsconfig.json",
|
|
119771
|
+
"tsconfig.spec.json",
|
|
119772
|
+
"vitest.unit.config.ts",
|
|
119773
|
+
".oxlintrc.json",
|
|
119774
|
+
".nvmrc",
|
|
119775
|
+
".yarnrc.yml",
|
|
119776
|
+
"!**/*.map",
|
|
119777
|
+
"!**/__tests__/**"
|
|
119778
|
+
],
|
|
119779
|
+
engines: {
|
|
119780
|
+
node: "^24.5.0",
|
|
119781
|
+
npm: "please-use-yarn",
|
|
119782
|
+
yarn: ">=4.0.2"
|
|
119783
|
+
},
|
|
119784
|
+
keywords: [
|
|
119785
|
+
"twenty-app"
|
|
119786
|
+
],
|
|
119787
|
+
packageManager: "yarn@4.13.0",
|
|
119788
|
+
scripts: {
|
|
119789
|
+
twenty: "twenty",
|
|
119790
|
+
app: "twenty",
|
|
119791
|
+
build: "yarn build:app && twenty dev:build",
|
|
119792
|
+
lint: "oxlint -c .oxlintrc.json .",
|
|
119793
|
+
"lint:fix": "oxlint --fix -c .oxlintrc.json .",
|
|
119794
|
+
typecheck: "tsc --noEmit -p tsconfig.spec.json",
|
|
119795
|
+
test: "vitest run --config vitest.unit.config.ts",
|
|
119796
|
+
"build:app": "vite build --config vite.app.config.ts"
|
|
119797
|
+
},
|
|
119798
|
+
devDependencies: {
|
|
119799
|
+
"@types/node": "^24.7.2",
|
|
119800
|
+
"@types/react": "^19.0.0",
|
|
119801
|
+
"@types/react-dom": "^19.0.0",
|
|
119802
|
+
oxlint: "^0.16.0",
|
|
119803
|
+
react: "^19.0.0",
|
|
119804
|
+
"react-dom": "^19.0.0",
|
|
119805
|
+
"twenty-client-sdk": "2.45.0",
|
|
119806
|
+
"twenty-sdk": "2.45.0",
|
|
119807
|
+
"twenty-ui": "2.45.0",
|
|
119808
|
+
typescript: "^5.9.3",
|
|
119809
|
+
vite: "^8.0.0",
|
|
119810
|
+
"vite-tsconfig-paths": "^4.2.1",
|
|
119811
|
+
vitest: "^4.0.0"
|
|
119812
|
+
},
|
|
119813
|
+
frontComponentSharedDependencies: [
|
|
119814
|
+
"react",
|
|
119815
|
+
"react-dom/client",
|
|
119816
|
+
"twenty-ui/primitives/input",
|
|
119817
|
+
"twenty-ui/primitives/data-display",
|
|
119818
|
+
"twenty-ui/theme",
|
|
119819
|
+
"twenty-ui/icon"
|
|
119820
|
+
]
|
|
119821
|
+
};
|
|
119822
|
+
|
|
119823
|
+
// src/server/docflow-app-page.ts
|
|
119824
|
+
var BX24_SDK_URL2 = "https://api.bitrix24.com/api/v1/";
|
|
119825
|
+
var buildAssetUrl = (workspaceId, file) => `/public-assets/${workspaceId}/${process.env.APPLICATION_ID ?? ""}/public/app/${file}?v=${encodeURIComponent(package_default.version)}`;
|
|
119826
|
+
var serializeConfig = (config) => JSON.stringify(config).replace(/</g, "\\u003c");
|
|
119827
|
+
var renderDocflowAppPage = ({
|
|
119828
|
+
workspaceId,
|
|
119829
|
+
config
|
|
119830
|
+
}) => new AL(
|
|
119831
|
+
`<!doctype html>
|
|
119832
|
+
<html lang="ru" class="dark">
|
|
119833
|
+
<head>
|
|
119834
|
+
<meta charset="utf-8">
|
|
119835
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
119836
|
+
<title>\u0414\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u043E\u043E\u0431\u043E\u0440\u043E\u0442</title>
|
|
119837
|
+
<link rel="stylesheet" href="${escapeHtml(buildAssetUrl(workspaceId, "docflow-app.css"))}">
|
|
119838
|
+
<style>html, body, #root { height: 100%; margin: 0; } body { font-family: Inter, -apple-system, "Segoe UI", Roboto, sans-serif; }</style>
|
|
119839
|
+
${config.mode === "bitrix" ? `<script src="${BX24_SDK_URL2}"></script>` : ""}
|
|
119840
|
+
<script id="docflow-app-config" type="application/json">${serializeConfig(config)}</script>
|
|
119841
|
+
</head>
|
|
119842
|
+
<body>
|
|
119843
|
+
<div id="root"></div>
|
|
119844
|
+
<script src="${escapeHtml(buildAssetUrl(workspaceId, "docflow-app.js"))}"></script>
|
|
119845
|
+
</body>
|
|
119846
|
+
</html>`,
|
|
119847
|
+
{
|
|
119848
|
+
status: 200,
|
|
119849
|
+
headers: {
|
|
119850
|
+
"content-type": "text/html; charset=utf-8",
|
|
119851
|
+
"cache-control": "no-store"
|
|
119852
|
+
}
|
|
119853
|
+
}
|
|
119854
|
+
);
|
|
119855
|
+
|
|
119611
119856
|
// src/server/http-response.ts
|
|
119612
119857
|
var htmlResponse = (status, html) => new AL(html, {
|
|
119613
119858
|
status,
|
|
119614
119859
|
headers: { "content-type": "text/html; charset=utf-8" }
|
|
119615
119860
|
});
|
|
119616
119861
|
|
|
119617
|
-
// src/server/records.ts
|
|
119618
|
-
var clients = {
|
|
119619
|
-
person: new u2(),
|
|
119620
|
-
application: new u2({ runAs: "application" })
|
|
119621
|
-
};
|
|
119622
|
-
var restClient = (runAs) => clients[runAs];
|
|
119623
|
-
|
|
119624
119862
|
// src/universal-identifiers.ts
|
|
119625
119863
|
var BITRIX_APP_LOGIC_FUNCTION_UNIVERSAL_IDENTIFIER = "00fa5cea-d57b-4215-980a-c4bed9232a4f";
|
|
119626
119864
|
|
|
119627
119865
|
// src/logic-functions/bitrix-app.logic-function.ts
|
|
119628
|
-
var
|
|
119629
|
-
var getCrmUrl = () => {
|
|
119630
|
-
const value = process.env.CRM_PUBLIC_URL?.trim();
|
|
119631
|
-
return value !== void 0 && /^https?:\/\//.test(value) ? value.replace(/\/$/, "") : void 0;
|
|
119632
|
-
};
|
|
119633
|
-
var findMyTasks = async (email, crmUrl) => {
|
|
119634
|
-
const [member] = readRestList(
|
|
119635
|
-
await restClient("application").get("/rest/workspaceMembers", {
|
|
119636
|
-
query: { filter: restEq("userEmail", email), limit: 1 }
|
|
119637
|
-
})
|
|
119638
|
-
).records;
|
|
119639
|
-
if (member === void 0) {
|
|
119640
|
-
return void 0;
|
|
119641
|
-
}
|
|
119642
|
-
return readRestList(
|
|
119643
|
-
await restClient("application").get("/rest/tasks", {
|
|
119644
|
-
query: {
|
|
119645
|
-
filter: restAnd(
|
|
119646
|
-
restEq("smbSection", DOCFLOW_SECTION),
|
|
119647
|
-
restEq("assigneeId", member.id),
|
|
119648
|
-
restOr(restNeq("status", TASK_DONE_STATUS), restIsNull("status"))
|
|
119649
|
-
),
|
|
119650
|
-
order_by: "dueAt[AscNullsLast]",
|
|
119651
|
-
limit: TASKS_SHOWN_IN_PORTAL
|
|
119652
|
-
}
|
|
119653
|
-
})
|
|
119654
|
-
).records.map((task) => ({
|
|
119655
|
-
title: task.title?.trim() || "\u0411\u0435\u0437 \u043D\u0430\u0437\u0432\u0430\u043D\u0438\u044F",
|
|
119656
|
-
url: crmUrl !== void 0 ? `${crmUrl}/object/task/${task.id}` : void 0,
|
|
119657
|
-
dueAt: typeof task.dueAt === "string" ? new Date(task.dueAt).toLocaleDateString("ru-RU") : void 0
|
|
119658
|
-
}));
|
|
119659
|
-
};
|
|
119660
|
-
var handler = async (event) => {
|
|
119866
|
+
var handler = async (event, context) => {
|
|
119661
119867
|
const crmUrl = getCrmUrl();
|
|
119662
119868
|
if (!isBitrixConfigured()) {
|
|
119663
119869
|
return htmlResponse(
|
|
@@ -119666,7 +119872,6 @@ var handler = async (event) => {
|
|
|
119666
119872
|
title: "\u0414\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u043E\u043E\u0431\u043E\u0440\u043E\u0442",
|
|
119667
119873
|
message: "\u0412 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430\u0445 \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u0432 CRM \u043D\u0435 \u0443\u043A\u0430\u0437\u0430\u043D\u044B BITRIX_CLIENT_ID \u0438 BITRIX_CLIENT_SECRET.",
|
|
119668
119874
|
crmUrl,
|
|
119669
|
-
tasks: [],
|
|
119670
119875
|
isInstall: false
|
|
119671
119876
|
})
|
|
119672
119877
|
);
|
|
@@ -119684,25 +119889,46 @@ var handler = async (event) => {
|
|
|
119684
119889
|
method: "user.current",
|
|
119685
119890
|
params: {}
|
|
119686
119891
|
});
|
|
119687
|
-
const
|
|
119688
|
-
|
|
119689
|
-
|
|
119690
|
-
|
|
119691
|
-
|
|
119692
|
-
|
|
119693
|
-
|
|
119694
|
-
|
|
119695
|
-
|
|
119696
|
-
|
|
119697
|
-
|
|
119892
|
+
const member = await findOrCreateWorkspaceMemberFromBitrix(user);
|
|
119893
|
+
if (member === void 0) {
|
|
119894
|
+
return htmlResponse(
|
|
119895
|
+
200,
|
|
119896
|
+
renderBitrixPage({
|
|
119897
|
+
title: "\u0414\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u043E\u043E\u0431\u043E\u0440\u043E\u0442",
|
|
119898
|
+
message: "\u0412 \u043F\u0440\u043E\u0444\u0438\u043B\u0435 \u0411\u0438\u0442\u0440\u0438\u043A\u044124 \u043D\u0435\u0442 \u043F\u043E\u0447\u0442\u044B \u2014 \u0431\u0435\u0437 \u043D\u0435\u0451 \u043D\u0435\u043B\u044C\u0437\u044F \u043D\u0430\u0439\u0442\u0438 \u0438\u043B\u0438 \u0441\u043E\u0437\u0434\u0430\u0442\u044C \u0441\u043E\u0442\u0440\u0443\u0434\u043D\u0438\u043A\u0430 \u0432 CRM.",
|
|
119899
|
+
crmUrl,
|
|
119900
|
+
isInstall: false
|
|
119901
|
+
})
|
|
119902
|
+
);
|
|
119903
|
+
}
|
|
119904
|
+
return renderDocflowAppPage({
|
|
119905
|
+
workspaceId: context.workspaceId,
|
|
119906
|
+
config: {
|
|
119907
|
+
mode: "bitrix",
|
|
119908
|
+
crmUrl: crmUrl ?? "",
|
|
119909
|
+
section: readDocflowAppSection(event.queryStringParameters.section),
|
|
119910
|
+
expectedWorkspaceMemberId: member.id,
|
|
119911
|
+
portalDomain: portal.portalDomain
|
|
119912
|
+
}
|
|
119913
|
+
});
|
|
119698
119914
|
} catch (error) {
|
|
119915
|
+
if (error instanceof BitrixError) {
|
|
119916
|
+
return htmlResponse(
|
|
119917
|
+
403,
|
|
119918
|
+
renderBitrixPage({
|
|
119919
|
+
title: "\u0414\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u043E\u043E\u0431\u043E\u0440\u043E\u0442",
|
|
119920
|
+
message: `\u0417\u0430\u043F\u0440\u043E\u0441 \u043F\u043E\u0440\u0442\u0430\u043B\u0430 \u043D\u0435 \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0451\u043D: ${error.message}`,
|
|
119921
|
+
crmUrl,
|
|
119922
|
+
isInstall: false
|
|
119923
|
+
})
|
|
119924
|
+
);
|
|
119925
|
+
}
|
|
119699
119926
|
return htmlResponse(
|
|
119700
|
-
|
|
119927
|
+
200,
|
|
119701
119928
|
renderBitrixPage({
|
|
119702
119929
|
title: "\u0414\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u043E\u043E\u0431\u043E\u0440\u043E\u0442",
|
|
119703
|
-
message: error instanceof
|
|
119930
|
+
message: error instanceof Error ? error.message : "\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043E\u0442\u043A\u0440\u044B\u0442\u044C \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u043E\u043E\u0431\u043E\u0440\u043E\u0442 \u0434\u043B\u044F \u0432\u0430\u0448\u0435\u0433\u043E \u043F\u0440\u043E\u0444\u0438\u043B\u044F \u0411\u0438\u0442\u0440\u0438\u043A\u044124.",
|
|
119704
119931
|
crmUrl,
|
|
119705
|
-
tasks: [],
|
|
119706
119932
|
isInstall: false
|
|
119707
119933
|
})
|
|
119708
119934
|
);
|