@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.
- package/README.md +10 -17
- package/dist/index.d.ts +85 -74
- package/package.json +2 -3
package/README.md
CHANGED
|
@@ -1,12 +1,8 @@
|
|
|
1
1
|
# @usefragment/core
|
|
2
2
|
|
|
3
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
##
|
|
31
|
+
## Usage
|
|
37
32
|
|
|
38
33
|
```ts
|
|
39
34
|
import { Plugin, Notice, type Command } from 'fragment';
|
|
40
35
|
|
|
41
|
-
export default class
|
|
36
|
+
export default class MyPlugin extends Plugin {
|
|
42
37
|
async onload() {
|
|
43
|
-
this.addCommand({ id: 'hello', name: '
|
|
38
|
+
this.addCommand({ id: 'hello', name: 'Say hello', callback: () => new Notice('👋') });
|
|
44
39
|
}
|
|
45
40
|
}
|
|
46
41
|
```
|
|
47
42
|
|
|
48
|
-
|
|
49
|
-
`@codemirror/state` (peer dependency optionnelle).
|
|
43
|
+
Authors writing CodeMirror extensions should also install `@codemirror/state` (an optional peer dependency).
|
|
50
44
|
|
|
51
|
-
##
|
|
45
|
+
## Versioning
|
|
52
46
|
|
|
53
|
-
|
|
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
|
-
|
|
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
|
-
/**
|
|
843
|
-
|
|
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
|
-
|
|
925
|
-
static
|
|
926
|
-
|
|
927
|
-
static
|
|
928
|
-
|
|
929
|
-
|
|
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
|
|
2774
|
-
*
|
|
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
|
-
|
|
2785
|
-
|
|
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
|
|
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
|
|
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.
|
|
4
|
-
"description": "
|
|
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"
|