@usefragment/core 0.0.0 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/README.md +10 -17
  2. package/dist/index.d.ts +85 -74
  3. package/package.json +2 -3
package/README.md CHANGED
@@ -1,12 +1,8 @@
1
1
  # @usefragment/core
2
2
 
3
- Le **contrat de types public** de [Fragment](https://github.com/RebornFlamme/Fragment)
4
- (alias Promethium) — le module hôte `fragment` que les plugins importent.
3
+ The public **type contract** of [Fragment](https://github.com/RebornFlamme/Fragment) — the `fragment` host module that plugins import.
5
4
 
6
- Package **de types uniquement** : il ne contient aucun JavaScript. À l'exécution,
7
- l'hôte injecte les vraies valeurs (`fragmentApi`) via son shim `require('fragment')`
8
- — exactement comme le package `obsidian`. Ton bundler laisse donc `fragment` en
9
- *external* ; ce package ne sert qu'à ton compilateur pour typer l'import.
5
+ A **types-only** package: it ships no JavaScript. At runtime the host injects the real values (`fragmentApi`) through its `require('fragment')` shim — exactly like the `obsidian` package does. Your bundler therefore keeps `fragment` external; this package exists only so your compiler can type the import.
10
6
 
11
7
  ## Installation
12
8
 
@@ -16,8 +12,7 @@ npm install --save-dev @usefragment/core
16
12
 
17
13
  ## Configuration
18
14
 
19
- Ajoute le package à `types` dans ton `tsconfig.json` pour charger les modules
20
- ambiants (`fragment`, et les alias `promethium` / `obsidian`) :
15
+ Add the package to `types` in your `tsconfig.json` so the ambient modules (`fragment`, and the `obsidian` compatibility alias) are loaded:
21
16
 
22
17
  ```jsonc
23
18
  {
@@ -27,28 +22,26 @@ ambiants (`fragment`, et les alias `promethium` / `obsidian`) :
27
22
  }
28
23
  ```
29
24
 
30
- Et marque `fragment` en external dans ton bundler (esbuild) :
25
+ And mark `fragment` as external in your bundler (esbuild):
31
26
 
32
27
  ```js
33
28
  esbuild.build({ /* … */ external: ['fragment', 'electron', '@codemirror/*'] });
34
29
  ```
35
30
 
36
- ## Utilisation
31
+ ## Usage
37
32
 
38
33
  ```ts
39
34
  import { Plugin, Notice, type Command } from 'fragment';
40
35
 
41
- export default class MonPlugin extends Plugin {
36
+ export default class MyPlugin extends Plugin {
42
37
  async onload() {
43
- this.addCommand({ id: 'hello', name: 'Dire bonjour', callback: () => new Notice('👋') });
38
+ this.addCommand({ id: 'hello', name: 'Say hello', callback: () => new Notice('👋') });
44
39
  }
45
40
  }
46
41
  ```
47
42
 
48
- Les auteurs qui écrivent des extensions CodeMirror installent en plus
49
- `@codemirror/state` (peer dependency optionnelle).
43
+ Authors writing CodeMirror extensions should also install `@codemirror/state` (an optional peer dependency).
50
44
 
51
- ## Versionnage
45
+ ## Versioning
52
46
 
53
- Publié depuis le monorepo Fragment via [Changesets](https://github.com/changesets/changesets),
54
- indépendamment des versions du client. Voir le `CHANGELOG.md`.
47
+ Published from the Fragment monorepo via [Changesets](https://github.com/changesets/changesets), independently of the app releases. See `CHANGELOG.md`.
package/dist/index.d.ts CHANGED
@@ -161,6 +161,10 @@ declare class DragManager extends Events {
161
161
  private moveGhost;
162
162
  endDrag(): void;
163
163
  }
164
+ declare class ExternalError extends Error {
165
+ readonly code: number;
166
+ constructor(code: number, message: string);
167
+ }
164
168
  declare class HotkeyManager {
165
169
  /** id de commande → raccourcis par défaut. Jamais persistés. */
166
170
  defaultKeys: Record<string, Hotkey[]>;
@@ -532,6 +536,12 @@ declare class WorkspaceTabs extends WorkspaceParent {
532
536
  */
533
537
  private updateTabOutline;
534
538
  }
539
+ declare function compileModifiers(modifiers: Modifier[], plateforme?: Plateforme): string;
540
+ declare function decompileModifiers(compiles: string, plateforme?: Plateforme): Modifier[];
541
+ declare function getModifiers(evt: Pick<KeyboardEvent, "ctrlKey" | "metaKey" | "altKey" | "shiftKey">): string;
542
+ declare function isMatch(liaison: Liaison, ctx: KeymapContext): boolean;
543
+ declare function isModifier(evt: Pick<KeyboardEvent, "ctrlKey" | "metaKey" | "altKey" | "shiftKey">, modifier: Modifier, plateforme?: Plateforme): boolean;
544
+ declare function isModifierKey(key: string): boolean;
535
545
  declare global {
536
546
  interface Window {
537
547
  app: App;
@@ -817,6 +827,8 @@ export declare class App {
817
827
  * Câblé au boot (bootApp.tsx) depuis window.electron.cli ; le cœur et les
818
828
  * plugins passent par ici plutôt que de toucher window.electron. */
819
829
  cliHost: CliHost;
830
+ /** L'identité de cette instance (coffre, userData, version). Voir InstanceInfo. */
831
+ instance: InstanceInfo;
820
832
  keymap: Keymap;
821
833
  scope: Scope;
822
834
  hotkeyManager: HotkeyManager;
@@ -825,11 +837,10 @@ export declare class App {
825
837
  embedRegistry: Registry<unknown>;
826
838
  commands: CommandManager;
827
839
  icons: Registry<string>;
828
- protocolHandlers: Registry<ProtocolHandler>;
829
840
  codeBlockProcessors: Registry<CodeBlockProcessor>;
830
841
  propertyWidgets: Registry<unknown>;
831
842
  layers: Registry<LayerSpec>;
832
- cliHandlers: Registry<CliHandlerSpec>;
843
+ externalCommands: Registry<ExternalCommandSpec>;
833
844
  postProcessors: OrderedRegistry<MarkdownPostProcessor>;
834
845
  editorExtensions: OrderedRegistry<Extension>;
835
846
  ribbonItems: OrderedRegistry<RibbonItem>;
@@ -839,23 +850,18 @@ export declare class App {
839
850
  registries: InspectableRegistry[];
840
851
  lastEvent: Event | null;
841
852
  constructor();
842
- /** §15 — une URL arrive, on cherche l'action MAINTENANT dans la table. */
843
- handleProtocol(action: string, params: Record<string, string>): void;
853
+ /**
854
+ * §15 — une URL `fragment://<action>?params` arrive. Même port que le CLI
855
+ * (`externalCommands`, via dispatchExternal), mais l'URL est fire-and-forget :
856
+ * elle IGNORE le code de sortie et ne renvoie rien. Un échec se voit dans la
857
+ * console (et, plus tard, via une Notice). Le câblage OS qui APPELLE ceci
858
+ * (setAsDefaultProtocolClient, open-url) reste à faire — voir main.ts.
859
+ */
860
+ handleProtocol(action: string, params: ExternalParams): void;
844
861
  private cleLocale;
845
862
  loadLocalStorage(key: string): unknown;
846
863
  saveLocalStorage(key: string, data: unknown): void;
847
864
  }
848
- /**
849
- * Une erreur qui PORTE un code de sortie.
850
- *
851
- * Un handler qui lève n'importe quoi rend EXIT.HANDLER_ERROR (1) avec la pile.
852
- * Un handler qui lève une CliError choisit son code — « commande introuvable »
853
- * n'est pas un plantage, c'est un 7, et un script doit pouvoir les distinguer.
854
- */
855
- export declare class CliError extends Error {
856
- readonly code: number;
857
- constructor(code: number, message: string);
858
- }
859
865
  export declare class Component {
860
866
  _children: Component[];
861
867
  _cleanups: (() => void)[];
@@ -921,34 +927,12 @@ export declare class Keymap {
921
927
  popScope(scope: Scope): void;
922
928
  /** Public pour que les tests puissent injecter une frappe sans DOM. */
923
929
  handleKeyEvent(evt: KeyboardEvent): boolean | void;
924
- /** Les modificateurs d'un événement, en forme canonique. */
925
- static getModifiers(evt: Pick<KeyboardEvent, "ctrlKey" | "metaKey" | "altKey" | "shiftKey">): string;
926
- /** `['Mod','Shift']` → `"Ctrl,Shift"`. Résout, trie, joint. */
927
- static compileModifiers(modifiers: Modifier[], plateforme?: Plateforme): string;
928
- /**
929
- * L'inverse — pour AFFICHER une liaison enregistrée en dur.
930
- *
931
- * Le modificateur natif de la plateforme redevient `Mod`, ce qui est la
932
- * bonne réponse à « comment nommer cette combinaison à l'utilisateur ? ».
933
- */
934
- static decompileModifiers(compiles: string, plateforme?: Plateforme): Modifier[];
935
- static isModifierKey(key: string): boolean;
936
- /** Ce modificateur-là est-il enfoncé ? `Mod` se résout selon la plateforme. */
937
- static isModifier(evt: Pick<KeyboardEvent, "ctrlKey" | "metaKey" | "altKey" | "shiftKey">, modifier: Modifier, plateforme?: Plateforme): boolean;
938
- /**
939
- * La liaison correspond-elle à la frappe ?
940
- *
941
- * ★ Les modificateurs sont comparés à l'IDENTIQUE, pas par inclusion :
942
- * `Mod+P` ne se déclenche PAS sur `Mod+Shift+P`. Sans quoi tout raccourci
943
- * serait le préfixe de tous ses sur-ensembles.
944
- *
945
- * ★ La touche est acceptée sur `vkey` (emplacement physique) OU sur `key`
946
- * sans tenir compte de la casse. Le second point n'est pas une commodité :
947
- * `Shift+A` produit `key === 'A'` tandis que `A` seul produit `'a'`, et
948
- * une liaison écrite `'A'` doit marcher dans les deux cas — la
949
- * différenciation par Shift est déjà faite par les modificateurs.
950
- */
951
- static isMatch(liaison: Liaison, ctx: KeymapContext): boolean;
930
+ static getModifiers: typeof getModifiers;
931
+ static compileModifiers: typeof compileModifiers;
932
+ static decompileModifiers: typeof decompileModifiers;
933
+ static isModifierKey: typeof isModifierKey;
934
+ static isModifier: typeof isModifier;
935
+ static isMatch: typeof isMatch;
952
936
  /**
953
937
  * §8.5 — l'événement demande-t-il une ouverture ailleurs ?
954
938
  *
@@ -1920,6 +1904,13 @@ export declare class WorkspaceLeaf extends WorkspaceItem {
1920
1904
  setPinned(pinned: boolean): void;
1921
1905
  togglePinned(): void;
1922
1906
  }
1907
+ /**
1908
+ * Une erreur qui PORTE un code de sortie — alias d'`ExternalError`, la MÊME classe.
1909
+ * Donc `new CliError(7, '…')` et `err instanceof CliError` marchent partout, et un
1910
+ * plugin Obsidian qui lève une CliError reste compris. Le code de sortie fin
1911
+ * (`command introuvable` = 7…) se choisit ici ; à défaut, un throw donne 1.
1912
+ */
1913
+ export declare const CliError: typeof ExternalError;
1923
1914
  /**
1924
1915
  * Les codes de sortie — stables, documentés, testables.
1925
1916
  *
@@ -2011,14 +2002,6 @@ export declare function renderMatches(el: HTMLElement, text: string, matches: Se
2011
2002
  * l'absence est un état normal, même philosophie que les vues (§8.3).
2012
2003
  */
2013
2004
  export declare function setIcon(el: HTMLElement, name: string): void;
2014
- /** Une entrée du registre `app.cliHandlers`. */
2015
- export interface CliHandlerSpec {
2016
- /** L'id complet : `help`, `commands`, ou `templater:create-from-template`. */
2017
- command: string;
2018
- description: string;
2019
- flags: CliFlags;
2020
- handler: CliHandler;
2021
- }
2022
2005
  /**
2023
2006
  * Les capacités CLI que le processus principal fournit au renderer. Injecté au
2024
2007
  * boot ; jamais construit par le cœur (qui n'a pas le droit de toucher
@@ -2337,6 +2320,19 @@ export interface EditorTransactionSpec {
2337
2320
  /** Amène la sélection à l'écran. */
2338
2321
  scrollIntoView?: boolean;
2339
2322
  }
2323
+ /** Une entrée du registre `app.externalCommands`. */
2324
+ export interface ExternalCommandSpec {
2325
+ /** L'id complet : `help`, `command`, ou `templater:create` (préfixé pour les plugins). */
2326
+ action: string;
2327
+ description: string;
2328
+ /**
2329
+ * Doc des paramètres acceptés, pour l'aide : nom → description. Un nom qui se
2330
+ * termine par `=` attend une valeur (`id=`), sinon c'est un drapeau (`total`).
2331
+ * Purement documentaire — rien n'est validé contre.
2332
+ */
2333
+ params: Record<string, string>;
2334
+ handler: ExternalHandler;
2335
+ }
2340
2336
  export interface FileStats {
2341
2337
  ctime: number;
2342
2338
  mtime: number;
@@ -2366,6 +2362,26 @@ export interface InspectableRegistry {
2366
2362
  owner: string;
2367
2363
  }>;
2368
2364
  }
2365
+ /**
2366
+ * L'identité de CETTE instance — le coffre ouvert, où sont ses données, quelle
2367
+ * version. Générique (pas CLI) : tout ce qui écrit par-instance ou coordonne des
2368
+ * fenêtres (sync, backup, un jour le multi-fenêtre) lit ici, plutôt que de
2369
+ * reconstruire ces chemins depuis `shared/cli/*`.
2370
+ *
2371
+ * ★ « Fenêtre active » n'est PAS modélisé aujourd'hui : un coffre = une fenêtre =
2372
+ * une instance (racineDuCoffre vient de process.argv, un seul coffre par
2373
+ * renderer). Le jour où le multi-fenêtre arrive, ce type s'élargit ici.
2374
+ */
2375
+ export interface InstanceInfo {
2376
+ /** La racine absolue du coffre (== racineDuCoffre()). */
2377
+ vaultPath: string;
2378
+ /** Le nom du dossier du coffre (== vault.getName()). */
2379
+ vaultName: string;
2380
+ /** Le dossier userData d'Electron — où vit l'index des instances CLI, p.ex. */
2381
+ userDataDir: string;
2382
+ /** La version de Fragment (== app.version). */
2383
+ appVersion: string;
2384
+ }
2369
2385
  export interface Instruction {
2370
2386
  /** La touche, telle qu'affichée : '↑↓', '↵', 'esc'. */
2371
2387
  command: string;
@@ -2769,22 +2785,18 @@ export interface WorkspaceLayout {
2769
2785
  export type CliBridge = {
2770
2786
  [K in keyof IpcInvokeMapping as StripCliPrefix<K>]: IpcInvokeMapping[K];
2771
2787
  };
2788
+ /** Ce qu'un handler reçoit : les `clé=valeur`, plus chaque `--drapeau` en `'true'`. */
2789
+ export type CliData = ExternalParams;
2790
+ export type CliError = ExternalError;
2772
2791
  /**
2773
- * Ce qu'un handler reçoit : les `clé=valeur` de la ligne, plus chaque
2774
- * `--drapeau` sous la forme `drapeau: 'true'`.
2775
- */
2776
- export type CliData = Record<string, string>;
2777
- /**
2778
- * Ce qu'un handler ACCEPTE, pour `help` : nom → description. Un nom qui se
2779
- * termine par `=` attend une valeur (`id=`), sinon c'est un drapeau (`total`).
2780
- * Purement documentaire — rien n'est validé contre.
2792
+ * Ce qu'un handler ACCEPTE, pour `help` : nom → description. Un nom qui se termine
2793
+ * par `=` attend une valeur (`id=`), sinon c'est un drapeau (`total`). Documentaire.
2781
2794
  */
2782
2795
  export type CliFlags = Record<string, string>;
2783
- /**
2784
- * Le handler. Il REND sa sortie — il n'écrit pas dans stdout, il n'a pas de
2785
- * stdout. Ce qu'il rend est imprimé tel quel par le client.
2786
- */
2787
- export type CliHandler = (params: CliData) => string | Promise<string>;
2796
+ /** Le handler. Il REND sa sortie — il n'écrit pas dans stdout, il n'en a pas. */
2797
+ export type CliHandler = ExternalHandler;
2798
+ /** Une entrée du registre `app.externalCommands` (alias fidèle d'ExternalCommandSpec). */
2799
+ export type CliHandlerSpec = ExternalCommandSpec;
2788
2800
  /** Ce que le serveur répond. */
2789
2801
  export type CliResult = {
2790
2802
  ok: true;
@@ -2804,6 +2816,13 @@ export type DragData = {
2804
2816
  file: TFile;
2805
2817
  };
2806
2818
  export type DropZone = "reorder" | "split-top" | "split-bottom" | "split-left" | "split-right" | "center";
2819
+ /**
2820
+ * Le handler. Il REND sa sortie — il n'écrit pas dans stdout, il n'en a pas. Ce
2821
+ * qu'il rend est imprimé tel quel par le CLI ; l'URL, elle, l'ignore.
2822
+ */
2823
+ export type ExternalHandler = (params: ExternalParams) => string | Promise<string>;
2824
+ /** Les paramètres d'une requête : un dico de chaînes (un drapeau vaut 'true'). */
2825
+ export type ExternalParams = Record<string, string>;
2807
2826
  /** De quel côté du texte se trouve une marge. */
2808
2827
  export type GutterSide = "left" | "right";
2809
2828
  // ─── Canaux requête/réponse : ipcRenderer.invoke ↔ ipcMain.handle ───────────
@@ -2859,8 +2878,6 @@ export type IpcInvokeMapping = {
2859
2878
  // ─── Le retour de la TROISIÈME forme (voir IpcRequestMapping) ──────
2860
2879
  /** Le renderer rend la réponse à une 'ipc:request', corrélée par son id. */
2861
2880
  "ipc:reply": (id: string, result: unknown) => Promise<void>;
2862
- /** Le renderer annonce que boot() est passé et que 'cli:exec' est posé. */
2863
- "cli:ready": () => Promise<void>;
2864
2881
  /**
2865
2882
  * `fragment eval` : le renderer demande au main d'évaluer `code` DANS le
2866
2883
  * renderer lui-même, par webContents.executeJavaScript — qui n'est pas
@@ -2918,8 +2935,6 @@ export type OverlayPlane = "viewport" | "document";
2918
2935
  export type PaneType = "tab" | "split" | "window";
2919
2936
  export type Plateforme = "macOS" | "autre";
2920
2937
  export type PluginConstructor = new (app: App, manifest: PluginManifest) => Plugin$1;
2921
- /** §15 — fragment://<action>?params */
2922
- export type ProtocolHandler = (params: Record<string, string>) => unknown;
2923
2938
  /**
2924
2939
  * La quatrième famille du pont : recevoir des requêtes du main. Pas de
2925
2940
  * préfixe à retirer ici — la seule dérivation utile est celle de
@@ -3055,9 +3070,9 @@ export {};
3055
3070
  // Pied de page ambient, concaténé en fin de dist/index.d.ts par le build.
3056
3071
  //
3057
3072
  // Le package expose le contrat comme module `@usefragment/core`, mais l'auteur
3058
- // d'un plugin importe depuis 'fragment' (ou les alias 'promethium'/'obsidian')
3073
+ // d'un plugin importe depuis 'fragment' (ou l'alias 'obsidian')
3059
3074
  // qu'il marque en external — l'hôte les résout à l'exécution (resoudreModuleHote).
3060
- // Ces re-déclarations ambiantes typent ces trois specifiers côté consommateur,
3075
+ // Ces re-déclarations ambiantes typent ces deux specifiers côté consommateur,
3061
3076
  // qui a @usefragment/core installé. Il ajoute `"types": ["@usefragment/core"]` (ou
3062
3077
  // un `import '@usefragment/core';`) pour charger ces blocs.
3063
3078
  // ═══════════════════════════════════════════════════════════════════════════
@@ -3066,10 +3081,6 @@ declare module 'fragment' {
3066
3081
  export * from '@usefragment/core';
3067
3082
  }
3068
3083
 
3069
- declare module 'promethium' {
3070
- export * from '@usefragment/core';
3071
- }
3072
-
3073
3084
  declare module 'obsidian' {
3074
3085
  export * from '@usefragment/core';
3075
3086
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@usefragment/core",
3
- "version": "0.0.0",
4
- "description": "Contrat de types public de Fragment (Promethium) — le module hôte `fragment` pour les plugins.",
3
+ "version": "0.1.0",
4
+ "description": "Public type contract for Fragment — the `fragment` host module that plugins import.",
5
5
  "license": "MIT",
6
6
  "type": "module",
7
7
  "types": "./dist/index.d.ts",
@@ -16,7 +16,6 @@
16
16
  "sideEffects": false,
17
17
  "keywords": [
18
18
  "fragment",
19
- "promethium",
20
19
  "obsidian",
21
20
  "plugin",
22
21
  "types"