@maudecode/kanvil 0.4.1 → 0.4.3
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/apps/server/.env.example +2 -0
- package/apps/server/dist/{auth-DAqfvUJm.mjs → auth-CnAQzKyq.mjs} +48 -17
- package/apps/server/dist/client.mjs +1 -1
- package/apps/server/dist/{config-BFzcAs8u.mjs → config-DOT1SDQO.mjs} +2 -1
- package/apps/server/dist/index.mjs +6 -6
- package/apps/server/dist/migrate.mjs +1 -1
- package/apps/server/dist/recover.mjs +3 -3
- package/apps/server/dist/{src-tQ82UI8k.mjs → src-VxR5jZiK.mjs} +145 -8
- package/apps/web/dist/assets/{CompositeItem-DgnfVvrF.js → CompositeItem-B5Qlh5m0.js} +1 -1
- package/apps/web/dist/assets/{Trans-f2VYVS9z.js → Trans-DxqBaUXP.js} +1 -1
- package/apps/web/dist/assets/{admin-settings-DBZL4siY.js → admin-settings-Bp7V2t1V.js} +1 -1
- package/apps/web/dist/assets/{archive-restore-CGuLxoHC.js → archive-restore-wsAzhqi-.js} +1 -1
- package/apps/web/dist/assets/az-AZ-DlsPlUZi.js +1 -0
- package/apps/web/dist/assets/{az-BE5iqNIE.js → az-C4KDjOOw.js} +1 -1
- package/apps/web/dist/assets/{corner-left-up-BCro--Gl.js → corner-left-up-arA2ipmM.js} +1 -1
- package/apps/web/dist/assets/de-DE-DLCaqUUe.js +1 -0
- package/apps/web/dist/assets/{de-DLGjUGf_.js → de-Z599ZW7b.js} +1 -1
- package/apps/web/dist/assets/default-6QIAyMq2.js +56 -0
- package/apps/web/dist/assets/{delivery-settings-CZOtb4X8.js → delivery-settings-D5NKPlhN.js} +1 -1
- package/apps/web/dist/assets/el-GR-P2XcwrSU.js +1 -0
- package/apps/web/dist/assets/{el-CG6Xy42v.js → el-xsvq992p.js} +1 -1
- package/apps/web/dist/assets/{ellipsis-ZJM26JNS.js → ellipsis-UOkL14vq.js} +1 -1
- package/apps/web/dist/assets/{es-Bbj5WuMM.js → es-D3e9L5_i.js} +1 -1
- package/apps/web/dist/assets/es-ES-CJoX8f3w.js +1 -0
- package/apps/web/dist/assets/{forms-C3pNy-qY.js → forms-BbWAl0BZ.js} +1 -1
- package/apps/web/dist/assets/{fr-CjuIKc1o.js → fr-CY35Bcpp.js} +1 -1
- package/apps/web/dist/assets/fr-FR-yLkQdy6a.js +1 -0
- package/apps/web/dist/assets/{hi-BVVrZ-zZ.js → hi-Cqfv-E5P.js} +1 -1
- package/apps/web/dist/assets/hi-IN-y8dqej7z.js +1 -0
- package/apps/web/dist/assets/{highlight-CKyEM4jx.js → highlight-Ds7xUUQv.js} +1 -1
- package/apps/web/dist/assets/{id-BhNWOQnp.js → id-CFBOVDUC.js} +1 -1
- package/apps/web/dist/assets/id-ID-DSvh8mGH.js +1 -0
- package/apps/web/dist/assets/{index-BIuqxnJn.js → index-2V6MWx63.js} +5 -5
- package/apps/web/dist/assets/{invitations-D5unaga2.js → invitations-BPk5fwwU.js} +1 -1
- package/apps/web/dist/assets/{it-Cav3_-xd.js → it-DNLponcC.js} +1 -1
- package/apps/web/dist/assets/it-IT-BUcfUqNo.js +1 -0
- package/apps/web/dist/assets/{item-Cj8xpMLk.js → item-DED0Ikqi.js} +1 -1
- package/apps/web/dist/assets/ja-JP-C-jLP_Ay.js +1 -0
- package/apps/web/dist/assets/{ja-DTmZE0Qe.js → ja-ZXGlS4WA.js} +1 -1
- package/apps/web/dist/assets/{ko-BuYCMOUj.js → ko-CSoj1hQM.js} +1 -1
- package/apps/web/dist/assets/ko-KR-C5Ozdm2E.js +1 -0
- package/apps/web/dist/assets/{label-settings-B89Ehf78.js → label-settings-D12QOkDs.js} +1 -1
- package/apps/web/dist/assets/{markdown-blocks-DSEA68s5.js → markdown-blocks-DbsqN1T2.js} +1 -1
- package/apps/web/dist/assets/{member-directory-48yD01yN.js → member-directory-BRhEIYZ6.js} +1 -1
- package/apps/web/dist/assets/{mk-BZ2Rg2sU.js → mk-D77vceoz.js} +1 -1
- package/apps/web/dist/assets/mk-MK-BdM_SsE8.js +1 -0
- package/apps/web/dist/assets/{nl-BtnPzRih.js → nl-Bew8-xmX.js} +1 -1
- package/apps/web/dist/assets/nl-NL-CwjB5sva.js +1 -0
- package/apps/web/dist/assets/{pl-Beg8hEdK.js → pl-CEBl_oa9.js} +1 -1
- package/apps/web/dist/assets/pl-PL-6-PMhTBd.js +1 -0
- package/apps/web/dist/assets/{project-lifecycle-CIAMJ-SX.js → project-lifecycle-DGHAmEB2.js} +1 -1
- package/apps/web/dist/assets/{project-settings-C7lolDSl.js → project-settings-DY8Ossd-.js} +1 -1
- package/apps/web/dist/assets/{pt-BR-B4VZ35N_.js → pt-BR-BDTQeKcp.js} +1 -1
- package/apps/web/dist/assets/pt-BR-TD_wt6Hr.js +1 -0
- package/apps/web/dist/assets/{public-project-DvvfaUd2.js → public-project-BeXla8TL.js} +1 -1
- package/apps/web/dist/assets/{rotate-ccw-GjVJPDML.js → rotate-ccw-DGM890Fc.js} +1 -1
- package/apps/web/dist/assets/{ru-DjVJVHzv.js → ru-BeH0eXQq.js} +1 -1
- package/apps/web/dist/assets/ru-RU-Bk1a6Oln.js +1 -0
- package/apps/web/dist/assets/{search-ZaQmVnj1.js → search-B3-w3oCd.js} +3 -3
- package/apps/web/dist/assets/{send-Dr9bXHhf.js → send-B9baaCnt.js} +1 -1
- package/apps/web/dist/assets/{settings-DXvrVvyS.js → settings-BKZfEkVk.js} +1 -1
- package/apps/web/dist/assets/{sliders-horizontal-C1t_zA7D.js → sliders-horizontal-yKgghk8h.js} +1 -1
- package/apps/web/dist/assets/{switch-D-WTDajm.js → switch-ByOrazEW.js} +1 -1
- package/apps/web/dist/assets/{table-BaRMFP84.js → table-Cm6NQXfq.js} +1 -1
- package/apps/web/dist/assets/{ticket-detail-CFJI4qoK.js → ticket-detail-Cd3_e2jz.js} +2 -2
- package/apps/web/dist/assets/{ticket-editor-DL3nHG_q.js → ticket-editor-CLDBUk0n.js} +2 -2
- package/apps/web/dist/assets/{ticket-list-CDkweYGS.js → ticket-list-BC9acNl4.js} +1 -1
- package/apps/web/dist/assets/{ticket-list-controls-CmTgFQQ-.js → ticket-list-controls-CRQk5ghe.js} +1 -1
- package/apps/web/dist/assets/{tr-Ckc4TA71.js → tr-BNApk6Hc.js} +1 -1
- package/apps/web/dist/assets/tr-TR-CUfBb7K9.js +1 -0
- package/apps/web/dist/assets/{uk-B4ZvJ8xG.js → uk-CjShsgpN.js} +1 -1
- package/apps/web/dist/assets/uk-UA-BDaXBsDP.js +1 -0
- package/apps/web/dist/assets/{upload-BwGa8shS.js → upload-BzLq4CMS.js} +1 -1
- package/apps/web/dist/assets/{useQueries-sQEHjB0a.js → useQueries-D64vLhM6.js} +1 -1
- package/apps/web/dist/assets/vi-VN-Bgb-L6mE.js +1 -0
- package/apps/web/dist/assets/{vi-Dq2krfY8.js → vi-s5Hfv1Y-.js} +1 -1
- package/apps/web/dist/assets/{visual-editor-CBhwqTDu.js → visual-editor-KE96mwCg.js} +1 -1
- package/apps/web/dist/assets/{workspace-settings-DgLyieJN.js → workspace-settings-C-Phmi9i.js} +1 -1
- package/apps/web/dist/assets/{zh-CN-B7Rxc3Mp.js → zh-CN-BBnpHJ9R.js} +1 -1
- package/apps/web/dist/assets/zh-CN-BypkvBe6.js +1 -0
- package/apps/web/dist/assets/zh-TW-CgMsT_XS.js +1 -0
- package/apps/web/dist/assets/{zh-TW-awiwHjeM.js → zh-TW-sSWkqSLN.js} +1 -1
- package/apps/web/dist/index.html +7 -7
- package/compose.yml +1 -0
- package/docs/api.md +4 -4
- package/docs/self-hosting.md +2 -0
- package/package.json +1 -1
- package/apps/server/dist/instance-CCeXRJ6m.mjs +0 -133
- package/apps/web/dist/assets/az-AZ-DesqXNg5.js +0 -1
- package/apps/web/dist/assets/de-DE-BIGY9SNm.js +0 -1
- package/apps/web/dist/assets/default-BgvtI7HK.js +0 -56
- package/apps/web/dist/assets/el-GR-D2TjImt0.js +0 -1
- package/apps/web/dist/assets/es-ES-C_fRqLGU.js +0 -1
- package/apps/web/dist/assets/fr-FR-_tnQsn4j.js +0 -1
- package/apps/web/dist/assets/hi-IN-CcmFsZYy.js +0 -1
- package/apps/web/dist/assets/id-ID-C59tC61D.js +0 -1
- package/apps/web/dist/assets/it-IT-BAP5O3gK.js +0 -1
- package/apps/web/dist/assets/ja-JP-vQa7mEdh.js +0 -1
- package/apps/web/dist/assets/ko-KR-CXlpmX0-.js +0 -1
- package/apps/web/dist/assets/mk-MK-BU5BLpXM.js +0 -1
- package/apps/web/dist/assets/nl-NL-2aSpdZkg.js +0 -1
- package/apps/web/dist/assets/pl-PL-C5Wvnv7f.js +0 -1
- package/apps/web/dist/assets/pt-BR-CVvI-ZB7.js +0 -1
- package/apps/web/dist/assets/ru-RU-C7UUdGIh.js +0 -1
- package/apps/web/dist/assets/tr-TR-VVsL3uMp.js +0 -1
- package/apps/web/dist/assets/uk-UA-DRpCbOps.js +0 -1
- package/apps/web/dist/assets/vi-VN-C0YFqq9j.js +0 -1
- package/apps/web/dist/assets/zh-CN-pcgTdR8c.js +0 -1
- package/apps/web/dist/assets/zh-TW-DymSXkFg.js +0 -1
package/apps/server/.env.example
CHANGED
|
@@ -12,6 +12,8 @@ KANVIL_TRUSTED_ORIGINS=http://localhost:5173
|
|
|
12
12
|
KANVIL_SESSION_WRITE_LIMIT=120
|
|
13
13
|
# Set false to disable rate limiting for all API keys, including existing keys.
|
|
14
14
|
KANVIL_API_KEY_RATE_LIMIT_ENABLED=true
|
|
15
|
+
# Maximum initial or renewed claim lease in seconds. Defaults to 24 hours.
|
|
16
|
+
KANVIL_CLAIM_MAX_LEASE_SECONDS=86400
|
|
15
17
|
# Configure all three OIDC values together. Omit them to use local login only.
|
|
16
18
|
# OIDC_DISCOVERY_URL=https://identity.example.com/.well-known/openid-configuration
|
|
17
19
|
# OIDC_CLIENT_ID=
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { a as auth_schema_exports, c as oauthConsent, d as user, i as apikey, l as oauthRefreshToken, o as oauthAccessToken, r as account, s as oauthClient, u as session } from "./config-
|
|
2
|
-
import {
|
|
3
|
-
import { $ as permissions, C as eventLabels, Ct as ticketFilter, D as formatEvent, Dt as workflowOrder, E as filterList, Et as ticketSchema, J as parseCustomFieldFilter, K as operationPermission, L as isSeededRole, M as invitationStatuses, N as isHexColor, O as hasAdminRole, Ot as workspaceSchema, Q as permissionScope, S as eventCategories, St as ticketExportFormat, T as filterKey, Tt as ticketPredicates, X as parsePublicOutput, Y as parseOutput, Z as permissionLabels, _ as deliverySettingsSchema, _t as snapshotSchema, at as remoteKinds, b as difficulties, bt as states, c as credentialProjectsSchema, ct as repositorySecretFields, d as customFieldValue, dt as roleLabels, et as priorities, f as customFieldValueSchema, ft as roles, g as deliverySecretFields, gt as signInMethodLabels, h as deletedAccountName, ht as seededPermissions, i as channelRouteAllows, j as importSecretFields, l as customFieldFilterTokens, lt as resourceProvider, m as defaultWorkflow, mt as searchResultTypes, n as attachmentLimit, nt as projectSchema, o as closedStates, ot as repositoryProviderDefinitions, p as defaultOrder, pt as scopes, q as operations, r as channelKinds, rt as publicOperations, st as repositoryProviders, t as ApiError, tt as priorityLabels, u as customFieldSchema, ut as roleCategory, v as destinationEventKeys, vt as stagedUploadLifetime, w as eventSchema, wt as ticketImportSchema, y as destinationKinds, yt as stateLabels, z as mentionScheme } from "./src-tQ82UI8k.mjs";
|
|
1
|
+
import { a as auth_schema_exports, c as oauthConsent, d as user, i as apikey, l as oauthRefreshToken, o as oauthAccessToken, r as account, s as oauthClient, u as session } from "./config-DOT1SDQO.mjs";
|
|
2
|
+
import { $ as permissionLabels, A as hasAdminRole, At as workspaceSchema, D as filterKey, Dt as ticketPredicates, E as eventSchema, Et as ticketImportSchema, F as isHexColor, J as operationPermission, Lt as s3SettingsSchema, Mt as authenticationPolicySchema, N as importSecretFields, Nt as brokerSettingsSchema, O as filterList, Ot as ticketSchema, P as invitationStatuses, Pt as instanceUpdateSchema, Q as parsePublicOutput, Rt as searchAuthentication, S as difficulties, St as states, T as eventLabels, Tt as ticketFilter, V as mentionScheme, X as parseCustomFieldFilter, Y as operations, Z as parseOutput, _ as deletedAccountName, _t as seededPermissions, at as publicOperations, b as destinationEventKeys, bt as stagedUploadLifetime, ct as repositoryProviderDefinitions, d as customFieldSchema, dt as resourceProvider, et as permissionScope, f as customFieldValue, ft as roleCategory, g as defaultWorkflow, gt as searchResultTypes, h as defaultOrder, ht as scopes, i as channelRouteAllows, it as projectSchema, k as formatEvent, kt as workflowOrder, l as credentialProjectsSchema, lt as repositoryProviders, m as defaultClaimMaxLeaseSeconds, mt as roles, n as attachmentLimit, nt as priorities, p as customFieldValueSchema, pt as roleLabels, r as channelKinds, rt as priorityLabels, s as closedStates, st as remoteKinds, t as ApiError, tt as permissions, u as customFieldFilterTokens, ut as repositorySecretFields, v as deliverySecretFields, vt as signInMethodLabels, w as eventCategories, wt as ticketExportFormat, x as destinationKinds, xt as stateLabels, y as deliverySettingsSchema, yt as snapshotSchema, z as isSeededRole, zt as searchSettingsSchema } from "./src-VxR5jZiK.mjs";
|
|
4
3
|
import { and, asc, count, desc, eq, getTableColumns, gt, ilike, inArray, isNotNull, isNull, lt, lte, ne, notInArray, or, sql } from "drizzle-orm";
|
|
5
4
|
import { alias, bigint, boolean, check, customType, foreignKey, index, integer, jsonb, pgTable, primaryKey, text, timestamp, unionAll, unique, uniqueIndex, uuid } from "drizzle-orm/pg-core";
|
|
6
5
|
import { z } from "zod";
|
|
@@ -1701,11 +1700,10 @@ async function rememberLabelColor(ctx, color) {
|
|
|
1701
1700
|
async function changeLabelUsage(ctx, name, replacement) {
|
|
1702
1701
|
const affected = await ctx.db.select().from(tickets).where(and(eq(tickets.projectId, project(ctx).id), sql`${name} = ANY(${tickets.labels})`));
|
|
1703
1702
|
const pending = [];
|
|
1704
|
-
for (const ticket of affected) pending.push((await
|
|
1705
|
-
projectId: project(ctx).id,
|
|
1703
|
+
for (const ticket of affected) pending.push((await updateTicketLabelsForDefinition(ctx, {
|
|
1706
1704
|
ticketId: ticket.id,
|
|
1707
1705
|
expectedVersion: ticket.version,
|
|
1708
|
-
|
|
1706
|
+
labels: [...new Set(replacement ? ticket.labels.map((tag) => tag === name ? replacement : tag) : ticket.labels.filter((tag) => tag !== name))]
|
|
1709
1707
|
})).event);
|
|
1710
1708
|
await publishMany(ctx, pending);
|
|
1711
1709
|
await rewriteViewFilters(ctx, "label", (tag) => tag !== name ? tag : replacement ?? null);
|
|
@@ -2222,6 +2220,14 @@ async function readinessMany(ctx, selected) {
|
|
|
2222
2220
|
}
|
|
2223
2221
|
return result;
|
|
2224
2222
|
}
|
|
2223
|
+
function claimExpiry(ctx, requested) {
|
|
2224
|
+
const leaseSeconds = requested ?? Math.min(300, ctx.claimMaxLeaseSeconds);
|
|
2225
|
+
if (leaseSeconds > ctx.claimMaxLeaseSeconds) fail(400, "validation_error", "Claim lease exceeds the configured maximum", {
|
|
2226
|
+
path: "leaseSeconds",
|
|
2227
|
+
maximum: ctx.claimMaxLeaseSeconds
|
|
2228
|
+
});
|
|
2229
|
+
return new Date(Date.now() + leaseSeconds * 1e3);
|
|
2230
|
+
}
|
|
2225
2231
|
async function readiness(ctx, ticket) {
|
|
2226
2232
|
return requireRow((await readinessMany(ctx, [ticket])).get(ticket.id));
|
|
2227
2233
|
}
|
|
@@ -2270,15 +2276,24 @@ async function updateTicketRow(ctx, input) {
|
|
|
2270
2276
|
const current = await getTicket(ctx, input.ticketId);
|
|
2271
2277
|
assertVersion(current, input.expectedVersion, "ticket");
|
|
2272
2278
|
await assertWorkerClaim(ctx, current, input.claimId);
|
|
2273
|
-
|
|
2274
|
-
|
|
2275
|
-
|
|
2279
|
+
return persistTicketChanges(ctx, current, input.changes);
|
|
2280
|
+
}
|
|
2281
|
+
async function updateTicketLabelsForDefinition(ctx, input) {
|
|
2282
|
+
if (!can(ctx, "project.manage") && !can(ctx, "workspace.manage")) fail(403, "forbidden", "Label administration permission is required");
|
|
2283
|
+
const current = await getTicket(ctx, input.ticketId);
|
|
2284
|
+
assertVersion(current, input.expectedVersion, "ticket");
|
|
2285
|
+
return persistTicketChanges(ctx, current, { labels: input.labels });
|
|
2286
|
+
}
|
|
2287
|
+
async function persistTicketChanges(ctx, current, changes) {
|
|
2288
|
+
await validateReferences(ctx, current.id, changes);
|
|
2289
|
+
const state = await resolveState(ctx, changes, current);
|
|
2290
|
+
const { startAt, dueAt, customFields, ...values } = changes, dates = dateColumns({
|
|
2276
2291
|
startAt,
|
|
2277
2292
|
dueAt
|
|
2278
2293
|
});
|
|
2279
2294
|
assertSchedule(dates.startAt === void 0 ? current.startAt : dates.startAt, dates.dueAt === void 0 ? current.dueAt : dates.dueAt, current.key);
|
|
2280
2295
|
const row = one(await ctx.db.update(tickets).set({
|
|
2281
|
-
...
|
|
2296
|
+
...values,
|
|
2282
2297
|
...state,
|
|
2283
2298
|
...dates,
|
|
2284
2299
|
...customFields && { customFields: applyCustomFieldValues(await projectCustomFields(ctx), current.customFields, customFields) },
|
|
@@ -2293,7 +2308,7 @@ async function updateTicketRow(ctx, input) {
|
|
|
2293
2308
|
ticketId: row.id,
|
|
2294
2309
|
data: {
|
|
2295
2310
|
version: row.version,
|
|
2296
|
-
changedFields: [.../* @__PURE__ */ new Set([...Object.keys(
|
|
2311
|
+
changedFields: [.../* @__PURE__ */ new Set([...Object.keys(changes), ...state ? ["status", "stateId"] : []])]
|
|
2297
2312
|
}
|
|
2298
2313
|
}
|
|
2299
2314
|
};
|
|
@@ -2885,7 +2900,7 @@ const ticketHandlers = {
|
|
|
2885
2900
|
actorId: ctx.actor.id,
|
|
2886
2901
|
ownerId: ctx.actor.ownerId,
|
|
2887
2902
|
workerId: input.workerId,
|
|
2888
|
-
expiresAt:
|
|
2903
|
+
expiresAt: claimExpiry(ctx, input.leaseSeconds)
|
|
2889
2904
|
}).returning());
|
|
2890
2905
|
const row = one(await ctx.db.update(tickets).set({
|
|
2891
2906
|
...await resolveState(ctx, { status: "in_progress" }, ticket),
|
|
@@ -2904,7 +2919,7 @@ const ticketHandlers = {
|
|
|
2904
2919
|
const ticket = await getTicket(ctx, input.ticketId);
|
|
2905
2920
|
const current = one(await ctx.db.select().from(claims).where(and(eq(claims.id, input.claimId), eq(claims.ticketId, ticket.id))));
|
|
2906
2921
|
if (!ownsLiveClaim(ctx, current)) fail(409, "claim_conflict", "Only the current worker can renew an unexpired claim");
|
|
2907
|
-
const claim = one(await ctx.db.update(claims).set({ expiresAt:
|
|
2922
|
+
const claim = one(await ctx.db.update(claims).set({ expiresAt: claimExpiry(ctx, input.leaseSeconds) }).where(eq(claims.id, current.id)).returning());
|
|
2908
2923
|
await publish(ctx, "claim.renewed", ticket.id, {
|
|
2909
2924
|
claimId: claim.id,
|
|
2910
2925
|
expiresAt: claim.expiresAt.toISOString()
|
|
@@ -2914,7 +2929,7 @@ const ticketHandlers = {
|
|
|
2914
2929
|
async release_claim(ctx, input) {
|
|
2915
2930
|
const ticket = await getTicket(ctx, input.ticketId);
|
|
2916
2931
|
const current = one(await ctx.db.select().from(claims).where(and(eq(claims.id, input.claimId), eq(claims.ticketId, ticket.id))));
|
|
2917
|
-
if (!ownsLiveClaim(ctx, current)) fail(409, "claim_conflict", "Only the owning worker can release an unexpired claim. Expired claims require
|
|
2932
|
+
if (!ownsLiveClaim(ctx, current)) fail(409, "claim_conflict", "Only the owning worker can release an unexpired claim. Expired claims require explicit recovery.");
|
|
2918
2933
|
await ctx.db.delete(claims).where(eq(claims.id, current.id));
|
|
2919
2934
|
await publish(ctx, "claim.released", ticket.id, { claimId: current.id });
|
|
2920
2935
|
return { ok: true };
|
|
@@ -2922,12 +2937,26 @@ const ticketHandlers = {
|
|
|
2922
2937
|
async recover_claim(ctx, input) {
|
|
2923
2938
|
const ticket = await getTicket(ctx, input.ticketId);
|
|
2924
2939
|
const current = one(await ctx.db.select().from(claims).where(and(eq(claims.id, input.claimId), eq(claims.ticketId, ticket.id))));
|
|
2925
|
-
if (
|
|
2940
|
+
if (input.cancelActive && !can(ctx, "project.manage")) fail(403, "forbidden", "Cancelling an active claim requires project management access and admin scope");
|
|
2941
|
+
if (current.expiresAt > /* @__PURE__ */ new Date() && !input.cancelActive) fail(409, "claim_not_expired", "The current claim has not expired");
|
|
2942
|
+
if (input.reschedule && input.expectedVersion !== void 0) {
|
|
2943
|
+
assertVersion(ticket, input.expectedVersion, "ticket", "rescheduling recovered work");
|
|
2944
|
+
const row = one(await ctx.db.update(tickets).set({
|
|
2945
|
+
...await resolveState(ctx, { status: "todo" }, ticket),
|
|
2946
|
+
version: ticket.version + 1,
|
|
2947
|
+
updatedAt: /* @__PURE__ */ new Date()
|
|
2948
|
+
}).where(eq(tickets.id, ticket.id)).returning());
|
|
2949
|
+
await publish(ctx, "ticket.updated", ticket.id, {
|
|
2950
|
+
version: row.version,
|
|
2951
|
+
changedFields: ["status", "stateId"]
|
|
2952
|
+
});
|
|
2953
|
+
}
|
|
2926
2954
|
await ctx.db.delete(claims).where(eq(claims.id, current.id));
|
|
2927
2955
|
await publish(ctx, "claim.recovered", ticket.id, {
|
|
2928
2956
|
claimId: current.id,
|
|
2929
2957
|
reason: input.reason,
|
|
2930
|
-
confirmedStopped: true
|
|
2958
|
+
confirmedStopped: true,
|
|
2959
|
+
...input.cancelActive && { cancelActive: true }
|
|
2931
2960
|
});
|
|
2932
2961
|
return { ok: true };
|
|
2933
2962
|
}
|
|
@@ -6775,7 +6804,8 @@ const baseContext = (db, actor) => ({
|
|
|
6775
6804
|
search: builtinSearch,
|
|
6776
6805
|
secrets: noSecrets,
|
|
6777
6806
|
publicUrl: "http://localhost",
|
|
6778
|
-
sources: noSources
|
|
6807
|
+
sources: noSources,
|
|
6808
|
+
claimMaxLeaseSeconds: defaultClaimMaxLeaseSeconds
|
|
6779
6809
|
});
|
|
6780
6810
|
const publicActor = {
|
|
6781
6811
|
id: "",
|
|
@@ -7042,6 +7072,7 @@ function createDomain(database, services = {}) {
|
|
|
7042
7072
|
if (services.secrets) ctx.secrets = services.secrets;
|
|
7043
7073
|
if (services.publicUrl) ctx.publicUrl = services.publicUrl;
|
|
7044
7074
|
if (services.sources) ctx.sources = services.sources;
|
|
7075
|
+
if (services.claimMaxLeaseSeconds !== void 0) ctx.claimMaxLeaseSeconds = services.claimMaxLeaseSeconds;
|
|
7045
7076
|
return ctx;
|
|
7046
7077
|
};
|
|
7047
7078
|
const locked = (run) => database.db.transaction(async (tx) => {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { C as errorSchema, Ct as streamErrorSchema, E as eventSchema, G as notificationReadInput, H as notificationIdsInput, K as notificationsSchema, Q as parsePublicOutput, U as notificationPreferencesInput, W as notificationPreferencesSchema, Y as operations, Z as parseOutput, a as checkpointSchema, at as publicOperations, q as okSchema, t as ApiError, yt as snapshotSchema } from "./src-VxR5jZiK.mjs";
|
|
2
2
|
import { z } from "zod";
|
|
3
3
|
import { parseArgs } from "node:util";
|
|
4
4
|
import { constants } from "node:fs";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Lt as s3SettingsSchema, Nt as brokerSettingsSchema, m as defaultClaimMaxLeaseSeconds, o as claimLeaseSecondsSchema, zt as searchSettingsSchema } from "./src-VxR5jZiK.mjs";
|
|
2
2
|
import pg from "pg";
|
|
3
3
|
import { drizzle } from "drizzle-orm/node-postgres";
|
|
4
4
|
import { relations } from "drizzle-orm";
|
|
@@ -394,6 +394,7 @@ const envSchema = z.object({
|
|
|
394
394
|
GOOGLE_CLIENT_SECRET: optionalEnv(z.string().min(1)),
|
|
395
395
|
DISCORD_CLIENT_ID: optionalEnv(z.string().min(1)),
|
|
396
396
|
DISCORD_CLIENT_SECRET: optionalEnv(z.string().min(1)),
|
|
397
|
+
KANVIL_CLAIM_MAX_LEASE_SECONDS: z.coerce.number().pipe(claimLeaseSecondsSchema).default(defaultClaimMaxLeaseSeconds),
|
|
397
398
|
KANVIL_SESSION_WRITE_LIMIT: z.coerce.number().int().min(1).max(1e5).default(120),
|
|
398
399
|
KANVIL_API_KEY_RATE_LIMIT_ENABLED: z.enum(["true", "false"]).default("true").transform((value) => value === "true"),
|
|
399
400
|
KANVIL_PUSH_ENABLED: z.enum(["true", "false"]).default("false").transform((value) => value === "true"),
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import { a as auth_schema_exports, d as user$1, i as apikey, n as createDatabase, r as account, t as readConfig, u as session } from "./config-
|
|
2
|
-
import {
|
|
1
|
+
import { a as auth_schema_exports, d as user$1, i as apikey, n as createDatabase, r as account, t as readConfig, u as session } from "./config-DOT1SDQO.mjs";
|
|
2
|
+
import { A as hasAdminRole, B as memberSchema, C as errorSchema, Ft as photoInputSchema, G as notificationReadInput, H as notificationIdsInput, I as isOperation, It as photoResultSchema, L as isPresetColor, Lt as s3SettingsSchema, M as importProviderDefinitions, Nt as brokerSettingsSchema, Pt as instanceUpdateSchema, R as isPublicOperation, U as notificationPreferencesInput, W as notificationPreferencesSchema, Y as operations, at as publicOperations, c as credentialInput, g as defaultWorkflow, ht as scopes, j as importLimits, jt as adminInstanceSchema, mt as roles, ot as pushDeviceInput, q as okSchema, s as closedStates, t as ApiError, wt as ticketExportFormat, xt as stateLabels, zt as searchSettingsSchema } from "./src-VxR5jZiK.mjs";
|
|
3
3
|
import { t as migrateDatabase } from "./migrate-C9f4ozB4.mjs";
|
|
4
|
-
import { $ as subscriptions, A as createTicketSearch, B as blobObjects, C as DeliveryError, D as requireInstanceAdmin, E as createWriteLimiter, F as stagedUploadCutoff, G as members, H as eventClock, I as createObjectStore, J as profilePhotos, K as notificationPreferences, L as createPollingJob, M as createBlobStorage, N as decodeImage, O as requireSession, P as imageResponse, Q as storageBackends, R as attachmentContent, S as deliverBatch, T as createAccess, U as events, V as deliveryCheckpoints, X as pushDevices, Y as projects, Z as stagedUploads, _ as recipientColumns, a as deliverySecrets, b as receiveRepositoryWebhook, c as ownerBlocker, d as createDomain, et as tickets, f as fail, g as reachable, h as one, i as createInstance, j as createTicketIndex, k as readCalendarFeed, l as appendEvents, m as notify, n as emailCodesAvailable, nt as workspaces, o as otherActiveAdministrator, p as json, q as notifications, r as signInProviders, rt as matchesOIDCBinding, s as ownedWorkspaces, t as createAuth, tt as workspaceMembers, u as assertVersion, v as requireRow, w as createHttpSender, x as defaultSenders, y as processImports, z as attachments } from "./auth-
|
|
5
|
-
import { A as importProviderDefinitions, B as notificationIdsInput, F as isPresetColor, G as okSchema, H as notificationPreferencesSchema, I as isPublicOperation, O as hasAdminRole, P as isOperation, R as memberSchema, St as ticketExportFormat, U as notificationReadInput, V as notificationPreferencesInput, ft as roles, it as pushDeviceInput, k as importLimits, m as defaultWorkflow, o as closedStates, pt as scopes, q as operations, rt as publicOperations, s as credentialInput, t as ApiError, x as errorSchema, yt as stateLabels } from "./src-tQ82UI8k.mjs";
|
|
4
|
+
import { $ as subscriptions, A as createTicketSearch, B as blobObjects, C as DeliveryError, D as requireInstanceAdmin, E as createWriteLimiter, F as stagedUploadCutoff, G as members, H as eventClock, I as createObjectStore, J as profilePhotos, K as notificationPreferences, L as createPollingJob, M as createBlobStorage, N as decodeImage, O as requireSession, P as imageResponse, Q as storageBackends, R as attachmentContent, S as deliverBatch, T as createAccess, U as events, V as deliveryCheckpoints, X as pushDevices, Y as projects, Z as stagedUploads, _ as recipientColumns, a as deliverySecrets, b as receiveRepositoryWebhook, c as ownerBlocker, d as createDomain, et as tickets, f as fail, g as reachable, h as one, i as createInstance, j as createTicketIndex, k as readCalendarFeed, l as appendEvents, m as notify, n as emailCodesAvailable, nt as workspaces, o as otherActiveAdministrator, p as json, q as notifications, r as signInProviders, rt as matchesOIDCBinding, s as ownedWorkspaces, t as createAuth, tt as workspaceMembers, u as assertVersion, v as requireRow, w as createHttpSender, x as defaultSenders, y as processImports, z as attachments } from "./auth-CnAQzKyq.mjs";
|
|
6
5
|
import { serve } from "@hono/node-server";
|
|
7
6
|
import pg from "pg";
|
|
8
7
|
import { drizzle } from "drizzle-orm/node-postgres";
|
|
@@ -326,7 +325,7 @@ function createAccountAdministration(database, auth, config) {
|
|
|
326
325
|
}
|
|
327
326
|
//#endregion
|
|
328
327
|
//#region src/version.ts
|
|
329
|
-
const applicationVersion = "0.4.
|
|
328
|
+
const applicationVersion = "0.4.3";
|
|
330
329
|
//#endregion
|
|
331
330
|
//#region src/realtime.ts
|
|
332
331
|
async function createRealtime(config) {
|
|
@@ -3221,7 +3220,8 @@ async function createApplication(database, config, overrides = {}) {
|
|
|
3221
3220
|
secrets,
|
|
3222
3221
|
publicUrl: config.KANVIL_URL,
|
|
3223
3222
|
mail: senders.mail,
|
|
3224
|
-
sources: adapters.importSources(config)
|
|
3223
|
+
sources: adapters.importSources(config),
|
|
3224
|
+
claimMaxLeaseSeconds: config.KANVIL_CLAIM_MAX_LEASE_SECONDS
|
|
3225
3225
|
}), access = createAccess(auth, domain, config, database), realtime = await adapters.realtime(config, instance, integrationDatabase);
|
|
3226
3226
|
const unsubscribeJobs = realtime.subscribe(() => {
|
|
3227
3227
|
blobs.sync().catch(() => {});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as createDatabase, t as readConfig } from "./config-
|
|
1
|
+
import { n as createDatabase, t as readConfig } from "./config-DOT1SDQO.mjs";
|
|
2
2
|
import { t as migrateDatabase } from "./migrate-C9f4ozB4.mjs";
|
|
3
3
|
//#region src/cli/migrate.ts
|
|
4
4
|
const database = createDatabase(readConfig().DATABASE_URL);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { d as user, n as createDatabase, r as account, t as readConfig, u as session } from "./config-
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { d as user, n as createDatabase, r as account, t as readConfig, u as session } from "./config-DOT1SDQO.mjs";
|
|
2
|
+
import { A as hasAdminRole } from "./src-VxR5jZiK.mjs";
|
|
3
|
+
import { W as instanceSettings, f as fail, t as createAuth } from "./auth-CnAQzKyq.mjs";
|
|
4
4
|
import { and, eq, isNull, sql } from "drizzle-orm";
|
|
5
5
|
import { z } from "zod";
|
|
6
6
|
import { parseArgs } from "node:util";
|
|
@@ -1,6 +1,135 @@
|
|
|
1
|
-
import { n as authenticationPolicySchema } from "./instance-CCeXRJ6m.mjs";
|
|
2
1
|
import { z } from "zod";
|
|
3
2
|
import i18next from "i18next";
|
|
3
|
+
//#region ../../packages/contracts/src/instance.ts
|
|
4
|
+
const endpoint$1 = z.url({ protocol: /^https?$/ }).refine((value) => !/^https?:\/\/[^/]*@/.test(value) && !/[?#]/.test(value), "Use an HTTP(S) endpoint without embedded credentials");
|
|
5
|
+
const s3SettingsSchema = z.object({
|
|
6
|
+
endpoint: z.union([endpoint$1, z.literal("")]).default(""),
|
|
7
|
+
region: z.string().min(1).max(100).default("us-east-1"),
|
|
8
|
+
bucket: z.string().min(3).max(255),
|
|
9
|
+
prefix: z.string().max(200).regex(/^[a-zA-Z0-9/_-]*$/).default("kanvil/"),
|
|
10
|
+
forcePathStyle: z.boolean().default(true),
|
|
11
|
+
accessKeyId: z.string().max(500).default(""),
|
|
12
|
+
secretAccessKey: z.string().max(2e3).optional()
|
|
13
|
+
}).strict();
|
|
14
|
+
const searchAuthenticationSchema = z.enum([
|
|
15
|
+
"none",
|
|
16
|
+
"apiKey",
|
|
17
|
+
"basic"
|
|
18
|
+
]);
|
|
19
|
+
const searchSettingsSchema = z.object({
|
|
20
|
+
url: endpoint$1,
|
|
21
|
+
auth: searchAuthenticationSchema.optional(),
|
|
22
|
+
index: z.string().regex(/^[a-z0-9][a-z0-9_-]{0,100}$/),
|
|
23
|
+
apiKey: z.string().max(4e3).optional(),
|
|
24
|
+
username: z.string().max(500).default(""),
|
|
25
|
+
password: z.string().max(2e3).optional()
|
|
26
|
+
}).strict();
|
|
27
|
+
const storageSettingsSchema = z.discriminatedUnion("provider", [z.object({ provider: z.literal("local") }).strict(), s3SettingsSchema.extend({ provider: z.literal("s3") })]);
|
|
28
|
+
const externalSearchSettingsSchema = z.discriminatedUnion("provider", [z.object({ provider: z.literal("postgres") }).strict(), searchSettingsSchema.extend({ provider: z.literal("elasticsearch") })]);
|
|
29
|
+
const brokerSettingsSchema = z.object({
|
|
30
|
+
url: z.url({ protocol: /^amqps?$/ }).max(4e3).optional(),
|
|
31
|
+
exchange: z.string().min(1).max(200).regex(/^[a-zA-Z0-9_.-]+$/).refine((value) => !value.startsWith("amq."), "Use an application exchange").default("kanvil.events")
|
|
32
|
+
}).strict();
|
|
33
|
+
const eventDeliverySettingsSchema = z.discriminatedUnion("provider", [z.object({ provider: z.literal("postgres") }).strict(), brokerSettingsSchema.extend({ provider: z.literal("rabbitmq") })]);
|
|
34
|
+
const authenticationPolicySchema = z.object({
|
|
35
|
+
emailPasswordEnabled: z.boolean().default(true),
|
|
36
|
+
ssoAutoProvision: z.boolean().default(false)
|
|
37
|
+
}).strict();
|
|
38
|
+
const instanceUpdateSchema = z.object({
|
|
39
|
+
expectedVersion: z.number().int().positive(),
|
|
40
|
+
name: z.string().trim().min(1).max(100),
|
|
41
|
+
description: z.string().max(500),
|
|
42
|
+
storage: storageSettingsSchema,
|
|
43
|
+
search: externalSearchSettingsSchema,
|
|
44
|
+
broker: eventDeliverySettingsSchema.optional(),
|
|
45
|
+
authentication: authenticationPolicySchema.optional()
|
|
46
|
+
}).strict();
|
|
47
|
+
z.object({
|
|
48
|
+
name: z.string(),
|
|
49
|
+
description: z.string()
|
|
50
|
+
});
|
|
51
|
+
const adminInstanceSchema = z.object({
|
|
52
|
+
id: z.uuid(),
|
|
53
|
+
version: z.number().int(),
|
|
54
|
+
name: z.string(),
|
|
55
|
+
description: z.string(),
|
|
56
|
+
authentication: authenticationPolicySchema.default(() => authenticationPolicySchema.parse({})),
|
|
57
|
+
storage: z.object({
|
|
58
|
+
provider: z.enum(["local", "s3"]),
|
|
59
|
+
source: z.enum(["deployment", "admin"]),
|
|
60
|
+
settings: s3SettingsSchema.omit({ secretAccessKey: true }).nullable(),
|
|
61
|
+
secretConfigured: z.boolean(),
|
|
62
|
+
pending: z.number().int(),
|
|
63
|
+
status: z.enum([
|
|
64
|
+
"ready",
|
|
65
|
+
"transferring",
|
|
66
|
+
"unavailable"
|
|
67
|
+
]),
|
|
68
|
+
error: z.string().nullable()
|
|
69
|
+
}),
|
|
70
|
+
search: z.object({
|
|
71
|
+
provider: z.enum(["postgres", "elasticsearch"]),
|
|
72
|
+
source: z.enum(["deployment", "admin"]),
|
|
73
|
+
settings: searchSettingsSchema.omit({
|
|
74
|
+
apiKey: true,
|
|
75
|
+
password: true
|
|
76
|
+
}).nullable(),
|
|
77
|
+
secretConfigured: z.boolean(),
|
|
78
|
+
status: z.enum([
|
|
79
|
+
"builtin",
|
|
80
|
+
"indexing",
|
|
81
|
+
"ready",
|
|
82
|
+
"unavailable"
|
|
83
|
+
]),
|
|
84
|
+
cursor: z.string(),
|
|
85
|
+
error: z.string().nullable()
|
|
86
|
+
}),
|
|
87
|
+
broker: z.object({
|
|
88
|
+
provider: z.enum(["postgres", "rabbitmq"]),
|
|
89
|
+
source: z.enum(["deployment", "admin"]),
|
|
90
|
+
settings: z.object({
|
|
91
|
+
endpoint: z.string(),
|
|
92
|
+
exchange: z.string()
|
|
93
|
+
}).nullable(),
|
|
94
|
+
secretConfigured: z.boolean(),
|
|
95
|
+
status: z.enum([
|
|
96
|
+
"builtin",
|
|
97
|
+
"connecting",
|
|
98
|
+
"ready",
|
|
99
|
+
"unavailable"
|
|
100
|
+
]),
|
|
101
|
+
error: z.string().nullable()
|
|
102
|
+
}),
|
|
103
|
+
deployment: z.object({
|
|
104
|
+
url: z.string(),
|
|
105
|
+
oidc: z.object({
|
|
106
|
+
name: z.string(),
|
|
107
|
+
discoveryUrl: z.string(),
|
|
108
|
+
clientId: z.string()
|
|
109
|
+
}).nullable(),
|
|
110
|
+
push: z.boolean(),
|
|
111
|
+
version: z.string()
|
|
112
|
+
}),
|
|
113
|
+
locations: z.array(z.object({
|
|
114
|
+
id: z.uuid(),
|
|
115
|
+
bucket: z.string(),
|
|
116
|
+
endpoint: z.string(),
|
|
117
|
+
prefix: z.string(),
|
|
118
|
+
objects: z.number().int()
|
|
119
|
+
}))
|
|
120
|
+
});
|
|
121
|
+
const photoInputSchema = z.object({
|
|
122
|
+
data: z.string().max(7e5),
|
|
123
|
+
contentType: z.enum([
|
|
124
|
+
"image/png",
|
|
125
|
+
"image/jpeg",
|
|
126
|
+
"image/webp"
|
|
127
|
+
])
|
|
128
|
+
}).strict();
|
|
129
|
+
const photoResultSchema = z.object({ image: z.string().nullable() });
|
|
130
|
+
function searchAuthentication(settings) {
|
|
131
|
+
return settings.auth ?? (settings.apiKey ? "apiKey" : settings.username && settings.password ? "basic" : "none");
|
|
132
|
+
}
|
|
4
133
|
//#endregion
|
|
5
134
|
//#region ../../packages/contracts/src/i18n/en-US/index.ts
|
|
6
135
|
var en_US_default = {
|
|
@@ -1136,7 +1265,7 @@ var en_US_default = {
|
|
|
1136
1265
|
release: "Release my claim",
|
|
1137
1266
|
releaseDescription: "Release ownership after your worker has stopped writing?",
|
|
1138
1267
|
recover: "Recover expired claim",
|
|
1139
|
-
recoverHelp: "
|
|
1268
|
+
recoverHelp: "Confirm the worker has stopped first.",
|
|
1140
1269
|
reason: "Recovery reason",
|
|
1141
1270
|
confirmed: "I have confirmed the worker has stopped",
|
|
1142
1271
|
submit: "Recover ownership"
|
|
@@ -2477,7 +2606,7 @@ var en_US_default = {
|
|
|
2477
2606
|
},
|
|
2478
2607
|
recover: {
|
|
2479
2608
|
action: "Recover expired claim",
|
|
2480
|
-
explanation: "
|
|
2609
|
+
explanation: "Confirm the worker has stopped first.",
|
|
2481
2610
|
reason: "Recovery reason",
|
|
2482
2611
|
confirm: "Worker stopped · recover"
|
|
2483
2612
|
}
|
|
@@ -2724,6 +2853,8 @@ const priorityLabels = labelTable(priorities, (value) => t(`common.priority.${va
|
|
|
2724
2853
|
const id = z.string().min(1).max(80);
|
|
2725
2854
|
const timestamp = z.iso.datetime();
|
|
2726
2855
|
const version = z.number().int().positive();
|
|
2856
|
+
const claimLeaseSecondsSchema = z.number().int().min(30).max(2147483647);
|
|
2857
|
+
const defaultClaimMaxLeaseSeconds = 86400;
|
|
2727
2858
|
const text = z.string().trim().min(1);
|
|
2728
2859
|
const dueDate = z.iso.datetime().refine((value) => new Date(value).getUTCFullYear() >= 1, "Use a date in year 1 or later");
|
|
2729
2860
|
const tags = z.array(text.max(40)).max(30).overwrite((values) => [...new Set(values)]);
|
|
@@ -4527,12 +4658,12 @@ const operations = {
|
|
|
4527
4658
|
...mutation,
|
|
4528
4659
|
workerId: text.max(200),
|
|
4529
4660
|
expectedVersion: version,
|
|
4530
|
-
leaseSeconds:
|
|
4661
|
+
leaseSeconds: claimLeaseSecondsSchema.optional()
|
|
4531
4662
|
}).strict(), claimSchema, "POST", "/projects/{projectId}/tickets/{ticketId}/claim", "claim", "Atomically claim ready work. Expired claims require explicit recovery."),
|
|
4532
4663
|
renew_claim: op(ticketInput.extend({
|
|
4533
4664
|
...mutation,
|
|
4534
4665
|
claimId: z.uuid(),
|
|
4535
|
-
leaseSeconds:
|
|
4666
|
+
leaseSeconds: claimLeaseSecondsSchema.optional()
|
|
4536
4667
|
}).strict(), claimSchema, "POST", "/projects/{projectId}/tickets/{ticketId}/claim/renew", "claim", "Renew the caller's unexpired claim."),
|
|
4537
4668
|
release_claim: op(ticketInput.extend({
|
|
4538
4669
|
...mutation,
|
|
@@ -4542,8 +4673,14 @@ const operations = {
|
|
|
4542
4673
|
...mutation,
|
|
4543
4674
|
claimId: z.uuid(),
|
|
4544
4675
|
reason: text.min(10).max(2e3),
|
|
4545
|
-
confirmedStopped: z.literal(true)
|
|
4546
|
-
|
|
4676
|
+
confirmedStopped: z.literal(true),
|
|
4677
|
+
cancelActive: z.boolean().optional(),
|
|
4678
|
+
reschedule: z.boolean().optional(),
|
|
4679
|
+
expectedVersion: version.optional()
|
|
4680
|
+
}).strict().refine((input) => !input.reschedule || input.expectedVersion !== void 0, {
|
|
4681
|
+
message: "expectedVersion is required to reschedule recovered work",
|
|
4682
|
+
path: ["expectedVersion"]
|
|
4683
|
+
}), okSchema, "POST", "/projects/{projectId}/tickets/{ticketId}/claim/recover", "claim", "Recover an expired claim after confirming the worker stopped. Optionally reschedule it to To do at its expectedVersion. Project managers with admin scope may explicitly cancel an active claim."),
|
|
4547
4684
|
set_subscription: op(ticketInput.extend({
|
|
4548
4685
|
...mutation,
|
|
4549
4686
|
enabled: z.boolean()
|
|
@@ -4815,4 +4952,4 @@ function parseOutput(name, value) {
|
|
|
4815
4952
|
return operations[name].output.parse(value);
|
|
4816
4953
|
}
|
|
4817
4954
|
//#endregion
|
|
4818
|
-
export {
|
|
4955
|
+
export { permissionLabels as $, hasAdminRole as A, workspaceSchema as At, memberSchema as B, errorSchema as C, streamErrorSchema as Ct, filterKey as D, ticketPredicates as Dt, eventSchema as E, ticketImportSchema as Et, isHexColor as F, photoInputSchema as Ft, notificationReadInput as G, notificationIdsInput as H, isOperation as I, photoResultSchema as It, operationPermission as J, notificationsSchema as K, isPresetColor as L, s3SettingsSchema as Lt, importProviderDefinitions as M, authenticationPolicySchema as Mt, importSecretFields as N, brokerSettingsSchema as Nt, filterList as O, ticketSchema as Ot, invitationStatuses as P, instanceUpdateSchema as Pt, parsePublicOutput as Q, isPublicOperation as R, searchAuthentication as Rt, difficulties as S, states as St, eventLabels as T, ticketFilter as Tt, notificationPreferencesInput as U, mentionScheme as V, notificationPreferencesSchema as W, parseCustomFieldFilter as X, operations as Y, parseOutput as Z, deletedAccountName as _, seededPermissions as _t, checkpointSchema as a, publicOperations as at, destinationEventKeys as b, stagedUploadLifetime as bt, credentialInput as c, repositoryProviderDefinitions as ct, customFieldSchema as d, resourceProvider as dt, permissionScope as et, customFieldValue as f, roleCategory as ft, defaultWorkflow as g, searchResultTypes as gt, defaultOrder as h, scopes as ht, channelRouteAllows as i, projectSchema as it, importLimits as j, adminInstanceSchema as jt, formatEvent as k, workflowOrder as kt, credentialProjectsSchema as l, repositoryProviders as lt, defaultClaimMaxLeaseSeconds as m, roles as mt, attachmentLimit as n, priorities as nt, claimLeaseSecondsSchema as o, pushDeviceInput as ot, customFieldValueSchema as p, roleLabels as pt, okSchema as q, channelKinds as r, priorityLabels as rt, closedStates as s, remoteKinds as st, ApiError as t, permissions as tt, customFieldFilterTokens as u, repositorySecretFields as ut, deliverySecretFields as v, signInMethodLabels as vt, eventCategories as w, ticketExportFormat as wt, destinationKinds as x, stateLabels as xt, deliverySettingsSchema as y, snapshotSchema as yt, isSeededRole as z, searchSettingsSchema as zt };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{Ga as e,_a as t,ba as n,ya as r}from"./search-
|
|
1
|
+
import{Ga as e,_a as t,ba as n,ya as r}from"./search-B3-w3oCd.js";import{i}from"./forms-BbWAl0BZ.js";var a={name:`chevrons-up-down`,size:24,node:[[`path`,{d:`m7 15 5 5 5-5`,key:`1hf1tw`}],[`path`,{d:`m7 9 5-5 5 5`,key:`sgt6xg`}]]};a.node;var o=e(a),s={name:`pencil`,size:24,node:[[`path`,{d:`M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z`,key:`1a8usu`}],[`path`,{d:`m15 5 4 4`,key:`1mk7zo`}]]};s.node;var c=e(s),l={name:`trash`,size:24,node:[[`path`,{d:`M10 11v6`,key:`nco0om`}],[`path`,{d:`M14 11v6`,key:`outv1u`}],[`path`,{d:`M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6`,key:`miytrc`}],[`path`,{d:`M3 6h18`,key:`d0wm0j`}],[`path`,{d:`M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2`,key:`e791ji`}]],aliases:[`trash-2`]};l.node;var u=e(l);function d(e){let{render:a,className:o,style:s,state:c=n,props:l=r,refs:u=r,metadata:d,stateAttributesMapping:f,tag:p=`div`,...m}=e,{compositeProps:h,compositeRef:g}=i({metadata:d});return t(p,e,{state:c,ref:[g,...u],props:[h,...l,m],stateAttributesMapping:f})}export{o as i,u as n,c as r,d as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{i as e}from"./rolldown-runtime-COiEfhsA.js";import{Nn as t,hn as n}from"./default-BgvtI7HK.js";import{Ga as r}from"./search-ZaQmVnj1.js";import{c as i}from"./item-Cj8xpMLk.js";var a={name:`archive`,size:24,node:[[`rect`,{width:`20`,height:`5`,x:`2`,y:`3`,rx:`1`,key:`1wp1u1`}],[`path`,{d:`M4 8v11a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8`,key:`1s80jp`}],[`path`,{d:`M10 12h4`,key:`a56b0p`}]]};a.node;var o=r(a),s={name:`bell`,size:24,node:[[`path`,{d:`M10.268 21a2 2 0 0 0 3.464 0`,key:`vwvbt9`}],[`path`,{d:`M3.262 15.326A1 1 0 0 0 4 17h16a1 1 0 0 0 .74-1.673C19.41 13.956 18 12.499 18 8A6 6 0 0 0 6 8c0 4.499-1.411 5.956-2.738 7.326`,key:`11g9vi`}]]};s.node;var c=r(s),l=e(t()),u={area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0,"!doctype":!0,"!DOCTYPE":!0},d=/\s([^'"/\s><]+?)[\s/>]|([^\s=]+)=\s?("[^"]*"|'[^']*')/g;function f(e){let t={type:`tag`,name:``,voidElement:!1,attrs:{},children:[]},n=e.match(/<\/?([^\s]+?)[/\s>]/);if(n&&(t.name=n[1],(u[n[1]]||e.charAt(e.length-2)===`/`)&&(t.voidElement=!0),t.name.startsWith(`!--`))){let t=e.indexOf(`-->`);return{type:`comment`,comment:t===-1?``:e.slice(4,t)}}let r=new RegExp(d),i=null;for(;i=r.exec(e),i!==null;)if(i[0].trim()){if(i[1]){let e=i[1].trim(),n=[e,null],a=e.indexOf(`=`);a>-1&&(n=[e.slice(0,a),e.slice(a+1)]),t.attrs[n[0]]=n[1],r.lastIndex--}else i[2]&&(t.attrs[i[2]]=i[3].trim().substring(1,i[3].length-1))}return t}var p=/<!--[\s\S]*?-->|<[a-zA-Z0-9\-!/](?:"[^"]*"|'[^']*'|[^'">])*>/g,m=/<\/?([^\s]+?)[/\s>]/,h=/^\s*$/,g=/^(script|style)$/i,_=`\0`,v=Object.create(null);function y(e){e.forEach(function(e){if(e.type===`text`)e.content=e.content.split(_).join(`<`);else if(e.type===`comment`)e.comment=e.comment.split(_).join(`<`);else{for(let t in e.attrs){let n=e.attrs[t];typeof n==`string`&&n.indexOf(_)>-1&&(e.attrs[t]=n.split(_).join(`<`))}e.children.length&&y(e.children)}})}function b(e,t){let n=t&&t.components||v,r=t&&t.allowedTags,i=!1;if(r){let t=typeof r==`function`?r:function(e){return r.indexOf(e)>-1},n=``,a=0;p.lastIndex=0;let o;for(;o=p.exec(e);){let r=o[0];n+=e.slice(a,o.index);let s=r.match(m);r.startsWith(`<!--`)||s&&t(s[1])?(n+=r,a=o.index+r.length):(i=!0,n+=_,a=o.index+1,p.lastIndex=a)}e=n+e.slice(a)}let a=[],o=[],s,c=-1,l=!1,u=0,d;if(e.indexOf(`<`)!==0){let t=e.indexOf(`<`);a.push({type:`text`,content:t===-1?e:e.substring(0,t)})}let b=[],x;for(;x=p.exec(e);)b.push(x);return b.forEach(function(e,t){let n=e[0];if(!n||n.startsWith(`<!--`))return;let r=0,i=0,a=-1,o=null;for(let e=0;e<n.length;e++){let t=n.charAt(e);o?t===o&&(o=null):t===`"`||t===`'`?o=t:t===`<`?(r++,r===2&&(a=e)):t===`>`&&i++}let s=a>-1&&/[a-zA-Z0-9\-!/]/.test(n.charAt(a+1));if(r>i&&s){let e=n.substring(0,a),r=n.substring(e.length);b[t][0]=r,b[t].index+=e.length}}),b.forEach(function(t,r){let i=t[0];if(!i)return;let p=t.index;if(p<u)return;if(l){if(i!==`</`+s.name+`>`)return;l=!1}let m=i.charAt(1)!==`/`,_=i.startsWith(`<!--`),v=p+i.length,y=e.charAt(v),x=b[r+1],S;if(y===`<`&&x){let t=e.substring(v,x.index);S=t.split(`<`).length>t.split(`>`).length}let C;if(_){let t=f(i);if(c<0)return a.push(t),a;C=o[c],C.children.push(t);let n=e.slice(v,x?x.index:void 0);return n.length>0&&C.children.push({type:`text`,content:n}),a}if(m){c++,s=f(i),s.type===`tag`&&n[s.name]&&(s.type=`component`,l=!0);let t=!1;if(!l&&!s.voidElement&&g.test(s.name)){t=!0,d||=e.toLowerCase();let n=d.indexOf(`</`+s.name.toLowerCase()+`>`,v),r=n===-1?e.length:n,i=e.slice(v,r);i&&s.children.push({type:`text`,content:i}),u=r}!s.voidElement&&!l&&!t&&y&&y!==`<`&&s.children.push({type:`text`,content:e.slice(v,x?x.index:void 0)}),c===0&&a.push(s),C=o[c-1],C&&C.children.push(s),o[c]=s}if((!m||s.voidElement)&&(c>-1&&(s.voidElement||s.name===i.slice(2,-1))&&(c--,s=c===-1?a:o[c]),!l&&(y!==`<`||S)&&y)){C=c===-1?a:o[c].children;let t=x?x.index:-1,n=e.slice(v,t===-1?void 0:t);h.test(n)&&(n=` `),(t>-1&&c+C.length>=0||n!==` `)&&C.push({type:`text`,content:n})}}),i&&y(a),a}function x(e){let t=[];for(let n in e)e[n]===null?t.push(n):t.push(n+`="`+String(e[n]).replace(/"/g,`"`)+`"`);return t.length?` `+t.join(` `):``}function S(e,t){switch(t.type){case`text`:return e+t.content;case`tag`:{let n=t.voidElement&&t.name.toLowerCase()!==`!doctype`?`/>`:`>`;return e+=`<`+t.name+(t.attrs?x(t.attrs):``)+n,t.voidElement?e:e+t.children.reduce(S,``)+`</`+t.name+`>`}case`comment`:return e+=`<!--`+t.comment+`-->`,e}}function C(e){return e.reduce(function(e,t){return e+S(``,t)},``)}var w={parse:b,stringify:C},T=(e,t,n,r)=>{let i=[n,{code:t,...r||{}}];if(e?.services?.logger?.forward)return e.services.logger.forward(i,`warn`,`react-i18next::`,!0);O(i[0])&&(i[0]=`react-i18next:: ${i[0]}`),e?.services?.logger?.warn?e.services.logger.warn(...i):console?.warn&&console.warn(...i)},E={},D=(e,t,n,r)=>{O(n)&&E[n]||(O(n)&&(E[n]=new Date),T(e,t,n,r))},O=e=>typeof e==`string`,k=e=>typeof e==`object`&&!!e,A=/&(?:amp|#38|lt|#60|gt|#62|apos|#39|quot|#34|nbsp|#160|copy|#169|reg|#174|hellip|#8230|#x2F|#47);/g,j={"&":`&`,"&":`&`,"<":`<`,"<":`<`,">":`>`,">":`>`,"'":`'`,"'":`'`,""":`"`,""":`"`," ":`\xA0`," ":`\xA0`,"©":`©`,"©":`©`,"®":`®`,"®":`®`,"…":`…`,"…":`…`,"/":`/`,"/":`/`},M=e=>j[e],N=e=>e.replace(A,M),P={bindI18n:`languageChanged`,bindI18nStore:``,transEmptyNodeValue:``,transSupportBasicHtmlNodes:!0,transWrapTextNodes:``,transKeepBasicHtmlNodesFor:[`br`,`strong`,`i`,`p`],useSuspense:!0,unescape:N,transDefaultProps:void 0},F=()=>P,I,L=()=>I,R=(e,t)=>{if(!e)return!1;let n=e.props?.children??e.children;return t?n.length>0:!!n},z=e=>{if(!e)return[];let t=e.props?.children??e.children;return e.props?.i18nIsDynamicList?V(t):t},B=e=>V(e).every(l.isValidElement),V=e=>Array.isArray(e)?e:[e],H=(e,t)=>{let n={...t};return n.props={...t.props,...e.props},n},U=e=>{let t={};if(!e)return t;let n=e=>{V(e).forEach(e=>{O(e)||(R(e)?n(z(e)):k(e)&&!(0,l.isValidElement)(e)&&Object.assign(t,e))})};return n(e),t},W=(e,t,n,r)=>{if(!e)return``;let i=``,a=V(e),o=t?.transSupportBasicHtmlNodes?t.transKeepBasicHtmlNodesFor??[]:[];return a.forEach((e,a)=>{if(O(e))i+=`${e}`;else if((0,l.isValidElement)(e)){let{props:s,type:c}=e,l=Object.keys(s).length,u=o.indexOf(c)>-1,d=s.children;if(!d&&u&&!l){i+=`<${c}/>`;return}if(!d&&(!u||l)||s.i18nIsDynamicList){i+=`<${a}></${a}>`;return}if(u&&l<=1){let e=O(d)?d:W(d,t,n,r);i+=`<${c}>${e}</${c}>`;return}let f=W(d,t,n,r);i+=`<${a}>${f}</${a}>`}else if(e===null)T(n,`TRANS_NULL_VALUE`,`Passed in a null value as child`,{i18nKey:r});else if(k(e)){let{format:t,...a}=e,o=Object.keys(a);if(o.length===1){let e=t?`${o[0]}, ${t}`:o[0];i+=`{{${e}}}`;return}T(n,`TRANS_INVALID_OBJ`,`Invalid child - Object should only have keys {{ value, format }} (format is optional).`,{i18nKey:r,child:e})}else T(n,`TRANS_INVALID_VAR`,`Passed in a variable like {number} - pass variables for interpolation as full objects like {{number}}.`,{i18nKey:r,child:e})}),i},G=(e,t,n,r,i,a,o)=>{if(n===``)return[];let s=i.transKeepBasicHtmlNodesFor||[],c=n&&new RegExp(s.map(e=>`<${e}`).join(`|`)).test(n);if(!e&&!t&&!c&&!o)return[n];let u=t??{},d=e=>{V(e).forEach(e=>{O(e)||(R(e)?d(z(e)):k(e)&&!(0,l.isValidElement)(e)&&Object.assign(u,e))})};d(e);let f=Object.keys(u),p=w.parse(`<0>${n}</0>`,{allowedTags:e=>/^\d+$/.test(e)||s.indexOf(e)>-1||f.indexOf(e)>-1}),m={...u,...a},h=(e,t,n)=>{let r=z(e),i=_(r,t.children,n);return B(r)&&i.length===0||e.props?.i18nIsDynamicList?r:i},g=(e,t,n,r,i)=>{e.dummy?(e.children=t,n.push((0,l.cloneElement)(e,{key:r},i?void 0:t))):n.push(...l.Children.map([e],e=>{if(e.type===l.Fragment||e.props?.i18nIsDynamicList!==void 0){let n={key:r};return e&&e.props&&Object.keys(e.props).forEach(t=>{t!==`children`&&t!==`i18nIsDynamicList`&&(n[t]=e.props[t])}),(0,l.createElement)(e.type,n,i?null:t)}let n={key:r};return e&&e.props&&Object.keys(e.props).forEach(t=>{t!==`ref`&&t!==`children`&&(n[t]=e.props[t])}),(0,l.cloneElement)(e,n,i?null:t)}))},_=(e,n,a)=>{let u=V(e),d=V(n),f={};return d.reduce((e,n,d)=>{let p=n.children?.[0]?.content&&r.services.interpolator.interpolate(n.children[0].content,m,r.language);if(n.type===`tag`){let v=u[parseInt(n.name,10)];!v&&t&&(v=t[n.name]),a.length===1&&!v&&(v=a[0][n.name]),v||={};let y={...n.attrs};o&&Object.keys(y).forEach(e=>{let t=y[e];O(t)&&(y[e]=N(t))});let b=Object.keys(y).length===0?v:H({props:y},v),x=(0,l.isValidElement)(b),S=x&&R(n,!0)&&!n.voidElement,C=c&&k(b)&&b.dummy&&!x,w=k(t)&&Object.hasOwnProperty.call(t,n.name);if(O(b)){let t=r.services.interpolator.interpolate(b,m,r.language);e.push(t)}else if(R(b)||S){let t=h(b,n,a);g(b,t,e,d)}else if(C){let t=_(u,n.children,a);g(b,t,e,d)}else if(Number.isNaN(parseFloat(n.name))){if(w){let t=h(b,n,a);g(b,t,e,d,n.voidElement)}else if(i.transSupportBasicHtmlNodes&&s.indexOf(n.name)>-1){if(n.voidElement)e.push((0,l.createElement)(n.name,{key:`${n.name}-${d}`}));else{let t=f[n.name]||0;f[n.name]=t+1;let r,i=0;for(let e=0;e<u.length;e+=1){let a=u[e];if((0,l.isValidElement)(a)&&a.type===n.name){if(i===t){r=a;break}i+=1}}let o=r?V(z(r)):u,s=_(o,n.children,a);e.push((0,l.createElement)(n.name,{key:`${n.name}-${d}`},s))}}else if(n.voidElement)e.push(`<${n.name} />`);else{let t=_(u,n.children,a);e.push(`<${n.name}>${t}</${n.name}>`)}}else if(k(b)&&!x){let t=n.children[0]?p:null;t&&e.push(t)}else g(b,p,e,d,n.children.length!==1||!p)}else if(n.type===`text`){let t=i.transWrapTextNodes,a=typeof i.unescape==`function`?i.unescape:F().unescape,s=o?a(r.services.interpolator.interpolate(n.content,m,r.language)):r.services.interpolator.interpolate(n.content,m,r.language);t?e.push((0,l.createElement)(t,{key:`${n.name}-${d}`},s)):e.push(s)}return e},[])};return z(_([{dummy:!0,children:e||[]}],p,V(e||[]))[0])},K=(e,t,n)=>{let r=e.key||t,i=(0,l.cloneElement)(e,{key:r});if(!i.props||!i.props.children||n.indexOf(`${t}/>`)<0&&n.indexOf(`${t} />`)<0)return i;function a(){return(0,l.createElement)(l.Fragment,null,i)}return(0,l.createElement)(a,{key:r})},q=(e,t)=>e.map((e,n)=>K(e,n,t)),J=(e,t)=>{let n={};return Object.keys(e).forEach(r=>{Object.assign(n,{[r]:K(e[r],r,t)})}),n},Y=(e,t,n,r)=>e?Array.isArray(e)?q(e,t):k(e)?J(e,t):(D(n,`TRANS_INVALID_COMPONENTS`,`<Trans /> "components" prop expects an object or array`,{i18nKey:r}),null):null,X=e=>!k(e)||Array.isArray(e)?!1:Object.keys(e).reduce((e,t)=>e&&Number.isNaN(Number.parseFloat(t)),!0);function Z({children:e,count:t,parent:r,i18nKey:i,context:a,tOptions:o={},values:s,defaults:c,components:u,ns:d,i18n:f,t:p,shouldUnescape:m,...h}){let g=f||L();if(!g)return D(g,`NO_I18NEXT_INSTANCE`,`Trans: You need to pass in an i18next instance using initReactI18next or by passing it via props or context. In monorepo setups, make sure there is only one instance of react-i18next.`,{i18nKey:i}),e;let _=p||g.t.bind(g)||(e=>e),v={...F(),...g.options?.react},y=d||(_.ns?void 0:g.options?.defaultNS||`translation`);O(y)&&(y=[y]);let{transDefaultProps:b}=v,x=b?.tOptions?{...b.tOptions,...o}:o,S=m??b?.shouldUnescape,C=b?.values?{...b.values,...s}:s,w=b?.components?{...b.components,...u}:u,T=W(e,v,g,i),E=c||x?.defaultValue||T||v.transEmptyNodeValue||(typeof i==`function`?n(i):i),{hashTransKey:k}=v,A=i||(k?k(T||E):T||E);s=g.options?.interpolation?.defaultVariables?{...g.options.interpolation.defaultVariables,...C}:C;let j=U(e);j&&typeof j.count==`number`&&t===void 0&&(t=j.count);let M=s||t!==void 0&&!g.options?.interpolation?.alwaysFormat||!e?x.interpolation:{interpolation:{...x.interpolation,prefix:`#$?`,suffix:`?$#`}},N={...x,context:a||x.context,count:t,...s,...M,defaultValue:E,ns:y},P=A?_(A,N):E;P===A&&E&&(P=E);let I=Y(w,P,g,i),R=I||e,z=null;X(I)&&(z=I,R=e);let B=G(R,z,P,g,v,N,S),V=r??v.defaultTransParent;return V?(0,l.createElement)(V,h,B):B}function Q({children:e,count:t,parent:n,i18nKey:r,context:a,tOptions:o={},values:s,defaults:c,components:u,ns:d,i18n:f,t:p,shouldUnescape:m,...h}){let{i18n:g,defaultNS:_}=(0,l.useContext)(i)||{},v=f||g||L(),y=p||v?.t.bind(v);return Z({children:e,count:t,parent:n,i18nKey:r,context:a,tOptions:o,values:s,defaults:c,components:u,ns:d||(y?.ns?void 0:_||v?.options?.defaultNS),i18n:v,t:p,shouldUnescape:m,...h})}export{c as n,o as r,Q as t};
|
|
1
|
+
import{i as e}from"./rolldown-runtime-COiEfhsA.js";import{Nn as t,hn as n}from"./default-6QIAyMq2.js";import{Ga as r}from"./search-B3-w3oCd.js";import{c as i}from"./item-DED0Ikqi.js";var a={name:`archive`,size:24,node:[[`rect`,{width:`20`,height:`5`,x:`2`,y:`3`,rx:`1`,key:`1wp1u1`}],[`path`,{d:`M4 8v11a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8`,key:`1s80jp`}],[`path`,{d:`M10 12h4`,key:`a56b0p`}]]};a.node;var o=r(a),s={name:`bell`,size:24,node:[[`path`,{d:`M10.268 21a2 2 0 0 0 3.464 0`,key:`vwvbt9`}],[`path`,{d:`M3.262 15.326A1 1 0 0 0 4 17h16a1 1 0 0 0 .74-1.673C19.41 13.956 18 12.499 18 8A6 6 0 0 0 6 8c0 4.499-1.411 5.956-2.738 7.326`,key:`11g9vi`}]]};s.node;var c=r(s),l=e(t()),u={area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0,"!doctype":!0,"!DOCTYPE":!0},d=/\s([^'"/\s><]+?)[\s/>]|([^\s=]+)=\s?("[^"]*"|'[^']*')/g;function f(e){let t={type:`tag`,name:``,voidElement:!1,attrs:{},children:[]},n=e.match(/<\/?([^\s]+?)[/\s>]/);if(n&&(t.name=n[1],(u[n[1]]||e.charAt(e.length-2)===`/`)&&(t.voidElement=!0),t.name.startsWith(`!--`))){let t=e.indexOf(`-->`);return{type:`comment`,comment:t===-1?``:e.slice(4,t)}}let r=new RegExp(d),i=null;for(;i=r.exec(e),i!==null;)if(i[0].trim()){if(i[1]){let e=i[1].trim(),n=[e,null],a=e.indexOf(`=`);a>-1&&(n=[e.slice(0,a),e.slice(a+1)]),t.attrs[n[0]]=n[1],r.lastIndex--}else i[2]&&(t.attrs[i[2]]=i[3].trim().substring(1,i[3].length-1))}return t}var p=/<!--[\s\S]*?-->|<[a-zA-Z0-9\-!/](?:"[^"]*"|'[^']*'|[^'">])*>/g,m=/<\/?([^\s]+?)[/\s>]/,h=/^\s*$/,g=/^(script|style)$/i,_=`\0`,v=Object.create(null);function y(e){e.forEach(function(e){if(e.type===`text`)e.content=e.content.split(_).join(`<`);else if(e.type===`comment`)e.comment=e.comment.split(_).join(`<`);else{for(let t in e.attrs){let n=e.attrs[t];typeof n==`string`&&n.indexOf(_)>-1&&(e.attrs[t]=n.split(_).join(`<`))}e.children.length&&y(e.children)}})}function b(e,t){let n=t&&t.components||v,r=t&&t.allowedTags,i=!1;if(r){let t=typeof r==`function`?r:function(e){return r.indexOf(e)>-1},n=``,a=0;p.lastIndex=0;let o;for(;o=p.exec(e);){let r=o[0];n+=e.slice(a,o.index);let s=r.match(m);r.startsWith(`<!--`)||s&&t(s[1])?(n+=r,a=o.index+r.length):(i=!0,n+=_,a=o.index+1,p.lastIndex=a)}e=n+e.slice(a)}let a=[],o=[],s,c=-1,l=!1,u=0,d;if(e.indexOf(`<`)!==0){let t=e.indexOf(`<`);a.push({type:`text`,content:t===-1?e:e.substring(0,t)})}let b=[],x;for(;x=p.exec(e);)b.push(x);return b.forEach(function(e,t){let n=e[0];if(!n||n.startsWith(`<!--`))return;let r=0,i=0,a=-1,o=null;for(let e=0;e<n.length;e++){let t=n.charAt(e);o?t===o&&(o=null):t===`"`||t===`'`?o=t:t===`<`?(r++,r===2&&(a=e)):t===`>`&&i++}let s=a>-1&&/[a-zA-Z0-9\-!/]/.test(n.charAt(a+1));if(r>i&&s){let e=n.substring(0,a),r=n.substring(e.length);b[t][0]=r,b[t].index+=e.length}}),b.forEach(function(t,r){let i=t[0];if(!i)return;let p=t.index;if(p<u)return;if(l){if(i!==`</`+s.name+`>`)return;l=!1}let m=i.charAt(1)!==`/`,_=i.startsWith(`<!--`),v=p+i.length,y=e.charAt(v),x=b[r+1],S;if(y===`<`&&x){let t=e.substring(v,x.index);S=t.split(`<`).length>t.split(`>`).length}let C;if(_){let t=f(i);if(c<0)return a.push(t),a;C=o[c],C.children.push(t);let n=e.slice(v,x?x.index:void 0);return n.length>0&&C.children.push({type:`text`,content:n}),a}if(m){c++,s=f(i),s.type===`tag`&&n[s.name]&&(s.type=`component`,l=!0);let t=!1;if(!l&&!s.voidElement&&g.test(s.name)){t=!0,d||=e.toLowerCase();let n=d.indexOf(`</`+s.name.toLowerCase()+`>`,v),r=n===-1?e.length:n,i=e.slice(v,r);i&&s.children.push({type:`text`,content:i}),u=r}!s.voidElement&&!l&&!t&&y&&y!==`<`&&s.children.push({type:`text`,content:e.slice(v,x?x.index:void 0)}),c===0&&a.push(s),C=o[c-1],C&&C.children.push(s),o[c]=s}if((!m||s.voidElement)&&(c>-1&&(s.voidElement||s.name===i.slice(2,-1))&&(c--,s=c===-1?a:o[c]),!l&&(y!==`<`||S)&&y)){C=c===-1?a:o[c].children;let t=x?x.index:-1,n=e.slice(v,t===-1?void 0:t);h.test(n)&&(n=` `),(t>-1&&c+C.length>=0||n!==` `)&&C.push({type:`text`,content:n})}}),i&&y(a),a}function x(e){let t=[];for(let n in e)e[n]===null?t.push(n):t.push(n+`="`+String(e[n]).replace(/"/g,`"`)+`"`);return t.length?` `+t.join(` `):``}function S(e,t){switch(t.type){case`text`:return e+t.content;case`tag`:{let n=t.voidElement&&t.name.toLowerCase()!==`!doctype`?`/>`:`>`;return e+=`<`+t.name+(t.attrs?x(t.attrs):``)+n,t.voidElement?e:e+t.children.reduce(S,``)+`</`+t.name+`>`}case`comment`:return e+=`<!--`+t.comment+`-->`,e}}function C(e){return e.reduce(function(e,t){return e+S(``,t)},``)}var w={parse:b,stringify:C},T=(e,t,n,r)=>{let i=[n,{code:t,...r||{}}];if(e?.services?.logger?.forward)return e.services.logger.forward(i,`warn`,`react-i18next::`,!0);O(i[0])&&(i[0]=`react-i18next:: ${i[0]}`),e?.services?.logger?.warn?e.services.logger.warn(...i):console?.warn&&console.warn(...i)},E={},D=(e,t,n,r)=>{O(n)&&E[n]||(O(n)&&(E[n]=new Date),T(e,t,n,r))},O=e=>typeof e==`string`,k=e=>typeof e==`object`&&!!e,A=/&(?:amp|#38|lt|#60|gt|#62|apos|#39|quot|#34|nbsp|#160|copy|#169|reg|#174|hellip|#8230|#x2F|#47);/g,j={"&":`&`,"&":`&`,"<":`<`,"<":`<`,">":`>`,">":`>`,"'":`'`,"'":`'`,""":`"`,""":`"`," ":`\xA0`," ":`\xA0`,"©":`©`,"©":`©`,"®":`®`,"®":`®`,"…":`…`,"…":`…`,"/":`/`,"/":`/`},M=e=>j[e],N=e=>e.replace(A,M),P={bindI18n:`languageChanged`,bindI18nStore:``,transEmptyNodeValue:``,transSupportBasicHtmlNodes:!0,transWrapTextNodes:``,transKeepBasicHtmlNodesFor:[`br`,`strong`,`i`,`p`],useSuspense:!0,unescape:N,transDefaultProps:void 0},F=()=>P,I,L=()=>I,R=(e,t)=>{if(!e)return!1;let n=e.props?.children??e.children;return t?n.length>0:!!n},z=e=>{if(!e)return[];let t=e.props?.children??e.children;return e.props?.i18nIsDynamicList?V(t):t},B=e=>V(e).every(l.isValidElement),V=e=>Array.isArray(e)?e:[e],H=(e,t)=>{let n={...t};return n.props={...t.props,...e.props},n},U=e=>{let t={};if(!e)return t;let n=e=>{V(e).forEach(e=>{O(e)||(R(e)?n(z(e)):k(e)&&!(0,l.isValidElement)(e)&&Object.assign(t,e))})};return n(e),t},W=(e,t,n,r)=>{if(!e)return``;let i=``,a=V(e),o=t?.transSupportBasicHtmlNodes?t.transKeepBasicHtmlNodesFor??[]:[];return a.forEach((e,a)=>{if(O(e))i+=`${e}`;else if((0,l.isValidElement)(e)){let{props:s,type:c}=e,l=Object.keys(s).length,u=o.indexOf(c)>-1,d=s.children;if(!d&&u&&!l){i+=`<${c}/>`;return}if(!d&&(!u||l)||s.i18nIsDynamicList){i+=`<${a}></${a}>`;return}if(u&&l<=1){let e=O(d)?d:W(d,t,n,r);i+=`<${c}>${e}</${c}>`;return}let f=W(d,t,n,r);i+=`<${a}>${f}</${a}>`}else if(e===null)T(n,`TRANS_NULL_VALUE`,`Passed in a null value as child`,{i18nKey:r});else if(k(e)){let{format:t,...a}=e,o=Object.keys(a);if(o.length===1){let e=t?`${o[0]}, ${t}`:o[0];i+=`{{${e}}}`;return}T(n,`TRANS_INVALID_OBJ`,`Invalid child - Object should only have keys {{ value, format }} (format is optional).`,{i18nKey:r,child:e})}else T(n,`TRANS_INVALID_VAR`,`Passed in a variable like {number} - pass variables for interpolation as full objects like {{number}}.`,{i18nKey:r,child:e})}),i},G=(e,t,n,r,i,a,o)=>{if(n===``)return[];let s=i.transKeepBasicHtmlNodesFor||[],c=n&&new RegExp(s.map(e=>`<${e}`).join(`|`)).test(n);if(!e&&!t&&!c&&!o)return[n];let u=t??{},d=e=>{V(e).forEach(e=>{O(e)||(R(e)?d(z(e)):k(e)&&!(0,l.isValidElement)(e)&&Object.assign(u,e))})};d(e);let f=Object.keys(u),p=w.parse(`<0>${n}</0>`,{allowedTags:e=>/^\d+$/.test(e)||s.indexOf(e)>-1||f.indexOf(e)>-1}),m={...u,...a},h=(e,t,n)=>{let r=z(e),i=_(r,t.children,n);return B(r)&&i.length===0||e.props?.i18nIsDynamicList?r:i},g=(e,t,n,r,i)=>{e.dummy?(e.children=t,n.push((0,l.cloneElement)(e,{key:r},i?void 0:t))):n.push(...l.Children.map([e],e=>{if(e.type===l.Fragment||e.props?.i18nIsDynamicList!==void 0){let n={key:r};return e&&e.props&&Object.keys(e.props).forEach(t=>{t!==`children`&&t!==`i18nIsDynamicList`&&(n[t]=e.props[t])}),(0,l.createElement)(e.type,n,i?null:t)}let n={key:r};return e&&e.props&&Object.keys(e.props).forEach(t=>{t!==`ref`&&t!==`children`&&(n[t]=e.props[t])}),(0,l.cloneElement)(e,n,i?null:t)}))},_=(e,n,a)=>{let u=V(e),d=V(n),f={};return d.reduce((e,n,d)=>{let p=n.children?.[0]?.content&&r.services.interpolator.interpolate(n.children[0].content,m,r.language);if(n.type===`tag`){let v=u[parseInt(n.name,10)];!v&&t&&(v=t[n.name]),a.length===1&&!v&&(v=a[0][n.name]),v||={};let y={...n.attrs};o&&Object.keys(y).forEach(e=>{let t=y[e];O(t)&&(y[e]=N(t))});let b=Object.keys(y).length===0?v:H({props:y},v),x=(0,l.isValidElement)(b),S=x&&R(n,!0)&&!n.voidElement,C=c&&k(b)&&b.dummy&&!x,w=k(t)&&Object.hasOwnProperty.call(t,n.name);if(O(b)){let t=r.services.interpolator.interpolate(b,m,r.language);e.push(t)}else if(R(b)||S){let t=h(b,n,a);g(b,t,e,d)}else if(C){let t=_(u,n.children,a);g(b,t,e,d)}else if(Number.isNaN(parseFloat(n.name))){if(w){let t=h(b,n,a);g(b,t,e,d,n.voidElement)}else if(i.transSupportBasicHtmlNodes&&s.indexOf(n.name)>-1){if(n.voidElement)e.push((0,l.createElement)(n.name,{key:`${n.name}-${d}`}));else{let t=f[n.name]||0;f[n.name]=t+1;let r,i=0;for(let e=0;e<u.length;e+=1){let a=u[e];if((0,l.isValidElement)(a)&&a.type===n.name){if(i===t){r=a;break}i+=1}}let o=r?V(z(r)):u,s=_(o,n.children,a);e.push((0,l.createElement)(n.name,{key:`${n.name}-${d}`},s))}}else if(n.voidElement)e.push(`<${n.name} />`);else{let t=_(u,n.children,a);e.push(`<${n.name}>${t}</${n.name}>`)}}else if(k(b)&&!x){let t=n.children[0]?p:null;t&&e.push(t)}else g(b,p,e,d,n.children.length!==1||!p)}else if(n.type===`text`){let t=i.transWrapTextNodes,a=typeof i.unescape==`function`?i.unescape:F().unescape,s=o?a(r.services.interpolator.interpolate(n.content,m,r.language)):r.services.interpolator.interpolate(n.content,m,r.language);t?e.push((0,l.createElement)(t,{key:`${n.name}-${d}`},s)):e.push(s)}return e},[])};return z(_([{dummy:!0,children:e||[]}],p,V(e||[]))[0])},K=(e,t,n)=>{let r=e.key||t,i=(0,l.cloneElement)(e,{key:r});if(!i.props||!i.props.children||n.indexOf(`${t}/>`)<0&&n.indexOf(`${t} />`)<0)return i;function a(){return(0,l.createElement)(l.Fragment,null,i)}return(0,l.createElement)(a,{key:r})},q=(e,t)=>e.map((e,n)=>K(e,n,t)),J=(e,t)=>{let n={};return Object.keys(e).forEach(r=>{Object.assign(n,{[r]:K(e[r],r,t)})}),n},Y=(e,t,n,r)=>e?Array.isArray(e)?q(e,t):k(e)?J(e,t):(D(n,`TRANS_INVALID_COMPONENTS`,`<Trans /> "components" prop expects an object or array`,{i18nKey:r}),null):null,X=e=>!k(e)||Array.isArray(e)?!1:Object.keys(e).reduce((e,t)=>e&&Number.isNaN(Number.parseFloat(t)),!0);function Z({children:e,count:t,parent:r,i18nKey:i,context:a,tOptions:o={},values:s,defaults:c,components:u,ns:d,i18n:f,t:p,shouldUnescape:m,...h}){let g=f||L();if(!g)return D(g,`NO_I18NEXT_INSTANCE`,`Trans: You need to pass in an i18next instance using initReactI18next or by passing it via props or context. In monorepo setups, make sure there is only one instance of react-i18next.`,{i18nKey:i}),e;let _=p||g.t.bind(g)||(e=>e),v={...F(),...g.options?.react},y=d||(_.ns?void 0:g.options?.defaultNS||`translation`);O(y)&&(y=[y]);let{transDefaultProps:b}=v,x=b?.tOptions?{...b.tOptions,...o}:o,S=m??b?.shouldUnescape,C=b?.values?{...b.values,...s}:s,w=b?.components?{...b.components,...u}:u,T=W(e,v,g,i),E=c||x?.defaultValue||T||v.transEmptyNodeValue||(typeof i==`function`?n(i):i),{hashTransKey:k}=v,A=i||(k?k(T||E):T||E);s=g.options?.interpolation?.defaultVariables?{...g.options.interpolation.defaultVariables,...C}:C;let j=U(e);j&&typeof j.count==`number`&&t===void 0&&(t=j.count);let M=s||t!==void 0&&!g.options?.interpolation?.alwaysFormat||!e?x.interpolation:{interpolation:{...x.interpolation,prefix:`#$?`,suffix:`?$#`}},N={...x,context:a||x.context,count:t,...s,...M,defaultValue:E,ns:y},P=A?_(A,N):E;P===A&&E&&(P=E);let I=Y(w,P,g,i),R=I||e,z=null;X(I)&&(z=I,R=e);let B=G(R,z,P,g,v,N,S),V=r??v.defaultTransParent;return V?(0,l.createElement)(V,h,B):B}function Q({children:e,count:t,parent:n,i18nKey:r,context:a,tOptions:o={},values:s,defaults:c,components:u,ns:d,i18n:f,t:p,shouldUnescape:m,...h}){let{i18n:g,defaultNS:_}=(0,l.useContext)(i)||{},v=f||g||L(),y=p||v?.t.bind(v);return Z({children:e,count:t,parent:n,i18nKey:r,context:a,tOptions:o,values:s,defaults:c,components:u,ns:d||(y?.ns?void 0:_||v?.options?.defaultNS),i18n:v,t:p,shouldUnescape:m,...h})}export{c as n,o as r,Q as t};
|