@maudecode/kanvil 0.4.4 → 0.5.0
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 +5 -0
- package/apps/server/dist/{auth-B-Tz8SF4.mjs → auth-Cs_whzgk.mjs} +300 -119
- package/apps/server/dist/client.mjs +1 -1
- package/apps/server/dist/{config-CRADzIvL.mjs → config-DKuNQY5b.mjs} +15 -7
- package/apps/server/dist/index.mjs +98 -30
- package/apps/server/dist/migrate.mjs +2 -2
- package/apps/server/dist/recover.mjs +4 -4
- package/apps/server/dist/{src-BCtZ3wbK.mjs → src-DptOUNRd.mjs} +53 -18
- package/apps/web/dist/assets/{CompositeItem-DvEBmVYM.js → CompositeItem-CXqewtEL.js} +1 -1
- package/apps/web/dist/assets/{Trans-NwgJNiLl.js → Trans-B1rRlWca.js} +1 -1
- package/apps/web/dist/assets/{admin-settings-BVWOe67Z.js → admin-settings-DE3MfBFE.js} +1 -1
- package/apps/web/dist/assets/{archive-restore-j20QLQCl.js → archive-restore-76sStk8K.js} +1 -1
- package/apps/web/dist/assets/az-AZ-bFxpMMZN.js +1 -0
- package/apps/web/dist/assets/{az-Dj0LhQ5O.js → az-B7OgHoaE.js} +1 -1
- package/apps/web/dist/assets/{corner-left-up-BAGDaT_1.js → corner-left-up-PD-73Nae.js} +1 -1
- package/apps/web/dist/assets/{de-BWVFKRmU.js → de-B-bv38Q0.js} +1 -1
- package/apps/web/dist/assets/de-DE-BeXI30Ll.js +1 -0
- package/apps/web/dist/assets/default-bQFGTwIp.js +56 -0
- package/apps/web/dist/assets/{delivery-settings-B26dRk_O.js → delivery-settings-BvMeOsCS.js} +1 -1
- package/apps/web/dist/assets/{el-IYSYQmsa.js → el-BQHQHQgX.js} +1 -1
- package/apps/web/dist/assets/el-GR-SgRHlWhY.js +1 -0
- package/apps/web/dist/assets/{ellipsis-Cx1SIn8a.js → ellipsis-GF1HwTDb.js} +1 -1
- package/apps/web/dist/assets/es-ES-BF1J5vap.js +1 -0
- package/apps/web/dist/assets/{es-C3DJP0aS.js → es-f5Xr8ldr.js} +1 -1
- package/apps/web/dist/assets/{forms-BwtRqvGj.js → forms-BlEL8C_P.js} +1 -1
- package/apps/web/dist/assets/{fr-BlVUPa15.js → fr-DSR0htnl.js} +1 -1
- package/apps/web/dist/assets/fr-FR-D_sldwf6.js +1 -0
- package/apps/web/dist/assets/{hi-CINzKB6O.js → hi-BaAJEWuW.js} +1 -1
- package/apps/web/dist/assets/hi-IN-CfOw4TWf.js +1 -0
- package/apps/web/dist/assets/{highlight-XHbOOx7A.js → highlight-DXT2xgt8.js} +1 -1
- package/apps/web/dist/assets/id-ID-CLKtHO7Q.js +1 -0
- package/apps/web/dist/assets/{id-CpyQwNyO.js → id-kxogWcip.js} +1 -1
- package/apps/web/dist/assets/{index-MTE_naHG.js → index-CYVrs22O.js} +5 -5
- package/apps/web/dist/assets/{invitations-Ch02KEAB.js → invitations-BPik3J_G.js} +1 -1
- package/apps/web/dist/assets/{it-CxMkGyiF.js → it-C_qk40U6.js} +1 -1
- package/apps/web/dist/assets/it-IT-eVZNW5qX.js +1 -0
- package/apps/web/dist/assets/{item-CRS9Ai9p.js → item-TCHuZNK6.js} +1 -1
- package/apps/web/dist/assets/{ja-D72d7qkv.js → ja-Dn5h64V9.js} +1 -1
- package/apps/web/dist/assets/ja-JP-D96njn-P.js +1 -0
- package/apps/web/dist/assets/{ko-BHuNjRQ3.js → ko-CjaoEPuG.js} +1 -1
- package/apps/web/dist/assets/ko-KR-Bash_ieA.js +1 -0
- package/apps/web/dist/assets/{label-settings-tE57CalJ.js → label-settings-DZTorNDm.js} +1 -1
- package/apps/web/dist/assets/{markdown-blocks-CN-hJdJS.js → markdown-blocks-BQLO-H_7.js} +1 -1
- package/apps/web/dist/assets/{member-directory-CoLB-2Oc.js → member-directory-Dx_jQYfI.js} +1 -1
- package/apps/web/dist/assets/mk-MK-BWQWGIRx.js +1 -0
- package/apps/web/dist/assets/{mk-D3TPH_Mz.js → mk-jLeGD50T.js} +1 -1
- package/apps/web/dist/assets/{nl-BHJbk-Wr.js → nl-AVtC5ygT.js} +1 -1
- package/apps/web/dist/assets/nl-NL-D1tvo0Gd.js +1 -0
- package/apps/web/dist/assets/{pl-JW_P_Gb9.js → pl-Dup1h_Y1.js} +1 -1
- package/apps/web/dist/assets/pl-PL-DNgGUEcQ.js +1 -0
- package/apps/web/dist/assets/{project-lifecycle-DuV33mlL.js → project-lifecycle-n1ZZbYfu.js} +1 -1
- package/apps/web/dist/assets/{project-settings-9yJbfZRu.js → project-settings-B_Ih5kiz.js} +1 -1
- package/apps/web/dist/assets/pt-BR-CZsUZQ6P.js +1 -0
- package/apps/web/dist/assets/{pt-BR-DWL_sEp3.js → pt-BR-Cm04EWM-.js} +1 -1
- package/apps/web/dist/assets/{public-project-M93Zpx_e.js → public-project-BivDjU_a.js} +1 -1
- package/apps/web/dist/assets/{rotate-ccw-DcHaluuA.js → rotate-ccw-CSaKhZYt.js} +1 -1
- package/apps/web/dist/assets/{ru-DQNby7hW.js → ru-IeycXsyE.js} +1 -1
- package/apps/web/dist/assets/ru-RU-4ew92YE_.js +1 -0
- package/apps/web/dist/assets/{search-DQtwggUH.js → search-Ble6WSEU.js} +3 -3
- package/apps/web/dist/assets/{send-gpGpxsCa.js → send-BLMZ8gQ0.js} +1 -1
- package/apps/web/dist/assets/settings-CH48qQK2.js +1 -0
- package/apps/web/dist/assets/{sliders-horizontal-BxgR4pFt.js → sliders-horizontal-Db6kRvuw.js} +1 -1
- package/apps/web/dist/assets/{switch-UPVGS5kv.js → switch-BeX-0Fwq.js} +1 -1
- package/apps/web/dist/assets/{table-D8iAxhJH.js → table-UJp5S9yy.js} +1 -1
- package/apps/web/dist/assets/ticket-detail-C24opfNW.js +2 -0
- package/apps/web/dist/assets/{ticket-editor-B5eOWIj4.js → ticket-editor--d_bG9C1.js} +2 -2
- package/apps/web/dist/assets/{ticket-list-C965rmmf.js → ticket-list-DRbZWYHf.js} +1 -1
- package/apps/web/dist/assets/{ticket-list-controls-ua3m0uRB.js → ticket-list-controls-fYBottFC.js} +1 -1
- package/apps/web/dist/assets/{tr-BNZEkwqd.js → tr-DtT_dKUK.js} +1 -1
- package/apps/web/dist/assets/tr-TR-CM381XCw.js +1 -0
- package/apps/web/dist/assets/{uk-Dmlqvk63.js → uk-CsbeHSS6.js} +1 -1
- package/apps/web/dist/assets/uk-UA-AeOiWCVo.js +1 -0
- package/apps/web/dist/assets/{upload-Cu0J8ZFJ.js → upload-DUEg04Nj.js} +1 -1
- package/apps/web/dist/assets/{useQueries-BEzeS0hU.js → useQueries-5lW2C5Sb.js} +1 -1
- package/apps/web/dist/assets/vi-VN-td08xXv9.js +1 -0
- package/apps/web/dist/assets/{vi-KALEc3bk.js → vi-rkf1BOLx.js} +1 -1
- package/apps/web/dist/assets/{visual-editor-DyhI5fa5.js → visual-editor-DkFLjouD.js} +1 -1
- package/apps/web/dist/assets/{workspace-settings-DGr-Lwnz.js → workspace-settings-Bcsp-VoJ.js} +1 -1
- package/apps/web/dist/assets/zh-CN-D3dhEYLS.js +1 -0
- package/apps/web/dist/assets/{zh-CN-DfruhRl9.js → zh-CN-Xo-QId5w.js} +1 -1
- package/apps/web/dist/assets/zh-TW-CfhOEFo8.js +1 -0
- package/apps/web/dist/assets/{zh-TW-C4keUYMa.js → zh-TW-DEnTqjbn.js} +1 -1
- package/apps/web/dist/index.html +7 -7
- package/docs/api.md +16 -6
- package/docs/releasing.md +16 -2
- package/docs/self-hosting.md +8 -0
- package/package.json +1 -1
- package/apps/web/dist/assets/az-AZ-DlsPlUZi.js +0 -1
- package/apps/web/dist/assets/de-DE-DLCaqUUe.js +0 -1
- package/apps/web/dist/assets/default-D6I-Xfqm.js +0 -56
- package/apps/web/dist/assets/el-GR-P2XcwrSU.js +0 -1
- package/apps/web/dist/assets/es-ES-CJoX8f3w.js +0 -1
- package/apps/web/dist/assets/fr-FR-yLkQdy6a.js +0 -1
- package/apps/web/dist/assets/hi-IN-y8dqej7z.js +0 -1
- package/apps/web/dist/assets/id-ID-DSvh8mGH.js +0 -1
- package/apps/web/dist/assets/it-IT-BUcfUqNo.js +0 -1
- package/apps/web/dist/assets/ja-JP-C-jLP_Ay.js +0 -1
- package/apps/web/dist/assets/ko-KR-C5Ozdm2E.js +0 -1
- package/apps/web/dist/assets/mk-MK-BdM_SsE8.js +0 -1
- package/apps/web/dist/assets/nl-NL-CwjB5sva.js +0 -1
- package/apps/web/dist/assets/pl-PL-6-PMhTBd.js +0 -1
- package/apps/web/dist/assets/pt-BR-TD_wt6Hr.js +0 -1
- package/apps/web/dist/assets/ru-RU-Bk1a6Oln.js +0 -1
- package/apps/web/dist/assets/settings-Co61IE04.js +0 -1
- package/apps/web/dist/assets/ticket-detail-BKilKtg_.js +0 -2
- package/apps/web/dist/assets/tr-TR-CUfBb7K9.js +0 -1
- package/apps/web/dist/assets/uk-UA-BDaXBsDP.js +0 -1
- package/apps/web/dist/assets/vi-VN-Bgb-L6mE.js +0 -1
- package/apps/web/dist/assets/zh-CN-BypkvBe6.js +0 -1
- package/apps/web/dist/assets/zh-TW-CgMsT_XS.js +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
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-
|
|
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-DptOUNRd.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 { Bt as searchSettingsSchema, Pt as brokerSettingsSchema, Rt as s3SettingsSchema, m as defaultClaimMaxLeaseSeconds, o as claimLeaseSecondsSchema } from "./src-DptOUNRd.mjs";
|
|
2
2
|
import pg from "pg";
|
|
3
3
|
import { drizzle } from "drizzle-orm/node-postgres";
|
|
4
4
|
import { relations } from "drizzle-orm";
|
|
@@ -341,12 +341,17 @@ const oauthConsentRelations = relations(oauthConsent, ({ one }) => ({
|
|
|
341
341
|
}));
|
|
342
342
|
//#endregion
|
|
343
343
|
//#region src/database.ts
|
|
344
|
-
function
|
|
345
|
-
|
|
346
|
-
connectionString:
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
344
|
+
function poolOptions(config, role) {
|
|
345
|
+
return {
|
|
346
|
+
connectionString: config.DATABASE_URL,
|
|
347
|
+
application_name: role === "domain" ? "kanvil" : "kanvil-integration",
|
|
348
|
+
max: role === "domain" ? config.KANVIL_DATABASE_POOL_MAX : config.KANVIL_INTEGRATION_POOL_MAX,
|
|
349
|
+
idleTimeoutMillis: 3e4,
|
|
350
|
+
connectionTimeoutMillis: config.KANVIL_DATABASE_ACQUIRE_TIMEOUT_MS
|
|
351
|
+
};
|
|
352
|
+
}
|
|
353
|
+
function createDatabase(config, role = "domain") {
|
|
354
|
+
const pool = new pg.Pool(poolOptions(config, role));
|
|
350
355
|
pool.on("error", () => {
|
|
351
356
|
console.error("A PostgreSQL idle connection was lost; the pool will reconnect.");
|
|
352
357
|
});
|
|
@@ -360,6 +365,9 @@ function createDatabase(url) {
|
|
|
360
365
|
const optionalEnv = (schema) => z.preprocess((value) => value === "" ? void 0 : value, schema.optional());
|
|
361
366
|
const envSchema = z.object({
|
|
362
367
|
DATABASE_URL: z.url(),
|
|
368
|
+
KANVIL_DATABASE_POOL_MAX: z.coerce.number().int().min(2).max(1e3).default(10),
|
|
369
|
+
KANVIL_INTEGRATION_POOL_MAX: z.coerce.number().int().min(1).max(1e3).default(4),
|
|
370
|
+
KANVIL_DATABASE_ACQUIRE_TIMEOUT_MS: z.coerce.number().int().min(100).max(6e5).default(3e4),
|
|
363
371
|
KANVIL_STORAGE_PROVIDER: optionalEnv(z.enum(["local", "s3"])),
|
|
364
372
|
S3_ENDPOINT: optionalEnv(s3SettingsSchema.shape.endpoint),
|
|
365
373
|
S3_REGION: s3SettingsSchema.shape.region,
|
|
@@ -1,7 +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 { A as hasAdminRole, B as memberSchema, C as errorSchema, Ft as
|
|
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-DKuNQY5b.mjs";
|
|
2
|
+
import { A as hasAdminRole, B as memberSchema, Bt as searchSettingsSchema, C as errorSchema, Ft as instanceUpdateSchema, G as notificationReadInput, H as notificationIdsInput, I as isOperation, It as photoInputSchema, L as isPresetColor, Lt as photoResultSchema, M as importProviderDefinitions, Mt as adminInstanceSchema, Pt as brokerSettingsSchema, R as isPublicOperation, Rt as s3SettingsSchema, U as notificationPreferencesInput, W as notificationPreferencesSchema, Y as operations, at as publicOperations, c as credentialInput, g as defaultWorkflow, ht as scopes, j as importLimits, mt as roles, ot as pushDeviceInput, q as okSchema, s as closedStates, t as ApiError, wt as ticketExportFormat, xt as stateLabels } from "./src-DptOUNRd.mjs";
|
|
3
3
|
import { t as migrateDatabase } from "./migrate-C9f4ozB4.mjs";
|
|
4
|
-
import { $ as
|
|
4
|
+
import { $ as stagedUploads, A as requireSession, B as attachmentContent, C as defaultSenders, D as createAccess, E as createHttpSender, F as decodeImage, G as events, H as blobObjects, I as imageResponse, J as notificationPreferences, L as stagedUploadCutoff, M as createTicketSearch, N as createTicketIndex, O as createWriteLimiter, P as createBlobStorage, Q as pushDevices, R as createObjectStore, S as receiveRepositoryWebhook, T as DeliveryError, U as deliveryCheckpoints, V as attachments, W as eventClock, X as profilePhotos, Y as notifications, Z as projects, _ as one, a as deliverySecrets, at as matchesOIDCBinding, b as requireRow, c as ownerBlocker, d as createDomain, et as storageBackends, f as errorEnvelope, g as notify, h as json, i as createInstance, it as workspaces, j as readCalendarFeed, k as requireInstanceAdmin, l as appendEvents, m as intakeOnly, n as emailCodesAvailable, nt as tickets, o as otherActiveAdministrator, p as fail, q as members, r as signInProviders, rt as workspaceMembers, s as ownedWorkspaces, t as createAuth, tt as subscriptions, u as assertVersion, v as reachable, w as deliverBatch, x as processImports, y as recipientColumns, z as createPollingJob } from "./auth-Cs_whzgk.mjs";
|
|
5
5
|
import { serve } from "@hono/node-server";
|
|
6
6
|
import pg from "pg";
|
|
7
7
|
import { drizzle } from "drizzle-orm/node-postgres";
|
|
@@ -324,8 +324,42 @@ function createAccountAdministration(database, auth, config) {
|
|
|
324
324
|
};
|
|
325
325
|
}
|
|
326
326
|
//#endregion
|
|
327
|
+
//#region src/cleanup.ts
|
|
328
|
+
function createCleanup() {
|
|
329
|
+
const resources = [];
|
|
330
|
+
let closing;
|
|
331
|
+
function close() {
|
|
332
|
+
return closing ??= Promise.resolve().then(async () => {
|
|
333
|
+
const failures = [];
|
|
334
|
+
for (const resource of resources.toReversed()) try {
|
|
335
|
+
await resource.close();
|
|
336
|
+
} catch {
|
|
337
|
+
failures.push(/* @__PURE__ */ new Error(`Could not close ${resource.name}.`));
|
|
338
|
+
}
|
|
339
|
+
if (failures.length) throw new AggregateError(failures, "Resource cleanup failed.");
|
|
340
|
+
});
|
|
341
|
+
}
|
|
342
|
+
return {
|
|
343
|
+
add(name, release) {
|
|
344
|
+
resources.push({
|
|
345
|
+
name,
|
|
346
|
+
close: release
|
|
347
|
+
});
|
|
348
|
+
},
|
|
349
|
+
close,
|
|
350
|
+
async fail(error) {
|
|
351
|
+
try {
|
|
352
|
+
await close();
|
|
353
|
+
} catch (cleanupError) {
|
|
354
|
+
console.error("Startup cleanup failed.", cleanupError);
|
|
355
|
+
}
|
|
356
|
+
throw error;
|
|
357
|
+
}
|
|
358
|
+
};
|
|
359
|
+
}
|
|
360
|
+
//#endregion
|
|
327
361
|
//#region src/version.ts
|
|
328
|
-
const applicationVersion = "0.
|
|
362
|
+
const applicationVersion = "0.5.0";
|
|
329
363
|
//#endregion
|
|
330
364
|
//#region src/realtime.ts
|
|
331
365
|
async function createRealtime(config) {
|
|
@@ -334,7 +368,10 @@ async function createRealtime(config) {
|
|
|
334
368
|
let client, closed = false, retry;
|
|
335
369
|
async function connect() {
|
|
336
370
|
if (closed) return;
|
|
337
|
-
const connection = new pg.Client({
|
|
371
|
+
const connection = new pg.Client({
|
|
372
|
+
connectionString: config.DATABASE_URL,
|
|
373
|
+
application_name: "kanvil-realtime"
|
|
374
|
+
});
|
|
338
375
|
client = connection;
|
|
339
376
|
const disconnected = () => {
|
|
340
377
|
if (client !== connection || closed) return;
|
|
@@ -497,8 +534,25 @@ function brokerEndpoint(settings) {
|
|
|
497
534
|
return `${url.protocol}//${url.host}${url.pathname}`;
|
|
498
535
|
}
|
|
499
536
|
async function createEventDelivery(config, instance, database, factory = createWakeupBus) {
|
|
500
|
-
const
|
|
537
|
+
const cleanup = createCleanup();
|
|
538
|
+
try {
|
|
539
|
+
const postgres = await createRealtime(config);
|
|
540
|
+
cleanup.add("PostgreSQL realtime client", () => postgres.close());
|
|
541
|
+
return await initializeEventDelivery(instance, database, factory, postgres, cleanup);
|
|
542
|
+
} catch (error) {
|
|
543
|
+
return cleanup.fail(error);
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
async function initializeEventDelivery(instance, database, factory, postgres, cleanup) {
|
|
547
|
+
const emitter = new EventEmitter();
|
|
501
548
|
emitter.setMaxListeners(0);
|
|
549
|
+
cleanup.add("realtime listeners", () => {
|
|
550
|
+
try {
|
|
551
|
+
emitter.emit("close");
|
|
552
|
+
} finally {
|
|
553
|
+
emitter.removeAllListeners();
|
|
554
|
+
}
|
|
555
|
+
});
|
|
502
556
|
const identity = (await instance.read()).identity;
|
|
503
557
|
let bus, fingerprint = "", destination = "", closed = false, pending, dirty = false, error = null;
|
|
504
558
|
const wake = () => emitter.emit("change");
|
|
@@ -580,11 +634,23 @@ async function createEventDelivery(config, instance, database, factory = createW
|
|
|
580
634
|
if (!bus?.ready() || error) wake();
|
|
581
635
|
trigger();
|
|
582
636
|
});
|
|
637
|
+
cleanup.add("broker connection", async () => {
|
|
638
|
+
await bus?.close();
|
|
639
|
+
});
|
|
640
|
+
cleanup.add("broker worker", async () => {
|
|
641
|
+
closed = true;
|
|
642
|
+
await pending;
|
|
643
|
+
});
|
|
644
|
+
cleanup.add("PostgreSQL subscription", unsubscribe);
|
|
583
645
|
const timer = setInterval(() => {
|
|
584
646
|
if (error) wake();
|
|
585
647
|
trigger();
|
|
586
648
|
}, 1e3);
|
|
587
649
|
timer.unref();
|
|
650
|
+
cleanup.add("broker timer", () => {
|
|
651
|
+
closed = true;
|
|
652
|
+
clearInterval(timer);
|
|
653
|
+
});
|
|
588
654
|
trigger();
|
|
589
655
|
return {
|
|
590
656
|
subscribe(listener) {
|
|
@@ -631,16 +697,7 @@ async function createEventDelivery(config, instance, database, factory = createW
|
|
|
631
697
|
await probe.close().catch(() => {});
|
|
632
698
|
}
|
|
633
699
|
},
|
|
634
|
-
|
|
635
|
-
closed = true;
|
|
636
|
-
clearInterval(timer);
|
|
637
|
-
unsubscribe();
|
|
638
|
-
await pending;
|
|
639
|
-
await bus?.close().catch(() => {});
|
|
640
|
-
emitter.emit("close");
|
|
641
|
-
emitter.removeAllListeners();
|
|
642
|
-
await postgres.close();
|
|
643
|
-
}
|
|
700
|
+
close: cleanup.close
|
|
644
701
|
};
|
|
645
702
|
}
|
|
646
703
|
//#endregion
|
|
@@ -3204,11 +3261,28 @@ const toPreferences = (row) => notificationPreferencesSchema.parse(row ? {
|
|
|
3204
3261
|
} : {});
|
|
3205
3262
|
const digest = (value) => createHash("sha256").update(value).digest();
|
|
3206
3263
|
async function createApplication(database, config, overrides = {}) {
|
|
3264
|
+
const cleanup = createCleanup();
|
|
3207
3265
|
const adapters = {
|
|
3208
3266
|
...defaultAdapters,
|
|
3209
3267
|
...overrides
|
|
3210
3268
|
};
|
|
3211
|
-
const
|
|
3269
|
+
const jobs = (name, interval, run) => {
|
|
3270
|
+
const job = adapters.jobs(name, interval, run);
|
|
3271
|
+
cleanup.add(name, () => job.close());
|
|
3272
|
+
return job;
|
|
3273
|
+
};
|
|
3274
|
+
try {
|
|
3275
|
+
return await initializeApplication(database, config, {
|
|
3276
|
+
...adapters,
|
|
3277
|
+
jobs
|
|
3278
|
+
}, cleanup);
|
|
3279
|
+
} catch (error) {
|
|
3280
|
+
return cleanup.fail(error);
|
|
3281
|
+
}
|
|
3282
|
+
}
|
|
3283
|
+
async function initializeApplication(database, config, adapters, cleanup) {
|
|
3284
|
+
const integrationDatabase = createDatabase(config, "integration");
|
|
3285
|
+
cleanup.add("integration database", () => integrationDatabase.pool.end());
|
|
3212
3286
|
const instance = createInstance(integrationDatabase, config);
|
|
3213
3287
|
await instance.read();
|
|
3214
3288
|
const blobs = createBlobStorage(integrationDatabase, instance, adapters.objectStore, adapters.jobs), search = createTicketSearch(integrationDatabase, instance, adapters.ticketIndex, adapters.jobs);
|
|
@@ -3222,12 +3296,14 @@ async function createApplication(database, config, overrides = {}) {
|
|
|
3222
3296
|
sources: adapters.importSources(config),
|
|
3223
3297
|
claimMaxLeaseSeconds: config.KANVIL_CLAIM_MAX_LEASE_SECONDS
|
|
3224
3298
|
}), access = createAccess(auth, domain, config, database), realtime = await adapters.realtime(config, instance, integrationDatabase);
|
|
3299
|
+
cleanup.add("realtime", () => realtime.close());
|
|
3225
3300
|
const unsubscribeJobs = realtime.subscribe(() => {
|
|
3226
3301
|
blobs.sync().catch(() => {});
|
|
3227
3302
|
search.sync().catch(() => {});
|
|
3228
3303
|
});
|
|
3229
|
-
|
|
3230
|
-
|
|
3304
|
+
cleanup.add("job subscription", unsubscribeJobs);
|
|
3305
|
+
adapters.jobs("outbox", 5e3, () => deliverBatch(database, config, senders, secrets, repositories));
|
|
3306
|
+
adapters.jobs("due-reminders", 6e4, () => sendDueReminders(database));
|
|
3231
3307
|
const imports = adapters.jobs("imports", 2e3, async () => {
|
|
3232
3308
|
if (await processImports(domain)) imports.trigger().catch(() => {});
|
|
3233
3309
|
});
|
|
@@ -3363,6 +3439,7 @@ async function createApplication(database, config, overrides = {}) {
|
|
|
3363
3439
|
app.use("/api/v1/*", async (c, next) => {
|
|
3364
3440
|
access.checkOrigin(c.req.raw);
|
|
3365
3441
|
const actor = await access.authenticate(c.req.raw);
|
|
3442
|
+
if (intakeOnly(actor) && !(c.req.method === "POST" && /^\/api\/v1\/projects\/[^/]+\/tickets$/.test(c.req.path))) fail(403, "insufficient_scope", "Intake credentials can only create tickets");
|
|
3366
3443
|
c.set("actor", actor);
|
|
3367
3444
|
if (!actor.machine && ![
|
|
3368
3445
|
"GET",
|
|
@@ -3737,22 +3814,13 @@ async function createApplication(database, config, overrides = {}) {
|
|
|
3737
3814
|
blobs,
|
|
3738
3815
|
search,
|
|
3739
3816
|
realtime,
|
|
3740
|
-
close:
|
|
3741
|
-
await imports.close();
|
|
3742
|
-
unsubscribeJobs();
|
|
3743
|
-
await realtime.close();
|
|
3744
|
-
await search.close();
|
|
3745
|
-
await blobs.close();
|
|
3746
|
-
await integrationDatabase.pool.end();
|
|
3747
|
-
await outbox.close();
|
|
3748
|
-
await reminders.close();
|
|
3749
|
-
}
|
|
3817
|
+
close: cleanup.close
|
|
3750
3818
|
};
|
|
3751
3819
|
}
|
|
3752
3820
|
//#endregion
|
|
3753
3821
|
//#region src/index.ts
|
|
3754
3822
|
const config = readConfig();
|
|
3755
|
-
const database = createDatabase(config
|
|
3823
|
+
const database = createDatabase(config);
|
|
3756
3824
|
await migrateDatabase(database);
|
|
3757
3825
|
const application = await createApplication(database, config);
|
|
3758
3826
|
const server = serve({
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { n as createDatabase, t as readConfig } from "./config-
|
|
1
|
+
import { n as createDatabase, t as readConfig } from "./config-DKuNQY5b.mjs";
|
|
2
2
|
import { t as migrateDatabase } from "./migrate-C9f4ozB4.mjs";
|
|
3
3
|
//#region src/cli/migrate.ts
|
|
4
|
-
const database = createDatabase(readConfig()
|
|
4
|
+
const database = createDatabase(readConfig());
|
|
5
5
|
try {
|
|
6
6
|
await migrateDatabase(database);
|
|
7
7
|
console.info("Kanvil database is current.");
|
|
@@ -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 { A as hasAdminRole } from "./src-
|
|
3
|
-
import {
|
|
1
|
+
import { d as user, n as createDatabase, r as account, t as readConfig, u as session } from "./config-DKuNQY5b.mjs";
|
|
2
|
+
import { A as hasAdminRole } from "./src-DptOUNRd.mjs";
|
|
3
|
+
import { K as instanceSettings, p as fail, t as createAuth } from "./auth-Cs_whzgk.mjs";
|
|
4
4
|
import { and, eq, isNull, sql } from "drizzle-orm";
|
|
5
5
|
import { z } from "zod";
|
|
6
6
|
import { parseArgs } from "node:util";
|
|
@@ -56,7 +56,7 @@ const password = process.stdin.isTTY ? await passwordPrompt({
|
|
|
56
56
|
validate: (value) => localPasswordSchema.safeParse(value).success || "Use 12 to 128 characters"
|
|
57
57
|
}) : readFileSync(0, "utf8").replace(/\r?\n$/, "");
|
|
58
58
|
const config = readConfig();
|
|
59
|
-
const database = createDatabase(config
|
|
59
|
+
const database = createDatabase(config);
|
|
60
60
|
try {
|
|
61
61
|
await recoverLocalPassword(database, config, values.email, password, values["enable-password-sign-in"]);
|
|
62
62
|
if (values["enable-password-sign-in"]) console.info("Instance password sign-in enabled.");
|
|
@@ -1548,6 +1548,10 @@ var en_US_default = {
|
|
|
1548
1548
|
custom: "Custom permissions"
|
|
1549
1549
|
},
|
|
1550
1550
|
permission: {
|
|
1551
|
+
intake: {
|
|
1552
|
+
name: "Submit reports",
|
|
1553
|
+
description: "Create quarantined tickets only. Cannot read or edit tickets. Use alone."
|
|
1554
|
+
},
|
|
1551
1555
|
read: {
|
|
1552
1556
|
name: "Read tickets",
|
|
1553
1557
|
description: "View projects, tickets, comments, and attachments."
|
|
@@ -2844,7 +2848,8 @@ const scopes = [
|
|
|
2844
2848
|
"read",
|
|
2845
2849
|
"write",
|
|
2846
2850
|
"claim",
|
|
2847
|
-
"admin"
|
|
2851
|
+
"admin",
|
|
2852
|
+
"intake"
|
|
2848
2853
|
];
|
|
2849
2854
|
const attachmentLimit = 1e7;
|
|
2850
2855
|
const stagedUploadLifetime = 864e5;
|
|
@@ -3260,6 +3265,26 @@ const ticketSchema = z.object({
|
|
|
3260
3265
|
createdAt: timestamp,
|
|
3261
3266
|
updatedAt: timestamp
|
|
3262
3267
|
});
|
|
3268
|
+
const ticketSummarySchema = ticketSchema.pick({
|
|
3269
|
+
id: true,
|
|
3270
|
+
key: true,
|
|
3271
|
+
number: true,
|
|
3272
|
+
projectId: true,
|
|
3273
|
+
title: true,
|
|
3274
|
+
status: true,
|
|
3275
|
+
stateId: true,
|
|
3276
|
+
kind: true,
|
|
3277
|
+
difficulty: true,
|
|
3278
|
+
priority: true,
|
|
3279
|
+
labels: true,
|
|
3280
|
+
scopes: true,
|
|
3281
|
+
archived: true,
|
|
3282
|
+
automationReady: true,
|
|
3283
|
+
updatedAt: true,
|
|
3284
|
+
version: true
|
|
3285
|
+
});
|
|
3286
|
+
const ticketView = { view: z.enum(["summary", "full"]).default("full") };
|
|
3287
|
+
const ticketRow = z.union([ticketSchema, ticketSummarySchema]);
|
|
3263
3288
|
const snapshotSchema = z.object({
|
|
3264
3289
|
project: projectSchema,
|
|
3265
3290
|
tickets: z.array(ticketSchema),
|
|
@@ -3295,8 +3320,13 @@ const relationSchema = z.object({
|
|
|
3295
3320
|
]),
|
|
3296
3321
|
sourceKey: z.string().optional(),
|
|
3297
3322
|
sourceTitle: z.string().optional(),
|
|
3323
|
+
sourceProjectId: z.uuid().optional(),
|
|
3324
|
+
sourceProjectKey: z.string().optional(),
|
|
3298
3325
|
targetKey: z.string().optional(),
|
|
3299
|
-
targetTitle: z.string().optional()
|
|
3326
|
+
targetTitle: z.string().optional(),
|
|
3327
|
+
targetProjectId: z.uuid().optional(),
|
|
3328
|
+
targetProjectKey: z.string().optional(),
|
|
3329
|
+
restricted: z.boolean().optional()
|
|
3300
3330
|
});
|
|
3301
3331
|
const relationDirections = z.enum(["outgoing", "incoming"]);
|
|
3302
3332
|
const relationLabel = (type, outgoing) => t(`common.relation.${type}.${outgoing ? "outgoing" : "incoming"}`);
|
|
@@ -3443,14 +3473,15 @@ const searchResultSchema = z.object({
|
|
|
3443
3473
|
type: z.enum(searchResultTypes),
|
|
3444
3474
|
id: z.string(),
|
|
3445
3475
|
project: projectRef,
|
|
3446
|
-
ticket: z.object({
|
|
3476
|
+
ticket: z.union([ticketSummarySchema, z.object({
|
|
3447
3477
|
id: z.uuid(),
|
|
3448
3478
|
key: z.string(),
|
|
3449
3479
|
title: z.string(),
|
|
3450
3480
|
status: z.enum(states)
|
|
3451
|
-
}).nullable(),
|
|
3481
|
+
})]).nullable(),
|
|
3452
3482
|
title: z.string(),
|
|
3453
3483
|
excerpt: z.string(),
|
|
3484
|
+
snippet: z.string().optional(),
|
|
3454
3485
|
actorId: z.string().nullable(),
|
|
3455
3486
|
at: timestamp
|
|
3456
3487
|
});
|
|
@@ -3792,7 +3823,7 @@ const credentialProjectsSchema = z.object({ projectIds: z.array(z.uuid()).max(1e
|
|
|
3792
3823
|
const credentialInput = z.object({
|
|
3793
3824
|
name: z.string().trim().min(1).max(100),
|
|
3794
3825
|
projectIds: credentialProjectsSchema.shape.projectIds.refine((ids) => ids === null || ids.length > 0),
|
|
3795
|
-
scopes: z.array(z.enum(scopes)).min(1),
|
|
3826
|
+
scopes: z.array(z.enum(scopes)).min(1).refine((values) => !values.includes("intake") || values.every((value) => value === "intake"), "Intake cannot be combined with other scopes"),
|
|
3796
3827
|
expiresIn: z.number().int().min(3600).max(31536e3).nullable().default(7776e3)
|
|
3797
3828
|
}).strict();
|
|
3798
3829
|
z.object({
|
|
@@ -4367,8 +4398,9 @@ const operations = {
|
|
|
4367
4398
|
relatedTo: id.optional(),
|
|
4368
4399
|
stateId: z.uuid().optional(),
|
|
4369
4400
|
scheduledFrom: timestamp.optional(),
|
|
4370
|
-
scheduledTo: timestamp.optional()
|
|
4371
|
-
|
|
4401
|
+
scheduledTo: timestamp.optional(),
|
|
4402
|
+
...ticketView
|
|
4403
|
+
}).superRefine(rejectConflicts), page(ticketRow), "GET", "/projects/{projectId}/tickets", "read", "Search tickets with server-side filters, stable ordering, and pagination. Each property filter takes one value or a repeated list (any of them); its `Not` twin excludes values. Double-quoted segments of `q` match as exact phrases. Pass `view: \"summary\"` when scanning results: rows then omit the description and acceptance criteria."),
|
|
4372
4404
|
list_ticket_labels: op(projectInput.extend({ archived: ticketFilter.shape.archived }), z.array(z.object({
|
|
4373
4405
|
name: z.string(),
|
|
4374
4406
|
count: z.number().int().nonnegative()
|
|
@@ -4538,25 +4570,28 @@ const operations = {
|
|
|
4538
4570
|
search_tickets: op(z.object({
|
|
4539
4571
|
q: z.string().trim().min(1).max(200),
|
|
4540
4572
|
workspaceId: z.uuid().optional(),
|
|
4541
|
-
limit: z.coerce.number().int().min(1).max(50).default(20)
|
|
4573
|
+
limit: z.coerce.number().int().min(1).max(50).default(20),
|
|
4574
|
+
...ticketView
|
|
4542
4575
|
}).strict(), z.object({ items: z.array(z.object({
|
|
4543
|
-
ticket:
|
|
4544
|
-
project: projectRef
|
|
4545
|
-
|
|
4576
|
+
ticket: ticketRow,
|
|
4577
|
+
project: projectRef,
|
|
4578
|
+
snippet: z.string().optional()
|
|
4579
|
+
})) }), "GET", "/tickets/search", "read", "Search unarchived tickets by key or text across every accessible project, optionally within one workspace. Results order by exact key match, then relevance, then recency. Double-quoted segments of `q` match as exact phrases. Pass `view: \"summary\"` when scanning results: each ticket is then a compact row and the result carries a `snippet` of the matching text."),
|
|
4546
4580
|
search_workspace: op(z.object({
|
|
4547
4581
|
q: z.string().trim().min(1).max(200),
|
|
4548
4582
|
workspaceId: z.uuid().optional(),
|
|
4549
4583
|
type: z.enum(searchResultTypes).optional(),
|
|
4550
4584
|
...filterShape,
|
|
4551
4585
|
limit: z.coerce.number().int().min(1).max(50).default(20),
|
|
4552
|
-
offset: z.coerce.number().int().min(0).max(1e3).default(0)
|
|
4586
|
+
offset: z.coerce.number().int().min(0).max(1e3).default(0),
|
|
4587
|
+
...ticketView
|
|
4553
4588
|
}).strict().superRefine(rejectConflicts), z.object({
|
|
4554
4589
|
items: z.array(searchResultSchema),
|
|
4555
4590
|
total: z.number().int().nonnegative(),
|
|
4556
4591
|
counts: z.record(z.enum(searchResultTypes), z.number().int().nonnegative()),
|
|
4557
4592
|
engine: z.enum(["postgres", "index"]),
|
|
4558
4593
|
indexing: z.boolean()
|
|
4559
|
-
}), "GET", "/search", "read", "Search accessible tickets, projects, comments, and activity by text or ticket key, optionally within one workspace or one result type. Property filters restrict results to matching tickets. Results order by exact key match, then type, then recency."),
|
|
4594
|
+
}), "GET", "/search", "read", "Search accessible tickets, projects, comments, and activity by text or ticket key, optionally within one workspace or one result type. Property filters restrict results to matching tickets. Results order by exact key match, then type, then ticket relevance, then recency. Double-quoted segments of `q` match ticket text as exact phrases. Pass `view: \"summary\"` when scanning results: ticket results then carry their summary row and each result a `snippet` of the matching text."),
|
|
4560
4595
|
list_my_work: op(z.object({
|
|
4561
4596
|
workspaceId: z.uuid().optional(),
|
|
4562
4597
|
q: ticketFilter.shape.q,
|
|
@@ -4569,17 +4604,17 @@ const operations = {
|
|
|
4569
4604
|
ticket: ticketSchema,
|
|
4570
4605
|
readiness: readinessSchema
|
|
4571
4606
|
})), "GET", "/projects/{projectId}/eligibility", "read", "Inspect eligibility and explicit blocking reasons for open tickets."),
|
|
4572
|
-
list_relations: op(ticketInput, z.array(relationSchema), "GET", "/projects/{projectId}/tickets/{ticketId}/relations", "read", "List incoming and outgoing ticket relationships."),
|
|
4607
|
+
list_relations: op(ticketInput, z.array(relationSchema), "GET", "/projects/{projectId}/tickets/{ticketId}/relations", "read", "List incoming and outgoing ticket relationships with each side's key, title, and project. A ticket in a project the caller cannot read appears by ID and key alone, with `restricted: true`."),
|
|
4573
4608
|
add_relation: op(ticketInput.extend({
|
|
4574
4609
|
...mutation,
|
|
4575
|
-
targetId:
|
|
4610
|
+
targetId: id,
|
|
4576
4611
|
type: relationSchema.shape.type,
|
|
4577
4612
|
direction: relationDirections.optional()
|
|
4578
|
-
}).strict(), relationSchema, "POST", "/projects/{projectId}/tickets/{ticketId}/relations", "write", "Relate
|
|
4613
|
+
}).strict(), relationSchema, "POST", "/projects/{projectId}/tickets/{ticketId}/relations", "write", "Relate a ticket to another by ID or key, in this project or any project the caller can read, while rejecting dependency cycles across projects. Blocking or marking as duplicate a ticket of another project also needs write there. Both projects' feeds record the change."),
|
|
4579
4614
|
remove_relation: op(projectInput.extend({
|
|
4580
4615
|
...mutation,
|
|
4581
4616
|
relationId: z.uuid()
|
|
4582
|
-
}).strict(), okSchema, "DELETE", "/projects/{projectId}/relations/{relationId}", "write", "Remove a ticket relationship."),
|
|
4617
|
+
}).strict(), okSchema, "DELETE", "/projects/{projectId}/relations/{relationId}", "write", "Remove a ticket relationship that names a ticket of this project."),
|
|
4583
4618
|
list_comments: op(ticketInput.extend(pagination), page(commentSchema), "GET", "/projects/{projectId}/tickets/{ticketId}/comments", "read", "Read ticket discussion."),
|
|
4584
4619
|
add_comment: op(ticketInput.extend({
|
|
4585
4620
|
...mutation,
|
|
@@ -4961,4 +4996,4 @@ function parseOutput(name, value) {
|
|
|
4961
4996
|
return operations[name].output.parse(value);
|
|
4962
4997
|
}
|
|
4963
4998
|
//#endregion
|
|
4964
|
-
export { permissionLabels as $, hasAdminRole as A,
|
|
4999
|
+
export { permissionLabels as $, hasAdminRole as A, workflowOrder as At, memberSchema as B, searchSettingsSchema as Bt, errorSchema as C, streamErrorSchema as Ct, filterKey as D, ticketPredicates as Dt, eventSchema as E, ticketImportSchema as Et, isHexColor as F, instanceUpdateSchema as Ft, notificationReadInput as G, notificationIdsInput as H, isOperation as I, photoInputSchema as It, operationPermission as J, notificationsSchema as K, isPresetColor as L, photoResultSchema as Lt, importProviderDefinitions as M, adminInstanceSchema as Mt, importSecretFields as N, authenticationPolicySchema as Nt, filterList as O, ticketSchema as Ot, invitationStatuses as P, brokerSettingsSchema as Pt, parsePublicOutput as Q, isPublicOperation as R, s3SettingsSchema 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, workspaceSchema as jt, formatEvent as k, ticketSummarySchema 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, searchAuthentication 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-Ble6WSEU.js";import{i}from"./forms-BlEL8C_P.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-D6I-Xfqm.js";import{Ga as r}from"./search-DQtwggUH.js";import{c as i}from"./item-CRS9Ai9p.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-bQFGTwIp.js";import{Ga as r}from"./search-Ble6WSEU.js";import{c as i}from"./item-TCHuZNK6.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};
|