@wssto2/vue-core 0.13.1 → 0.15.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 (113) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/README.md +2 -2
  3. package/bin/architecture/engine.mjs +11 -1
  4. package/bin/architecture/rules.mjs +95 -0
  5. package/bin/commands/check-architecture.mjs +8 -1
  6. package/bin/config.mjs +2 -0
  7. package/dist/{AccessGate.vue_vue_type_script_setup_true_lang-DEzXovsY.js → AccessGate.vue_vue_type_script_setup_true_lang-BH3f0hda.js} +1 -1
  8. package/dist/{Activity-ChfxdvXf.js → Activity-MOAIv6s4.js} +5 -5
  9. package/dist/{AdaptivePageShell.vue_vue_type_script_setup_true_lang-lPj9hPqV.js → AdaptivePageShell.vue_vue_type_script_setup_true_lang-Bsv5j5Z8.js} +1 -1
  10. package/dist/{Changes-BCa43_mO.js → Changes-Bu7D0dhY.js} +2 -2
  11. package/dist/{CollectionPage.vue_vue_type_script_setup_true_lang-C1GCvyZx.js → CollectionPage.vue_vue_type_script_setup_true_lang-D5HsYIck.js} +6 -6
  12. package/dist/{DataTable.vue_vue_type_script_setup_true_lang-B9r9M5Gt.js → DataTable.vue_vue_type_script_setup_true_lang-J3PhyJAS.js} +1 -1
  13. package/dist/{DateField.vue_vue_type_script_setup_true_lang-B5UUY1OO.js → DateField.vue_vue_type_script_setup_true_lang-CKKG4JEg.js} +2 -2
  14. package/dist/{DeadLetters-wFTqhISU.js → DeadLetters-DsujMnLG.js} +5 -5
  15. package/dist/FormGroup.vue_vue_type_script_setup_true_lang-CTVuhEbW.js +428 -0
  16. package/dist/{FormView.vue_vue_type_script_setup_true_lang-DvbPEiNQ.js → FormView.vue_vue_type_script_setup_true_lang-Cfvh7rF6.js} +1 -1
  17. package/dist/{General-jW7u4MjH.js → General-Dswj1oXt.js} +7 -7
  18. package/dist/IncidentRecord-DcmqpziF.js +522 -0
  19. package/dist/{IncidentsList-yu0xSMrH.js → IncidentsList-BRNqHZdU.js} +6 -6
  20. package/dist/{NewRolePage-CQ5UVaHs.js → NewRolePage-dFLznJGH.js} +3 -3
  21. package/dist/{NumberField.vue_vue_type_script_setup_true_lang-YVgf5CP6.js → NumberField.vue_vue_type_script_setup_true_lang-U-_kcnGr.js} +1 -1
  22. package/dist/{PersonAccess.vue_vue_type_script_setup_true_lang-CWCt9_dM.js → PersonAccess.vue_vue_type_script_setup_true_lang-D3yp43o5.js} +4 -4
  23. package/dist/{ProfilePage-Ca3x3UAH.js → ProfilePage-BnHR3xGB.js} +10 -10
  24. package/dist/{RecordHeader.vue_vue_type_script_setup_true_lang-Do_ATJwT.js → RecordHeader.vue_vue_type_script_setup_true_lang-SDgLjwEI.js} +1 -1
  25. package/dist/{ResourcePage.vue_vue_type_script_setup_true_lang-Coz91xht.js → ResourcePage.vue_vue_type_script_setup_true_lang-DRC3h71-.js} +1 -1
  26. package/dist/{RoleEditor.vue_vue_type_script_setup_true_lang-d_aaeXTT.js → RoleEditor.vue_vue_type_script_setup_true_lang-DNF9wzE9.js} +4 -4
  27. package/dist/{RolePage-BUj1w1m1.js → RolePage-BtM2rFLm.js} +7 -7
  28. package/dist/{RolesPage-NKzBUsrM.js → RolesPage-MO1gAfdT.js} +4 -4
  29. package/dist/{SectionNavigator.vue_vue_type_script_setup_true_lang-DfKEhTFv.js → SectionNavigator.vue_vue_type_script_setup_true_lang-TMdsmYAg.js} +2 -2
  30. package/dist/ServiceAccountDialog.vue_vue_type_script_setup_true_lang-Bo3phlqB.js +127 -0
  31. package/dist/{ServiceAccountRecord-ClbyeLhL.js → ServiceAccountRecord-C1M-dcju.js} +10 -10
  32. package/dist/{ServiceAccountsList-B2VDnYxD.js → ServiceAccountsList-zfyS2WJB.js} +6 -6
  33. package/dist/{Sessions-BjkciyHH.js → Sessions-BYBUSqHI.js} +3 -3
  34. package/dist/{SettingsPage-Csb14qsx.js → SettingsPage-C9Kp2ddX.js} +9 -9
  35. package/dist/{SignIn-DPFMv4C7.js → SignIn-HBYLSZ1M.js} +5 -5
  36. package/dist/{SignInPage-DukoFqkt.js → SignInPage-CEoz3fWE.js} +3 -3
  37. package/dist/{SignIns-DvdpNkiS.js → SignIns-BAz7V4vy.js} +2 -2
  38. package/dist/{TimeField.vue_vue_type_script_setup_true_lang-DpDXHH7u.js → TimeField.vue_vue_type_script_setup_true_lang-BDlTAMsh.js} +2 -2
  39. package/dist/{Timestamp.vue_vue_type_script_setup_true_lang-DlEUKWra.js → Timestamp.vue_vue_type_script_setup_true_lang-jCXYFLtq.js} +1 -1
  40. package/dist/{UserRecord-B9SeSWQh.js → UserRecord-DkyhGma-.js} +9 -9
  41. package/dist/{UsersList-CREG8q3l.js → UsersList-CsW-jU0m.js} +4 -4
  42. package/dist/access/RestrictedPanel.vue.d.ts +20 -0
  43. package/dist/access/index.d.ts +1 -0
  44. package/dist/access/index.js +91 -31
  45. package/dist/app/application.d.ts +2 -2
  46. package/dist/app/current.d.ts +6 -0
  47. package/dist/app/index.d.ts +1 -1
  48. package/dist/app/index.js +17 -16
  49. package/dist/{application-DomS6sbx.js → application-2gHiwAVy.js} +6 -6
  50. package/dist/client/client.d.ts +6 -0
  51. package/dist/client/index.js +1 -1
  52. package/dist/client-Do8v1I5l.js +193 -0
  53. package/dist/collection/index.js +6 -6
  54. package/dist/config/index.d.ts +21 -1
  55. package/dist/content/StatSummary.vue.d.ts +40 -0
  56. package/dist/content/index.d.ts +1 -0
  57. package/dist/content/index.js +245 -176
  58. package/dist/{contributions-obnyn03x.js → contributions-9CPT-Z5v.js} +1 -1
  59. package/dist/{current-B0lHKTWr.js → current-CslcEPXp.js} +8 -4
  60. package/dist/eslint/index.js +2 -2
  61. package/dist/form/index.js +16 -16
  62. package/dist/form/useForm.d.ts +1 -1
  63. package/dist/format/format.d.ts +5 -2
  64. package/dist/format/index.js +1 -1
  65. package/dist/format-Cp1h0vsC.js +125 -0
  66. package/dist/{guards-DGcSfTEh.js → guards-6fJxfUtk.js} +1 -1
  67. package/dist/{http-DOEfFCDA.js → http-D6qOS6xs.js} +1 -1
  68. package/dist/i18n/index.d.ts +5 -1
  69. package/dist/i18n/index.js +21 -20
  70. package/dist/i18n/serverMessages.d.ts +15 -1
  71. package/dist/identity/index.js +2 -2
  72. package/dist/incidents/Occurrences.vue.d.ts +9 -0
  73. package/dist/incidents/api.d.ts +11 -2
  74. package/dist/incidents/index.js +1 -1
  75. package/dist/{index-DZikGJ8L.js → index--AF_DNhE.js} +22 -22
  76. package/dist/{index-D_yyd4C2.js → index-DYva-K_4.js} +5 -5
  77. package/dist/{index-Be9Q1PB_.js → index-Dlu-PA4W.js} +104 -98
  78. package/dist/index.d.ts +1 -1
  79. package/dist/index.js +1 -1
  80. package/dist/modules/incident/entities.d.ts +19 -0
  81. package/dist/modules/incident/routes.d.ts +4 -1
  82. package/dist/{navigation-CctcxT51.js → navigation-DMJ6akat.js} +1 -1
  83. package/dist/{neighbors-Csfan8Ho.js → neighbors-DrEahe7B.js} +1 -1
  84. package/dist/notifications/index.js +1 -1
  85. package/dist/onboarding/index.js +1 -1
  86. package/dist/page/index.js +3 -3
  87. package/dist/phone/index.d.ts +1 -1
  88. package/dist/phone/index.js +154 -142
  89. package/dist/phone/phone.d.ts +6 -0
  90. package/dist/platform/index.js +3 -3
  91. package/dist/{platform-DtISOEt7.js → platform-ORzRR3Tw.js} +1 -1
  92. package/dist/resource/index.js +2 -2
  93. package/dist/router/index.js +3 -3
  94. package/dist/{rowLayout-y1IB_h2r.js → rowLayout-Ohh5ng1u.js} +2 -2
  95. package/dist/{sections-fkW_IJLc.js → sections-DI_JhgQG.js} +1 -1
  96. package/dist/serverMessages-Ce8-MK4e.js +30 -0
  97. package/dist/shell/index.js +4 -4
  98. package/dist/{state-CXMexi0l.js → state-QDaxntgR.js} +1 -1
  99. package/dist/styles.css +1 -1
  100. package/dist/testing/index.js +3 -3
  101. package/dist/{useCommand-Ch_nx1AQ.js → useCommand-BvcU3AlW.js} +1 -1
  102. package/dist/{useGroupSheet-CPjHydQV.js → useGroupSheet-BGIntPKD.js} +1 -1
  103. package/dist/{usePreferences-B8LIZp_f.js → usePreferences-BfMXVbSO.js} +1 -1
  104. package/dist/{useRecordDialog-DdkauXnU.js → useRecordDialog-q_BNXdb7.js} +1 -1
  105. package/dist/{useResourceForm-Dl6YFYyz.js → useResourceForm-C1S628UI.js} +1 -1
  106. package/dist/{useTypedEntry-DKs8I1yP.js → useTypedEntry-tttjrClq.js} +1 -1
  107. package/package.json +2 -2
  108. package/dist/FormGroup.vue_vue_type_script_setup_true_lang-D6jYfNjW.js +0 -427
  109. package/dist/IncidentRecord-zTemLz2R.js +0 -404
  110. package/dist/ServiceAccountDialog.vue_vue_type_script_setup_true_lang-4nbhEpv_.js +0 -127
  111. package/dist/client-Dg303Pmc.js +0 -193
  112. package/dist/format-DoKs29bZ.js +0 -118
  113. package/dist/serverMessages-Ddghrewh.js +0 -25
