@longsightgroup/qti3-player 0.3.0 → 0.5.1

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 (92) hide show
  1. package/README.md +153 -13
  2. package/dist/index.d.ts +13 -2
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +6 -0
  5. package/dist/index.js.map +1 -1
  6. package/dist/player-adapter.d.ts +62 -0
  7. package/dist/player-adapter.d.ts.map +1 -0
  8. package/dist/player-adapter.js +119 -0
  9. package/dist/player-adapter.js.map +1 -0
  10. package/dist/player-dev.d.ts +4 -0
  11. package/dist/player-dev.d.ts.map +1 -0
  12. package/dist/player-dev.js +14 -0
  13. package/dist/player-dev.js.map +1 -0
  14. package/dist/player-element.d.ts +14 -1
  15. package/dist/player-element.d.ts.map +1 -1
  16. package/dist/player-element.js +57 -5
  17. package/dist/player-element.js.map +1 -1
  18. package/dist/player-locale.d.ts +8 -3
  19. package/dist/player-locale.d.ts.map +1 -1
  20. package/dist/player-locale.js +16 -175
  21. package/dist/player-locale.js.map +1 -1
  22. package/dist/player-message-catalog-default.d.ts +4 -0
  23. package/dist/player-message-catalog-default.d.ts.map +1 -0
  24. package/dist/player-message-catalog-default.js +118 -0
  25. package/dist/player-message-catalog-default.js.map +1 -0
  26. package/dist/player-message-catalog-validate.d.ts +31 -0
  27. package/dist/player-message-catalog-validate.d.ts.map +1 -0
  28. package/dist/player-message-catalog-validate.js +327 -0
  29. package/dist/player-message-catalog-validate.js.map +1 -0
  30. package/dist/player-message-catalog.d.ts +18 -0
  31. package/dist/player-message-catalog.d.ts.map +1 -0
  32. package/dist/player-message-catalog.js +40 -0
  33. package/dist/player-message-catalog.js.map +1 -0
  34. package/dist/player-message-keys.d.ts +6 -0
  35. package/dist/player-message-keys.d.ts.map +1 -0
  36. package/dist/player-message-keys.js +7 -0
  37. package/dist/player-message-keys.js.map +1 -0
  38. package/dist/player-message-manifest.d.ts +272 -0
  39. package/dist/player-message-manifest.d.ts.map +1 -0
  40. package/dist/player-message-manifest.js +83 -0
  41. package/dist/player-message-manifest.js.map +1 -0
  42. package/dist/player-message-overrides.d.ts +3 -0
  43. package/dist/player-message-overrides.d.ts.map +1 -0
  44. package/dist/player-message-overrides.js +28 -0
  45. package/dist/player-message-overrides.js.map +1 -0
  46. package/dist/player-message-resolver.d.ts +31 -0
  47. package/dist/player-message-resolver.d.ts.map +1 -0
  48. package/dist/player-message-resolver.js +110 -0
  49. package/dist/player-message-resolver.js.map +1 -0
  50. package/dist/player-messages.d.ts +0 -38
  51. package/dist/player-messages.d.ts.map +1 -1
  52. package/dist/player-types.d.ts +12 -2
  53. package/dist/player-types.d.ts.map +1 -1
  54. package/package.json +3 -3
  55. package/src/controls/remove-button.ts +8 -5
  56. package/src/index.ts +61 -5
  57. package/src/interactions/choice-interaction.ts +6 -2
  58. package/src/interactions/drawing-interaction.ts +14 -9
  59. package/src/interactions/end-attempt-interaction.ts +3 -3
  60. package/src/interactions/gap-match-interaction.ts +32 -13
  61. package/src/interactions/graphic-associate-interaction.ts +15 -10
  62. package/src/interactions/hotspot-interaction.ts +10 -6
  63. package/src/interactions/inline-choice-interaction.ts +4 -4
  64. package/src/interactions/interaction-registry.ts +12 -12
  65. package/src/interactions/match-interaction.ts +9 -6
  66. package/src/interactions/pair-interaction.ts +22 -14
  67. package/src/interactions/position-object-interaction.ts +22 -13
  68. package/src/interactions/select-point-interaction.ts +25 -13
  69. package/src/interactions/shared.ts +21 -4
  70. package/src/interactions/text-interaction.ts +14 -4
  71. package/src/interactions/upload-interaction.ts +6 -3
  72. package/src/player/content-state.ts +12 -1
  73. package/src/player/interaction-render.ts +4 -4
  74. package/src/player-adapter.ts +253 -0
  75. package/src/player-dev.ts +14 -0
  76. package/src/player-element.ts +78 -8
  77. package/src/player-locale.ts +28 -199
  78. package/src/player-message-catalog-default.ts +119 -0
  79. package/src/player-message-catalog-validate.ts +425 -0
  80. package/src/player-message-catalog.ts +72 -0
  81. package/src/player-message-keys.ts +12 -0
  82. package/src/player-message-manifest.ts +103 -0
  83. package/src/player-message-overrides.ts +38 -0
  84. package/src/player-message-resolver.ts +205 -0
  85. package/src/player-messages.ts +0 -30
  86. package/src/player-types.ts +15 -4
  87. package/src/reorder/a11y.ts +22 -7
  88. package/src/reorder/graphic-order-interaction.ts +23 -16
  89. package/src/reorder/list-controls.ts +8 -6
  90. package/src/reorder/order-interaction.ts +7 -5
  91. package/src/styles/base-styles.ts +20 -5
  92. package/src/styles/graphic-styles.ts +0 -6
