feat: l'IDE devient la vue par défaut + deep-link worktree unifié
Route / redirige vers /ide ; le dashboard passe à /dashboard (nom inchangé). /workspace/:repoId/:wt rend désormais l'IDE (IdeShell) : au montage il décode la clé, active et déplie le worktree ciblé, ouvre ?file= le cas échéant. WorkspaceView et useWorkspaceLayout retirés. encode/decodeWtKey déplacés dans @arboretum/shared (source unique) avec décodeur TOLÉRANT (base64url OU chemin percent-encodé), corrigeant la divergence historique du deep-link VS Code. config.ts de l'extension aligné sur encodeWtKey. Tests wt-key (shared) + config (vscode) mis à jour. 431 tests.
This commit is contained in:
33
packages/shared/src/wt-key.ts
Normal file
33
packages/shared/src/wt-key.ts
Normal file
@@ -0,0 +1,33 @@
|
||||
// Encodage du chemin absolu d'un worktree pour le segment d'URL /workspace/:repoId/:wt.
|
||||
// Source unique partagée par le front web ET l'extension VS Code (deep-link), pour éviter toute
|
||||
// divergence d'encodage. base64url (sans +, /, =) donne un segment propre et réversible.
|
||||
|
||||
/** Encode un chemin absolu en base64url (sûr en segment d'URL). */
|
||||
export function encodeWtKey(path: string): string {
|
||||
const b64 = btoa(unescape(encodeURIComponent(path)));
|
||||
return b64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
|
||||
}
|
||||
|
||||
/**
|
||||
* Décode une clé de worktree vers son chemin absolu. Tolérant à deux formats historiques :
|
||||
* - base64url (front web, encodeWtKey) ;
|
||||
* - chemin percent-encodé (ancien deep-link VS Code via encodeURIComponent) : reconnaissable au
|
||||
* caractère `%` que le base64url ne contient jamais.
|
||||
* Ne lève pas : renvoie la clé telle quelle en dernier recours.
|
||||
*/
|
||||
export function decodeWtKey(key: string): string {
|
||||
if (key.includes('%')) {
|
||||
try {
|
||||
return decodeURIComponent(key);
|
||||
} catch {
|
||||
return key;
|
||||
}
|
||||
}
|
||||
const b64 = key.replace(/-/g, '+').replace(/_/g, '/');
|
||||
const pad = b64.length % 4 === 0 ? '' : '='.repeat(4 - (b64.length % 4));
|
||||
try {
|
||||
return decodeURIComponent(escape(atob(b64 + pad)));
|
||||
} catch {
|
||||
return key;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user