@@ -1,4 +1,18 @@
1
1
  import type { FormFailureKind } from "../form";
2
+ export interface ServerMessagesOptions {
3
+ /**
4
+ * The namespaces of the keys the server's validator writes (`validation_errors.required`): a field message that starts with one
5
+ * (and a dot) is a key, said with the app's text for it, else the library's `core.<key>`. Default `["validation_errors"]` (go-core's);
6
+ * `[]` leaves every such message as sent. A rule whose text needs a parameter the server does not send (`min`, `max`, `min_value`,
7
+ * `max_value`, `between`, `in`, `not_in`) reads as the namespace's `out_of_range`.
8
+ */
9
+ readonly prefixes?: readonly string[];
10
+ }
11
+ /** `describeFieldError` over a translator: the validator's keys by `prefixes`, then the app's `errors.<reason>` and the library's `core.errors.<reason>`; other text as sent. */
12
+ export declare function fieldMessageWith({ t, te }: {
13
+ t(key: string): string;
14
+ te(key: string): boolean;
15
+ }, { prefixes }?: ServerMessagesOptions): (message: string) => string;
2
16
  /**
3
17
  * What a form needs to speak any go-core refusal, in the app's language (an app's `errors.<reason>` first, then
4
18
  * `core.errors.<reason>`): the reason of a field (`identity.email.taken`) becomes a sentence (`describeFieldError`); a refusal of
@@ -9,7 +23,7 @@ import type { FormFailureKind } from "../form";
9
23
  * const messages = useServerMessages();
10
24
  * useForm({ ...messages, failureMessage: (kind, error) => myRefusal(error) ?? messages.failureMessage(kind, error), defaults, validator });
11
25
  */
