@iveri/contracts 0.16.0 → 0.18.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 (98) hide show
  1. package/README.md +29 -1
  2. package/dist/cjs/api/localization/bundle.type.d.ts +41 -0
  3. package/dist/cjs/api/localization/bundle.type.d.ts.map +1 -0
  4. package/dist/cjs/api/localization/bundle.type.js +3 -0
  5. package/dist/cjs/api/localization/bundle.type.js.map +1 -0
  6. package/dist/cjs/api/localization/index.d.ts +10 -0
  7. package/dist/cjs/api/localization/index.d.ts.map +1 -0
  8. package/dist/cjs/api/localization/index.js +26 -0
  9. package/dist/cjs/api/localization/index.js.map +1 -0
  10. package/dist/cjs/api/localization/locale.type.d.ts +67 -0
  11. package/dist/cjs/api/localization/locale.type.d.ts.map +1 -0
  12. package/dist/cjs/api/localization/locale.type.js +3 -0
  13. package/dist/cjs/api/localization/locale.type.js.map +1 -0
  14. package/dist/cjs/api/localization/message.type.d.ts +90 -0
  15. package/dist/cjs/api/localization/message.type.d.ts.map +1 -0
  16. package/dist/cjs/api/localization/message.type.js +3 -0
  17. package/dist/cjs/api/localization/message.type.js.map +1 -0
  18. package/dist/cjs/api/localization/namespace.type.d.ts +67 -0
  19. package/dist/cjs/api/localization/namespace.type.d.ts.map +1 -0
  20. package/dist/cjs/api/localization/namespace.type.js +3 -0
  21. package/dist/cjs/api/localization/namespace.type.js.map +1 -0
  22. package/dist/cjs/api/localization/release.type.d.ts +74 -0
  23. package/dist/cjs/api/localization/release.type.d.ts.map +1 -0
  24. package/dist/cjs/api/localization/release.type.js +3 -0
  25. package/dist/cjs/api/localization/release.type.js.map +1 -0
  26. package/dist/cjs/api/localization/render.type.d.ts +50 -0
  27. package/dist/cjs/api/localization/render.type.d.ts.map +1 -0
  28. package/dist/cjs/api/localization/render.type.js +3 -0
  29. package/dist/cjs/api/localization/render.type.js.map +1 -0
  30. package/dist/cjs/api/localization/translation-status.enum.d.ts +29 -0
  31. package/dist/cjs/api/localization/translation-status.enum.d.ts.map +1 -0
  32. package/dist/cjs/api/localization/translation-status.enum.js +33 -0
  33. package/dist/cjs/api/localization/translation-status.enum.js.map +1 -0
  34. package/dist/cjs/api/localization/translation.type.d.ts +74 -0
  35. package/dist/cjs/api/localization/translation.type.d.ts.map +1 -0
  36. package/dist/cjs/api/localization/translation.type.js +3 -0
  37. package/dist/cjs/api/localization/translation.type.js.map +1 -0
  38. package/dist/cjs/api/localization/variable-type.enum.d.ts +39 -0
  39. package/dist/cjs/api/localization/variable-type.enum.d.ts.map +1 -0
  40. package/dist/cjs/api/localization/variable-type.enum.js +43 -0
  41. package/dist/cjs/api/localization/variable-type.enum.js.map +1 -0
  42. package/dist/cjs/api/unibox/realtime.type.d.ts +13 -1
  43. package/dist/cjs/api/unibox/realtime.type.d.ts.map +1 -1
  44. package/dist/cjs/api/unibox/realtime.type.js +1 -0
  45. package/dist/cjs/api/unibox/realtime.type.js.map +1 -1
  46. package/dist/cjs/enum/user-permission.enum.d.ts +44 -1
  47. package/dist/cjs/enum/user-permission.enum.d.ts.map +1 -1
  48. package/dist/cjs/enum/user-permission.enum.js +50 -0
  49. package/dist/cjs/enum/user-permission.enum.js.map +1 -1
  50. package/dist/esm/api/localization/bundle.type.d.ts +41 -0
  51. package/dist/esm/api/localization/bundle.type.d.ts.map +1 -0
  52. package/dist/esm/api/localization/bundle.type.js +2 -0
  53. package/dist/esm/api/localization/bundle.type.js.map +1 -0
  54. package/dist/esm/api/localization/index.d.ts +10 -0
  55. package/dist/esm/api/localization/index.d.ts.map +1 -0
  56. package/dist/esm/api/localization/index.js +10 -0
  57. package/dist/esm/api/localization/index.js.map +1 -0
  58. package/dist/esm/api/localization/locale.type.d.ts +67 -0
  59. package/dist/esm/api/localization/locale.type.d.ts.map +1 -0
  60. package/dist/esm/api/localization/locale.type.js +2 -0
  61. package/dist/esm/api/localization/locale.type.js.map +1 -0
  62. package/dist/esm/api/localization/message.type.d.ts +90 -0
  63. package/dist/esm/api/localization/message.type.d.ts.map +1 -0
  64. package/dist/esm/api/localization/message.type.js +2 -0
  65. package/dist/esm/api/localization/message.type.js.map +1 -0
  66. package/dist/esm/api/localization/namespace.type.d.ts +67 -0
  67. package/dist/esm/api/localization/namespace.type.d.ts.map +1 -0
  68. package/dist/esm/api/localization/namespace.type.js +2 -0
  69. package/dist/esm/api/localization/namespace.type.js.map +1 -0
  70. package/dist/esm/api/localization/release.type.d.ts +74 -0
  71. package/dist/esm/api/localization/release.type.d.ts.map +1 -0
  72. package/dist/esm/api/localization/release.type.js +2 -0
  73. package/dist/esm/api/localization/release.type.js.map +1 -0
  74. package/dist/esm/api/localization/render.type.d.ts +50 -0
  75. package/dist/esm/api/localization/render.type.d.ts.map +1 -0
  76. package/dist/esm/api/localization/render.type.js +2 -0
  77. package/dist/esm/api/localization/render.type.js.map +1 -0
  78. package/dist/esm/api/localization/translation-status.enum.d.ts +29 -0
  79. package/dist/esm/api/localization/translation-status.enum.d.ts.map +1 -0
  80. package/dist/esm/api/localization/translation-status.enum.js +30 -0
  81. package/dist/esm/api/localization/translation-status.enum.js.map +1 -0
  82. package/dist/esm/api/localization/translation.type.d.ts +74 -0
  83. package/dist/esm/api/localization/translation.type.d.ts.map +1 -0
  84. package/dist/esm/api/localization/translation.type.js +2 -0
  85. package/dist/esm/api/localization/translation.type.js.map +1 -0
  86. package/dist/esm/api/localization/variable-type.enum.d.ts +39 -0
  87. package/dist/esm/api/localization/variable-type.enum.d.ts.map +1 -0
  88. package/dist/esm/api/localization/variable-type.enum.js +40 -0
  89. package/dist/esm/api/localization/variable-type.enum.js.map +1 -0
  90. package/dist/esm/api/unibox/realtime.type.d.ts +13 -1
  91. package/dist/esm/api/unibox/realtime.type.d.ts.map +1 -1
  92. package/dist/esm/api/unibox/realtime.type.js +1 -0
  93. package/dist/esm/api/unibox/realtime.type.js.map +1 -1
  94. package/dist/esm/enum/user-permission.enum.d.ts +44 -1
  95. package/dist/esm/enum/user-permission.enum.d.ts.map +1 -1
  96. package/dist/esm/enum/user-permission.enum.js +50 -0
  97. package/dist/esm/enum/user-permission.enum.js.map +1 -1
  98. package/package.json +9 -1
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TranslationStatus = void 0;
4
+ /**
5
+ * Where a single translation stands, for one message in one locale.
6
+ *
7
+ * The states exist to answer one question a translator asks constantly — *what is left to do* —
8
+ * and they are ordered by how much trust a reader may put in the value.
9
+ *
10
+ * `MISSING` is **not stored**. A translation row exists only once someone has written something,
11
+ * so "missing" is the absence of a row projected into this enum by the read side. Storing it
12
+ * would mean writing a row per message per locale the moment a key is created, which turns
13
+ * adding one key into N writes and makes "has anyone touched this?" unanswerable.
14
+ */
15
+ var TranslationStatus;
16
+ (function (TranslationStatus) {
17
+ /** No row exists. Synthesised by the read side so a listing can be filtered on it. */
18
+ TranslationStatus["MISSING"] = "missing";
19
+ /** Someone is working on it. Excluded from a release unless the namespace allows drafts. */
20
+ TranslationStatus["DRAFT"] = "draft";
21
+ /**
22
+ * Written, but the source text changed underneath it.
23
+ *
24
+ * Set automatically when the source-locale value of the same message is edited — an English
25
+ * label reworded from `Archive` to `Delete` leaves a Georgian translation that is
26
+ * grammatically fine and now says the wrong thing. Nothing else in the system can catch that,
27
+ * because the translation is still valid text.
28
+ */
29
+ TranslationStatus["NEEDS_REVIEW"] = "needs-review";
30
+ /** Reviewed and publishable. */
31
+ TranslationStatus["APPROVED"] = "approved";
32
+ })(TranslationStatus || (exports.TranslationStatus = TranslationStatus = {}));
33
+ //# sourceMappingURL=translation-status.enum.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"translation-status.enum.js","sourceRoot":"","sources":["../../../../src/api/localization/translation-status.enum.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;;;GAUG;AACH,IAAY,iBAmBX;AAnBD,WAAY,iBAAiB;IACzB,sFAAsF;IACtF,wCAAmB,CAAA;IAEnB,4FAA4F;IAC5F,oCAAe,CAAA;IAEf;;;;;;;OAOG;IACH,kDAA6B,CAAA;IAE7B,gCAAgC;IAChC,0CAAqB,CAAA;AACzB,CAAC,EAnBW,iBAAiB,iCAAjB,iBAAiB,QAmB5B"}
@@ -0,0 +1,74 @@
1
+ import type { IsoDateTime } from '../../type/iso-date-time.type.js';
2
+ import type { Nullable } from '../../type/nil.type.js';
3
+ import type { UUID } from '../../type/uuid.type.js';
4
+ import type { TranslationStatus } from './translation-status.enum.js';
5
+ /**
6
+ * One message, in one locale.
7
+ *
8
+ * `value` is **ICU MessageFormat**, not a template string with our own placeholder syntax. That
9
+ * choice is the reason this service can be correct in Russian: Russian selects between `one`,
10
+ * `few`, `many` and `other` on the *numeric* value, and a hand-rolled `count === 1 ? a : b` is
11
+ * wrong for 2, 5 and 21 in ways an English-speaking reviewer cannot see. ICU already encodes
12
+ * every locale's plural rules, so the translation carries the branch and the code carries none.
13
+ */
14
+ export interface Translation {
15
+ id: UUID;
16
+ messageId: UUID;
17
+ messageKey: string;
18
+ namespaceKey: string;
19
+ localeCode: string;
20
+ /** ICU MessageFormat. Validated against the message's declared variables on every write. */
21
+ value: string;
22
+ status: TranslationStatus;
23
+ /** Null when written by a service principal rather than a person. */
24
+ updatedByUserId: Nullable<UUID>;
25
+ createdAt: IsoDateTime;
26
+ updatedAt: IsoDateTime;
27
+ }
28
+ /**
29
+ * `PUT /api/v1/namespaces/:key/messages/:messageKey/translations/:localeCode`.
30
+ *
31
+ * An upsert rather than create/update, because a translator does not know or care whether a row
32
+ * exists — `MISSING` is the absence of one, and making them discover that through a 404 would be
33
+ * exposing our storage decision as a workflow step.
34
+ */
35
+ export interface UpsertTranslationBody {
36
+ value: string;
37
+ /**
38
+ * Defaults to `DRAFT`. Setting `APPROVED` requires the same permission as any other write —
39
+ * approving is not separately gated, because the gate that matters is publishing.
40
+ */
41
+ status?: TranslationStatus;
42
+ }
43
+ /**
44
+ * `POST /api/v1/namespaces/:key/translations/bulk` — one locale, many messages.
45
+ *
46
+ * The entries that validate are written together in one transaction; the ones that do not are
47
+ * reported back. See {@link BulkUpsertTranslationsResult} for why it is not all-or-nothing.
48
+ */
49
+ export interface BulkUpsertTranslationsBody {
50
+ localeCode: string;
51
+ entries: BulkTranslationEntry[];
52
+ }
53
+ export interface BulkTranslationEntry {
54
+ messageKey: string;
55
+ value: string;
56
+ status?: TranslationStatus;
57
+ }
58
+ /**
59
+ * The result of a bulk write.
60
+ *
61
+ * Rejections are returned per entry instead of failing the whole batch, because the usual caller
62
+ * is an import of a file a translator produced elsewhere: refusing 400 good rows over one bad
63
+ * placeholder means they have no way to make progress, and the failure they must fix is
64
+ * precisely the one this names.
65
+ */
66
+ export interface BulkUpsertTranslationsResult {
67
+ written: number;
68
+ rejected: RejectedTranslation[];
69
+ }
70
+ export interface RejectedTranslation {
71
+ messageKey: string;
72
+ reason: string;
73
+ }
74
+ //# sourceMappingURL=translation.type.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"translation.type.d.ts","sourceRoot":"","sources":["../../../../src/api/localization/translation.type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAEpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAEtE;;;;;;;;GAQG;AACH,MAAM,WAAW,WAAW;IACxB,EAAE,EAAE,IAAI,CAAC;IAET,SAAS,EAAE,IAAI,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IAEnB,4FAA4F;IAC5F,KAAK,EAAE,MAAM,CAAC;IAEd,MAAM,EAAE,iBAAiB,CAAC;IAE1B,qEAAqE;IACrE,eAAe,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;IAEhC,SAAS,EAAE,WAAW,CAAC;IACvB,SAAS,EAAE,WAAW,CAAC;CAC1B;AAED;;;;;;GAMG;AACH,MAAM,WAAW,qBAAqB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,MAAM,CAAC,EAAE,iBAAiB,CAAC;CAC9B;AAED;;;;;GAKG;AACH,MAAM,WAAW,0BAA0B;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,oBAAoB,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,oBAAoB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,iBAAiB,CAAC;CAC9B;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,4BAA4B;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,mBAAmB,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,mBAAmB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAClB"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=translation.type.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"translation.type.js","sourceRoot":"","sources":["../../../../src/api/localization/translation.type.ts"],"names":[],"mappings":""}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * The kind of value a message placeholder expects.
3
+ *
4
+ * **Declared on the message, not inferred from the text.** A translation is rejected at write
5
+ * time if its placeholders do not match the message's declared set, which is the single check
6
+ * that stops a Russian string shipping with a literal `{orderNumber}` in front of a customer.
7
+ * Inferring the set from whichever locale happened to be written first would make the check
8
+ * circular — the first typo becomes the specification.
9
+ *
10
+ * The type is what tells a renderer how to format the value and what an editor should show as an
11
+ * example. It also tells a translator what they are allowed to do with it: `PLURAL` may be
12
+ * branched on, `STRING` may not.
13
+ */
14
+ export declare enum VariableType {
15
+ /** Substituted verbatim. `{name}` */
16
+ STRING = "string",
17
+ /** Formatted with `Intl.NumberFormat` for the target locale. `{count, number}` */
18
+ NUMBER = "number",
19
+ /** Formatted with `Intl.DateTimeFormat` for the target locale. `{dueAt, date, medium}` */
20
+ DATE = "date",
21
+ /**
22
+ * A count the translation branches on: `{n, plural, one {...} few {...} other {...}}`.
23
+ *
24
+ * Distinct from `NUMBER` because the plural categories a locale needs are not a formatting
25
+ * choice. Russian has `one`/`few`/`many`/`other` and English has `one`/`other`, so a
26
+ * translation written by substituting a number and appending an "s" is wrong in Russian in a
27
+ * way no reviewer of the English can see.
28
+ */
29
+ PLURAL = "plural",
30
+ /**
31
+ * A closed set the translation branches on: `{gender, select, female {...} other {...}}`.
32
+ *
33
+ * Georgian and Russian inflect around the subject where English does not, so a sentence that
34
+ * needs no branch in the source locale needs one in the target. The declared options are the
35
+ * contract — a translation branching on an option the message never declared is rejected.
36
+ */
37
+ SELECT = "select"
38
+ }
39
+ //# sourceMappingURL=variable-type.enum.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"variable-type.enum.d.ts","sourceRoot":"","sources":["../../../../src/api/localization/variable-type.enum.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,oBAAY,YAAY;IACpB,qCAAqC;IACrC,MAAM,WAAW;IAEjB,kFAAkF;IAClF,MAAM,WAAW;IAEjB,0FAA0F;IAC1F,IAAI,SAAS;IAEb;;;;;;;OAOG;IACH,MAAM,WAAW;IAEjB;;;;;;OAMG;IACH,MAAM,WAAW;CACpB"}
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.VariableType = void 0;
4
+ /**
5
+ * The kind of value a message placeholder expects.
6
+ *
7
+ * **Declared on the message, not inferred from the text.** A translation is rejected at write
8
+ * time if its placeholders do not match the message's declared set, which is the single check
9
+ * that stops a Russian string shipping with a literal `{orderNumber}` in front of a customer.
10
+ * Inferring the set from whichever locale happened to be written first would make the check
11
+ * circular — the first typo becomes the specification.
12
+ *
13
+ * The type is what tells a renderer how to format the value and what an editor should show as an
14
+ * example. It also tells a translator what they are allowed to do with it: `PLURAL` may be
15
+ * branched on, `STRING` may not.
16
+ */
17
+ var VariableType;
18
+ (function (VariableType) {
19
+ /** Substituted verbatim. `{name}` */
20
+ VariableType["STRING"] = "string";
21
+ /** Formatted with `Intl.NumberFormat` for the target locale. `{count, number}` */
22
+ VariableType["NUMBER"] = "number";
23
+ /** Formatted with `Intl.DateTimeFormat` for the target locale. `{dueAt, date, medium}` */
24
+ VariableType["DATE"] = "date";
25
+ /**
26
+ * A count the translation branches on: `{n, plural, one {...} few {...} other {...}}`.
27
+ *
28
+ * Distinct from `NUMBER` because the plural categories a locale needs are not a formatting
29
+ * choice. Russian has `one`/`few`/`many`/`other` and English has `one`/`other`, so a
30
+ * translation written by substituting a number and appending an "s" is wrong in Russian in a
31
+ * way no reviewer of the English can see.
32
+ */
33
+ VariableType["PLURAL"] = "plural";
34
+ /**
35
+ * A closed set the translation branches on: `{gender, select, female {...} other {...}}`.
36
+ *
37
+ * Georgian and Russian inflect around the subject where English does not, so a sentence that
38
+ * needs no branch in the source locale needs one in the target. The declared options are the
39
+ * contract — a translation branching on an option the message never declared is rejected.
40
+ */
41
+ VariableType["SELECT"] = "select";
42
+ })(VariableType || (exports.VariableType = VariableType = {}));
43
+ //# sourceMappingURL=variable-type.enum.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"variable-type.enum.js","sourceRoot":"","sources":["../../../../src/api/localization/variable-type.enum.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;;;;;GAYG;AACH,IAAY,YA4BX;AA5BD,WAAY,YAAY;IACpB,qCAAqC;IACrC,iCAAiB,CAAA;IAEjB,kFAAkF;IAClF,iCAAiB,CAAA;IAEjB,0FAA0F;IAC1F,6BAAa,CAAA;IAEb;;;;;;;OAOG;IACH,iCAAiB,CAAA;IAEjB;;;;;;OAMG;IACH,iCAAiB,CAAA;AACrB,CAAC,EA5BW,YAAY,4BAAZ,YAAY,QA4BvB"}
@@ -3,6 +3,7 @@ import type { RealtimeConversationEvent } from './realtime-event.enum.js';
3
3
  /** Socket.IO event names a client sends. */
