@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.
Files changed (110) hide show
  1. package/apps/server/.env.example +5 -0
  2. package/apps/server/dist/{auth-B-Tz8SF4.mjs → auth-Cs_whzgk.mjs} +300 -119
  3. package/apps/server/dist/client.mjs +1 -1
  4. package/apps/server/dist/{config-CRADzIvL.mjs → config-DKuNQY5b.mjs} +15 -7
  5. package/apps/server/dist/index.mjs +98 -30
  6. package/apps/server/dist/migrate.mjs +2 -2
  7. package/apps/server/dist/recover.mjs +4 -4
  8. package/apps/server/dist/{src-BCtZ3wbK.mjs → src-DptOUNRd.mjs} +53 -18
  9. package/apps/web/dist/assets/{CompositeItem-DvEBmVYM.js → CompositeItem-CXqewtEL.js} +1 -1
  10. package/apps/web/dist/assets/{Trans-NwgJNiLl.js → Trans-B1rRlWca.js} +1 -1
  11. package/apps/web/dist/assets/{admin-settings-BVWOe67Z.js → admin-settings-DE3MfBFE.js} +1 -1
  12. package/apps/web/dist/assets/{archive-restore-j20QLQCl.js → archive-restore-76sStk8K.js} +1 -1
  13. package/apps/web/dist/assets/az-AZ-bFxpMMZN.js +1 -0
  14. package/apps/web/dist/assets/{az-Dj0LhQ5O.js → az-B7OgHoaE.js} +1 -1
  15. package/apps/web/dist/assets/{corner-left-up-BAGDaT_1.js → corner-left-up-PD-73Nae.js} +1 -1
  16. package/apps/web/dist/assets/{de-BWVFKRmU.js → de-B-bv38Q0.js} +1 -1
  17. package/apps/web/dist/assets/de-DE-BeXI30Ll.js +1 -0
  18. package/apps/web/dist/assets/default-bQFGTwIp.js +56 -0
  19. package/apps/web/dist/assets/{delivery-settings-B26dRk_O.js → delivery-settings-BvMeOsCS.js} +1 -1
  20. package/apps/web/dist/assets/{el-IYSYQmsa.js → el-BQHQHQgX.js} +1 -1
  21. package/apps/web/dist/assets/el-GR-SgRHlWhY.js +1 -0
  22. package/apps/web/dist/assets/{ellipsis-Cx1SIn8a.js → ellipsis-GF1HwTDb.js} +1 -1
  23. package/apps/web/dist/assets/es-ES-BF1J5vap.js +1 -0
  24. package/apps/web/dist/assets/{es-C3DJP0aS.js → es-f5Xr8ldr.js} +1 -1
  25. package/apps/web/dist/assets/{forms-BwtRqvGj.js → forms-BlEL8C_P.js} +1 -1
  26. package/apps/web/dist/assets/{fr-BlVUPa15.js → fr-DSR0htnl.js} +1 -1
  27. package/apps/web/dist/assets/fr-FR-D_sldwf6.js +1 -0
  28. package/apps/web/dist/assets/{hi-CINzKB6O.js → hi-BaAJEWuW.js} +1 -1
  29. package/apps/web/dist/assets/hi-IN-CfOw4TWf.js +1 -0
  30. package/apps/web/dist/assets/{highlight-XHbOOx7A.js → highlight-DXT2xgt8.js} +1 -1
  31. package/apps/web/dist/assets/id-ID-CLKtHO7Q.js +1 -0
  32. package/apps/web/dist/assets/{id-CpyQwNyO.js → id-kxogWcip.js} +1 -1
  33. package/apps/web/dist/assets/{index-MTE_naHG.js → index-CYVrs22O.js} +5 -5
  34. package/apps/web/dist/assets/{invitations-Ch02KEAB.js → invitations-BPik3J_G.js} +1 -1
  35. package/apps/web/dist/assets/{it-CxMkGyiF.js → it-C_qk40U6.js} +1 -1
  36. package/apps/web/dist/assets/it-IT-eVZNW5qX.js +1 -0
  37. package/apps/web/dist/assets/{item-CRS9Ai9p.js → item-TCHuZNK6.js} +1 -1
  38. package/apps/web/dist/assets/{ja-D72d7qkv.js → ja-Dn5h64V9.js} +1 -1
  39. package/apps/web/dist/assets/ja-JP-D96njn-P.js +1 -0
  40. package/apps/web/dist/assets/{ko-BHuNjRQ3.js → ko-CjaoEPuG.js} +1 -1
  41. package/apps/web/dist/assets/ko-KR-Bash_ieA.js +1 -0
  42. package/apps/web/dist/assets/{label-settings-tE57CalJ.js → label-settings-DZTorNDm.js} +1 -1
  43. package/apps/web/dist/assets/{markdown-blocks-CN-hJdJS.js → markdown-blocks-BQLO-H_7.js} +1 -1
  44. package/apps/web/dist/assets/{member-directory-CoLB-2Oc.js → member-directory-Dx_jQYfI.js} +1 -1
  45. package/apps/web/dist/assets/mk-MK-BWQWGIRx.js +1 -0
  46. package/apps/web/dist/assets/{mk-D3TPH_Mz.js → mk-jLeGD50T.js} +1 -1
  47. package/apps/web/dist/assets/{nl-BHJbk-Wr.js → nl-AVtC5ygT.js} +1 -1
  48. package/apps/web/dist/assets/nl-NL-D1tvo0Gd.js +1 -0
  49. package/apps/web/dist/assets/{pl-JW_P_Gb9.js → pl-Dup1h_Y1.js} +1 -1
  50. package/apps/web/dist/assets/pl-PL-DNgGUEcQ.js +1 -0
  51. package/apps/web/dist/assets/{project-lifecycle-DuV33mlL.js → project-lifecycle-n1ZZbYfu.js} +1 -1
  52. package/apps/web/dist/assets/{project-settings-9yJbfZRu.js → project-settings-B_Ih5kiz.js} +1 -1
  53. package/apps/web/dist/assets/pt-BR-CZsUZQ6P.js +1 -0
  54. package/apps/web/dist/assets/{pt-BR-DWL_sEp3.js → pt-BR-Cm04EWM-.js} +1 -1
  55. package/apps/web/dist/assets/{public-project-M93Zpx_e.js → public-project-BivDjU_a.js} +1 -1
  56. package/apps/web/dist/assets/{rotate-ccw-DcHaluuA.js → rotate-ccw-CSaKhZYt.js} +1 -1
  57. package/apps/web/dist/assets/{ru-DQNby7hW.js → ru-IeycXsyE.js} +1 -1
  58. package/apps/web/dist/assets/ru-RU-4ew92YE_.js +1 -0
  59. package/apps/web/dist/assets/{search-DQtwggUH.js → search-Ble6WSEU.js} +3 -3
  60. package/apps/web/dist/assets/{send-gpGpxsCa.js → send-BLMZ8gQ0.js} +1 -1
  61. package/apps/web/dist/assets/settings-CH48qQK2.js +1 -0
  62. package/apps/web/dist/assets/{sliders-horizontal-BxgR4pFt.js → sliders-horizontal-Db6kRvuw.js} +1 -1
  63. package/apps/web/dist/assets/{switch-UPVGS5kv.js → switch-BeX-0Fwq.js} +1 -1
  64. package/apps/web/dist/assets/{table-D8iAxhJH.js → table-UJp5S9yy.js} +1 -1
  65. package/apps/web/dist/assets/ticket-detail-C24opfNW.js +2 -0
  66. package/apps/web/dist/assets/{ticket-editor-B5eOWIj4.js → ticket-editor--d_bG9C1.js} +2 -2
  67. package/apps/web/dist/assets/{ticket-list-C965rmmf.js → ticket-list-DRbZWYHf.js} +1 -1
  68. package/apps/web/dist/assets/{ticket-list-controls-ua3m0uRB.js → ticket-list-controls-fYBottFC.js} +1 -1
  69. package/apps/web/dist/assets/{tr-BNZEkwqd.js → tr-DtT_dKUK.js} +1 -1
  70. package/apps/web/dist/assets/tr-TR-CM381XCw.js +1 -0
  71. package/apps/web/dist/assets/{uk-Dmlqvk63.js → uk-CsbeHSS6.js} +1 -1
  72. package/apps/web/dist/assets/uk-UA-AeOiWCVo.js +1 -0
  73. package/apps/web/dist/assets/{upload-Cu0J8ZFJ.js → upload-DUEg04Nj.js} +1 -1
  74. package/apps/web/dist/assets/{useQueries-BEzeS0hU.js → useQueries-5lW2C5Sb.js} +1 -1
  75. package/apps/web/dist/assets/vi-VN-td08xXv9.js +1 -0
  76. package/apps/web/dist/assets/{vi-KALEc3bk.js → vi-rkf1BOLx.js} +1 -1
  77. package/apps/web/dist/assets/{visual-editor-DyhI5fa5.js → visual-editor-DkFLjouD.js} +1 -1
  78. package/apps/web/dist/assets/{workspace-settings-DGr-Lwnz.js → workspace-settings-Bcsp-VoJ.js} +1 -1
  79. package/apps/web/dist/assets/zh-CN-D3dhEYLS.js +1 -0
  80. package/apps/web/dist/assets/{zh-CN-DfruhRl9.js → zh-CN-Xo-QId5w.js} +1 -1
  81. package/apps/web/dist/assets/zh-TW-CfhOEFo8.js +1 -0
  82. package/apps/web/dist/assets/{zh-TW-C4keUYMa.js → zh-TW-DEnTqjbn.js} +1 -1
  83. package/apps/web/dist/index.html +7 -7
  84. package/docs/api.md +16 -6
  85. package/docs/releasing.md +16 -2
  86. package/docs/self-hosting.md +8 -0
  87. package/package.json +1 -1
  88. package/apps/web/dist/assets/az-AZ-DlsPlUZi.js +0 -1
  89. package/apps/web/dist/assets/de-DE-DLCaqUUe.js +0 -1
  90. package/apps/web/dist/assets/default-D6I-Xfqm.js +0 -56
  91. package/apps/web/dist/assets/el-GR-P2XcwrSU.js +0 -1
  92. package/apps/web/dist/assets/es-ES-CJoX8f3w.js +0 -1
  93. package/apps/web/dist/assets/fr-FR-yLkQdy6a.js +0 -1
  94. package/apps/web/dist/assets/hi-IN-y8dqej7z.js +0 -1
  95. package/apps/web/dist/assets/id-ID-DSvh8mGH.js +0 -1
  96. package/apps/web/dist/assets/it-IT-BUcfUqNo.js +0 -1
  97. package/apps/web/dist/assets/ja-JP-C-jLP_Ay.js +0 -1
  98. package/apps/web/dist/assets/ko-KR-C5Ozdm2E.js +0 -1
  99. package/apps/web/dist/assets/mk-MK-BdM_SsE8.js +0 -1
  100. package/apps/web/dist/assets/nl-NL-CwjB5sva.js +0 -1
  101. package/apps/web/dist/assets/pl-PL-6-PMhTBd.js +0 -1
  102. package/apps/web/dist/assets/pt-BR-TD_wt6Hr.js +0 -1
  103. package/apps/web/dist/assets/ru-RU-Bk1a6Oln.js +0 -1
  104. package/apps/web/dist/assets/settings-Co61IE04.js +0 -1
  105. package/apps/web/dist/assets/ticket-detail-BKilKtg_.js +0 -2
  106. package/apps/web/dist/assets/tr-TR-CUfBb7K9.js +0 -1
  107. package/apps/web/dist/assets/uk-UA-BDaXBsDP.js +0 -1
  108. package/apps/web/dist/assets/vi-VN-Bgb-L6mE.js +0 -1
  109. package/apps/web/dist/assets/zh-CN-BypkvBe6.js +0 -1
  110. 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-BCtZ3wbK.mjs";
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 { Lt as s3SettingsSchema, Nt as brokerSettingsSchema, m as defaultClaimMaxLeaseSeconds, o as claimLeaseSecondsSchema, zt as searchSettingsSchema } from "./src-BCtZ3wbK.mjs";
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 createDatabase(url) {
345
- const pool = new pg.Pool({
346
- connectionString: url,
347
- max: 10,
348
- idleTimeoutMillis: 3e4
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-CRADzIvL.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-BCtZ3wbK.mjs";
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 storageBackends, A as readCalendarFeed, B as attachments, C as deliverBatch, D as createWriteLimiter, E as createAccess, F as imageResponse, H as deliveryCheckpoints, I as stagedUploadCutoff, J as notifications, K as members, L as createObjectStore, M as createTicketIndex, N as createBlobStorage, O as requireInstanceAdmin, P as decodeImage, Q as stagedUploads, R as createPollingJob, S as defaultSenders, T as createHttpSender, U as eventClock, V as blobObjects, W as events, X as projects, Y as profilePhotos, Z as pushDevices, _ as reachable, a as deliverySecrets, b as processImports, c as ownerBlocker, d as createDomain, et as subscriptions, f as errorEnvelope, g as one, h as notify, i as createInstance, it as matchesOIDCBinding, j as createTicketSearch, k as requireSession, l as appendEvents, m as json, n as emailCodesAvailable, nt as workspaceMembers, o as otherActiveAdministrator, p as fail, q as notificationPreferences, r as signInProviders, rt as workspaces, s as ownedWorkspaces, t as createAuth, tt as tickets, u as assertVersion, v as recipientColumns, w as DeliveryError, x as receiveRepositoryWebhook, y as requireRow, z as attachmentContent } from "./auth-B-Tz8SF4.mjs";
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.4.4";
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({ connectionString: config.DATABASE_URL });
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 postgres = await createRealtime(config), emitter = new EventEmitter();
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
- async close() {
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 integrationDatabase = createDatabase(config.DATABASE_URL);
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
- const outbox = adapters.jobs("outbox", 5e3, () => deliverBatch(database, config, senders, secrets, repositories));
3230
- const reminders = adapters.jobs("due-reminders", 6e4, () => sendDueReminders(database));
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: async () => {
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.DATABASE_URL);
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-CRADzIvL.mjs";
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().DATABASE_URL);
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-CRADzIvL.mjs";
2
- import { A as hasAdminRole } from "./src-BCtZ3wbK.mjs";
3
- import { G as instanceSettings, p as fail, t as createAuth } from "./auth-B-Tz8SF4.mjs";
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.DATABASE_URL);
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
- }).superRefine(rejectConflicts), page(ticketSchema), "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."),
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: ticketSchema,
4544
- project: projectRef
4545
- })) }), "GET", "/tickets/search", "read", "Search unarchived tickets by key or text across every accessible project, optionally within one workspace."),
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: z.uuid(),
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 tickets while rejecting dependency cycles."),
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, 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 };
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-DQtwggUH.js";import{i}from"./forms-BwtRqvGj.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
+ 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,`&quot;`)+`"`);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={"&amp;":`&`,"&#38;":`&`,"&lt;":`<`,"&#60;":`<`,"&gt;":`>`,"&#62;":`>`,"&apos;":`'`,"&#39;":`'`,"&quot;":`"`,"&#34;":`"`,"&nbsp;":`\xA0`,"&#160;":`\xA0`,"&copy;":`©`,"&#169;":`©`,"&reg;":`®`,"&#174;":`®`,"&hellip;":`…`,"&#8230;":`…`,"&#x2F;":`/`,"&#47;":`/`},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,`&quot;`)+`"`);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={"&amp;":`&`,"&#38;":`&`,"&lt;":`<`,"&#60;":`<`,"&gt;":`>`,"&#62;":`>`,"&apos;":`'`,"&#39;":`'`,"&quot;":`"`,"&#34;":`"`,"&nbsp;":`\xA0`,"&#160;":`\xA0`,"&copy;":`©`,"&#169;":`©`,"&reg;":`®`,"&#174;":`®`,"&hellip;":`…`,"&#8230;":`…`,"&#x2F;":`/`,"&#47;":`/`},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};