@creezio/shell-ui 0.22.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.
- package/README.md +336 -0
- package/dist/adapters/nav-shell.d.ts +54 -0
- package/dist/adapters/nav-shell.d.ts.map +1 -0
- package/dist/adapters/nav-shell.js +112 -0
- package/dist/adapters/nav-shell.js.map +1 -0
- package/dist/brand.d.ts +64 -0
- package/dist/brand.d.ts.map +1 -0
- package/dist/brand.js +59 -0
- package/dist/brand.js.map +1 -0
- package/dist/core-nav.d.ts +17 -0
- package/dist/core-nav.d.ts.map +1 -0
- package/dist/core-nav.js +40 -0
- package/dist/core-nav.js.map +1 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/api-scopes.d.ts +24 -0
- package/dist/lib/api-scopes.d.ts.map +1 -0
- package/dist/lib/api-scopes.js +78 -0
- package/dist/lib/api-scopes.js.map +1 -0
- package/dist/lib/catalog-suspense-key.d.ts +3 -0
- package/dist/lib/catalog-suspense-key.d.ts.map +1 -0
- package/dist/lib/catalog-suspense-key.js +12 -0
- package/dist/lib/catalog-suspense-key.js.map +1 -0
- package/dist/lib/data-changed.d.ts +51 -0
- package/dist/lib/data-changed.d.ts.map +1 -0
- package/dist/lib/data-changed.js +227 -0
- package/dist/lib/data-changed.js.map +1 -0
- package/dist/lib/desktop-home-path.d.ts +14 -0
- package/dist/lib/desktop-home-path.d.ts.map +1 -0
- package/dist/lib/desktop-home-path.js +29 -0
- package/dist/lib/desktop-home-path.js.map +1 -0
- package/dist/lib/geo-distance.d.ts +6 -0
- package/dist/lib/geo-distance.d.ts.map +1 -0
- package/dist/lib/geo-distance.js +27 -0
- package/dist/lib/geo-distance.js.map +1 -0
- package/dist/lib/img.d.ts +2 -0
- package/dist/lib/img.d.ts.map +1 -0
- package/dist/lib/img.js +40 -0
- package/dist/lib/img.js.map +1 -0
- package/dist/lib/keepalive-eviction.d.ts +14 -0
- package/dist/lib/keepalive-eviction.d.ts.map +1 -0
- package/dist/lib/keepalive-eviction.js +44 -0
- package/dist/lib/keepalive-eviction.js.map +1 -0
- package/dist/lib/ops-track.d.ts +29 -0
- package/dist/lib/ops-track.d.ts.map +1 -0
- package/dist/lib/ops-track.js +37 -0
- package/dist/lib/ops-track.js.map +1 -0
- package/dist/lib/optimize-cover-url.d.ts +10 -0
- package/dist/lib/optimize-cover-url.d.ts.map +1 -0
- package/dist/lib/optimize-cover-url.js +80 -0
- package/dist/lib/optimize-cover-url.js.map +1 -0
- package/dist/lib/page-trails.d.ts +9 -0
- package/dist/lib/page-trails.d.ts.map +1 -0
- package/dist/lib/page-trails.js +20 -0
- package/dist/lib/page-trails.js.map +1 -0
- package/dist/lib/public-origin.d.ts +32 -0
- package/dist/lib/public-origin.d.ts.map +1 -0
- package/dist/lib/public-origin.js +125 -0
- package/dist/lib/public-origin.js.map +1 -0
- package/dist/lib/server-incident.d.ts +12 -0
- package/dist/lib/server-incident.d.ts.map +1 -0
- package/dist/lib/server-incident.js +72 -0
- package/dist/lib/server-incident.js.map +1 -0
- package/dist/lib/tab-document-url.d.ts +13 -0
- package/dist/lib/tab-document-url.d.ts.map +1 -0
- package/dist/lib/tab-document-url.js +60 -0
- package/dist/lib/tab-document-url.js.map +1 -0
- package/dist/lib/utils.d.ts +20 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +87 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/nav-catalog.d.ts +97 -0
- package/dist/nav-catalog.d.ts.map +1 -0
- package/dist/nav-catalog.js +282 -0
- package/dist/nav-catalog.js.map +1 -0
- package/dist/registry.d.ts +11 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +60 -0
- package/dist/registry.js.map +1 -0
- package/dist/types.d.ts +22 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist-cjs/adapters/nav-shell.js +115 -0
- package/dist-cjs/adapters/nav-shell.js.map +1 -0
- package/dist-cjs/brand.js +66 -0
- package/dist-cjs/brand.js.map +1 -0
- package/dist-cjs/core-nav.js +43 -0
- package/dist-cjs/core-nav.js.map +1 -0
- package/dist-cjs/index.js +95 -0
- package/dist-cjs/index.js.map +1 -0
- package/dist-cjs/lib/api-scopes.js +86 -0
- package/dist-cjs/lib/api-scopes.js.map +1 -0
- package/dist-cjs/lib/catalog-suspense-key.js +15 -0
- package/dist-cjs/lib/catalog-suspense-key.js.map +1 -0
- package/dist-cjs/lib/data-changed.js +236 -0
- package/dist-cjs/lib/data-changed.js.map +1 -0
- package/dist-cjs/lib/desktop-home-path.js +34 -0
- package/dist-cjs/lib/desktop-home-path.js.map +1 -0
- package/dist-cjs/lib/geo-distance.js +30 -0
- package/dist-cjs/lib/geo-distance.js.map +1 -0
- package/dist-cjs/lib/img.js +43 -0
- package/dist-cjs/lib/img.js.map +1 -0
- package/dist-cjs/lib/keepalive-eviction.js +49 -0
- package/dist-cjs/lib/keepalive-eviction.js.map +1 -0
- package/dist-cjs/lib/ops-track.js +41 -0
- package/dist-cjs/lib/ops-track.js.map +1 -0
- package/dist-cjs/lib/optimize-cover-url.js +83 -0
- package/dist-cjs/lib/optimize-cover-url.js.map +1 -0
- package/dist-cjs/lib/page-trails.js +25 -0
- package/dist-cjs/lib/page-trails.js.map +1 -0
- package/dist-cjs/lib/public-origin.js +130 -0
- package/dist-cjs/lib/public-origin.js.map +1 -0
- package/dist-cjs/lib/server-incident.js +75 -0
- package/dist-cjs/lib/server-incident.js.map +1 -0
- package/dist-cjs/lib/tab-document-url.js +65 -0
- package/dist-cjs/lib/tab-document-url.js.map +1 -0
- package/dist-cjs/lib/utils.js +97 -0
- package/dist-cjs/lib/utils.js.map +1 -0
- package/dist-cjs/nav-catalog.js +293 -0
- package/dist-cjs/nav-catalog.js.map +1 -0
- package/dist-cjs/package.json +3 -0
- package/dist-cjs/registry.js +64 -0
- package/dist-cjs/registry.js.map +1 -0
- package/dist-cjs/types.js +3 -0
- package/dist-cjs/types.js.map +1 -0
- package/package.json +163 -0
- package/ui/app-error-boundary.tsx +59 -0
- package/ui/data-table.tsx +121 -0
- package/ui/desktop/auth-window-chrome.tsx +51 -0
- package/ui/desktop/desktop-bridge.tsx +87 -0
- package/ui/desktop/external-site-slot.tsx +313 -0
- package/ui/desktop/external-site-surface.ts +58 -0
- package/ui/desktop/site-link.tsx +105 -0
- package/ui/desktop/window-chrome-controls.tsx +5 -0
- package/ui/desktop-types.ts +30 -0
- package/ui/faceted-filters.tsx +119 -0
- package/ui/global-search-host.ts +20 -0
- package/ui/global-search.tsx +66 -0
- package/ui/index.ts +178 -0
- package/ui/kit.ts +30 -0
- package/ui/layout/app-shell.tsx +58 -0
- package/ui/layout/desktop-update-banner.tsx +100 -0
- package/ui/layout/entity-header.tsx +44 -0
- package/ui/layout/native-os-nav.ts +104 -0
- package/ui/layout/nav-catalog-loader.tsx +98 -0
- package/ui/layout/nav-icons.ts +67 -0
- package/ui/layout/page-chrome.tsx +90 -0
- package/ui/layout/page-toolbar-context.tsx +82 -0
- package/ui/layout/sandbox-banner.tsx +38 -0
- package/ui/layout/section-view-shell.tsx +73 -0
- package/ui/layout/sidebar-host.ts +144 -0
- package/ui/layout/sidebar.tsx +1150 -0
- package/ui/lib/ai-screencast-hub.ts +127 -0
- package/ui/lib/ai-workspace-client.ts +46 -0
- package/ui/lib/aid.ts +22 -0
- package/ui/lib/desktop-host.ts +114 -0
- package/ui/lib/fleet-tracker-client.ts +237 -0
- package/ui/lib/hermes-ui.ts +114 -0
- package/ui/lib/n8n-ui.ts +115 -0
- package/ui/lib/use-creezio-resource.tsx +121 -0
- package/ui/lib/use-shell-ui-brand.ts +22 -0
- package/ui/list-toolbar.tsx +309 -0
- package/ui/os-pages/desktop-settings-page.tsx +158 -0
- package/ui/os-pages/index.ts +8 -0
- package/ui/page-loading/entity-page-loading.tsx +59 -0
- package/ui/page-loading/list-page-loading.tsx +61 -0
- package/ui/pagination.tsx +56 -0
- package/ui/primitives/avatar.tsx +33 -0
- package/ui/primitives/badge.tsx +36 -0
- package/ui/primitives/breadcrumb.tsx +93 -0
- package/ui/primitives/button.tsx +44 -0
- package/ui/primitives/card.tsx +44 -0
- package/ui/primitives/chart.tsx +317 -0
- package/ui/primitives/command.tsx +111 -0
- package/ui/primitives/dialog.tsx +100 -0
- package/ui/primitives/dropdown-menu.tsx +187 -0
- package/ui/primitives/input.tsx +19 -0
- package/ui/primitives/label.tsx +17 -0
- package/ui/primitives/resizable.tsx +45 -0
- package/ui/primitives/scroll-area.tsx +41 -0
- package/ui/primitives/select.tsx +73 -0
- package/ui/primitives/separator.tsx +26 -0
- package/ui/primitives/sheet.tsx +90 -0
- package/ui/primitives/skeleton.tsx +7 -0
- package/ui/primitives/sonner.tsx +22 -0
- package/ui/primitives/tabs.tsx +51 -0
- package/ui/primitives/textarea.tsx +22 -0
- package/ui/primitives/tooltip.tsx +31 -0
- package/ui/pwa/client-error-reporter.tsx +62 -0
- package/ui/pwa/register-sw.tsx +50 -0
- package/ui/range-filters.tsx +174 -0
- package/ui/search/global-search-config.ts +32 -0
- package/ui/search/global-search-provider.tsx +528 -0
- package/ui/search/search-history.ts +74 -0
- package/ui/search-input.tsx +146 -0
- package/ui/settings/account-settings.tsx +140 -0
- package/ui/settings/agent-profile-settings.tsx +184 -0
- package/ui/settings/api-keys-settings.tsx +349 -0
- package/ui/settings/desktop-background-settings.tsx +128 -0
- package/ui/settings/desktop-connection-settings.tsx +251 -0
- package/ui/settings/desktop-embed-env-panel.tsx +257 -0
- package/ui/settings/desktop-fleet-telemetry-settings.tsx +269 -0
- package/ui/settings/desktop-hermes-settings.tsx +341 -0
- package/ui/settings/desktop-llm-keys.tsx +192 -0
- package/ui/settings/desktop-n8n-settings.tsx +306 -0
- package/ui/settings/desktop-tunnel.tsx +264 -0
- package/ui/settings/desktop-update-settings.tsx +175 -0
- package/ui/settings/factory-reset-settings.tsx +89 -0
- package/ui/settings/host-only-settings.tsx +62 -0
- package/ui/settings/locked-config-field.tsx +30 -0
- package/ui/settings/ops-diagnostic-settings.tsx +242 -0
- package/ui/settings/search-reindex-settings.tsx +158 -0
- package/ui/settings/server-mode-cards.tsx +801 -0
- package/ui/theme/tailwind-preset.cjs +82 -0
- package/ui/theme/theme.css +328 -0
- package/ui/workspace/ai-activity-panel-host.tsx +19 -0
- package/ui/workspace/ai-workspace-agent-host.tsx +54 -0
- package/ui/workspace/ai-workspace-banner.tsx +168 -0
- package/ui/workspace/impersonation-banner.tsx +39 -0
- package/ui/workspace/keep-alive.tsx +220 -0
- package/ui/workspace/tab-workspace-context.tsx +1172 -0
- package/ui/workspace/tab-workspace-host.ts +89 -0
- package/ui/workspace/types.ts +500 -0
- package/ui/workspace/use-location-search.tsx +50 -0
- package/ui/workspace/window-chrome-controls.tsx +116 -0
- package/ui/workspace/workspace-config.ts +47 -0
- package/ui/workspace/workspace-root.tsx +147 -0
- package/ui/workspace/workspace-shell.tsx +292 -0
- package/ui/workspace/workspace-tab-bar.tsx +572 -0
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Bus client de réactivité data (mutations → UI).
|
|
4
|
+
*
|
|
5
|
+
* Contrat :
|
|
6
|
+
* - Émetteurs : `emitDataChanged({ resource, ids?, source })` après une
|
|
7
|
+
* mutation confirmée (UI, fetch qui lit le header API, tool MCP/assistant).
|
|
8
|
+
* - Consommateurs : `subscribeDataChanged` / hook UI `useCreezioResource`
|
|
9
|
+
* (rafraîchit la page ouverte sans reload manuel).
|
|
10
|
+
*
|
|
11
|
+
* Header HTTP homonyme (EntitySpec / mounts) : `x-creezio-data-changed`
|
|
12
|
+
* (valeur = resource, CSV si plusieurs). Le fetch interceptor kit le
|
|
13
|
+
* transforme en événement navigateur.
|
|
14
|
+
*
|
|
15
|
+
* Tools MCP / assistant : `inferResourceFromToolName(toolName)` → resource
|
|
16
|
+
* (ou null si lecture). Convention `module.<owner>.<action>` + table d'alias
|
|
17
|
+
* + préfixes d'écriture legacy (`add_to_*`, `create_*`, …).
|
|
18
|
+
*/
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
exports.CREEZIO_DATA_CHANGED_HEADER = exports.CREEZIO_DATA_CHANGED_EVENT = void 0;
|
|
21
|
+
exports.emitDataChanged = emitDataChanged;
|
|
22
|
+
exports.subscribeDataChanged = subscribeDataChanged;
|
|
23
|
+
exports.parseDataChangedHeader = parseDataChangedHeader;
|
|
24
|
+
exports.inferResourceFromToolName = inferResourceFromToolName;
|
|
25
|
+
exports.installCreezioDataChangedFetch = installCreezioDataChangedFetch;
|
|
26
|
+
exports.resetDataChangedFetchForTests = resetDataChangedFetchForTests;
|
|
27
|
+
exports.CREEZIO_DATA_CHANGED_EVENT = "creezio:data-changed";
|
|
28
|
+
exports.CREEZIO_DATA_CHANGED_HEADER = "x-creezio-data-changed";
|
|
29
|
+
function emitDataChanged(detail) {
|
|
30
|
+
if (typeof window === "undefined")
|
|
31
|
+
return;
|
|
32
|
+
const resource = String(detail.resource || "").trim();
|
|
33
|
+
if (!resource)
|
|
34
|
+
return;
|
|
35
|
+
window.dispatchEvent(new CustomEvent(exports.CREEZIO_DATA_CHANGED_EVENT, {
|
|
36
|
+
detail: {
|
|
37
|
+
resource,
|
|
38
|
+
ids: detail.ids,
|
|
39
|
+
source: detail.source,
|
|
40
|
+
at: detail.at ?? Date.now(),
|
|
41
|
+
},
|
|
42
|
+
}));
|
|
43
|
+
}
|
|
44
|
+
function subscribeDataChanged(handler, opts) {
|
|
45
|
+
if (typeof window === "undefined")
|
|
46
|
+
return () => { };
|
|
47
|
+
const wanted = opts?.resource
|
|
48
|
+
? new Set((Array.isArray(opts.resource) ? opts.resource : [opts.resource]).map((r) => r.trim()))
|
|
49
|
+
: null;
|
|
50
|
+
const onEvent = (e) => {
|
|
51
|
+
const detail = e.detail;
|
|
52
|
+
if (!detail?.resource)
|
|
53
|
+
return;
|
|
54
|
+
if (wanted && !wanted.has(detail.resource))
|
|
55
|
+
return;
|
|
56
|
+
handler(detail);
|
|
57
|
+
};
|
|
58
|
+
window.addEventListener(exports.CREEZIO_DATA_CHANGED_EVENT, onEvent);
|
|
59
|
+
return () => window.removeEventListener(exports.CREEZIO_DATA_CHANGED_EVENT, onEvent);
|
|
60
|
+
}
|
|
61
|
+
/** Parse le header `x-creezio-data-changed` (CSV) → resources. */
|
|
62
|
+
function parseDataChangedHeader(value) {
|
|
63
|
+
if (!value)
|
|
64
|
+
return [];
|
|
65
|
+
return value
|
|
66
|
+
.split(",")
|
|
67
|
+
.map((s) => s.trim())
|
|
68
|
+
.filter(Boolean);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Alias owner / stem outil → resource UI (`useCreezioResource`).
|
|
72
|
+
* Les clés sont en minuscules ; valeurs = id resource bus.
|
|
73
|
+
*/
|
|
74
|
+
const TOOL_OWNER_TO_RESOURCE = {
|
|
75
|
+
panier: "panier",
|
|
76
|
+
cart: "panier",
|
|
77
|
+
commande: "commandes",
|
|
78
|
+
commandes: "commandes",
|
|
79
|
+
sku: "skus",
|
|
80
|
+
skus: "skus",
|
|
81
|
+
produit: "produits",
|
|
82
|
+
product: "produits",
|
|
83
|
+
products: "produits",
|
|
84
|
+
produits: "produits",
|
|
85
|
+
catalog: "produits",
|
|
86
|
+
catalogue: "produits",
|
|
87
|
+
fournisseur: "fournisseurs",
|
|
88
|
+
fournisseurs: "fournisseurs",
|
|
89
|
+
supplier: "fournisseurs",
|
|
90
|
+
vendor: "fournisseurs",
|
|
91
|
+
client: "clients",
|
|
92
|
+
customers: "clients",
|
|
93
|
+
customer: "clients",
|
|
94
|
+
clients: "clients",
|
|
95
|
+
task: "tasks",
|
|
96
|
+
tasks: "tasks",
|
|
97
|
+
tache: "tasks",
|
|
98
|
+
taches: "tasks",
|
|
99
|
+
todo: "tasks",
|
|
100
|
+
todos: "tasks",
|
|
101
|
+
ai_task: "tasks",
|
|
102
|
+
ai_collaborator: "tasks",
|
|
103
|
+
mail: "mails",
|
|
104
|
+
mails: "mails",
|
|
105
|
+
email: "mails",
|
|
106
|
+
emails: "mails",
|
|
107
|
+
promo: "promotions",
|
|
108
|
+
promotion: "promotions",
|
|
109
|
+
promotions: "promotions",
|
|
110
|
+
stack: "stack",
|
|
111
|
+
prix: "prix",
|
|
112
|
+
releve: "prix",
|
|
113
|
+
releves: "prix",
|
|
114
|
+
releves_prix: "prix",
|
|
115
|
+
optimiser: "optimiser",
|
|
116
|
+
conditions: "conditions",
|
|
117
|
+
data_mapping: "data_mapping",
|
|
118
|
+
widget: "widgets",
|
|
119
|
+
widgets: "widgets",
|
|
120
|
+
};
|
|
121
|
+
/** Verbes / préfixes d'action clairement lecture seule. */
|
|
122
|
+
const READ_ACTION_RE = /^(get|list|search|find|read|count|describe|schema|status|suggest|scenario|graph|stats|rfa)(_|$)/;
|
|
123
|
+
/** Préfixes d'écriture legacy (`add_to_panier`, `create_ai_task`, …). */
|
|
124
|
+
const WRITE_PREFIX_RE = /^(?:add_to_|add_|create_|update_|delete_|close_|set_|remove_|archive_|upsert_|patch_|answer_)/;
|
|
125
|
+
function normalizeOwnerStem(raw) {
|
|
126
|
+
return raw
|
|
127
|
+
.replace(/_ligne$/, "")
|
|
128
|
+
.replace(/_item$/, "")
|
|
129
|
+
.replace(/_line$/, "")
|
|
130
|
+
.replace(/_entry$/, "");
|
|
131
|
+
}
|
|
132
|
+
function resourceFromOwner(owner) {
|
|
133
|
+
const key = normalizeOwnerStem(owner.trim().toLowerCase());
|
|
134
|
+
if (!key)
|
|
135
|
+
return null;
|
|
136
|
+
return TOOL_OWNER_TO_RESOURCE[key] ?? key;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Heuristique tool MCP / assistant → resource (écriture).
|
|
140
|
+
* Retourne null si tool probablement lecture seule.
|
|
141
|
+
*
|
|
142
|
+
* Conventions supportées :
|
|
143
|
+
* 1. `module.<owner>.<action>` — action lecture → null ; sinon resource(owner)
|
|
144
|
+
* 2. Contient panier/cart / promotions… (mots-clés métier)
|
|
145
|
+
* 3. Préfixes d'écriture legacy → stem → resource
|
|
146
|
+
*/
|
|
147
|
+
function inferResourceFromToolName(toolName) {
|
|
148
|
+
const n = String(toolName || "").trim().toLowerCase();
|
|
149
|
+
if (!n)
|
|
150
|
+
return null;
|
|
151
|
+
// 1) Convention module.<owner>.<action>[_…]
|
|
152
|
+
const mod = /^module\.([a-z0-9_-]+)\.([a-z0-9_.-]+)$/.exec(n);
|
|
153
|
+
if (mod) {
|
|
154
|
+
const owner = mod[1];
|
|
155
|
+
const action = mod[2];
|
|
156
|
+
if (READ_ACTION_RE.test(action))
|
|
157
|
+
return null;
|
|
158
|
+
return resourceFromOwner(owner);
|
|
159
|
+
}
|
|
160
|
+
// Lecture seule legacy (préfixe ou suffixe)
|
|
161
|
+
if (/^(get_|list_|search_|find_|read_|count_|describe_|schema_)/.test(n) ||
|
|
162
|
+
n.endsWith("_get") ||
|
|
163
|
+
n.endsWith("_list") ||
|
|
164
|
+
n.endsWith("_search")) {
|
|
165
|
+
return null;
|
|
166
|
+
}
|
|
167
|
+
// 2) Mots-clés métier (outil plat ou composé)
|
|
168
|
+
if (/panier|cart/.test(n))
|
|
169
|
+
return "panier";
|
|
170
|
+
if (/promotions?|promo\b/.test(n))
|
|
171
|
+
return "promotions";
|
|
172
|
+
if (/\bstack\b|add_to_stack|remove_from_stack/.test(n))
|
|
173
|
+
return "stack";
|
|
174
|
+
if (/commande/.test(n))
|
|
175
|
+
return "commandes";
|
|
176
|
+
if (/\bskus?\b/.test(n))
|
|
177
|
+
return "skus";
|
|
178
|
+
if (/produit|product|catalog/.test(n))
|
|
179
|
+
return "produits";
|
|
180
|
+
if (/fournisseur|supplier|vendor/.test(n))
|
|
181
|
+
return "fournisseurs";
|
|
182
|
+
if (/client|customer/.test(n))
|
|
183
|
+
return "clients";
|
|
184
|
+
if (/task|tache|todo|ai_task|ai_collaborator|ai_question/.test(n)) {
|
|
185
|
+
return "tasks";
|
|
186
|
+
}
|
|
187
|
+
if (/mail|email/.test(n))
|
|
188
|
+
return "mails";
|
|
189
|
+
if (/optimiser/.test(n))
|
|
190
|
+
return "optimiser";
|
|
191
|
+
if (/conditions?|rfa/.test(n))
|
|
192
|
+
return "conditions";
|
|
193
|
+
if (/releve|prix/.test(n))
|
|
194
|
+
return "prix";
|
|
195
|
+
// 3) Préfixes d'écriture → stem
|
|
196
|
+
if (WRITE_PREFIX_RE.test(n)) {
|
|
197
|
+
const stem = n
|
|
198
|
+
.replace(WRITE_PREFIX_RE, "")
|
|
199
|
+
.replace(/_ligne$/, "")
|
|
200
|
+
.replace(/_item$/, "");
|
|
201
|
+
if (!stem)
|
|
202
|
+
return null;
|
|
203
|
+
// create_ai_task → ai_task ; add_to_panier déjà couvert plus haut
|
|
204
|
+
return resourceFromOwner(stem);
|
|
205
|
+
}
|
|
206
|
+
return null;
|
|
207
|
+
}
|
|
208
|
+
let fetchPatched = false;
|
|
209
|
+
/**
|
|
210
|
+
* Intercepte `window.fetch` une fois : si la réponse porte
|
|
211
|
+
* `x-creezio-data-changed`, émet le bus client (source `api`).
|
|
212
|
+
*/
|
|
213
|
+
function installCreezioDataChangedFetch() {
|
|
214
|
+
if (typeof window === "undefined" || fetchPatched)
|
|
215
|
+
return;
|
|
216
|
+
const original = window.fetch.bind(window);
|
|
217
|
+
fetchPatched = true;
|
|
218
|
+
window.fetch = async (input, init) => {
|
|
219
|
+
const res = await original(input, init);
|
|
220
|
+
try {
|
|
221
|
+
const header = res.headers.get(exports.CREEZIO_DATA_CHANGED_HEADER);
|
|
222
|
+
for (const resource of parseDataChangedHeader(header)) {
|
|
223
|
+
emitDataChanged({ resource, source: "api" });
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
catch {
|
|
227
|
+
/* ignore */
|
|
228
|
+
}
|
|
229
|
+
return res;
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
/** Tests uniquement. */
|
|
233
|
+
function resetDataChangedFetchForTests() {
|
|
234
|
+
fetchPatched = false;
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=data-changed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-changed.js","sourceRoot":"","sources":["../../src/lib/data-changed.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SERVER_COCKPIT_PATH = exports.CRM_HOME_PATH = void 0;
|
|
4
|
+
exports.defaultHomePathSync = defaultHomePathSync;
|
|
5
|
+
exports.resolveDesktopHomePath = resolveDesktopHomePath;
|
|
6
|
+
const brand_js_1 = require("../brand.js");
|
|
7
|
+
/** Accueil CRM classique (Client / legacy / navigateur). */
|
|
8
|
+
exports.CRM_HOME_PATH = "/dashboard";
|
|
9
|
+
/** Surface ops de l'app desktop Serveur (kind=server). */
|
|
10
|
+
exports.SERVER_COCKPIT_PATH = "/server-cockpit";
|
|
11
|
+
/**
|
|
12
|
+
* Chemin d'accueil par défaut hors contexte desktop (SSR, navigateur).
|
|
13
|
+
*/
|
|
14
|
+
function defaultHomePathSync() {
|
|
15
|
+
return exports.CRM_HOME_PATH;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Après onboarding / skip / login sans `?next=` : cockpit serveur si
|
|
19
|
+
* `desktop:info` signale appKind=server, sinon dashboard CRM.
|
|
20
|
+
*/
|
|
21
|
+
async function resolveDesktopHomePath() {
|
|
22
|
+
if (typeof window === "undefined")
|
|
23
|
+
return exports.CRM_HOME_PATH;
|
|
24
|
+
try {
|
|
25
|
+
const info = await (0, brand_js_1.getShellDesktopApi)()?.getInfo?.();
|
|
26
|
+
if (info?.appKind === "server")
|
|
27
|
+
return exports.SERVER_COCKPIT_PATH;
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
/* hors desktop ou IPC indisponible */
|
|
31
|
+
}
|
|
32
|
+
return exports.CRM_HOME_PATH;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=desktop-home-path.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"desktop-home-path.js","sourceRoot":"","sources":["../../src/lib/desktop-home-path.ts"],"names":[],"mappings":";;;AAUA,kDAEC;AAMD,wDASC;AA3BD,0CAAiD;AACjD,4DAA4D;AAC/C,QAAA,aAAa,GAAG,YAAY,CAAC;AAE1C,0DAA0D;AAC7C,QAAA,mBAAmB,GAAG,iBAAiB,CAAC;AAErD;;GAEG;AACH,SAAgB,mBAAmB;IACjC,OAAO,qBAAa,CAAC;AACvB,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,sBAAsB;IAC1C,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO,qBAAa,CAAC;IACxD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,IAAA,6BAAkB,GAAE,EAAE,OAAO,EAAE,EAAE,CAAC;QACrD,IAAI,IAAI,EAAE,OAAO,KAAK,QAAQ;YAAE,OAAO,2BAAmB,CAAC;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,sCAAsC;IACxC,CAAC;IACD,OAAO,qBAAa,CAAC;AACvB,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Distance géodésique (haversine) — logique pure, testable.
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.haversineKm = haversineKm;
|
|
7
|
+
const EARTH_RADIUS_KM = 6371;
|
|
8
|
+
function toRad(deg) {
|
|
9
|
+
return (deg * Math.PI) / 180;
|
|
10
|
+
}
|
|
11
|
+
/** Distance en km entre deux points WGS84. Retourne null si coords invalides. */
|
|
12
|
+
function haversineKm(lat1, lng1, lat2, lng2) {
|
|
13
|
+
if (lat1 == null ||
|
|
14
|
+
lng1 == null ||
|
|
15
|
+
lat2 == null ||
|
|
16
|
+
lng2 == null ||
|
|
17
|
+
!Number.isFinite(lat1) ||
|
|
18
|
+
!Number.isFinite(lng1) ||
|
|
19
|
+
!Number.isFinite(lat2) ||
|
|
20
|
+
!Number.isFinite(lng2)) {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
const dLat = toRad(lat2 - lat1);
|
|
24
|
+
const dLng = toRad(lng2 - lng1);
|
|
25
|
+
const a = Math.sin(dLat / 2) ** 2 +
|
|
26
|
+
Math.cos(toRad(lat1)) * Math.cos(toRad(lat2)) * Math.sin(dLng / 2) ** 2;
|
|
27
|
+
const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
|
|
28
|
+
return Math.round(EARTH_RADIUS_KM * c * 10) / 10;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=geo-distance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geo-distance.js","sourceRoot":"","sources":["../../src/lib/geo-distance.ts"],"names":[],"mappings":";AAAA;;GAEG;;AASH,kCAyBC;AAhCD,MAAM,eAAe,GAAG,IAAI,CAAC;AAE7B,SAAS,KAAK,CAAC,GAAW;IACxB,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;AAC/B,CAAC;AAED,iFAAiF;AACjF,SAAgB,WAAW,CACzB,IAA+B,EAC/B,IAA+B,EAC/B,IAA+B,EAC/B,IAA+B;IAE/B,IACE,IAAI,IAAI,IAAI;QACZ,IAAI,IAAI,IAAI;QACZ,IAAI,IAAI,IAAI;QACZ,IAAI,IAAI,IAAI;QACZ,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;QACtB,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;QACtB,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;QACtB,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EACtB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IAChC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IAChC,MAAM,CAAC,GACL,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;QACvB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;IAC1E,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACzD,OAAO,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC;AACnD,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.thumbUrl = thumbUrl;
|
|
4
|
+
/**
|
|
5
|
+
* Réécrit les URLs d'images externes vers leur variante miniature CDN.
|
|
6
|
+
* Évite de charger des originaux de 20+ Mpx dans des cartes de 300 px.
|
|
7
|
+
*/
|
|
8
|
+
const WIKIMEDIA_SIZES = [330, 500, 960]; // seules tailles acceptées par upload.wikimedia.org
|
|
9
|
+
function thumbUrl(url, width = 500) {
|
|
10
|
+
if (!url)
|
|
11
|
+
return null;
|
|
12
|
+
let u;
|
|
13
|
+
try {
|
|
14
|
+
u = new URL(url);
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return url;
|
|
18
|
+
}
|
|
19
|
+
if (u.host === "upload.wikimedia.org" &&
|
|
20
|
+
u.pathname.includes("/commons/") &&
|
|
21
|
+
!u.pathname.includes("/thumb/")) {
|
|
22
|
+
const size = WIKIMEDIA_SIZES.find((s) => s >= width) ?? 960;
|
|
23
|
+
const file = u.pathname.split("/").pop();
|
|
24
|
+
if (!file)
|
|
25
|
+
return url;
|
|
26
|
+
return `https://upload.wikimedia.org${u.pathname.replace("/commons/", "/commons/thumb/")}/${size}px-${file}`;
|
|
27
|
+
}
|
|
28
|
+
if (u.host === "images.pexels.com") {
|
|
29
|
+
u.search = "";
|
|
30
|
+
u.searchParams.set("auto", "compress");
|
|
31
|
+
u.searchParams.set("cs", "tinysrgb");
|
|
32
|
+
u.searchParams.set("w", String(width));
|
|
33
|
+
return u.toString();
|
|
34
|
+
}
|
|
35
|
+
if (u.host === "images.unsplash.com") {
|
|
36
|
+
u.searchParams.set("auto", "format");
|
|
37
|
+
u.searchParams.set("w", String(width));
|
|
38
|
+
u.searchParams.set("q", "70");
|
|
39
|
+
return u.toString();
|
|
40
|
+
}
|
|
41
|
+
return url; // S3 fournisseur et autres : inchangé
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=img.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"img.js","sourceRoot":"","sources":["../../src/lib/img.ts"],"names":[],"mappings":";;AAMA,4BAuCC;AA7CD;;;GAGG;AACH,MAAM,eAAe,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAU,CAAC,CAAC,oDAAoD;AAEtG,SAAgB,QAAQ,CAAC,GAA8B,EAAE,KAAK,GAAG,GAAG;IAClE,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,IAAI,CAAM,CAAC;IACX,IAAI,CAAC;QACH,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,CAAC;IACb,CAAC;IAED,IACE,CAAC,CAAC,IAAI,KAAK,sBAAsB;QACjC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC;QAChC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,EAC/B,CAAC;QACD,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC;QAC5D,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QACzC,IAAI,CAAC,IAAI;YAAE,OAAO,GAAG,CAAC;QACtB,OAAO,+BAA+B,CAAC,CAAC,QAAQ,CAAC,OAAO,CACtD,WAAW,EACX,iBAAiB,CAClB,IAAI,IAAI,MAAM,IAAI,EAAE,CAAC;IACxB,CAAC;IAED,IAAI,CAAC,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;QACnC,CAAC,CAAC,MAAM,GAAG,EAAE,CAAC;QACd,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QACvC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QACrC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACvC,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;IACtB,CAAC;IAED,IAAI,CAAC,CAAC,IAAI,KAAK,qBAAqB,EAAE,CAAC;QACrC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QACrC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACvC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC9B,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;IACtB,CAAC;IAED,OAAO,GAAG,CAAC,CAAC,sCAAsC;AACpD,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Politique d'éviction keep-alive (pur / testable).
|
|
4
|
+
* Les panes fullscreen (`/site/*` + matchers marque) ne sont jamais évincées.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.configureKeepAliveFullscreenMatchers = configureKeepAliveFullscreenMatchers;
|
|
8
|
+
exports.isKeepAliveProtectedKey = isKeepAliveProtectedKey;
|
|
9
|
+
exports.rankKeepAliveEvictionKeys = rankKeepAliveEvictionKeys;
|
|
10
|
+
const DASHBOARD_PATH = "/dashboard";
|
|
11
|
+
/** Matchers fullscreen injectables (marque) — ex. canvas Optimiser TF. */
|
|
12
|
+
let fullscreenMatchers = [];
|
|
13
|
+
function configureKeepAliveFullscreenMatchers(matchers) {
|
|
14
|
+
fullscreenMatchers = matchers;
|
|
15
|
+
}
|
|
16
|
+
function normalizeHref(href) {
|
|
17
|
+
try {
|
|
18
|
+
const url = new URL(href, "http://local.invalid");
|
|
19
|
+
const path = url.pathname === "/" ? DASHBOARD_PATH : url.pathname || "/";
|
|
20
|
+
const search = url.search || "";
|
|
21
|
+
return `${path}${search}`;
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return href.split("#")[0] || "/";
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function isExternalSiteHref(href) {
|
|
28
|
+
const path = normalizeHref(href).split("?")[0] || "/";
|
|
29
|
+
return path === "/site" || path.startsWith("/site/");
|
|
30
|
+
}
|
|
31
|
+
function isFullscreenHref(href) {
|
|
32
|
+
if (isExternalSiteHref(href))
|
|
33
|
+
return true;
|
|
34
|
+
return fullscreenMatchers.some((m) => m(href));
|
|
35
|
+
}
|
|
36
|
+
function isKeepAliveProtectedKey(key) {
|
|
37
|
+
return isFullscreenHref(normalizeHref(key));
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Clés évinçables (plus anciennes d'abord), hors display/route et hors protégées.
|
|
41
|
+
*/
|
|
42
|
+
function rankKeepAliveEvictionKeys(keys, lastActiveAt, opts) {
|
|
43
|
+
return keys
|
|
44
|
+
.filter((key) => key !== opts.displayKey &&
|
|
45
|
+
key !== opts.routeKey &&
|
|
46
|
+
!isKeepAliveProtectedKey(key))
|
|
47
|
+
.sort((a, b) => (lastActiveAt[a] || 0) - (lastActiveAt[b] || 0));
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=keepalive-eviction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keepalive-eviction.js","sourceRoot":"","sources":["../../src/lib/keepalive-eviction.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAOH,oFAIC;AAuBD,0DAEC;AAKD,8DAaC;AApDD,MAAM,cAAc,GAAG,YAAY,CAAC;AAEpC,0EAA0E;AAC1E,IAAI,kBAAkB,GAAqC,EAAE,CAAC;AAE9D,SAAgB,oCAAoC,CAClD,QAA0C;IAE1C,kBAAkB,GAAG,QAAQ,CAAC;AAChC,CAAC;AAED,SAAS,aAAa,CAAC,IAAY;IACjC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,sBAAsB,CAAC,CAAC;QAClD,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,KAAK,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC;QACzE,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC;QAChC,OAAO,GAAG,IAAI,GAAG,MAAM,EAAE,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;IACnC,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAY;IACtC,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;IACtD,OAAO,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAY;IACpC,IAAI,kBAAkB,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1C,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,SAAgB,uBAAuB,CAAC,GAAW;IACjD,OAAO,gBAAgB,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED;;GAEG;AACH,SAAgB,yBAAyB,CACvC,IAAc,EACd,YAAoC,EACpC,IAA8C;IAE9C,OAAO,IAAI;SACR,MAAM,CACL,CAAC,GAAG,EAAE,EAAE,CACN,GAAG,KAAK,IAAI,CAAC,UAAU;QACvB,GAAG,KAAK,IAAI,CAAC,QAAQ;QACrB,CAAC,uBAAuB,CAAC,GAAG,CAAC,CAChC;SACA,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACrE,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Boîte noire — émission d'événements ops depuis le SERVEUR Next.
|
|
4
|
+
*
|
|
5
|
+
* Le serveur tourne en sous-process du main Electron : une ligne
|
|
6
|
+
* `TF2EVENT {json}` sur stdout est captée par le hook logger du main
|
|
7
|
+
* (voir `@creezio/observability` initOpsJournal). En mode serveur pur (Docker), la ligne
|
|
8
|
+
* reste un simple log console — inoffensif.
|
|
9
|
+
*
|
|
10
|
+
* Volontairement autonome (pas d'import electron/) pour respecter la
|
|
11
|
+
* frontière de build Next.
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.trackServer = trackServer;
|
|
15
|
+
exports.trackServerDebounced = trackServerDebounced;
|
|
16
|
+
const TF2EVENT_PREFIX = "TF2EVENT ";
|
|
17
|
+
function trackServer(evt) {
|
|
18
|
+
try {
|
|
19
|
+
// eslint-disable-next-line no-console
|
|
20
|
+
console.log(`${TF2EVENT_PREFIX}${JSON.stringify({ ...evt, source: "next" })}`);
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
/* best-effort : jamais de throw depuis l'instrumentation */
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
const lastSentByKey = new Map();
|
|
27
|
+
/**
|
|
28
|
+
* Variante anti-spam : au plus un événement par `kind+outcome` toutes les
|
|
29
|
+
* `intervalMs` (5 min par défaut) — pour les chemins chauds (fallback SQL
|
|
30
|
+
* appelé à chaque recherche quand Meili est down).
|
|
31
|
+
*/
|
|
32
|
+
function trackServerDebounced(evt, intervalMs = 5 * 60_000) {
|
|
33
|
+
const key = `${evt.kind}|${evt.outcome || ""}`;
|
|
34
|
+
const now = Date.now();
|
|
35
|
+
const last = lastSentByKey.get(key) || 0;
|
|
36
|
+
if (now - last < intervalMs)
|
|
37
|
+
return;
|
|
38
|
+
lastSentByKey.set(key, now);
|
|
39
|
+
trackServer(evt);
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=ops-track.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ops-track.js","sourceRoot":"","sources":["../../src/lib/ops-track.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;AAgBH,kCAOC;AASD,oDAOC;AArCD,MAAM,eAAe,GAAG,WAAW,CAAC;AAcpC,SAAgB,WAAW,CAAC,GAAmB;IAC7C,IAAI,CAAC;QACH,sCAAsC;QACtC,OAAO,CAAC,GAAG,CAAC,GAAG,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;IACjF,CAAC;IAAC,MAAM,CAAC;QACP,4DAA4D;IAC9D,CAAC;AACH,CAAC;AAED,MAAM,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAC;AAEhD;;;;GAIG;AACH,SAAgB,oBAAoB,CAAC,GAAmB,EAAE,UAAU,GAAG,CAAC,GAAG,MAAM;IAC/E,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;IAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,GAAG,GAAG,IAAI,GAAG,UAAU;QAAE,OAAO;IACpC,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC5B,WAAW,CAAC,GAAG,CAAC,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Réécrit les URLs de covers (secteurs / catégories) vers une taille vignette.
|
|
4
|
+
* Les /img/familles/*.webp locaux sont déjà optimisés — pass-through.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.optimizeCoverUrl = optimizeCoverUrl;
|
|
8
|
+
const DEFAULT_WIDTH = 640;
|
|
9
|
+
/** Wikimedia Commons : fichier full → thumb 640px. */
|
|
10
|
+
function wikimediaThumb(url, width) {
|
|
11
|
+
try {
|
|
12
|
+
const u = new URL(url);
|
|
13
|
+
if (!u.hostname.endsWith("wikimedia.org") && !u.hostname.endsWith("wikipedia.org")) {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
// Déjà un thumb
|
|
17
|
+
if (u.pathname.includes("/thumb/")) {
|
|
18
|
+
// Remplacer la largeur du thumb si présente (…/640px-Foo.jpg)
|
|
19
|
+
return url.replace(/\/\d+px-([^/]+)$/, `/${width}px-$1`);
|
|
20
|
+
}
|
|
21
|
+
// /wikipedia/commons/a/ab/File.jpg → /wikipedia/commons/thumb/a/ab/File.jpg/640px-File.jpg
|
|
22
|
+
const m = u.pathname.match(/^(\/wikipedia\/commons\/)([0-9a-f]\/[0-9a-f]{2}\/)([^/]+)$/i);
|
|
23
|
+
if (!m)
|
|
24
|
+
return null;
|
|
25
|
+
const file = m[3];
|
|
26
|
+
u.pathname = `${m[1]}thumb/${m[2]}${file}/${width}px-${file}`;
|
|
27
|
+
return u.toString();
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
function pexelsSized(url, width) {
|
|
34
|
+
try {
|
|
35
|
+
const u = new URL(url);
|
|
36
|
+
if (!u.hostname.includes("pexels.com"))
|
|
37
|
+
return null;
|
|
38
|
+
u.searchParams.set("auto", "compress");
|
|
39
|
+
u.searchParams.set("cs", "tinysrgb");
|
|
40
|
+
u.searchParams.set("w", String(width));
|
|
41
|
+
u.searchParams.set("fit", "crop");
|
|
42
|
+
return u.toString();
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
function unsplashSized(url, width) {
|
|
49
|
+
try {
|
|
50
|
+
const u = new URL(url);
|
|
51
|
+
if (!u.hostname.includes("unsplash.com"))
|
|
52
|
+
return null;
|
|
53
|
+
u.searchParams.set("w", String(width));
|
|
54
|
+
u.searchParams.set("q", "75");
|
|
55
|
+
u.searchParams.set("auto", "format");
|
|
56
|
+
u.searchParams.set("fit", "crop");
|
|
57
|
+
return u.toString();
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Retourne une URL adaptée à une vignette ~width CSS pixels (×2 DPR géré par le navigateur
|
|
65
|
+
* sur les CDNs qui le supportent ; Wikimedia/Pexels reçoivent width logique).
|
|
66
|
+
*/
|
|
67
|
+
function optimizeCoverUrl(url, width = DEFAULT_WIDTH) {
|
|
68
|
+
if (!url)
|
|
69
|
+
return null;
|
|
70
|
+
const trimmed = url.trim();
|
|
71
|
+
if (!trimmed)
|
|
72
|
+
return null;
|
|
73
|
+
// Assets locaux déjà compressés
|
|
74
|
+
if (trimmed.startsWith("/img/"))
|
|
75
|
+
return trimmed;
|
|
76
|
+
if (!/^https?:\/\//i.test(trimmed))
|
|
77
|
+
return trimmed;
|
|
78
|
+
return (wikimediaThumb(trimmed, width) ||
|
|
79
|
+
pexelsSized(trimmed, width) ||
|
|
80
|
+
unsplashSized(trimmed, width) ||
|
|
81
|
+
trimmed);
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=optimize-cover-url.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"optimize-cover-url.js","sourceRoot":"","sources":["../../src/lib/optimize-cover-url.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/** Trails admin / loading plateforme (O9) — trails métier restent marque. */
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.trailForRequestLogs = trailForRequestLogs;
|
|
5
|
+
exports.trailForAnalytics = trailForAnalytics;
|
|
6
|
+
exports.trailForLoading = trailForLoading;
|
|
7
|
+
function trailForRequestLogs() {
|
|
8
|
+
return [
|
|
9
|
+
{ href: "/admin/request-logs", label: "Admin" },
|
|
10
|
+
{ label: "Logs API / MCP" },
|
|
11
|
+
];
|
|
12
|
+
}
|
|
13
|
+
function trailForAnalytics() {
|
|
14
|
+
return [
|
|
15
|
+
{ href: "/admin/analytics", label: "Admin" },
|
|
16
|
+
{ label: "Analytics" },
|
|
17
|
+
];
|
|
18
|
+
}
|
|
19
|
+
function trailForLoading(listHref, listLabel) {
|
|
20
|
+
return [
|
|
21
|
+
{ href: listHref, label: listLabel },
|
|
22
|
+
{ label: "Chargement…" },
|
|
23
|
+
];
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=page-trails.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page-trails.js","sourceRoot":"","sources":["../../src/lib/page-trails.ts"],"names":[],"mappings":";AAAA,6EAA6E;;AAI7E,kDAKC;AAED,8CAKC;AAED,0CAKC;AAnBD,SAAgB,mBAAmB;IACjC,OAAO;QACL,EAAE,IAAI,EAAE,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE;QAC/C,EAAE,KAAK,EAAE,gBAAgB,EAAE;KAC5B,CAAC;AACJ,CAAC;AAED,SAAgB,iBAAiB;IAC/B,OAAO;QACL,EAAE,IAAI,EAAE,kBAAkB,EAAE,KAAK,EAAE,OAAO,EAAE;QAC5C,EAAE,KAAK,EAAE,WAAW,EAAE;KACvB,CAAC;AACJ,CAAC;AAED,SAAgB,eAAe,CAAC,QAAgB,EAAE,SAAiB;IACjE,OAAO;QACL,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE;QACpC,EAAE,KAAK,EAAE,aAAa,EAAE;KACzB,CAAC;AACJ,CAAC"}
|