4
4
  export declare const REALTIME_CLIENT_EVENT: {
5
5
  readonly SUBSCRIBE: "realtime.subscribe";
6
+ readonly UNSUBSCRIBE: "realtime.unsubscribe";
6
7
  };
7
8
  /** Socket.IO event names a client receives. */
8
9
  export declare const REALTIME_SERVER_EVENT: {
@@ -48,10 +49,21 @@ export interface PublishConversationEventResponse {
48
49
  export interface RealtimeReadyMessage {
49
50
  protocolVersion: typeof REALTIME_PROTOCOL_VERSION;
50
51
  }
51
- /** What a client asks to watch. */
52
+ /** What a client asks to watch. Additive — the socket keeps what it already had. */
52
53
  export interface RealtimeSubscribeRequest {
53
54
  conversationIds: UUID[];
54
55
  }
56
+ /**
57
+ * What a client asks to stop watching.
58
+ *
59
+ * Subscribing is additive and capped at {@link MAX_REALTIME_SUBSCRIPTIONS_PER_SOCKET}, so
60
+ * without this a long-lived inbox that pages through conversations reaches the cap and then
61
+ * silently stops receiving anything new. Unsubscribing what has scrolled out of view is what
62
+ * keeps the set bounded by what is on screen rather than by everything ever looked at.
63
+ */
64
+ export interface RealtimeUnsubscribeRequest {
65
+ conversationIds: UUID[];
66
+ }
55
67
  /** The full set a socket is watching after a subscribe, not just the delta. */
56
68
  export interface RealtimeSubscribedMessage {
57
69
  conversationIds: UUID[];
@@ -1 +1 @@
1
- {"version":3,"file":"realtime.type.d.ts","sourceRoot":"","sources":["../../../../src/api/unibox/realtime.type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAEpD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAE1E,4CAA4C;AAC5C,eAAO,MAAM,qBAAqB;;CAExB,CAAC;AAEX,+CAA+C;AAC/C,eAAO,MAAM,qBAAqB;;;;;CAKxB,CAAC;AAEX,4FAA4F;AAC5F,eAAO,MAAM,yBAAyB,IAAI,CAAC;AAE3C,oDAAoD;AACpD,eAAO,MAAM,qCAAqC,MAAM,CAAC;AAEzD,0CAA0C;AAC1C,eAAO,MAAM,wBAAwB,QAAY,CAAC;AAElD,oDAAoD;AACpD,eAAO,MAAM,8BAA8B,MAAM,CAAC;AAElD;;;;;;;GAOG;AACH,MAAM,WAAW,4BAA4B;IACzC,cAAc,EAAE,IAAI,CAAC;IACrB,KAAK,EAAE,yBAAyB,CAAC;IACjC,uFAAuF;IACvF,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,+CAA+C;AAC/C,MAAM,WAAW,gCAAgC;IAC7C;;;;;;OAMG;IACH,QAAQ,EAAE,OAAO,CAAC;CACrB;AAED,gDAAgD;AAChD,MAAM,WAAW,oBAAoB;IACjC,eAAe,EAAE,OAAO,yBAAyB,CAAC;CACrD;AAED,mCAAmC;AACnC,MAAM,WAAW,wBAAwB;IACrC,eAAe,EAAE,IAAI,EAAE,CAAC;CAC3B;AAED,+EAA+E;AAC/E,MAAM,WAAW,yBAAyB;IACtC,eAAe,EAAE,IAAI,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,oBAAoB;IACjC,IAAI,EAAE,iBAAiB,GAAG,WAAW,GAAG,sBAAsB,GAAG,mBAAmB,CAAC;IACrF,OAAO,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,0BAA0B;IACvC,cAAc,EAAE,IAAI,CAAC;IACrB,KAAK,EAAE,yBAAyB,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,+DAA+D;AAC/D,MAAM,MAAM,uBAAuB,GAC/B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,yBAAyB,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,oBAAoB,CAAA;CAAE,CAAC"}
1
+ {"version":3,"file":"realtime.type.d.ts","sourceRoot":"","sources":["../../../../src/api/unibox/realtime.type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAEpD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAE1E,4CAA4C;AAC5C,eAAO,MAAM,qBAAqB;;;CAGxB,CAAC;AAEX,+CAA+C;AAC/C,eAAO,MAAM,qBAAqB;;;;;CAKxB,CAAC;AAEX,4FAA4F;AAC5F,eAAO,MAAM,yBAAyB,IAAI,CAAC;AAE3C,oDAAoD;AACpD,eAAO,MAAM,qCAAqC,MAAM,CAAC;AAEzD,0CAA0C;AAC1C,eAAO,MAAM,wBAAwB,QAAY,CAAC;AAElD,oDAAoD;AACpD,eAAO,MAAM,8BAA8B,MAAM,CAAC;AAElD;;;;;;;GAOG;AACH,MAAM,WAAW,4BAA4B;IACzC,cAAc,EAAE,IAAI,CAAC;IACrB,KAAK,EAAE,yBAAyB,CAAC;IACjC,uFAAuF;IACvF,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,+CAA+C;AAC/C,MAAM,WAAW,gCAAgC;IAC7C;;;;;;OAMG;IACH,QAAQ,EAAE,OAAO,CAAC;CACrB;AAED,gDAAgD;AAChD,MAAM,WAAW,oBAAoB;IACjC,eAAe,EAAE,OAAO,yBAAyB,CAAC;CACrD;AAED,oFAAoF;AACpF,MAAM,WAAW,wBAAwB;IACrC,eAAe,EAAE,IAAI,EAAE,CAAC;CAC3B;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,0BAA0B;IACvC,eAAe,EAAE,IAAI,EAAE,CAAC;CAC3B;AAED,+EAA+E;AAC/E,MAAM,WAAW,yBAAyB;IACtC,eAAe,EAAE,IAAI,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,oBAAoB;IACjC,IAAI,EAAE,iBAAiB,GAAG,WAAW,GAAG,sBAAsB,GAAG,mBAAmB,CAAC;IACrF,OAAO,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,0BAA0B;IACvC,cAAc,EAAE,IAAI,CAAC;IACrB,KAAK,EAAE,yBAAyB,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,+DAA+D;AAC/D,MAAM,MAAM,uBAAuB,GAC/B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,yBAAyB,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,oBAAoB,CAAA;CAAE,CAAC"}
@@ -4,6 +4,7 @@ exports.MAX_REALTIME_EVENT_NAME_LENGTH = exports.MAX_REALTIME_EVENT_BYTES = expo
4
4
  /** Socket.IO event names a client sends. */
5
5
  exports.REALTIME_CLIENT_EVENT = {
6
6
  SUBSCRIBE: 'realtime.subscribe',
7
+ UNSUBSCRIBE: 'realtime.unsubscribe',
7
8
  };
8
9
  /** Socket.IO event names a client receives. */
9
10
  exports.REALTIME_SERVER_EVENT = {
@@ -1 +1 @@
1
- {"version":3,"file":"realtime.type.js","sourceRoot":"","sources":["../../../../src/api/unibox/realtime.type.ts"],"names":[],"mappings":";;;AAIA,4CAA4C;AAC/B,QAAA,qBAAqB,GAAG;IACjC,SAAS,EAAE,oBAAoB;CACzB,CAAC;AAEX,+CAA+C;AAClC,QAAA,qBAAqB,GAAG;IACjC,KAAK,EAAE,gBAAgB;IACvB,UAAU,EAAE,qBAAqB;IACjC,oBAAoB,EAAE,sBAAsB;IAC5C,KAAK,EAAE,gBAAgB;CACjB,CAAC;AAEX,4FAA4F;AAC/E,QAAA,yBAAyB,GAAG,CAAC,CAAC;AAE3C,oDAAoD;AACvC,QAAA,qCAAqC,GAAG,GAAG,CAAC;AAEzD,0CAA0C;AAC7B,QAAA,wBAAwB,GAAG,EAAE,GAAG,IAAI,CAAC;AAElD,oDAAoD;AACvC,QAAA,8BAA8B,GAAG,GAAG,CAAC"}
1
+ {"version":3,"file":"realtime.type.js","sourceRoot":"","sources":["../../../../src/api/unibox/realtime.type.ts"],"names":[],"mappings":";;;AAIA,4CAA4C;AAC/B,QAAA,qBAAqB,GAAG;IACjC,SAAS,EAAE,oBAAoB;IAC/B,WAAW,EAAE,sBAAsB;CAC7B,CAAC;AAEX,+CAA+C;AAClC,QAAA,qBAAqB,GAAG;IACjC,KAAK,EAAE,gBAAgB;IACvB,UAAU,EAAE,qBAAqB;IACjC,oBAAoB,EAAE,sBAAsB;IAC5C,KAAK,EAAE,gBAAgB;CACjB,CAAC;AAEX,4FAA4F;AAC/E,QAAA,yBAAyB,GAAG,CAAC,CAAC;AAE3C,oDAAoD;AACvC,QAAA,qCAAqC,GAAG,GAAG,CAAC;AAEzD,0CAA0C;AAC7B,QAAA,wBAAwB,GAAG,EAAE,GAAG,IAAI,CAAC;AAElD,oDAAoD;AACvC,QAAA,8BAA8B,GAAG,GAAG,CAAC"}
@@ -228,7 +228,50 @@ export declare enum UserPermission {
228
228
  /** Read tenant invoices and their immutable line items. */
229
229
  BILLING_INVOICE_READ = "billing:invoice:read",
230
230
  /** Create, finalize or void tenant invoices. */
231
- BILLING_INVOICE_MANAGE = "billing:invoice:manage"
231
+ BILLING_INVOICE_MANAGE = "billing:invoice:manage",
232
+ /**
233
+ * Read locales, namespaces, keys, translations and release history — and pull a published
234
+ * bundle, which is how a build gets its strings.
235
+ *
236
+ * One read permission over all of it rather than one per aggregate: none of it is secret. It
237
+ * is text written to be shown to users, and a key list with the values hidden is unusable
238
+ * for the review this permission exists to enable.
239
+ */
240
+ LOCALIZATION_READ = "localization:read",
241
+ /**
242
+ * Define the structure — locales, namespaces, message keys and their declared variables.
243
+ *
244
+ * The engineer's half, and the sharper one despite sounding like configuration. A message key
245
+ * is compiled into an app (`t('inbox.title')`), so archiving one breaks a screen that already
246
+ * shipped; and editing a message's declared variables invalidates every translation of it in
247
+ * every language at once. A translator must not be able to do either by accident.
248
+ */
249
+ LOCALIZATION_MESSAGE_MANAGE = "localization:message:manage",
250
+ /**
251
+ * Write translation values.
252
+ *
253
+ * The translator's whole job, and deliberately the *only* thing it grants. This is the
254
+ * permission handed to an outside contractor or an agency, so it must be safe to hand to
255
+ * someone with no stake in the codebase: they can rewrite every string in the product and
256
+ * cannot add a key, remove one, or put a word of it in front of a customer.
257
+ */
258
+ LOCALIZATION_TRANSLATE = "localization:translate",
259
+ /**
260
+ * Cut a release — the act that actually changes what users read.
261
+ *
262
+ * Separate from `LOCALIZATION_TRANSLATE` for the reason the release aggregate exists at all:
263
+ * editing has to be free so a translator can work in the tool instead of in a spreadsheet,
264
+ * which is only tolerable if editing is not shipping. This is the gate between the two.
265
+ */
266
+ LOCALIZATION_PUBLISH = "localization:publish",
267
+ /**
268
+ * Resolve and format messages at runtime through `POST /render`.
269
+ *
270
+ * A service permission. `iveri-messaging-api` rendering an OTP body and `iveri-billing-api`
271
+ * rendering an invoice line hold this and nothing else here — they have no reason to read the
272
+ * key catalogue, and separating it keeps a compromised worker from enumerating it.
273
+ */
274
+ LOCALIZATION_RENDER = "localization:render"
232
275
  }
233
276
  /**
234
277
  * Every member, for seeding the owner role and validating custom-role input.
@@ -1 +1 @@
1
- {"version":3,"file":"user-permission.enum.d.ts","sourceRoot":"","sources":["../../../src/enum/user-permission.enum.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"user-permission.enum.d.ts","sourceRoot":"","sources":["../../../src/enum/user-permission.enum.ts"],"names":[],"mappings":"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"}
@@ -269,6 +269,56 @@ var UserPermission;
269
269
  UserPermission["BILLING_INVOICE_READ"] = "billing:invoice:read";
270
270
  /** Create, finalize or void tenant invoices. */
271
271
  UserPermission["BILLING_INVOICE_MANAGE"] = "billing:invoice:manage";
272
+ // ══ iveri-localization-api ══════════════════════════════════════════════
273
+ //
274
+ // Four permissions for what looks like one job, because translation has four distinct
275
+ // audiences and the whole point of the service is that they are not the same person. An
276
+ // engineer defines keys, a translator writes values, a reviewer decides a language is ready,
277
+ // and a service reads the result. Collapsing them means a contractor hired to translate a
278
+ // panel into Georgian can delete the keys the panel is built from.
279
+ /**
280
+ * Read locales, namespaces, keys, translations and release history — and pull a published
281
+ * bundle, which is how a build gets its strings.
282
+ *
283
+ * One read permission over all of it rather than one per aggregate: none of it is secret. It
284
+ * is text written to be shown to users, and a key list with the values hidden is unusable
285
+ * for the review this permission exists to enable.
286
+ */
287
+ UserPermission["LOCALIZATION_READ"] = "localization:read";
288
+ /**
289
+ * Define the structure — locales, namespaces, message keys and their declared variables.
290
+ *
291
+ * The engineer's half, and the sharper one despite sounding like configuration. A message key
292
+ * is compiled into an app (`t('inbox.title')`), so archiving one breaks a screen that already
293
+ * shipped; and editing a message's declared variables invalidates every translation of it in
294
+ * every language at once. A translator must not be able to do either by accident.
295
+ */
296
+ UserPermission["LOCALIZATION_MESSAGE_MANAGE"] = "localization:message:manage";
297
+ /**
298
+ * Write translation values.
299
+ *
300
+ * The translator's whole job, and deliberately the *only* thing it grants. This is the
301
+ * permission handed to an outside contractor or an agency, so it must be safe to hand to
302
+ * someone with no stake in the codebase: they can rewrite every string in the product and
303
+ * cannot add a key, remove one, or put a word of it in front of a customer.
304
+ */
305
+ UserPermission["LOCALIZATION_TRANSLATE"] = "localization:translate";
306
+ /**
307
+ * Cut a release — the act that actually changes what users read.
308
+ *
309
+ * Separate from `LOCALIZATION_TRANSLATE` for the reason the release aggregate exists at all:
310
+ * editing has to be free so a translator can work in the tool instead of in a spreadsheet,
311
+ * which is only tolerable if editing is not shipping. This is the gate between the two.
312
+ */
313
+ UserPermission["LOCALIZATION_PUBLISH"] = "localization:publish";
314
+ /**
315
+ * Resolve and format messages at runtime through `POST /render`.
316
+ *
317
+ * A service permission. `iveri-messaging-api` rendering an OTP body and `iveri-billing-api`
318
+ * rendering an invoice line hold this and nothing else here — they have no reason to read the
319
+ * key catalogue, and separating it keeps a compromised worker from enumerating it.
320
+ */
321
+ UserPermission["LOCALIZATION_RENDER"] = "localization:render";
272
322
  })(UserPermission || (exports.UserPermission = UserPermission = {}));
273
323
  /**
274
324
  * Every member, for seeding the owner role and validating custom-role input.
@@ -1 +1 @@
1
- {"version":3,"file":"user-permission.enum.js","sourceRoot":"","sources":["../../../src/enum/user-permission.enum.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"user-permission.enum.js","sourceRoot":"","sources":["../../../src/enum/user-permission.enum.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import type { IsoDateTime } from '../../type/iso-date-time.type.js';
2
+ /**
3
+ * One namespace at one locale, flattened — what a build pulls and commits into a repo.
4
+ *
5
+ * **UI strings are fetched at build time, never at runtime, and that is the load-bearing decision
6
+ * in this service.** A React app that fetched its labels on mount would put a network call in
7
+ * front of every first paint, make this service a hard dependency of two admin panels that are
8
+ * otherwise happy while it is down, and render a screen of empty strings when it is not. The
9
+ * strings were known when the app compiled; that is when they should be baked in.
10
+ *
11
+ * So a consumer runs `pnpm i18n:pull`, gets one of these per locale, writes it to
12
+ * `src/locale/<code>.json`, and commits it. The diff is reviewable, the app has no runtime
13
+ * dependency, and rolling back a bad translation is `git revert`.
14
+ *
15
+ * {@link RenderedMessage} is the other half — for text produced on a server, where there is no
16
+ * bundle to bake into.
17
+ */
18
+ export interface TranslationBundle {
19
+ namespaceKey: string;
20
+ localeCode: string;
21
+ /** The release this was cut from. Pinned by the consumer; `latest` resolves to a number. */
22
+ version: number;
23
+ generatedAt: IsoDateTime;
24
+ /**
25
+ * Message key to ICU value.
26
+ *
27
+ * **Flat, not nested.** `{"inbox.title": "..."}` rather than `{"inbox": {"title": "..."}}`,
28
+ * even though the dotted keys invite nesting. Nesting means a key containing a dot becomes
29
+ * ambiguous, and it makes `messages[key]` — the only lookup anyone performs — a path walk
30
+ * instead of a property read.
31
+ */
32
+ messages: Record<string, string>;
33
+ /**
34
+ * Keys served from a fallback locale rather than this one, and where they came from.
35
+ *
36
+ * Emitted so a build can fail, or warn, on an incomplete bundle. Without it a half-translated
37
+ * locale looks identical to a complete one: every key resolves, and half of them are English.
38
+ */
39
+ fallbacks: Record<string, string>;
40
+ }
41
+ //# sourceMappingURL=bundle.type.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundle.type.d.ts","sourceRoot":"","sources":["../../../../src/api/localization/bundle.type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAEpE;;;;;;;;;;;;;;;GAeG;AACH,MAAM,WAAW,iBAAiB;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IAEnB,4FAA4F;IAC5F,OAAO,EAAE,MAAM,CAAC;IAEhB,WAAW,EAAE,WAAW,CAAC;IAEzB;;;;;;;OAOG;IACH,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEjC;;;;;OAKG;IACH,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=bundle.type.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundle.type.js","sourceRoot":"","sources":["../../../../src/api/localization/bundle.type.ts"],"names":[],"mappings":""}
@@ -0,0 +1,10 @@
1
+ export * from './bundle.type.js';
2
+ export * from './locale.type.js';
3
+ export * from './message.type.js';
4
+ export * from './namespace.type.js';
5
+ export * from './release.type.js';
6
+ export * from './render.type.js';
7
+ export * from './translation-status.enum.js';
8
+ export * from './translation.type.js';
9
+ export * from './variable-type.enum.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/api/localization/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC"}
@@ -0,0 +1,10 @@
1
+ export * from './bundle.type.js';
2
+ export * from './locale.type.js';
3
+ export * from './message.type.js';
4
+ export * from './namespace.type.js';
5
+ export * from './release.type.js';
6
+ export * from './render.type.js';
7
+ export * from './translation-status.enum.js';
8
+ export * from './translation.type.js';
9
+ export * from './variable-type.enum.js';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/api/localization/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC"}
@@ -0,0 +1,67 @@
1
+ import type { IsoDateTime } from '../../type/iso-date-time.type.js';
2
+ import type { Nullable } from '../../type/nil.type.js';
3
+ import type { UUID } from '../../type/uuid.type.js';
4
+ /**
5
+ * A language a tenant publishes in.
6
+ *
7
+ * **A row, not an enum member.** The obvious alternative — `enum LocaleCode { EN, RU, KA }` — makes
8
+ * adding Ukrainian a contracts release, an SDK release and a redeploy of every consumer, to add a
9
+ * value that no code branches on. Nothing in the platform switches on *which* locale a string is
10
+ * in; it only ever looks one up. So the set belongs in data.
11
+ *
12
+ * `code` is a BCP-47 tag and is what every other surface uses: the `Accept-Language` header the
13
+ * SDK already resolves into `RequestContext.locale`, the export filename, the render request.
14
+ */
15
+ export interface Locale {
16
+ id: UUID;
17
+ /** BCP-47, lowercased — `en`, `ru`, `ka`, `en-GB`. Unique within the tenant. */
18
+ code: string;
19
+ /** For the language picker in an English-language admin screen. */
20
+ englishName: string;
21
+ /** For the language picker a native speaker sees — `ქართული`, `Русский`. */
22
+ nativeName: string;
23
+ /**
24
+ * The locale translators translate *from*. Exactly one per tenant.
25
+ *
26
+ * It is also the locale a message's source text lives in, so editing a source value is what
27
+ * flips every other locale's translation of that message to `needs-review`. Changing which
28
+ * locale is the source is therefore not a display preference — it moves that trigger.
29
+ */
30
+ isSource: boolean;
31
+ /**
32
+ * Whether this locale is offered at all. Inactive keeps the translations and stops them
33
+ * being exported or rendered, which is what a locale that is half-translated needs — the
34
+ * alternative is deleting the work to hide it.
35
+ */
36
+ isActive: boolean;
37
+ /**
38
+ * Where a lookup goes when this locale has no approved translation. Null ends the chain.
39
+ *
40
+ * Chains are followed transitively (`en-GB → en → null`) and are **rejected at write time if
41
+ * they cycle**, because the resolver would otherwise loop on a row a customer can create.
42
+ */
43
+ fallbackCode: Nullable<string>;
44
+ createdAt: IsoDateTime;
45
+ updatedAt: IsoDateTime;
46
+ }
47
+ /** `GET /api/v1/locales`. Small and unpaged — a tenant has a handful of these, not a page of them. */
48
+ export type LocaleList = Locale[];
49
+ /** `POST /api/v1/locales`. */
50
+ export interface CreateLocaleBody {
51
+ code: string;
52
+ englishName: string;
53
+ nativeName: string;
54
+ isSource?: boolean;
55
+ isActive?: boolean;
56
+ fallbackCode?: Nullable<string>;
57
+ }
58
+ /** `PATCH /api/v1/locales/:code`. */
59
+ export interface UpdateLocaleBody {
60
+ englishName?: string;
61
+ nativeName?: string;
62
+ /** Promoting a locale to source demotes the previous one in the same transaction. */
63
+ isSource?: boolean;
64
+ isActive?: boolean;
65
+ fallbackCode?: Nullable<string>;
66
+ }
67
+ //# sourceMappingURL=locale.type.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"locale.type.d.ts","sourceRoot":"","sources":["../../../../src/api/localization/locale.type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAEpD;;;;;;;;;;GAUG;AACH,MAAM,WAAW,MAAM;IACnB,EAAE,EAAE,IAAI,CAAC;IAET,gFAAgF;IAChF,IAAI,EAAE,MAAM,CAAC;IAEb,mEAAmE;IACnE,WAAW,EAAE,MAAM,CAAC;IAEpB,4EAA4E;IAC5E,UAAU,EAAE,MAAM,CAAC;IAEnB;;;;;;OAMG;IACH,QAAQ,EAAE,OAAO,CAAC;IAElB;;;;OAIG;IACH,QAAQ,EAAE,OAAO,CAAC;IAElB;;;;;OAKG;IACH,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAE/B,SAAS,EAAE,WAAW,CAAC;IACvB,SAAS,EAAE,WAAW,CAAC;CAC1B;AAED,sGAAsG;AACtG,MAAM,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC;AAElC,8BAA8B;AAC9B,MAAM,WAAW,gBAAgB;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;CACnC;AAED,qCAAqC;AACrC,MAAM,WAAW,gBAAgB;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qFAAqF;IACrF,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;CACnC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=locale.type.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"locale.type.js","sourceRoot":"","sources":["../../../../src/api/localization/locale.type.ts"],"names":[],"mappings":""}