@gooddata/sdk-ui-metric-component 11.65.0-alpha.8 → 11.65.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.
@@ -6,39 +6,152 @@
6
6
  //
7
7
  // new URL("../../common/services/editorWebWorkerMain.js", import.meta.url)
8
8
  //
9
- // Vite/rolldown sees a bare `new URL(..., import.meta.url)` (not wrapped in `new Worker(...)`), so it
10
- // treats it as a plain *asset* reference. That entry file is 544 B — below the 4 kB
11
- // `build.assetsInlineLimit` — so the production build inlines the untouched Monaco source as a
12
- // `data:` URI instead of emitting a bundled worker chunk. The worker then fails on its own first
13
- // relative import, because a `data:` URL is not a hierarchical base to resolve against:
9
+ // Bundlers read a bare `new URL(..., import.meta.url)` (not wrapped in `new Worker(...)`) as a plain
10
+ // *asset* reference, so they copy or inline the untouched 544 B entry instead of bundling it. The
11
+ // worker then fails on its own first relative import:
14
12
  //
15
13
  // Failed to load worker script for label: editorWorkerService.
16
14
  // TypeError: Failed to resolve module specifier "../../../base/common/worker/webWorkerBootstrap.js".
17
15
  //
18
- // The dev server never hits this: there the same `new URL(...)` yields a real http URL, so the
19
- // worker's relative imports resolve as ordinary module requests. It surfaces only in a built bundle,
20
- // e.g. once this editor is loaded from a Module Federation remote by the host application.
21
- //
22
- // The fix is to hand Monaco the URL of a properly bundled worker: `?worker&url` makes Vite bundle the
23
- // entry with its whole dependency graph and give us the emitted chunk's URL.
24
- //
25
- // `getWorkerUrl` — not `getWorker` — is deliberate. Monaco wraps the URL in a same-origin blob that
26
- // `import()`s it, which is what keeps the worker constructible while the code is served from a
27
- // federated remote on a different origin than the host page; `new Worker(<cross-origin url>)` would
28
- // be blocked by the browser.
29
- //
30
- // `?worker&url` is Vite-only. The one consumer still built with webpack (apps/gdc-dashboards, which
31
- // reaches this lib through gdc-dashboards-runtime → gdc-analytical-designer) replaces this
32
- // specifier with a module of its own — see webpack.monacoWorker.loader.cjs there. That module solves
33
- // the same problem the webpack way: it bundles the entry as a real worker chunk and installs
34
- // `MonacoEnvironment.getWorker` on import, leaving its own default export `undefined`. Because it is
35
- // this file's first import, it runs before `setupMonacoWorkers()` below, whose `getWorker` guard then
36
- // makes it a no-op. Do NOT add a `if (!editorWorkerUrl)` guard here to accommodate that `undefined`
37
- // — Vite emits this import as `"" + new URL(...).href`, and the minifier drops the parentheses when
38
- // that expression is negated (`!"" + url + ""`, a truthy string), which silently short-circuits the
39
- // whole assignment below.
40
- // oxlint-disable-next-line import/default -- `?worker&url` makes this module export the worker's URL as its default; the linter only sees the plain file, which has no default export
41
- import editorWorkerUrl from "monaco-editor/editor/common/services/editorWebWorkerMain.js?worker&url";
16
+ // The fix is to hand Monaco a properly bundled worker. The build of this package bundles the entry
17
+ // with its whole dependency graph into the self-contained `worker/monaco-editor-worker.js` and wraps
18
+ // the same code into a string module (see the `build-worker` script). sdk-ui-geo ships its MapLibre
19
+ // worker the same way. Nothing here depends on a bundler feature, so the package works in any bundler
20
+ // and in the Vite dev server, which pre-bundles it from node_modules.
21
+ /**
22
+ * URL of the self-contained editor worker file that this package ships, relative to this module.
23
+ *
24
+ * @remarks
25
+ * The relative path is the same from `src/MaqlEditor/monaco/` and from `esm/MaqlEditor/monaco/`, so
26
+ * it also holds when a dev server serves this package from its sources. webpack and Vite recognise
27
+ * the `new URL("...", import.meta.url)` pattern and emit the file as an asset. A pre-bundled
28
+ * dependency, other bundlers and a Module Federation remote on another origin leave a URL that does
29
+ * not exist or that the page cannot start a worker from. The URL must therefore be checked before
30
+ * the worker starts, see {@link resolveEditorWorkerUrl}.
31
+ *
32
+ * @internal
33
+ */
34
+ export function getBundledEditorWorkerUrl() {
35
+ return new URL("../../../worker/monaco-editor-worker.js", import.meta.url).href;
36
+ }
37
+ /**
38
+ * How long the check of the bundled worker file may take before the inline worker is used instead.
39
+ */
40
+ const WORKER_FILE_CHECK_TIMEOUT_MS = 5000;
41
+ /**
42
+ * Tells whether the worker can start from the URL directly: the URL is a same-origin `http(s)` URL
43
+ * and the server has the file as JavaScript.
44
+ *
45
+ * @remarks
46
+ * A cross-origin URL is not used even when the file exists: the browser does not start a worker from
47
+ * another origin, which is the case of this editor loaded from a Module Federation remote. The same
48
+ * holds for a same-origin URL that redirects to another origin.
49
+ *
50
+ * The MIME type is checked because single-page application servers often answer a missing file with
51
+ * `index.html` and status 200, and browsers do not start a module worker from HTML.
52
+ */
53
+ async function isReachableSameOriginScript(url) {
54
+ const pageOrigin = typeof location === "undefined" ? undefined : location.origin;
55
+ if (!pageOrigin) {
56
+ return false;
57
+ }
58
+ let parsed;
59
+ try {
60
+ parsed = new URL(url);
61
+ }
62
+ catch {
63
+ return false;
64
+ }
65
+ if (!/^https?:$/.test(parsed.protocol) || parsed.origin !== pageOrigin) {
66
+ return false;
67
+ }
68
+ try {
69
+ const response = await fetch(url, {
70
+ method: "HEAD",
71
+ signal: AbortSignal.timeout(WORKER_FILE_CHECK_TIMEOUT_MS),
72
+ });
73
+ return (response.ok &&
74
+ (!response.url || new URL(response.url).origin === pageOrigin) &&
75
+ /^(text|application)\/(javascript|ecmascript)\b/.test(response.headers.get("content-type") ?? ""));
76
+ }
77
+ catch {
78
+ return false;
79
+ }
80
+ }
81
+ /**
82
+ * Makes a worker URL from the worker code this package ships inline. The Blob URL carries the origin
83
+ * of the page, so the worker starts from it on any page. The URL is never revoked: Monaco creates its
84
+ * worker lazily and the one Blob lives as long as the page.
85
+ */
86
+ async function createInlineWorkerUrl() {
87
+ const { default: source } = await import("../../../worker/monaco-editor-worker.source.js");
88
+ return URL.createObjectURL(new Blob([source], { type: "text/javascript" }));
89
+ }
90
+ /**
91
+ * Resolves the URL the editor worker starts from: the bundled worker file when the bundler emitted
92
+ * it next to the page, the inline worker otherwise.
93
+ *
94
+ * @param assetUrl - URL of the bundled worker file, defaults to {@link getBundledEditorWorkerUrl}
95
+ * @internal
96
+ */
97
+ export async function resolveEditorWorkerUrl(assetUrl = getBundledEditorWorkerUrl()) {
98
+ return (await isReachableSameOriginScript(assetUrl)) ? assetUrl : createInlineWorkerUrl();
99
+ }
100
+ /**
101
+ * Name of the Trusted Types policy that turns the worker URL into a `TrustedScriptURL`. A page whose
102
+ * content security policy lists the allowed policy names must allow this one.
103
+ *
104
+ * @internal
105
+ */
106
+ export const EDITOR_WORKER_TRUSTED_TYPES_POLICY = "gdMetricEditorWorker";
107
+ /**
108
+ * Creates the Trusted Types policy for the worker URL the way Monaco creates its own: through the
109
+ * host's `MonacoEnvironment.createTrustedTypesPolicy` when it has one, through the browser otherwise.
110
+ * Without the policy, a page that enforces Trusted Types does not start a worker from a plain string.
111
+ * Monaco itself already uses the name `defaultWorkerFactory`, and a page that enforces Trusted Types
112
+ * may not allow a second policy of the same name.
113
+ */
114
+ function createWorkerUrlPolicy() {
115
+ const options = { createScriptURL: (url) => url };
116
+ const environment = globalThis.MonacoEnvironment;
117
+ // The DOM typings of TypeScript do not declare Trusted Types; the browser API has the same shape.
118
+ const { trustedTypes } = globalThis;
119
+ try {
120
+ return environment?.createTrustedTypesPolicy
121
+ ? environment.createTrustedTypesPolicy(EDITOR_WORKER_TRUSTED_TYPES_POLICY, options)
122
+ : trustedTypes?.createPolicy(EDITOR_WORKER_TRUSTED_TYPES_POLICY, options);
123
+ }
124
+ catch (error) {
125
+ console.error("The Trusted Types policy of the metric editor worker cannot be created.", error);
126
+ return undefined;
127
+ }
128
+ }
129
+ /**
130
+ * Creates the `MonacoEnvironment.getWorker` that starts the bundled editor worker.
131
+ *
132
+ * @remarks
133
+ * The worker URL and the Trusted Types policy are created once and shared by all workers, which is why
134
+ * the cache lives in the created function: tests create their own, the runtime uses one. A failed
135
+ * resolution is not cached, so the next worker tries again.
136
+ *
137
+ * @param resolveWorkerUrl - resolves the URL of the worker this package ships
138
+ * @internal
139
+ */
140
+ export function createEditorWorkerFactory(resolveWorkerUrl = resolveEditorWorkerUrl) {
141
+ let resolvedWorkerUrl;
142
+ let workerUrlPolicy;
143
+ return async (_workerId, label) => {
144
+ resolvedWorkerUrl ??= resolveWorkerUrl().catch((error) => {
145
+ resolvedWorkerUrl = undefined;
146
+ throw error;
147
+ });
148
+ const workerUrl = await resolvedWorkerUrl;
149
+ workerUrlPolicy ??= { value: createWorkerUrlPolicy() };
150
+ const scriptUrl = workerUrlPolicy.value?.createScriptURL?.(workerUrl) ?? workerUrl;
151
+ return new Worker(scriptUrl, { type: "module", name: label });
152
+ };
153
+ }
154
+ const getEditorWorker = createEditorWorkerFactory();
42
155
  /**
43
156
  * Point Monaco at the bundled `editorWorkerService` worker.
44
157
  *
@@ -55,7 +168,7 @@ export function setupMonacoWorkers() {
55
168
  }
56
169
  globalThis.MonacoEnvironment = {
57
170
  ...globalThis.MonacoEnvironment,
58
- getWorkerUrl: () => editorWorkerUrl,
171
+ getWorker: getEditorWorker,
59
172
  };
60
173
  }
61
174
  // Run on import, so the environment is in place before any Monaco module can ask for the worker —
@@ -18,9 +18,9 @@
18
18
  "metricComponent.editMetric.runBubble.disabled": "La definición de la métrica está incompleta o no es válida.",
19
19
  "metricComponent.editMetric.decoratorsShow": "Mostrar nombres",
20
20
  "metricComponent.editMetric.decoratorsHide": "Ocultar nombres",
21
- "metricComponent.editMetric.descriptionPlaceholder": "Añada una descripción aquí...",
22
- "metricComponent.editMetric.placeholder": "Comience a escribir <placeholder>SELECT</placeholder> o abra el código completo (CTRL+space or CTRL+I)...",
23
- "metricComponent.editMetric.placeholderMac": "Comience a escribir <placeholder>SELECT</placeholder> o abra el código completo (⌃+space or ⌘+I)...",
21
+ "metricComponent.editMetric.descriptionPlaceholder": "Añada una descripción aquí…",
22
+ "metricComponent.editMetric.placeholder": "Comience a escribir <placeholder>SELECT</placeholder> o abra el código completo (CTRL+space or CTRL+I)…",
23
+ "metricComponent.editMetric.placeholderMac": "Comience a escribir <placeholder>SELECT</placeholder> o abra el código completo (⌃+space or ⌘+I)…",
24
24
  "metricComponent.editMetric.placeholder.readOnly": "Esta expresión MAQL está vacía",
25
25
  "metricComponent.editMetric.helpText": "¿Cómo crear métricas?",
26
26
  "metricComponent.editMetric.cancel": "Cancelar",
@@ -55,11 +55,11 @@
55
55
  "metricComponent.editMetric.metric.result.context.displayTop": "Arriba",
56
56
  "metricComponent.editMetric.metric.result.context.displayBottom": "Abajo",
57
57
  "metricComponent.editMetric.metric.result": "Resultado",
58
- "metricComponent.editMetric.metric.result.tooltip": "La métrica devuelve un número y puede reutilizarse cuando se combina con atributos y filtros para crear un informe. Añada \"Ver por\" para crear un informe de vista previa.",
59
- "metricComponent.editMetric.metric.result.computing": "Calculando...",
58
+ "metricComponent.editMetric.metric.result.tooltip": "La métrica devuelve un número y puede reutilizarse cuando se combina con atributos y filtros para crear un informe. Añada «Ver por» para crear un informe de vista previa.",
59
+ "metricComponent.editMetric.metric.result.computing": "Calculando…",
60
60
  "metricComponent.editMetric.metric.result.error.title": "No se ha podido calcular el resultado",
61
61
  "metricComponent.editMetric.metric.result.error": "No se puede calcular el resultado porque la definición de la métrica está incompleta o no es válida.",
62
- "metricComponent.editMetric.metric.context.search": "Buscar...",
62
+ "metricComponent.editMetric.metric.context.search": "Buscar…",
63
63
  "metricComponent.editMetric.metric.context.cancel": "Cancelar",
64
64
  "metricComponent.editMetric.metric.context.apply": "Aplicar",
65
65
  "metricComponent.editMetric.metric.sql": "SQL",
@@ -83,7 +83,7 @@
83
83
  "metricComponent.objectUsage.usedIn.titleTooltip": "Esta lista solo incluye los objetos del espacio de trabajo actual que utiliza la métrica.",
84
84
  "metricComponent.editMetricForm.idInvalid": "Este ID no es válido.",
85
85
  "metricComponent.editMetricForm.idExists": "Este ID ya existe.",
86
- "metricComponent.editMetricForm.idMatchParentPrefixName": "Este ID comienza con algún prefijo de espacio de trabajo principal \"{conflict}\" y no se puede utilizar.",
86
+ "metricComponent.editMetricForm.idMatchParentPrefixName": "Este ID comienza con algún prefijo de espacio de trabajo principal «{conflict}» y no se puede utilizar.",
87
87
  "metricComponent.editMetricForm.titleEmpty": "Nombre obligatorio.",
88
88
  "metricComponent.editMetricForm.titleExists": "Este nombre ya existe.",
89
89
  "metricComponent.editMetricForm.expressionEmpty": "La expresión MAQL está vacía.",
@@ -2,27 +2,27 @@
2
2
  "metricEditor.status.lotsOfItemsInSuggestionResults": "Seules les 100 premières valeurs correspondantes sont affichées",
3
3
  "metricComponent.deleteMetricConfirmDialog.cancel": "Annuler",
4
4
  "metricComponent.deleteMetricConfirmDialog.delete": "Supprimer",
5
- "metricComponent.deleteMetricConfirmDialog.headline": "Supprimer la métrique ?",
5
+ "metricComponent.deleteMetricConfirmDialog.headline": "Supprimer la métrique ?",
6
6
  "metricComponent.deleteMetricConfirmDialog.content.line1": "La métrique sera retirée de la liste.",
7
7
  "metricComponent.deleteMetricConfirmDialog.content.line2": "Les tableaux de bord, les visualisations et les autres métriques qui utilisent cette métrique deviendront inaccessibles.",
8
8
  "metricComponent.createMetric.title": "Créer une métrique",
9
9
  "metricComponent.editMetric.autoFormat": "Format automatique",
10
- "metricComponent.editMetric.autoFormatBubble": "Formater l'expression métrique (Maj+CTRL+I)",
11
- "metricComponent.editMetric.autoFormatBubbleMac": "Formater l'expression métrique (⇧+⌥+F)",
10
+ "metricComponent.editMetric.autoFormatBubble": "Formater l’expression métrique (Maj+CTRL+I)",
11
+ "metricComponent.editMetric.autoFormatBubbleMac": "Formater l’expression métrique (⇧+⌥+F)",
12
12
  "metricComponent.editMetric.sql": "Afficher SQL",
13
13
  "metricComponent.editMetric.sql.disabled": "La définition de la métrique est incomplète ou non valide.",
14
14
  "metricComponent.editMetric.run": "Exécuter",
15
- "metricComponent.editMetric.run.success": "Le calcul du résultat est en cours. En cas d'absence de modification, le résultat sera le même.",
16
- "metricComponent.editMetric.runBubble": "Exécuter l'aperçu de la métrique (CTRL+R)",
17
- "metricComponent.editMetric.runBubbleMac": "Exécuter l'aperçu de la métrique (⌥+R)",
15
+ "metricComponent.editMetric.run.success": "Le calcul du résultat est en cours. En cas d’absence de modification, le résultat sera le même.",
16
+ "metricComponent.editMetric.runBubble": "Exécuter l’aperçu de la métrique (CTRL+R)",
17
+ "metricComponent.editMetric.runBubbleMac": "Exécuter l’aperçu de la métrique (⌥+R)",
18
18
  "metricComponent.editMetric.runBubble.disabled": "La définition de la métrique est incomplète ou non valide.",
19
19
  "metricComponent.editMetric.decoratorsShow": "Afficher les noms",
20
20
  "metricComponent.editMetric.decoratorsHide": "Masquer les noms",
21
- "metricComponent.editMetric.descriptionPlaceholder": "Ajoutez une description ici...",
22
- "metricComponent.editMetric.placeholder": "Commencez par saisir <placeholder>SELECT</placeholder> ou ouvrez la complétion de code (CTRL+espace ou CTRL+I) ...",
21
+ "metricComponent.editMetric.descriptionPlaceholder": "Ajoutez une description ici…",
22
+ "metricComponent.editMetric.placeholder": "Commencez par saisir <placeholder>SELECT</placeholder> ou ouvrez la complétion de code (CTRL+espace ou CTRL+I)…",
23
23
  "metricComponent.editMetric.placeholderMac": "Commencez par saisir <placeholder>SELECT</placeholder> ou ouvrez la complétion de code (⌃+espace ou ⌘+I)…",
24
24
  "metricComponent.editMetric.placeholder.readOnly": "Cette expression MAQL est vide",
25
- "metricComponent.editMetric.helpText": "Comment créer des métriques ?",
25
+ "metricComponent.editMetric.helpText": "Comment créer des métriques ?",
26
26
  "metricComponent.editMetric.cancel": "Annuler",
27
27
  "metricComponent.editMetric.close": "Fermer",
28
28
  "metricComponent.editMetric.delete": "Supprimer",
@@ -41,7 +41,7 @@
41
41
  "metricComponent.editMetric.id.ariaLabel": "ID de métrique",
42
42
  "metricComponent.editMetric.saveAsNew": "Enregistrer sous un nouveau nom",
43
43
  "loading": "Chargement en cours…",
44
- "metricComponent.editMetric.protectedMetric": "Vous ne pouvez pas modifier ou supprimer cette métrique car elle a été créée dans l'espace de travail parent. Pour modifier ou supprimer cette métrique, faites-le dans l'espace de travail parent.",
44
+ "metricComponent.editMetric.protectedMetric": "Vous ne pouvez pas modifier ou supprimer cette métrique car elle a été créée dans l’espace de travail parent. Pour modifier ou supprimer cette métrique, faites-le dans l’espace de travail parent.",
45
45
  "metricComponent.editMetric.hover.more": "Plus",
46
46
  "metricComponent.editMetric.hover.less": "Moins",
47
47
  "metricComponent.editMetric.metric.definition": "Définition de métrique",
@@ -51,59 +51,59 @@
51
51
  "metricComponent.editMetric.metric.result.context.displayTitle": "Afficher",
52
52
  "metricComponent.editMetric.metric.result.context.display": "{ranking} {limit} lignes",
53
53
  "metricComponent.editMetric.metric.result.context.displayRows": "lignes",
54
- "metricComponent.editMetric.metric.result.context.display.explain": "d'après cette valeur de métrique",
54
+ "metricComponent.editMetric.metric.result.context.display.explain": "d’après cette valeur de métrique",
55
55
  "metricComponent.editMetric.metric.result.context.displayTop": "Haut",
56
56
  "metricComponent.editMetric.metric.result.context.displayBottom": "Bas",
57
57
  "metricComponent.editMetric.metric.result": "Résultat",
58
- "metricComponent.editMetric.metric.result.tooltip": "Une métrique renvoie un nombre et peut être réutilisée en étant combinée à des attributs et filtres pour créer un rapport. Ajoutez « Afficher par » pour créer un rapport d'aperçu.",
59
- "metricComponent.editMetric.metric.result.computing": "Calcul en cours ...",
58
+ "metricComponent.editMetric.metric.result.tooltip": "Une métrique renvoie un nombre et peut être réutilisée en étant combinée à des attributs et filtres pour créer un rapport. Ajoutez « Afficher par » pour créer un rapport d’aperçu.",
59
+ "metricComponent.editMetric.metric.result.computing": "Calcul en cours…",
60
60
  "metricComponent.editMetric.metric.result.error.title": "Calcul du résultat impossible",
61
61
  "metricComponent.editMetric.metric.result.error": "Impossible de calculer le résultat, car la définition de la métrique est incomplète ou non valide.",
62
- "metricComponent.editMetric.metric.context.search": "Recherche ...",
62
+ "metricComponent.editMetric.metric.context.search": "Recherche…",
63
63
  "metricComponent.editMetric.metric.context.cancel": "Annuler",
64
64
  "metricComponent.editMetric.metric.context.apply": "Appliquer",
65
65
  "metricComponent.editMetric.metric.sql": "SQL",
66
- "metricComponent.editMetric.metric.sql.tooltip": "La définition de la métrique est transformée en SQL avant l'exécution.",
66
+ "metricComponent.editMetric.metric.sql.tooltip": "La définition de la métrique est transformée en SQL avant l’exécution.",
67
67
  "metricComponent.editMetric.metric.sql.close": "Fermer",
68
68
  "metricComponent.editMetric.metric.sql.copy_to_clipboard": "Copier dans le presse-papiers",
69
69
  "metricComponent.editMetric.metric.sql.copy_to_clipboard.ok": "SQL copié dans le presse-papiers du système.",
70
70
  "metricComponent.editMetric.metric.sql.copy_to_clipboard.error": "Échec de la copie du SQL dans le presse-papiers du système. Effectuez une copie manuelle.",
71
- "metricComponent.editMetric.metric.sql.error": "Impossible de créer l'instruction SQL, car la définition de la métrique est incomplète ou non valide.",
71
+ "metricComponent.editMetric.metric.sql.error": "Impossible de créer l’instruction SQL, car la définition de la métrique est incomplète ou non valide.",
72
72
  "metricComponent.numberFormat.label": "Format numérique",
73
73
  "metricComponent.metricType.label": "Type",
74
74
  "metricComponent.tags.label": "Balises",
75
75
  "metricComponent.metricType.unspecified": "Non spécifié",
76
76
  "metricComponent.metricType.currency": "Devise",
77
- "metricComponent.objectUsage.usedIn": "utilisée dans :",
77
+ "metricComponent.objectUsage.usedIn": "utilisée dans :",
78
78
  "metricComponent.objectUsage.metricsCount": "{count, plural, one {# métrique} other {# métriques}}",
79
79
  "metricComponent.objectUsage.metrics": "Métriques",
80
80
  "metricComponent.objectUsage.insightsCount": "{count, plural, one {# visualisation} other {# visualisations}}",
81
81
  "metricComponent.objectUsage.insights": "Visualisations",
82
82
  "metricComponent.objectUsage.usedIn.title": "Métrique utilisée dans",
83
- "metricComponent.objectUsage.usedIn.titleTooltip": "Cette liste comporte uniquement des objets de l'espace de travail actuel qui utilisent la métrique.",
84
- "metricComponent.editMetricForm.idInvalid": "Cet ID n'est pas valide.",
83
+ "metricComponent.objectUsage.usedIn.titleTooltip": "Cette liste comporte uniquement des objets de l’espace de travail actuel qui utilisent la métrique.",
84
+ "metricComponent.editMetricForm.idInvalid": "Cet ID n’est pas valide.",
85
85
  "metricComponent.editMetricForm.idExists": "Cet ID existe déjà.",
86
- "metricComponent.editMetricForm.idMatchParentPrefixName": "Cet ID commence par un préfixe d'espace de travail parent « {conflict} » et ne peut pas être utilisé.",
86
+ "metricComponent.editMetricForm.idMatchParentPrefixName": "Cet ID commence par un préfixe d’espace de travail parent « {conflict} » et ne peut pas être utilisé.",
87
87
  "metricComponent.editMetricForm.titleEmpty": "Le nom est obligatoire.",
88
88
  "metricComponent.editMetricForm.titleExists": "Ce nom existe déjà.",
89
- "metricComponent.editMetricForm.expressionEmpty": "L'expression MAQL est vide.",
90
- "metricComponent.editMetricForm.expressionInvalid": "L'expression MAQL n'est pas valide.",
89
+ "metricComponent.editMetricForm.expressionEmpty": "L’expression MAQL est vide.",
90
+ "metricComponent.editMetricForm.expressionInvalid": "L’expression MAQL n’est pas valide.",
91
91
  "metricComponent.editMetricForm.formatNotCurrency": "Le format doit être un format de devise lorsque le type de métrique est Devise.",
92
- "metricComponent.editMetricForm.metricTypeNotCurrency": "Le type de métrique doit être Devise lors de l'utilisation d'un format de devise.",
92
+ "metricComponent.editMetricForm.metricTypeNotCurrency": "Le type de métrique doit être Devise lors de l’utilisation d’un format de devise.",
93
93
  "metricComponent.editMetricForm.formatRequiredForCurrency": "Le format est requis pour le type de métrique Devise. Un format vide ne peut pas être utilisé pour les métriques en devise.",
94
94
  "metricComponent.editMetricForm.namePlaceholder": "Métrique sans titre",
95
95
  "metricComponent.editMetricForm.errorsOnSave.start": "Impossible d'{save} car la métrique contient",
96
96
  "metricComponent.editMetricForm.errorsOnSave.count": "{count, plural, one {# erreur} other {# erreurs}}",
97
97
  "metricComponent.editMetricForm.errorsOnSave.empty": "Impossible d'{save} une métrique vide.",
98
- "metricComponent.idChangeConfirmDialog.headline": "Changer l'ID de métrique ?",
99
- "metricComponent.idChangeConfirmDialog.headlineOverwrite": "Remplacer la métrique dans un espace de travail enfant ?",
100
- "metricComponent.idChangeConfirmDialog.changeTitle": "D'autres objets analytiques vont devenir inaccessibles",
101
- "metricComponent.idChangeConfirmDialog.change": "Si vous enregistrez cette métrique sous un nouvel ID, les autres métriques, visualisations, et tableaux de bord qui référencent cette métrique avec l'ID original <b>{metricId}</b> deviendront inaccessibles.",
102
- "metricComponent.idChangeConfirmDialog.conflictsTitle": "La métrique de l'espace de travail enfant va être remplacée",
98
+ "metricComponent.idChangeConfirmDialog.headline": "Changer l’ID de métrique ?",
99
+ "metricComponent.idChangeConfirmDialog.headlineOverwrite": "Remplacer la métrique dans un espace de travail enfant ?",
100
+ "metricComponent.idChangeConfirmDialog.changeTitle": "D’autres objets analytiques vont devenir inaccessibles",
101
+ "metricComponent.idChangeConfirmDialog.change": "Si vous enregistrez cette métrique sous un nouvel ID, les autres métriques, visualisations, et tableaux de bord qui référencent cette métrique avec l’ID original <b>{metricId}</b> deviendront inaccessibles.",
102
+ "metricComponent.idChangeConfirmDialog.conflictsTitle": "La métrique de l’espace de travail enfant va être remplacée",
103
103
  "metricComponent.idChangeConfirmDialog.conflicts": "Si vous enregistrez cette métrique, une autre métrique avec le même ID <b>{metricId}</b> dans un espace de travail enfant sera remplacée. Les métriques remplacées ne peuvent pas être restaurées.",
104
104
  "metricComponent.idChangeConfirmDialog.conflicts.footer": "Créez un autre ID de métrique pour éviter les remplacements.",
105
105
  "metricComponent.idChangeConfirmDialog.generated": "Créer un autre ID et enregistrer",
106
- "metricComponent.idChangeConfirmDialog.keep": "Conserver l'ID d'origine et enregistrer",
106
+ "metricComponent.idChangeConfirmDialog.keep": "Conserver l’ID d’origine et enregistrer",
107
107
  "metricComponent.idChangeConfirmDialog.submitChange": "Changer et enregistrer",
108
108
  "metricComponent.idChangeConfirmDialog.submitOverwrite": "Remplacer et enregistrer",
109
109
  "metricComponent.unsavedChangesConfirmDialog.metric.headline": "Les modifications de la métrique ne sont pas enregistrées",
@@ -114,7 +114,7 @@
114
114
  "metricComponent.unsavedChangesConfirmDialog.submit": "Enregistrer",
115
115
  "metricComponent.unsavedChangesConfirmDialog.submitAsNew": "Enregistrer sous un nouveau nom",
116
116
  "metricComponent.unsavedChangesConfirmDialog.submitAll": "Tout enregistrer",
117
- "metricComponent.minimize.editing": "Modification :",
117
+ "metricComponent.minimize.editing": "Modification :",
118
118
  "metricComponent.minimize.viewing": "Visualisation",
119
119
  "metricComponent.minimize.metrics": "{edited, plural, one {# métrique} other {# métriques}}",
120
120
  "metricComponent.tags.manager.label.more": "Plus de balises",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gooddata/sdk-ui-metric-component",
3
- "version": "11.65.0-alpha.8",
3
+ "version": "11.65.0",
4
4
  "license": "LicenseRef-LICENSE",
5
5
  "author": "GoodData Corporation",
6
6
  "repository": {
@@ -10,6 +10,7 @@
10
10
  },
11
11
  "files": [
12
12
  "esm",
13
+ "worker/*.js",
13
14
  "NOTICE"
14
15
  ],
15
16
  "type": "module",
@@ -23,8 +24,8 @@
23
24
  "dependencies": {
24
25
  "@emotion/react": "11.14.0",
25
26
  "classnames": "2.5.1",
27
+ "lodash-es": "^4.17.23",
26
28
  "monaco-editor": "0.56.0",
27
- "monaco-languageclient": "2.1.0",
28
29
  "react-intl": "10.1.25",
29
30
  "sql-formatter": "12.2.4",
30
31
  "tss-react": "4.9.19",
@@ -32,17 +33,17 @@
32
33
  "vscode-languageserver-textdocument": "1.0.12",
33
34
  "vscode-languageserver-types": "3.17.5",
34
35
  "yup": "0.32.11",
35
- "@gooddata/api-client-tiger": "11.65.0-alpha.8",
36
- "@gooddata/sdk-backend-tiger": "11.65.0-alpha.8",
37
- "@gooddata/sdk-backend-spi": "11.65.0-alpha.8",
38
- "@gooddata/sdk-model": "11.65.0-alpha.8",
39
- "@gooddata/sdk-maql-language-server": "11.65.0-alpha.8",
40
- "@gooddata/sdk-ui": "11.65.0-alpha.8",
41
- "@gooddata/sdk-ui-ext": "11.65.0-alpha.8",
42
- "@gooddata/sdk-ui-pivot": "11.65.0-alpha.8",
43
- "@gooddata/sdk-ui-kit": "11.65.0-alpha.8",
44
- "@gooddata/util": "11.65.0-alpha.8",
45
- "@gooddata/sdk-ui-charts": "11.65.0-alpha.8"
36
+ "@gooddata/api-client-tiger": "11.65.0",
37
+ "@gooddata/sdk-backend-spi": "11.65.0",
38
+ "@gooddata/sdk-backend-tiger": "11.65.0",
39
+ "@gooddata/sdk-maql-language-server": "11.65.0",
40
+ "@gooddata/sdk-model": "11.65.0",
41
+ "@gooddata/sdk-ui": "11.65.0",
42
+ "@gooddata/sdk-ui-charts": "11.65.0",
43
+ "@gooddata/sdk-ui-ext": "11.65.0",
44
+ "@gooddata/sdk-ui-kit": "11.65.0",
45
+ "@gooddata/util": "11.65.0",
46
+ "@gooddata/sdk-ui-pivot": "11.65.0"
46
47
  },
47
48
  "devDependencies": {
48
49
  "@microsoft/api-documenter": "7.30.16",
@@ -67,7 +68,6 @@
67
68
  "eslint-plugin-tsdoc": "0.2.14",
68
69
  "happy-dom": "20.12.0",
69
70
  "jiti": "2.6.1",
70
- "lodash-es": "^4.17.23",
71
71
  "npm-run-all": "4.1.5",
72
72
  "oxfmt": "0.68.0",
73
73
  "oxlint": "1.83.0",
@@ -75,13 +75,14 @@
75
75
  "oxlint-tsgolint": "7.0.2001",
76
76
  "react": "19.1.1",
77
77
  "react-dom": "19.1.1",
78
+ "rolldown": "1.0.3",
78
79
  "typescript": "7.0.2",
79
80
  "vitest": "5.0.4",
80
- "@gooddata/eslint-config": "11.65.0-alpha.8",
81
- "@gooddata/i18n-toolkit": "11.65.0-alpha.8",
82
- "@gooddata/oxlint-config": "11.65.0-alpha.8",
83
- "@gooddata/sdk-backend-base": "11.65.0-alpha.8",
84
- "@gooddata/sdk-ui-theme-provider": "11.65.0-alpha.8"
81
+ "@gooddata/eslint-config": "11.65.0",
82
+ "@gooddata/i18n-toolkit": "11.65.0",
83
+ "@gooddata/oxlint-config": "11.65.0",
84
+ "@gooddata/sdk-ui-theme-provider": "11.65.0",
85
+ "@gooddata/sdk-backend-base": "11.65.0"
85
86
  },
86
87
  "peerDependencies": {
87
88
  "react": "^18.0.0 || ^19.0.0",
@@ -92,10 +93,11 @@
92
93
  "_phase:test": "npm run test-once",
93
94
  "_phase:validate": "npm run validate",
94
95
  "api-extractor": "mkdir -p api && [ -z \"${CI}\" ] && (api-extractor run -l) || (api-extractor run)",
95
- "build": "npm-run-all -p build-check build-ts && npm run api-extractor",
96
+ "build": "npm run build-worker && npm-run-all -p build-check build-ts && npm run api-extractor",
96
97
  "build-check": "tsc",
97
98
  "build-ts": "tsc -p tsconfig.build.json",
98
- "clean": "../../common/scripts/clean-command-state.sh && rm -rf dist *.log",
99
+ "build-worker": "rolldown node_modules/monaco-editor/esm/vs/editor/common/services/editorWebWorkerMain.js --format esm --platform browser --minify --file worker/monaco-editor-worker.js && node scripts/buildWorkerSource.js worker/monaco-editor-worker.js worker/monaco-editor-worker.source.js",
100
+ "clean": "../../common/scripts/clean-command-state.sh && rm -rf dist worker *.log",
99
101
  "format-check": "oxfmt --check .",
100
102
  "format-write": "oxfmt .",
101
103
  "lint": "oxlint . --quiet && eslint .",