@@ -0,0 +1,327 @@
1
+ import { defaultPlayerMessageCatalog } from "./player-message-catalog-default.js";
2
+ import { extractMessagePlaceholders } from "./player-message-catalog.js";
3
+ import { PLAYER_MESSAGE_MANIFEST, } from "./player-message-manifest.js";
4
+ const MANIFEST_KEYS = new Set(PLAYER_MESSAGE_MANIFEST.map((entry) => entry.key));
5
+ const MANIFEST_BY_KEY = new Map(PLAYER_MESSAGE_MANIFEST.map((entry) => [entry.key, entry]));
6
+ const AUXILIARY_STRING_KEYS = new Set([
7
+ "characterUnit.one",
8
+ "characterUnit.other",
9
+ "wordUnit.one",
10
+ "wordUnit.other",
11
+ ]);
12
+ const VALID_DIRECTION_KEYS = new Set(["up", "down", "left", "right"]);
13
+ function isPlainObject(value) {
14
+ return typeof value === "object" && value !== null && !Array.isArray(value);
15
+ }
16
+ function isNonEmptyString(value) {
17
+ return typeof value === "string";
18
+ }
19
+ function pushDiagnostic(diagnostics, diagnostic) {
20
+ diagnostics.push(diagnostic);
21
+ }
22
+ function isManifestStringKey(key) {
23
+ if (MANIFEST_KEYS.has(key))
24
+ return true;
25
+ if (AUXILIARY_STRING_KEYS.has(key))
26
+ return true;
27
+ const pluralMatch = /^(.+)\.(one|other)$/.exec(key);
28
+ if (pluralMatch && MANIFEST_KEYS.has(pluralMatch[1])) {
29
+ return MANIFEST_BY_KEY.get(pluralMatch[1])?.resolver === "plural";
30
+ }
31
+ return false;
32
+ }
33
+ /** Placeholders a host may use for a manifest entry (superset of manifest params). */
34
+ export function allowedCatalogPlaceholders(entry) {
35
+ switch (entry.resolver) {
36
+ case "plain":
37
+ case "typeLabel":
38
+ return [];
39
+ case "template":
40
+ case "plural":
41
+ case "directionTemplate":
42
+ return entry.params ?? [];
43
+ case "typeTemplate":
44
+ return [...(entry.params?.filter((name) => name !== "type") ?? []), "typeName"];
45
+ case "extendedTextCounter":
46
+ return ["characters", "words", "characterUnit", "wordUnit"];
47
+ default:
48
+ return [];
49
+ }
50
+ }
51
+ /**
52
+ * Placeholders a host template must include for a catalog string key.
53
+ * Uses the English default for that key when present; otherwise no placeholders are required.
54
+ * Manifest `params` bound required fields for resolvers that inject extra values at runtime
55
+ * (e.g. `extendedTextCounter` supplies `{characterUnit}` / `{wordUnit}` even when omitted).
56
+ */
57
+ export function requiredCatalogPlaceholders(catalogKey, entry) {
58
+ const manifestEntry = entry ?? manifestEntryForStringKey(catalogKey);
59
+ if (!manifestEntry) {
60
+ return [];
61
+ }
62
+ const allowed = new Set(allowedCatalogPlaceholders(manifestEntry));
63
+ const defaultTemplate = defaultPlayerMessageCatalog.strings[catalogKey];
64
+ const fromDefault = defaultTemplate
65
+ ? extractMessagePlaceholders(defaultTemplate).filter((name) => allowed.has(name))
66
+ : [];
67
+ if (manifestEntry.resolver === "extendedTextCounter") {
68
+ return (manifestEntry.params ?? []).filter((name) => allowed.has(name));
69
+ }
70
+ if (fromDefault.length > 0) {
71
+ return fromDefault;
72
+ }
73
+ return [];
74
+ }
75
+ function validateTemplate(key, template, entry, diagnostics) {
76
+ if (!template.trim()) {
77
+ pushDiagnostic(diagnostics, {
78
+ code: "empty-template",
79
+ key,
80
+ severity: "error",
81
+ message: `Message "${key}" is empty.`,
82
+ });
83
+ return;
84
+ }
85
+ const allowed = new Set(allowedCatalogPlaceholders(entry));
86
+ const actual = extractMessagePlaceholders(template);
87
+ const required = requiredCatalogPlaceholders(key, entry);
88
+ for (const placeholder of actual) {
89
+ if (!allowed.has(placeholder)) {
90
+ pushDiagnostic(diagnostics, {
91
+ code: "unknown-placeholder",
92
+ key,
93
+ severity: "error",
94
+ message: `Message "${key}" uses unknown placeholder "{${placeholder}}". Allowed: ${[...allowed].join(", ") || "(none)"}.`,
95
+ });
96
+ }
97
+ }
98
+ for (const placeholder of required) {
99
+ if (!actual.includes(placeholder)) {
100
+ pushDiagnostic(diagnostics, {
101
+ code: "missing-placeholder",
102
+ key,
103
+ severity: "error",
104
+ message: `Message "${key}" is missing required placeholder "{${placeholder}}" (required by English default for this key).`,
105
+ });
106
+ }
107
+ }
108
+ }
109
+ function manifestEntryForStringKey(key) {
110
+ const pluralMatch = /^(.+)\.(one|other)$/.exec(key);
111
+ const baseKey = (pluralMatch?.[1] ?? key);
112
+ return MANIFEST_BY_KEY.get(baseKey);
113
+ }
114
+ function normalizeCatalogInput(input, diagnostics) {
115
+ if (!isPlainObject(input)) {
116
+ pushDiagnostic(diagnostics, {
117
+ code: "invalid-catalog-root",
118
+ key: "(root)",
119
+ severity: "error",
120
+ message: "Player message catalog must be a JSON object.",
121
+ });
122
+ return null;
123
+ }
124
+ const normalized = {
125
+ strings: {},
126
+ interactionTypes: {},
127
+ directions: {},
128
+ };
129
+ if ("locale" in input) {
130
+ if (input.locale === undefined) {
131
+ // omit
132
+ }
133
+ else if (!isNonEmptyString(input.locale)) {
134
+ pushDiagnostic(diagnostics, {
135
+ code: "invalid-catalog-field",
136
+ key: "locale",
137
+ severity: "error",
138
+ message: "Catalog locale must be a string when provided.",
139
+ });
140
+ }
141
+ else {
142
+ normalized.locale = input.locale;
143
+ }
144
+ }
145
+ if (!("strings" in input) || input.strings === undefined) {
146
+ pushDiagnostic(diagnostics, {
147
+ code: "invalid-strings-field",
148
+ key: "strings",
149
+ severity: "error",
150
+ message: 'Catalog must include a "strings" object.',
151
+ });
152
+ }
153
+ else if (!isPlainObject(input.strings)) {
154
+ pushDiagnostic(diagnostics, {
155
+ code: "invalid-strings-field",
156
+ key: "strings",
157
+ severity: "error",
158
+ message: 'Catalog "strings" must be an object mapping message ids to template strings.',
159
+ });
160
+ }
161
+ else {
162
+ for (const [key, value] of Object.entries(input.strings)) {
163
+ if (!isNonEmptyString(value)) {
164
+ pushDiagnostic(diagnostics, {
165
+ code: "invalid-string-value",
166
+ key,
167
+ severity: "error",
168
+ message: `Catalog strings["${key}"] must be a string.`,
169
+ });
170
+ continue;
171
+ }
172
+ normalized.strings[key] = value;
173
+ }
174
+ }
175
+ if ("interactionTypes" in input && input.interactionTypes !== undefined) {
176
+ if (!isPlainObject(input.interactionTypes)) {
177
+ pushDiagnostic(diagnostics, {
178
+ code: "invalid-interaction-types-field",
179
+ key: "interactionTypes",
180
+ severity: "error",
181
+ message: 'Catalog "interactionTypes" must be an object mapping interaction type ids to labels.',
182
+ });
183
+ }
184
+ else {
185
+ for (const [typeId, label] of Object.entries(input.interactionTypes)) {
186
+ if (!isNonEmptyString(label)) {
187
+ pushDiagnostic(diagnostics, {
188
+ code: "invalid-interaction-type-value",
189
+ key: typeId,
190
+ severity: "error",
191
+ message: `Catalog interactionTypes["${typeId}"] must be a string.`,
192
+ });
193
+ continue;
194
+ }
195
+ normalized.interactionTypes[typeId] = label;
196
+ }
197
+ }
198
+ }
199
+ if ("directions" in input && input.directions !== undefined) {
200
+ if (!isPlainObject(input.directions)) {
201
+ pushDiagnostic(diagnostics, {
202
+ code: "invalid-directions-field",
203
+ key: "directions",
204
+ severity: "error",
205
+ message: 'Catalog "directions" must be an object mapping direction ids to labels.',
206
+ });
207
+ }
208
+ else {
209
+ for (const [direction, label] of Object.entries(input.directions)) {
210
+ if (!VALID_DIRECTION_KEYS.has(direction)) {
211
+ pushDiagnostic(diagnostics, {
212
+ code: "invalid-direction-key",
213
+ key: direction,
214
+ severity: "error",
215
+ message: `Unknown direction key "${direction}". Use up, down, left, or right.`,
216
+ });
217
+ continue;
218
+ }
219
+ if (!isNonEmptyString(label)) {
220
+ pushDiagnostic(diagnostics, {
221
+ code: "invalid-direction-value",
222
+ key: direction,
223
+ severity: "error",
224
+ message: `Catalog directions["${direction}"] must be a string.`,
225
+ });
226
+ continue;
227
+ }
228
+ normalized.directions[direction] = label;
229
+ }
230
+ }
231
+ }
232
+ for (const field of Object.keys(input)) {
233
+ if (field === "locale" ||
234
+ field === "strings" ||
235
+ field === "interactionTypes" ||
236
+ field === "directions") {
237
+ continue;
238
+ }
239
+ pushDiagnostic(diagnostics, {
240
+ code: "invalid-catalog-field",
241
+ key: field,
242
+ severity: "error",
243
+ message: `Unknown catalog field "${field}".`,
244
+ });
245
+ }
246
+ return normalized;
247
+ }
248
+ function validateNormalizedCatalog(catalog, options, diagnostics) {
249
+ const strings = catalog.strings;
250
+ for (const key of Object.keys(strings)) {
251
+ if (!isManifestStringKey(key)) {
252
+ pushDiagnostic(diagnostics, {
253
+ code: "unknown-string-key",
254
+ key,
255
+ severity: "error",
256
+ message: `Unknown catalog string key "${key}". See PLAYER_MESSAGE_KEYS.`,
257
+ });
258
+ continue;
259
+ }
260
+ const entry = manifestEntryForStringKey(key);
261
+ const template = strings[key];
262
+ if (!entry || template === undefined)
263
+ continue;
264
+ validateTemplate(key, template, entry, diagnostics);
265
+ }
266
+ if (options.requireAllKeys) {
267
+ for (const entry of PLAYER_MESSAGE_MANIFEST) {
268
+ const hasBase = strings[entry.key] !== undefined;
269
+ const hasPlural = entry.resolver === "plural" &&
270
+ (strings[`${entry.key}.one`] !== undefined || strings[`${entry.key}.other`] !== undefined);
271
+ if (entry.resolver === "typeLabel") {
272
+ continue;
273
+ }
274
+ if (entry.resolver === "plural") {
275
+ if (!hasBase && !hasPlural) {
276
+ pushDiagnostic(diagnostics, {
277
+ code: "missing-message-key",
278
+ key: entry.key,
279
+ severity: "error",
280
+ message: `Missing message "${entry.key}" (or "${entry.key}.one" / "${entry.key}.other").`,
281
+ });
282
+ }
283
+ if (!strings[`${entry.key}.one`] &&
284
+ defaultPlayerMessageCatalog.strings[`${entry.key}.one`]) {
285
+ pushDiagnostic(diagnostics, {
286
+ code: "missing-plural-form",
287
+ key: `${entry.key}.one`,
288
+ severity: "warning",
289
+ message: `Missing plural form "${entry.key}.one". English fallback will be used.`,
290
+ });
291
+ }
292
+ if (!strings[`${entry.key}.other`] &&
293
+ defaultPlayerMessageCatalog.strings[`${entry.key}.other`]) {
294
+ pushDiagnostic(diagnostics, {
295
+ code: "missing-plural-form",
296
+ key: `${entry.key}.other`,
297
+ severity: "warning",
298
+ message: `Missing plural form "${entry.key}.other". English fallback will be used.`,
299
+ });
300
+ }
301
+ }
302
+ else if (!hasBase) {
303
+ pushDiagnostic(diagnostics, {
304
+ code: "missing-message-key",
305
+ key: entry.key,
306
+ severity: "error",
307
+ message: `Missing message "${entry.key}".`,
308
+ });
309
+ }
310
+ }
311
+ }
312
+ }
313
+ /**
314
+ * Validates host player chrome JSON against {@link PLAYER_MESSAGE_MANIFEST}.
315
+ * Accepts raw `JSON.parse` output (`unknown`); returns structured diagnostics instead of throwing.
316
+ */
317
+ export function validatePlayerMessageCatalog(catalog, options = {}) {
318
+ const diagnostics = [];
319
+ const normalized = normalizeCatalogInput(catalog, diagnostics);
320
+ if (!normalized) {
321
+ return { valid: false, diagnostics };
322
+ }
323
+ validateNormalizedCatalog(normalized, options, diagnostics);
324
+ const errors = diagnostics.filter((item) => item.severity === "error");
325
+ return { valid: errors.length === 0, diagnostics };
326
+ }
327
+ //# sourceMappingURL=player-message-catalog-validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"player-message-catalog-validate.js","sourceRoot":"","sources":["../src/player-message-catalog-validate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { QtiPlayerMovementDirection } from "./player-messages.js";
2
+ export { defaultPlayerMessageCatalog } from "./player-message-catalog-default.js";
3
+ export { createPlayerMessageResolver, defaultPlayerMessageResolver, type PlayerMessageOverride, type PlayerMessageParams, type PlayerMessageResolver, type QtiPlayerMessageOverrides, } from "./player-message-resolver.js";
4
+ /** JSON-serializable chrome strings for Harbor/LMS locale files. */
5
+ export interface PlayerMessageCatalog {
6
+ /** BCP 47 tag (metadata only). */
7
+ locale?: string;
8
+ /** Message templates; use `{name}` placeholders. Plural forms: `key.one` / `key.other`. */
9
+ strings: Record<string, string>;
10
+ /** QTI interaction type id → short label inserted as `{typeName}`. */
11
+ interactionTypes?: Record<string, string>;
12
+ /** Labels for moveChoice / movePoint / moveObject (`{direction}`). */
13
+ directions?: Partial<Record<QtiPlayerMovementDirection, string>>;
14
+ }
15
+ export declare function mergePlayerMessageCatalogs(base: PlayerMessageCatalog, partial: Partial<PlayerMessageCatalog>): PlayerMessageCatalog;
16
+ export declare function extractMessagePlaceholders(template: string): string[];
17
+ export declare function formatPlayerMessage(template: string, values: Record<string, string | number>): string;
18
+ //# sourceMappingURL=player-message-catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"player-message-catalog.d.ts","sourceRoot":"","sources":["../src/player-message-catalog.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAEvE,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAC;AAClF,OAAO,EACL,2BAA2B,EAC3B,4BAA4B,EAC5B,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EACxB,KAAK,qBAAqB,EAC1B,KAAK,yBAAyB,GAC/B,MAAM,8BAA8B,CAAC;AAEtC,oEAAoE;AACpE,MAAM,WAAW,oBAAoB;IACnC,kCAAkC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2FAA2F;IAC3F,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,sEAAsE;IACtE,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,sEAAsE;IACtE,UAAU,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,0BAA0B,EAAE,MAAM,CAAC,CAAC,CAAC;CAClE;AAED,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,oBAAoB,EAC1B,OAAO,EAAE,OAAO,CAAC,oBAAoB,CAAC,GACrC,oBAAoB,CAiBtB;AAED,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAMrE;AAED,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,GACtC,MAAM,CAaR"}
@@ -0,0 +1,40 @@
1
+ import { playerDevWarningsEnabled, warnPlayerMessageOnce } from "./player-dev.js";
2
+ export { defaultPlayerMessageCatalog } from "./player-message-catalog-default.js";
3
+ export { createPlayerMessageResolver, defaultPlayerMessageResolver, } from "./player-message-resolver.js";
4
+ export function mergePlayerMessageCatalogs(base, partial) {
5
+ const merged = {
6
+ strings: { ...base.strings, ...partial.strings },
7
+ };
8
+ const interactionTypes = { ...base.interactionTypes, ...partial.interactionTypes };
9
+ if (Object.keys(interactionTypes).length > 0) {
10
+ merged.interactionTypes = interactionTypes;
11
+ }
12
+ const directions = { ...base.directions, ...partial.directions };
13
+ if (Object.keys(directions).length > 0) {
14
+ merged.directions = directions;
15
+ }
16
+ const locale = partial.locale ?? base.locale;
17
+ if (locale !== undefined) {
18
+ merged.locale = locale;
19
+ }
20
+ return merged;
21
+ }
22
+ export function extractMessagePlaceholders(template) {
23
+ const names = new Set();
24
+ for (const match of template.matchAll(/\{(\w+)\}/g)) {
25
+ names.add(match[1] ?? "");
26
+ }
27
+ return [...names].filter(Boolean);
28
+ }
29
+ export function formatPlayerMessage(template, values) {
30
+ const placeholders = extractMessagePlaceholders(template);
31
+ const missing = placeholders.filter((name) => values[name] === undefined);
32
+ if (missing.length > 0 && playerDevWarningsEnabled()) {
33
+ warnPlayerMessageOnce(`missing-placeholder-values:${missing.join(",")}`, `Player message template is missing values for: ${missing.map((name) => `{${name}}`).join(", ")}.`);
34
+ }
35
+ return template.replace(/\{(\w+)\}/g, (_, key) => {
36
+ const value = values[key];
37
+ return value === undefined ? `{${key}}` : String(value);
38
+ });
39
+ }
40
+ //# sourceMappingURL=player-message-catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"player-message-catalog.js","sourceRoot":"","sources":["../src/player-message-catalog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAGlF,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAC;AAClF,OAAO,EACL,2BAA2B,EAC3B,4BAA4B,GAK7B,MAAM,8BAA8B,CAAC;AActC,MAAM,UAAU,0BAA0B,CACxC,IAA0B,EAC1B,OAAsC;IAEtC,MAAM,MAAM,GAAyB;QACnC,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE;KACjD,CAAC;IACF,MAAM,gBAAgB,GAAG,EAAE,GAAG,IAAI,CAAC,gBAAgB,EAAE,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IACnF,IAAI,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7C,MAAM,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;IAC7C,CAAC;IACD,MAAM,UAAU,GAAG,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IACjE,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvC,MAAM,CAAC,UAAU,GAAG,UAAU,CAAC;IACjC,CAAC;IACD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC;IAC7C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;IACzB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,QAAgB;IACzD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QACpD,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,QAAgB,EAChB,MAAuC;IAEvC,MAAM,YAAY,GAAG,0BAA0B,CAAC,QAAQ,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,SAAS,CAAC,CAAC;IAC1E,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,wBAAwB,EAAE,EAAE,CAAC;QACrD,qBAAqB,CACnB,8BAA8B,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EACjD,kDAAkD,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CACnG,CAAC;IACJ,CAAC;IACD,OAAO,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE,GAAW,EAAE,EAAE;QACvD,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1B,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { type PlayerMessageKey } from "./player-message-manifest.js";
2
+ /** Chrome message ids (from {@link PLAYER_MESSAGE_MANIFEST}). */
3
+ export declare const PLAYER_MESSAGE_KEYS: readonly PlayerMessageKey[];
4
+ /** All `strings` keys in the English catalog (including plural/unit suffix keys). */
5
+ export declare const PLAYER_MESSAGE_STRING_KEYS: ReadonlyArray<string>;
6
+ //# sourceMappingURL=player-message-keys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"player-message-keys.d.ts","sourceRoot":"","sources":["../src/player-message-keys.ts"],"names":[],"mappings":"AACA,OAAO,EAA2B,KAAK,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAE9F,iEAAiE;AACjE,eAAO,MAAM,mBAAmB,EAE3B,SAAS,gBAAgB,EAAE,CAAC;AAEjC,qFAAqF;AACrF,eAAO,MAAM,0BAA0B,EAElC,aAAa,CAAC,MAAM,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { defaultPlayerMessageCatalog } from "./player-message-catalog-default.js";
2
+ import { PLAYER_MESSAGE_MANIFEST } from "./player-message-manifest.js";
3
+ /** Chrome message ids (from {@link PLAYER_MESSAGE_MANIFEST}). */
4
+ export const PLAYER_MESSAGE_KEYS = PLAYER_MESSAGE_MANIFEST.map((entry) => entry.key);
5
+ /** All `strings` keys in the English catalog (including plural/unit suffix keys). */
6
+ export const PLAYER_MESSAGE_STRING_KEYS = Object.keys(defaultPlayerMessageCatalog.strings);
7
+ //# sourceMappingURL=player-message-keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"player-message-keys.js","sourceRoot":"","sources":["../src/player-message-keys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAC;AAClF,OAAO,EAAE,uBAAuB,EAAyB,MAAM,8BAA8B,CAAC;AAE9F,iEAAiE;AACjE,MAAM,CAAC,MAAM,mBAAmB,GAAG,uBAAuB,CAAC,GAAG,CAC5D,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CACU,CAAC;AAEjC,qFAAqF;AACrF,MAAM,CAAC,MAAM,0BAA0B,GAAG,MAAM,CAAC,IAAI,CACnD,2BAA2B,CAAC,OAAO,CACX,CAAC"}