12
- export declare function useServerMessages(): {
26
+ export declare function useServerMessages(options?: ServerMessagesOptions): {
13
27
  sentence: (error: unknown, fallback?: string) => string;
14
28
  describeFieldError: (message: string) => string;
15
29
  failureMessage: (kind: FormFailureKind, error: unknown) => string | undefined;
@@ -1,7 +1,7 @@
1
1
  import { i as a } from "../preferences-hYhrw8Uy.js";
2
- import { k as o, r as n, t as i, P as r, j as u, h as c, _ as d, q as S, i as g, U as A, v as f, w as l, x as p, y as m, z as I, A as R, o as x, B as y, C as P, n as U, s as v, e as D, g as E, b, f as w, D as F, E as B, c as C } from "../index-DZikGJ8L.js";
2
+ import { k as o, r as n, t as i, P as r, j as u, h as c, _ as d, q as S, i as g, U as A, v as f, w as l, x as p, y as m, z as I, A as R, o as x, B as y, C as P, n as U, s as v, e as D, g as E, b, f as w, D as F, E as B, c as C } from "../index--AF_DNhE.js";
3
3
  import { a as T, _ } from "../ActionRow.vue_vue_type_script_setup_true_lang-DybAIOHS.js";
4
- import { i as k, l as N, r as O, s as j, a as q, u as z } from "../usePreferences-B8LIZp_f.js";
4
+ import { i as k, l as N, r as O, s as j, a as q, u as z } from "../usePreferences-BfMXVbSO.js";
5
5
  import { s as K } from "../routes-Beyr5NQo.js";
6
6
  export {
7
7
  T as ActionRow,
@@ -0,0 +1,9 @@
1
+ /**
2
+ * An incident's occurrences (staff only: the caller shows it for `incident:manage`), newest first, a page at a time. Each opens to its stack
3
+ * and the context and request the server kept (read-only JSON).
4
+ */
5
+ type __VLS_Props = {
6
+ incidentId: number;
7
+ };
8
+ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
9
+ export default _default;
@@ -1,5 +1,5 @@
1
- import type { HttpClient } from "../client";
2
- import type { CommentResponse, Incident, ReportResponse } from "../modules/incident/entities";
1
+ import type { HttpClient, PageMeta } from "../client";
2
+ import type { CommentResponse, Incident, OccurrenceResponse, ReportResponse } from "../modules/incident/entities";
3
3
  import type { CommentRequest, ReportInput, UpdateRequest } from "../modules/incident/schemas";
4
4
  export type IncidentSort = "title" | "last_seen_at";
5
5
  export type IncidentFilter = "created_at" | "status" | "severity" | "source";
@@ -11,11 +11,20 @@ export interface IncidentDetail {
11
11
  readonly reports: readonly ReportResponse[];
12
12
  readonly comments: readonly CommentResponse[];
13
13
  }
14
+ /** The occurrences a page of the incident page shows. */
15
+ export declare const OCCURRENCES_PER_PAGE = 10;
14
16
  /** go-core's incident routes as calls; `data` of each answer already read. A change takes the `Idempotency-Key` of its attempt. */
15
17
  export declare function createIncidentsApi(http: HttpClient): {
16
18
  show: (id: number, options?: {
17
19
  readonly signal?: AbortSignal;
18
20
  }) => Promise<IncidentDetail>;
21
+ /** One page of an incident's occurrences, newest first (`incident:manage`). */
22
+ occurrences: (id: number, page: number, options?: {
23
+ readonly signal?: AbortSignal;
24
+ }) => Promise<{
25
+ readonly rows: readonly OccurrenceResponse[];
26
+ readonly meta: PageMeta | null;
27
+ }>;
19
28
  /** The whole management form; the answer is the stored incident (without its people: the page reads again for them). */
20
29
  update: (id: number, input: UpdateRequest, idempotencyKey: string) => Promise<Incident>;
21
30
  /** A report: the incident it opened or joined. */
@@ -1,4 +1,4 @@
1
- import { h as t, j as i, k as r, l as n, i as a } from "../index-Be9Q1PB_.js";
1
+ import { h as t, j as i, k as r, l as n, i as a } from "../index-Dlu-PA4W.js";
2
2
  export {
3
3
  t as MAX_REPORTS_PER_SESSION,
4
4
  i as clientErrorReporter,
@@ -8,34 +8,34 @@ import { a as Y } from "./error-CD7x0Jrz.js";
8
8
  import { u as pe } from "./environment-Dva-SG8D.js";
9
9
  import { u as B } from "./describeError-B-NMa--w.js";
10
10
  import { t as z } from "./toast-CqSDTWRX.js";
11
- import { u as I, h as W, f as te } from "./platform-DtISOEt7.js";
12
- import { i as H, r as qe, l as Fe, s as Ne, a as Be } from "./usePreferences-B8LIZp_f.js";
11
+ import { u as I, h as W, f as te } from "./platform-ORzRR3Tw.js";
12
+ import { i as H, r as qe, l as Fe, s as Ne, a as Be } from "./usePreferences-BfMXVbSO.js";
13
13
  import { useI18n as C } from "vue-i18n";
14
14
  import { _ as fe } from "./Icon.vue_vue_type_script_lang-BhhsFYwp.js";
15
15
  import { useRouter as ge, useRoute as Ve, RouterLink as Me } from "vue-router";
16
16
  import { _ as _e } from "./AccountMenuItem.vue_vue_type_script_setup_true_lang-BIYgaihv.js";
17
17
  import { _ as T } from "./Button.vue_vue_type_script_setup_true_lang-C74hcb0N.js";
18
18
  import { u as De } from "./leaveGuard-Cc8yeLxM.js";
19
- import { _ as We } from "./FormView.vue_vue_type_script_setup_true_lang-DvbPEiNQ.js";
19
+ import { _ as We } from "./FormView.vue_vue_type_script_setup_true_lang-Cfvh7rF6.js";
20
20
  import { _ as L } from "./TextField.vue_vue_type_script_setup_true_lang-CWIeeZRE.js";
21
21
  import { u as Ge } from "./mediaQuery-CygcXmFW.js";
22
22
  import { u as Xe } from "./useDialog-DfNmqM-0.js";
23
23
  import { c as Ye } from "./closeOverlays-CjVsIrpL.js";
24
- import { u as He, a as V } from "./FormGroup.vue_vue_type_script_setup_true_lang-D6jYfNjW.js";
25
- import { u as J } from "./format-DoKs29bZ.js";
24
+ import { u as He, a as V } from "./FormGroup.vue_vue_type_script_setup_true_lang-CTVuhEbW.js";
25
+ import { u as J } from "./format-Cp1h0vsC.js";
26
26
  import { b as Je } from "./routeResource-DlTsGTg_.js";
27
27
  import { _ as F } from "./IconTile.vue_vue_type_script_setup_true_lang-BmxCuUZ9.js";
28
28
  import { g as U } from "./options-B48UiYsG.js";
29
- import { u as he, _ as be } from "./useCommand-Ch_nx1AQ.js";
30
- import { u as ye } from "./serverMessages-Ddghrewh.js";
29
+ import { u as he, _ as be } from "./useCommand-BvcU3AlW.js";
30
+ import { u as ye } from "./serverMessages-Ce8-MK4e.js";
31
31
  import { _ as Qe } from "./SelectField.vue_vue_type_script_setup_true_lang-BZwdANL3.js";
32
- import { d as Ze, r as et } from "./http-DOEfFCDA.js";
32
+ import { d as Ze, r as et } from "./http-D6qOS6xs.js";
33
33
  import { z as r } from "zod";
34
34
  import "./ActionRow.vue_vue_type_script_setup_true_lang-DybAIOHS.js";
35
35
  import { _ as G } from "./Badge.vue_vue_type_script_setup_true_lang-DJyZc0C7.js";
36
- import { _ as tt } from "./DataTable.vue_vue_type_script_setup_true_lang-B9r9M5Gt.js";
36
+ import { _ as tt } from "./DataTable.vue_vue_type_script_setup_true_lang-J3PhyJAS.js";
37
37
  import { _ as nt } from "./Avatar.vue_vue_type_script_setup_true_lang-BPj_fkJR.js";
38
- import { _ as st } from "./AccessGate.vue_vue_type_script_setup_true_lang-DEzXovsY.js";
38
+ import { _ as st } from "./AccessGate.vue_vue_type_script_setup_true_lang-BH3f0hda.js";
39
39
  import "./routes-Beyr5NQo.js";
40
40
  const [ot, ve] = N("vue-core.identity"), rt = { hidden: "" }, at = /* @__PURE__ */ $({
41
41
  __name: "LocaleSync",
@@ -246,7 +246,7 @@ const ft = ["aria-labelledby"], gt = ["id"], _t = { class: "mt-1 text-subheadlin
246
246
  ]));
247
247
  }
248
248
  }), wt = X({
249
- login: { name: "login", path: "/login", component: () => import("./SignInPage-DukoFqkt.js"), meta: { public: !0, titleKey: "core.identity.signin.title" } }
249
+ login: { name: "login", path: "/login", component: () => import("./SignInPage-CEoz3fWE.js"), meta: { public: !0, titleKey: "core.identity.signin.title" } }
250
250
  });
251
251
  function Xn(e = {}) {
252
252
  return ne({
@@ -381,7 +381,7 @@ function Hn(e) {
381
381
  };
382
382
  }
383
383
  const ke = X({
384
- index: { name: "profile", path: "/profile", component: () => import("./ProfilePage-Ca3x3UAH.js"), meta: { titleKey: "core.profile.title" } }
384
+ index: { name: "profile", path: "/profile", component: () => import("./ProfilePage-BnHR3xGB.js"), meta: { titleKey: "core.profile.title" } }
385
385
  }), At = /* @__PURE__ */ $({
386
386
  __name: "ProfileMenuItem",
387
387
  setup(e) {
@@ -412,19 +412,19 @@ function jt(e, n) {
412
412
  return [...e.flatMap((s) => [s, ...o(s)]), ...n.filter((s) => s.after === void 0).map((s) => ce(s))];
413
413
  }
414
414
  const le = "iam.user:view", ts = "iam.user:manage", Kt = "iam.user.activity:view", Se = X({
415
- index: { name: "users.index", path: "/users", component: () => import("./UsersList-CREG8q3l.js"), meta: { access: le, titleKey: "core.users.title" } },
415
+ index: { name: "users.index", path: "/users", component: () => import("./UsersList-CsW-jU0m.js"), meta: { access: le, titleKey: "core.users.title" } },
416
416
  record: {
417
417
  name: "users.record",
418
418
  path: "/users/:id",
419
- component: () => import("./UserRecord-B9SeSWQh.js"),
419
+ component: () => import("./UserRecord-DkyhGma-.js"),
420
420
  meta: { access: le, titleKey: "core.users.title", remountOnParam: "id" },
421
421
  children: [
422
- { name: "users.record.general", path: "general", component: () => import("./General-jW7u4MjH.js"), meta: { section: { labelKey: "core.users.sections.general", icon: "user3Line", groupKey: "core.users.section_groups.person" } } },
423
- { name: "users.record.signin", path: "signin", component: () => import("./SignIn-DPFMv4C7.js"), meta: { section: { labelKey: "core.users.sections.signin", icon: "key2Line", groupKey: "core.users.section_groups.access" } } },
424
- { name: "users.record.sessions", path: "sessions", component: () => import("./Sessions-BjkciyHH.js"), meta: { section: { labelKey: "core.users.sections.sessions", icon: "deviceLine", groupKey: "core.users.section_groups.access" } } },
425
- { name: "users.record.signins", path: "signins", component: () => import("./SignIns-DvdpNkiS.js"), meta: { section: { labelKey: "core.users.sections.signins", icon: "timeFill", groupKey: "core.users.section_groups.activity" } } },
426
- { name: "users.record.changes", path: "changes", component: () => import("./Changes-BCa43_mO.js"), meta: { section: { labelKey: "core.users.sections.changes", icon: "edit", groupKey: "core.users.section_groups.activity" } } },
427
- { name: "users.record.activity", path: "activity", component: () => import("./Activity-ChfxdvXf.js"), meta: { access: Kt, section: { labelKey: "core.users.sections.activity", icon: "listCheck", groupKey: "core.users.section_groups.activity" } } }
422
+ { name: "users.record.general", path: "general", component: () => import("./General-Dswj1oXt.js"), meta: { section: { labelKey: "core.users.sections.general", icon: "user3Line", groupKey: "core.users.section_groups.person" } } },
423
+ { name: "users.record.signin", path: "signin", component: () => import("./SignIn-HBYLSZ1M.js"), meta: { section: { labelKey: "core.users.sections.signin", icon: "key2Line", groupKey: "core.users.section_groups.access" } } },
424
+ { name: "users.record.sessions", path: "sessions", component: () => import("./Sessions-BYBUSqHI.js"), meta: { section: { labelKey: "core.users.sections.sessions", icon: "deviceLine", groupKey: "core.users.section_groups.access" } } },
425
+ { name: "users.record.signins", path: "signins", component: () => import("./SignIns-BAz7V4vy.js"), meta: { section: { labelKey: "core.users.sections.signins", icon: "timeFill", groupKey: "core.users.section_groups.activity" } } },
426
+ { name: "users.record.changes", path: "changes", component: () => import("./Changes-Bu7D0dhY.js"), meta: { section: { labelKey: "core.users.sections.changes", icon: "edit", groupKey: "core.users.section_groups.activity" } } },
427
+ { name: "users.record.activity", path: "activity", component: () => import("./Activity-MOAIv6s4.js"), meta: { access: Kt, section: { labelKey: "core.users.sections.activity", icon: "listCheck", groupKey: "core.users.section_groups.activity" } } }
428
428
  ]
429
429
  }
430
430
  });
@@ -1153,11 +1153,11 @@ const Jt = ["title"], Qt = { class: "font-mono" }, cs = /* @__PURE__ */ $({
1153
1153
  }, 8, ["permission"])) : k("", !0);
1154
1154
  }
1155
1155
  }), [cn, ms] = N("vue-core.serviceaccounts"), ue = "iam.serviceaccount:view", ps = "iam.serviceaccount:manage", fs = "iam.serviceaccount:revoke", de = X({
1156
- index: { name: "serviceaccounts.index", path: "/iam/service-accounts", component: () => import("./ServiceAccountsList-B2VDnYxD.js"), meta: { access: ue, titleKey: "core.serviceaccounts.title_plural" } },
1156
+ index: { name: "serviceaccounts.index", path: "/iam/service-accounts", component: () => import("./ServiceAccountsList-zfyS2WJB.js"), meta: { access: ue, titleKey: "core.serviceaccounts.title_plural" } },
1157
1157
  record: {
1158
1158
  name: "serviceaccounts.record",
1159
1159
  path: "/iam/service-accounts/:id",
1160
- component: () => import("./ServiceAccountRecord-ClbyeLhL.js"),
1160
+ component: () => import("./ServiceAccountRecord-C1M-dcju.js"),
1161
1161
  meta: { access: ue, titleKey: "core.serviceaccounts.title_plural", remountOnParam: "id" }
1162
1162
  }
1163
1163
  });
@@ -2,18 +2,18 @@ import { r as v } from "./route-goWMxDUN.js";
2
2
  import { d as ve, p as me } from "./feature-DdUAfyi4.js";
3
3
  import { ref as C, readonly as $, defineComponent as q, openBlock as _, createBlock as U, unref as s, shallowRef as z, withCtx as A, createTextVNode as X, toDisplayString as L, mergeProps as Z, computed as N, createElementBlock as S, createElementVNode as P, createCommentVNode as R, createVNode as T, Fragment as G, renderList as be, normalizeClass as H, useTemplateRef as he, createSlots as ye } from "vue";
4
4
  import { d as ge } from "./context-Ch1r4fdN.js";
5
- import { u as ee } from "./platform-DtISOEt7.js";
5
+ import { u as ee } from "./platform-ORzRR3Tw.js";
6
6
  import { d as te } from "./defineRoutes-BGAdiIrt.js";
7
7
  import { useI18n as I } from "vue-i18n";
8
8
  import { _ as _e } from "./AccountMenuItem.vue_vue_type_script_setup_true_lang-BIYgaihv.js";
9
- import { f as xe } from "./client-Dg303Pmc.js";
9
+ import { f as xe } from "./client-Do8v1I5l.js";
10
10
  import { u as we } from "./mediaQuery-CygcXmFW.js";
11
11
  import { _ as ke } from "./Sheet.vue_vue_type_script_setup_true_lang-B91aRD_y.js";
12
12
  import { _ as Se } from "./Popover.vue_vue_type_script_setup_true_lang-C20Hf3Hl.js";
13
13
  import { _ as J } from "./HeaderAction.vue_vue_type_script_setup_true_lang-Da59TLBh.js";
14
14
  import { useRouter as Te } from "vue-router";
15
15
  import { _ as K } from "./Button.vue_vue_type_script_setup_true_lang-C74hcb0N.js";
16
- import { u as Ee } from "./format-DoKs29bZ.js";
16
+ import { u as Ee } from "./format-Cp1h0vsC.js";
17
17
  import { _ as Pe } from "./Icon.vue_vue_type_script_lang-BhhsFYwp.js";
18
18
  import { _ as Ce } from "./AsyncSection.vue_vue_type_script_setup_true_lang-DGzQ-Snp.js";
19
19
  const E = {
@@ -135,9 +135,9 @@ function Me(n = ee().http, t = W()) {
135
135
  return { state: $(e), hash: $(i), busy: $(a), inspect: c, enable: u, disable: g };
136
136
  }
137
137
  const Ne = "events.deadletter:view", $t = "events.deadletter:retry", Y = te({
138
- index: { name: "events.deadletters", path: "/events/dead-letters", component: () => import("./DeadLetters-wFTqhISU.js"), meta: { access: Ne, titleKey: "core.notifications.dead_letters.title" } }
138
+ index: { name: "events.deadletters", path: "/events/dead-letters", component: () => import("./DeadLetters-DsujMnLG.js"), meta: { access: Ne, titleKey: "core.notifications.dead_letters.title" } }
139
139
  }), j = te({
140
- index: { name: "notifications.settings", path: "/profile/notifications", component: () => import("./SettingsPage-Csb14qsx.js"), meta: { titleKey: "core.notifications.settings.title" } }
140
+ index: { name: "notifications.settings", path: "/profile/notifications", component: () => import("./SettingsPage-C9Kp2ddX.js"), meta: { titleKey: "core.notifications.settings.title" } }
141
141
  }), Oe = /* @__PURE__ */ q({
142
142
  __name: "SettingsMenuItem",
143
143
  setup(n) {
@@ -1,55 +1,61 @@
1
- import { r as p } from "./route-goWMxDUN.js";
2
- import { d as V, p as L } from "./feature-DdUAfyi4.js";
3
- import { defineComponent as A, computed as O, onMounted as U, watch as X, openBlock as S, createBlock as y, unref as e, withCtx as I, createElementVNode as B, createVNode as c, mergeProps as l, createCommentVNode as R, ref as F } from "vue";
4
- import { d as j } from "./context-Ch1r4fdN.js";
5
- import { useI18n as P } from "vue-i18n";
6
- import { a as N } from "./FormGroup.vue_vue_type_script_setup_true_lang-D6jYfNjW.js";
7
- import { _ as G } from "./SelectField.vue_vue_type_script_setup_true_lang-BZwdANL3.js";
1
+ import { r as _ } from "./route-goWMxDUN.js";
2
+ import { d as $, p as V } from "./feature-DdUAfyi4.js";
3
+ import { defineComponent as y, computed as k, onMounted as U, watch as L, openBlock as S, createBlock as I, unref as e, withCtx as T, createElementVNode as X, createVNode as c, mergeProps as l, createCommentVNode as A, ref as B } from "vue";
4
+ import { d as G } from "./context-Ch1r4fdN.js";
5
+ import { useI18n as q } from "vue-i18n";
6
+ import { a as O } from "./FormGroup.vue_vue_type_script_setup_true_lang-CTVuhEbW.js";
7
+ import { _ as F } from "./SelectField.vue_vue_type_script_setup_true_lang-BZwdANL3.js";
8
8
  import { _ as b } from "./TextareaField.vue_vue_type_script_setup_true_lang-D2j4s96s.js";
9
- import { _ as x } from "./TextField.vue_vue_type_script_setup_true_lang-CWIeeZRE.js";
10
- import { u as K, _ as z } from "./useCommand-Ch_nx1AQ.js";
11
- import { t as H } from "./toast-CqSDTWRX.js";
12
- import { u as k } from "./platform-DtISOEt7.js";
13
- import { d as Q, r as W, a as Y } from "./http-DOEfFCDA.js";
14
- import { _ as J } from "./AccountMenuItem.vue_vue_type_script_setup_true_lang-BIYgaihv.js";
15
- import { d as Z } from "./defineRoutes-BGAdiIrt.js";
16
- import { d as ee } from "./application-DomS6sbx.js";
17
- import { R as te } from "./client-Dg303Pmc.js";
18
- import { a as ne } from "./error-CD7x0Jrz.js";
19
- const v = {
20
- index: p("GET", "/v1/incidents", { permission: "incident:view" }),
21
- show: p("GET", "/v1/incidents/:incidentID", { permission: "incident:view" }),
22
- comments: p("GET", "/v1/incidents/:incidentID/comments", { permission: "incident:view" }),
23
- report: p("POST", "/v1/incidents/reports", { permission: "incident:create" }),
24
- comment: p("POST", "/v1/incidents/:incidentID/comments", { permission: "incident:create" }),
25
- update: p("PATCH", "/v1/incidents/:incidentID", { permission: "incident:update" }),
26
- clientError: p("POST", "/v1/incidents/client-errors")
27
- }, [ie, C] = j("vue-core.incidents"), M = "incident:view", se = "incident:create", je = "incident:update", re = "incident:manage";
28
- function Ge(t) {
29
- return Q({
9
+ import { _ as w } from "./TextField.vue_vue_type_script_setup_true_lang-CWIeeZRE.js";
10
+ import { u as j, _ as K } from "./useCommand-BvcU3AlW.js";
11
+ import { t as z } from "./toast-CqSDTWRX.js";
12
+ import { u as R } from "./platform-ORzRR3Tw.js";
13
+ import { d as H, r as Q, a as W } from "./http-D6qOS6xs.js";
14
+ import { _ as Y } from "./AccountMenuItem.vue_vue_type_script_setup_true_lang-BIYgaihv.js";
15
+ import { d as J } from "./defineRoutes-BGAdiIrt.js";
16
+ import { d as Z } from "./application-2gHiwAVy.js";
17
+ import { R as ee } from "./client-Do8v1I5l.js";
18
+ import { a as te } from "./error-CD7x0Jrz.js";
19
+ const g = {
20
+ index: _("GET", "/v1/incidents", { permission: "incident:view" }),
21
+ show: _("GET", "/v1/incidents/:incidentID", { permission: "incident:view" }),
22
+ comments: _("GET", "/v1/incidents/:incidentID/comments", { permission: "incident:view" }),
23
+ occurrences: _("GET", "/v1/incidents/:incidentID/occurrences", { permission: "incident:manage" }),
24
+ report: _("POST", "/v1/incidents/reports", { permission: "incident:create" }),
25
+ comment: _("POST", "/v1/incidents/:incidentID/comments", { permission: "incident:create" }),
26
+ update: _("PATCH", "/v1/incidents/:incidentID", { permission: "incident:update" }),
27
+ clientError: _("POST", "/v1/incidents/client-errors")
28
+ }, [ne, C] = G("vue-core.incidents"), N = "incident:view", ie = "incident:create", Fe = "incident:update", se = "incident:manage";
29
+ function je(t) {
30
+ return H({
30
31
  id: "incidents",
31
32
  stateVersion: 1,
32
- load: async (n, { signal: s }) => W(await t.request(v.index, Y(n), { signal: s }), n),
33
+ load: async (n, { signal: s }) => Q(await t.request(g.index, W(n), { signal: s }), n),
33
34
  key: (n) => n.id,
34
35
  query: { sorts: ["title", "last_seen_at"], filters: ["created_at", "status", "severity", "source"] },
35
36
  defaults: { sort: "last_seen_at", direction: "desc" }
36
37
  });
37
38
  }
38
- const T = (t) => ({ headers: { "Idempotency-Key": t } });
39
+ const re = 10;
39
40
  function oe(t) {
40
41
  return {
41
42
  show: async (n, s) => {
42
- const { data: r, meta: o } = await t.request(v.show, { incidentID: n }, s);
43
+ const { data: r, meta: o } = await t.request(g.show, { incidentID: n }, s);
43
44
  return { incident: r, reports: o?.reports ?? [], comments: o?.comments ?? [] };
44
45
  },
46
+ /** One page of an incident's occurrences, newest first (`incident:manage`). */
47
+ occurrences: async (n, s, r) => {
48
+ const { data: o, meta: i } = await t.request(g.occurrences, { incidentID: n, page: s, per_page: re }, r);
49
+ return { rows: o, meta: i };
50
+ },
45
51
  /** The whole management form; the answer is the stored incident (without its people: the page reads again for them). */
46
- update: async (n, s, r) => (await t.request(v.update, { ...s, incidentID: n }, T(r))).data,
52
+ update: async (n, s, r) => (await t.request(g.update, { ...s, incidentID: n }, { idempotencyKey: r })).data,
47
53
  /** A report: the incident it opened or joined. */
48
- report: async (n, s) => (await t.request(v.report, n, T(s))).data.data,
49
- comment: async (n, s, r) => (await t.request(v.comment, { ...s, incidentID: n }, T(r))).data
54
+ report: async (n, s) => (await t.request(g.report, n, { idempotencyKey: s })).data.data,
55
+ comment: async (n, s, r) => (await t.request(g.comment, { ...s, incidentID: n }, { idempotencyKey: r })).data
50
56
  };
51
57
  }
52
- const ae = () => oe(k().http);
58
+ const ae = () => oe(R().http);
53
59
  function ce(t, n) {
54
60
  return {
55
61
  safeParse(s) {
@@ -135,37 +141,37 @@ const Qe = {
135
141
  }, ue = {
136
142
  class: "flex flex-col gap-group-gap",
137
143
  "data-test": "incident-report"
138
- }, me = /* @__PURE__ */ A({
144
+ }, me = /* @__PURE__ */ y({
139
145
  __name: "ReportDialog",
140
146
  props: {
141
147
  autoOpen: { type: Boolean }
142
148
  },
143
149
  emits: ["created", "close"],
144
150
  setup(t, { expose: n, emit: s }) {
145
- const r = t, o = s, { t: i } = P(), { access: d } = k(), u = ae(), { appVersion: h } = C(), E = O(() => d.can(re)), w = O(() => Object.entries(le).map(([m, g]) => ({ value: m, label: i(g) }))), _ = K({
146
- defaults: () => de(h),
151
+ const r = t, o = s, { t: i } = q(), { access: d } = R(), u = ae(), { appVersion: E } = C(), h = k(() => d.can(se)), x = k(() => Object.entries(le).map(([m, v]) => ({ value: m, label: i(v) }))), p = j({
152
+ defaults: () => de(E),
147
153
  validator: ce(["title", "description"], i("core.account.validation.required")),
148
- run: (m, { idempotencyKey: g }) => u.report(m, g),
154
+ run: (m, { idempotencyKey: v }) => u.report(m, v),
149
155
  done: (m) => {
150
- H.success(i("core.incidents.toasts.report_success")), o("created", m);
156
+ z.success(i("core.incidents.toasts.report_success")), o("created", m);
151
157
  }
152
- }), a = _.form, D = () => _.present(), $ = () => _.dismiss();
158
+ }), a = p.form, D = () => p.present(), M = () => p.dismiss();
153
159
  return U(() => {
154
160
  r.autoOpen && D();
155
- }), X(() => _.open.value, (m, g) => {
156
- g && !m && o("close");
157
- }), n({ show: D, hide: $ }), (m, g) => (S(), y(e(z), {
158
- command: e(_),
161
+ }), L(() => p.open.value, (m, v) => {
162
+ v && !m && o("close");
163
+ }), n({ show: D, hide: M }), (m, v) => (S(), I(e(K), {
164
+ command: e(p),
159
165
  size: "md",
160
166
  title: e(i)("core.incidents.report_modal.title"),
161
167
  subtitle: e(i)("core.incidents.report_modal.description"),
162
168
  "confirm-label": e(i)("core.incidents.report_modal.submit")
163
169
  }, {
164
- default: I(() => [
165
- B("div", ue, [
166
- c(e(N), null, {
167
- default: I(() => [
168
- c(e(x), l(e(a).bind("title"), {
170
+ default: T(() => [
171
+ X("div", ue, [
172
+ c(e(O), null, {
173
+ default: T(() => [
174
+ c(e(w), l(e(a).bind("title"), {
169
175
  label: e(i)("core.incidents.fields.title"),
170
176
  required: "",
171
177
  "max-length": 255
@@ -176,23 +182,23 @@ const Qe = {
176
182
  rows: 4,
177
183
  "max-length": 2e4
178
184
  }), null, 16, ["label"]),
179
- c(e(G), l(e(a).bind("severity"), {
185
+ c(e(F), l(e(a).bind("severity"), {
180
186
  label: e(i)("core.incidents.fields.severity"),
181
- options: w.value
187
+ options: x.value
182
188
  }), null, 16, ["label", "options"])
183
189
  ]),
184
190
  _: 1
185
191
  }),
186
- E.value ? (S(), y(e(N), {
192
+ h.value ? (S(), I(e(O), {
187
193
  key: 0,
188
194
  header: e(i)("core.incidents.report_modal.advanced_fields")
189
195
  }, {
190
- default: I(() => [
191
- c(e(x), l(e(a).bind("affected_module"), {
196
+ default: T(() => [
197
+ c(e(w), l(e(a).bind("affected_module"), {
192
198
  label: e(i)("core.incidents.fields.affected_module"),
193
199
  "max-length": 100
194
200
  }), null, 16, ["label"]),
195
- c(e(x), l(e(a).bind("page_url"), {
201
+ c(e(w), l(e(a).bind("page_url"), {
196
202
  label: e(i)("core.incidents.fields.page_url"),
197
203
  "max-length": 1e3
198
204
  }), null, 16, ["label"]),
@@ -211,11 +217,11 @@ const Qe = {
211
217
  rows: 2,
212
218
  "max-length": 2e4
213
219
  }), null, 16, ["label"]),
214
- c(e(x), l(e(a).bind("browser_info"), {
220
+ c(e(w), l(e(a).bind("browser_info"), {
215
221
  label: e(i)("core.incidents.fields.browser_info"),
216
222
  "max-length": 500
217
223
  }), null, 16, ["label"]),
218
- c(e(x), l(e(a).bind("app_version"), {
224
+ c(e(w), l(e(a).bind("app_version"), {
219
225
  label: e(i)("core.incidents.fields.app_version"),
220
226
  "max-length": 100
221
227
  }), null, 16, ["label"]),
@@ -231,82 +237,82 @@ const Qe = {
231
237
  }), null, 16, ["label"])
232
238
  ]),
233
239
  _: 1
234
- }, 8, ["header"])) : R("", !0)
240
+ }, 8, ["header"])) : A("", !0)
235
241
  ])
236
242
  ]),
237
243
  _: 1
238
244
  }, 8, ["command", "title", "subtitle", "confirm-label"]));
239
245
  }
240
- }), _e = /* @__PURE__ */ A({
246
+ }), _e = /* @__PURE__ */ y({
241
247
  __name: "ReportHost",
242
248
  setup(t) {
243
249
  const { reporting: n } = C(), s = () => {
244
250
  n.value = !1;
245
251
  };
246
- return (r, o) => e(n) ? (S(), y(me, {
252
+ return (r, o) => e(n) ? (S(), I(me, {
247
253
  key: 0,
248
254
  "auto-open": "",
249
255
  onClose: s
250
- })) : R("", !0);
256
+ })) : A("", !0);
251
257
  }
252
- }), pe = /* @__PURE__ */ A({
258
+ }), pe = /* @__PURE__ */ y({
253
259
  __name: "ReportMenuItem",
254
260
  setup(t) {
255
- const { t: n } = P(), { access: s } = k(), r = C();
256
- return (o, i) => e(s).can(e(se)) ? (S(), y(J, {
261
+ const { t: n } = q(), { access: s } = R(), r = C();
262
+ return (o, i) => e(s).can(e(ie)) ? (S(), I(Y, {
257
263
  key: 0,
258
264
  label: e(n)("core.incidents.report_modal.menu"),
259
265
  icon: "alertTriangle",
260
266
  "data-incident-report-menu-item": "",
261
267
  onClick: i[0] || (i[0] = (d) => e(r).reporting.value = !0)
262
- }, null, 8, ["label"])) : R("", !0);
268
+ }, null, 8, ["label"])) : A("", !0);
263
269
  }
264
- }), q = Z({
265
- index: { name: "incidents.index", path: "/incidents", component: () => import("./IncidentsList-yu0xSMrH.js"), meta: { access: M, titleKey: "core.incidents.title" } },
270
+ }), P = J({
271
+ index: { name: "incidents.index", path: "/incidents", component: () => import("./IncidentsList-BRNqHZdU.js"), meta: { access: N, titleKey: "core.incidents.title" } },
266
272
  details: {
267
273
  name: "incidents.details",
268
274
  path: "/incidents/:incidentID",
269
- component: () => import("./IncidentRecord-zTemLz2R.js"),
275
+ component: () => import("./IncidentRecord-DcmqpziF.js"),
270
276
  // Previous / next record swaps the id in place.
271
- meta: { access: M, titleKey: "core.incidents.title", remountOnParam: "incidentID" }
277
+ meta: { access: N, titleKey: "core.incidents.title", remountOnParam: "incidentID" }
272
278
  }
273
279
  });
274
280
  function Ze(t = {}) {
275
- return V({
281
+ return $({
276
282
  id: "incidents",
277
- routes: q.records,
278
- context: L(ie, { reporting: F(!1), appVersion: t.appVersion ?? "" }),
279
- navigation: t.destination ? [{ destination: t.destination, to: q.index, within: ["incidents.details"] }] : [],
283
+ routes: P.records,
284
+ context: V(ne, { reporting: B(!1), appVersion: t.appVersion ?? "" }),
285
+ navigation: t.destination ? [{ destination: t.destination, to: P.index, within: ["incidents.details"] }] : [],
280
286
  contributions: [
281
287
  { id: "incidents.report-menu", slot: "accountMenu", component: pe, scope: "authenticated", order: 40, optional: !0 },
282
288
  { id: "incidents.report-host", slot: "host", component: _e, scope: "authenticated", optional: !0 }
283
289
  ]
284
290
  });
285
291
  }
286
- const fe = 2e3, ge = 2e4, be = 255, ve = 500, he = 100, Ee = 100, xe = 255, we = 20, Se = /* @__PURE__ */ new Set(["vue", "unhandledrejection", "window", "handled"]), f = (t, n) => t.slice(0, n), ye = (t) => /^script error\.?$/i.test(t.trim()), Ie = (t) => t.split(`
292
+ const fe = 2e3, ge = 2e4, ve = 255, be = 500, Ee = 100, he = 100, we = 255, xe = 20, Se = /* @__PURE__ */ new Set(["vue", "unhandledrejection", "window", "handled"]), f = (t, n) => t.slice(0, n), Ie = (t) => /^script error\.?$/i.test(t.trim()), Te = (t) => t.split(`
287
293
  `).find((n) => /^\s*at\s|@\S/.test(n))?.trim() ?? "";
288
294
  function et(t) {
289
- const { platform: n, appVersion: s = "", onError: r = ee } = t, o = /* @__PURE__ */ new Set();
295
+ const { platform: n, appVersion: s = "", onError: r = Z } = t, o = /* @__PURE__ */ new Set();
290
296
  function i(d) {
291
297
  const { error: u } = d;
292
- if (!Se.has(d.source) || !(u instanceof Error) || ne(u) || u.message.trim() === "" || ye(u.message)) return;
293
- const h = t.origin ?? globalThis.location?.origin, E = u.stack ?? "";
294
- if (!h || h === "null" || !E.includes(`${h}/`) || n.session.state.value.status !== "authenticated") return;
295
- const w = `${u.message}
296
- ${Ie(E)}`;
297
- if (o.has(w) || o.size >= we) return;
298
- o.add(w);
299
- const _ = {
298
+ if (!Se.has(d.source) || !(u instanceof Error) || te(u) || u.message.trim() === "" || Ie(u.message)) return;
299
+ const E = t.origin ?? globalThis.location?.origin, h = u.stack ?? "";
300
+ if (!E || E === "null" || !h.includes(`${E}/`) || n.session.state.value.status !== "authenticated") return;
301
+ const x = `${u.message}
302
+ ${Te(h)}`;
303
+ if (o.has(x) || o.size >= xe) return;
304
+ o.add(x);
305
+ const p = {
300
306
  message: f(u.message, fe),
301
307
  source: d.source,
302
- ...d.detail && { detail: f(d.detail, xe) },
303
- stack: f(E, ge),
304
- route: f((d.route ?? "").split(/[?#]/)[0] ?? "", be),
305
- browser: f(globalThis.navigator?.userAgent ?? "", ve),
306
- app_version: f(s, he),
307
- request_ids: n.http.recentRequestIds().slice(-te).map((a) => f(a, Ee))
308
+ ...d.detail && { detail: f(d.detail, we) },
309
+ stack: f(h, ge),
310
+ route: f((d.route ?? "").split(/[?#]/)[0] ?? "", ve),
311
+ browser: f(globalThis.navigator?.userAgent ?? "", be),
312
+ app_version: f(s, Ee),
313
+ request_ids: n.http.recentRequestIds().slice(-ee).map((a) => f(a, he))
308
314
  };
309
- n.http.request(v.clientError, _).catch(() => {
315
+ n.http.request(g.clientError, p).catch(() => {
310
316
  });
311
317
  }
312
318
  return (d) => {
@@ -318,22 +324,22 @@ ${Ie(E)}`;
318
324
  };
319
325
  }
320
326
  export {
321
- se as C,
322
- re as M,
327
+ ie as C,
328
+ se as M,
323
329
  We as S,
324
- je as U,
330
+ Fe as U,
325
331
  me as _,
326
- Ge as a,
332
+ je as a,
327
333
  Ye as b,
328
334
  Qe as c,
329
335
  Je as d,
330
336
  le as e,
331
337
  ze as f,
332
338
  Ke as g,
333
- we as h,
334
- q as i,
339
+ xe as h,
340
+ P as i,
335
341
  et as j,
336
- v as k,
342
+ g as k,
337
343
  Ze as l,
338
344
  He as m,
339
345
  ce as r,
package/dist/index.d.ts CHANGED
@@ -1,2 +1,2 @@
1
1
  /** The version of @wssto2/vue-core (kept equal to package.json by index.test.ts). */
2
- export declare const version = "0.13.1";
2
+ export declare const version = "0.15.0";
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- const o = "0.13.1";
1
+ const o = "0.15.0";
2
2
  export {
3
3
  o as version
4
4
  };
@@ -53,6 +53,25 @@ export type Meta = {
53
53
  reports: ReportResponse[];
54
54
  watching: boolean;
55
55
  };
56
+ export type OccurrenceResponse = {
57
+ id: number;
58
+ incident_id: number;
59
+ occurred_at: string;
60
+ environment?: string;
61
+ module?: string;
62
+ route?: string;
63
+ method?: string;
64
+ user_id?: number | null;
65
+ user?: PersonResponse | null;
66
+ ip_address?: string;
67
+ request_id?: string;
68
+ error_class?: string;
69
+ error_code?: string;
70
+ message: string;
71
+ stacktrace?: string;
72
+ context?: unknown;
73
+ request?: unknown;
74
+ };
56
75
  export type PersonResponse = {
57
76
  id: number;
58
77
  name: string;