@etrepum/lexical-builder 0.0.15-nightly.20240607.0 → 0.0.15

Sign up to get free protection for your applications and to get access to all the features.
@@ -21,5 +21,5 @@ export interface AutoFocusConfig {
21
21
  * A Plan to focus the LexicalEditor when the root element is set
22
22
  * (typically only when the editor is first created).
23
23
  */
24
- export declare const AutoFocusPlan: import('@etrepum/lexical-builder').LexicalPlan<AutoFocusConfig, "@etrepum/lexical-builder/AutoFocusPlan">;
24
+ export declare const AutoFocusPlan: import('@etrepum/lexical-builder').LexicalPlan<AutoFocusConfig, "@etrepum/lexical-builder/AutoFocusPlan", unknown>;
25
25
  //# sourceMappingURL=AutoFocusPlan.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AutoFocusPlan.d.ts","sourceRoot":"","sources":["../src/AutoFocusPlan.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,QAAQ,0BAA0B,CAAC;IACxC,UAAU,mBAAmB;QAC3B,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,OAAO,aAAa,CAAC;KAC5C;CACF;AAED,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,gBAAgB,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;CAC5C;AAED;;;GAGG;AACH,eAAO,MAAM,aAAa,2GAwBxB,CAAC"}
1
+ {"version":3,"file":"AutoFocusPlan.d.ts","sourceRoot":"","sources":["../src/AutoFocusPlan.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,QAAQ,0BAA0B,CAAC;IACxC,UAAU,mBAAmB;QAC3B,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,OAAO,aAAa,CAAC;KAC5C;CACF;AAED,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,gBAAgB,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;CAC5C;AAED;;;GAGG;AACH,eAAO,MAAM,aAAa,oHAwBxB,CAAC"}
@@ -9,5 +9,5 @@
9
9
  * Add Dragon speech to text input support to the editor, via the
10
10
  * @lexical/dragon module.
11
11
  */
12
- export declare const DragonPlan: import('@etrepum/lexical-builder').LexicalPlan<{}, "@lexical/dragon">;
12
+ export declare const DragonPlan: import('@etrepum/lexical-builder').LexicalPlan<{}, "@lexical/dragon", unknown>;
13
13
  //# sourceMappingURL=DragonPlan.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"DragonPlan.d.ts","sourceRoot":"","sources":["../src/DragonPlan.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH;;;GAGG;AACH,eAAO,MAAM,UAAU,uEAIrB,CAAC"}
1
+ {"version":3,"file":"DragonPlan.d.ts","sourceRoot":"","sources":["../src/DragonPlan.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH;;;GAGG;AACH,eAAO,MAAM,UAAU,gFAIrB,CAAC"}
@@ -20,5 +20,5 @@ export interface HistoryConfig {
20
20
  * Registers necessary listeners to manage undo/redo history stack and related
21
21
  * editor commands, via the @lexical/history module.
22
22
  */
23
- export declare const HistoryPlan: import('@etrepum/lexical-builder').LexicalPlan<HistoryConfig, "@etrepum/lexical-builder/HistoryPlan">;
23
+ export declare const HistoryPlan: import('@etrepum/lexical-builder').LexicalPlan<HistoryConfig, "@etrepum/lexical-builder/HistoryPlan", unknown>;
24
24
  //# sourceMappingURL=HistoryPlan.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"HistoryPlan.d.ts","sourceRoot":"","sources":["../src/HistoryPlan.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAEL,KAAK,YAAY,EAElB,MAAM,kBAAkB,CAAC;AAM1B,OAAO,QAAQ,0BAA0B,CAAC;IACxC,UAAU,mBAAmB;QAC3B,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,OAAO,WAAW,CAAC;KACxC;CACF;AAED,MAAM,WAAW,aAAa;IAC5B;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,yBAAyB,EAAE,MAAM,YAAY,CAAC;CAC/C;AAED;;;GAGG;AACH,eAAO,MAAM,WAAW,uGAStB,CAAC"}
1
+ {"version":3,"file":"HistoryPlan.d.ts","sourceRoot":"","sources":["../src/HistoryPlan.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAEL,KAAK,YAAY,EAElB,MAAM,kBAAkB,CAAC;AAM1B,OAAO,QAAQ,0BAA0B,CAAC;IACxC,UAAU,mBAAmB;QAC3B,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,OAAO,WAAW,CAAC;KACxC;CACF;AAED,MAAM,WAAW,aAAa;IAC5B;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,yBAAyB,EAAE,MAAM,YAAY,CAAC;CAC/C;AAED;;;GAGG;AACH,eAAO,MAAM,WAAW,gHAStB,CAAC"}
@@ -44,6 +44,7 @@ export declare class LexicalBuilder {
44
44
  /** Look up the editor that was created by this LexicalBuilder or undefined */
45
45
  static fromEditor(editor: LexicalEditor): LexicalBuilder | undefined;
46
46
  buildEditor(): EditorHandle;
47
+ getPlanRep<Plan extends AnyLexicalPlan>(plan: Plan): PlanRep<Plan> | undefined;
47
48
  addPlan(arg: AnyLexicalPlanArgument): number;
48
49
  sortedPlanReps(): Generator<PlanRep<AnyLexicalPlan>, void, undefined>;
49
50
  registerEditor(editor: LexicalEditor): () => void;
@@ -1 +1 @@
1
- {"version":3,"file":"LexicalBuilder.d.ts","sourceRoot":"","sources":["../src/LexicalBuilder.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EACV,cAAc,EACd,sBAAsB,EACtB,YAAY,EAEb,MAAM,SAAS,CAAC;AAEjB,OAAO,EACL,aAAa,EAEb,KAAK,gBAAgB,EAKtB,MAAM,SAAS,CAAC;AAKjB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,sBAAsB,EAC5B,GAAG,KAAK,EAAE,sBAAsB,EAAE,GACjC,YAAY,CAOd;AA+BD,gBAAgB;AAChB,qBAAa,cAAc;IACzB,MAAM,EAAE,GAAG,CAAC,cAAc,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC;IACvD,OAAO,EAAE,GAAG,CAAC,cAAc,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IAChE,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC;IAClD,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;;IAU/B,8EAA8E;IAC9E,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,cAAc,GAAG,SAAS;IAIpE,WAAW,IAAI,YAAY;IAmB3B,OAAO,CAAC,GAAG,EAAE,sBAAsB,GAAG,MAAM;IA4E3C,cAAc;IAMf,cAAc,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,IAAI;IA6BjD,qBAAqB;CAqFtB"}
1
+ {"version":3,"file":"LexicalBuilder.d.ts","sourceRoot":"","sources":["../src/LexicalBuilder.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EACV,cAAc,EACd,sBAAsB,EACtB,YAAY,EAEb,MAAM,SAAS,CAAC;AAEjB,OAAO,EACL,aAAa,EAEb,KAAK,gBAAgB,EAKtB,MAAM,SAAS,CAAC;AAKjB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,sBAAsB,EAC5B,GAAG,KAAK,EAAE,sBAAsB,EAAE,GACjC,YAAY,CAOd;AA+BD,gBAAgB;AAChB,qBAAa,cAAc;IACzB,MAAM,EAAE,GAAG,CAAC,cAAc,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC;IACvD,OAAO,EAAE,GAAG,CAAC,cAAc,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IAChE,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC;IAClD,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;;IAU/B,8EAA8E;IAC9E,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,cAAc,GAAG,SAAS;IAIpE,WAAW,IAAI,YAAY;IAmB3B,UAAU,CAAC,IAAI,SAAS,cAAc,EACpC,IAAI,EAAE,IAAI,GACT,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS;IAQ5B,OAAO,CAAC,GAAG,EAAE,sBAAsB,GAAG,MAAM;IA4E3C,cAAc;IAMf,cAAc,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,IAAI;IAqBjD,qBAAqB;CAqFtB"}
@@ -1,5 +1,5 @@
1
1
  /**
2
2
  * A plan to register @lexical/plain-text behavior
3
3
  */
4
- export declare const PlainTextPlan: import('@etrepum/lexical-builder').LexicalPlan<{}, "@lexical/plain-text">;
4
+ export declare const PlainTextPlan: import('@etrepum/lexical-builder').LexicalPlan<{}, "@lexical/plain-text", unknown>;
5
5
  //# sourceMappingURL=PlainTextPlan.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"PlainTextPlan.d.ts","sourceRoot":"","sources":["../src/PlainTextPlan.ts"],"names":[],"mappings":"AAWA;;GAEG;AACH,eAAO,MAAM,aAAa,2EAKxB,CAAC"}
1
+ {"version":3,"file":"PlainTextPlan.d.ts","sourceRoot":"","sources":["../src/PlainTextPlan.ts"],"names":[],"mappings":"AAWA;;GAEG;AACH,eAAO,MAAM,aAAa,oFAKxB,CAAC"}
package/dist/PlanRep.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import { LexicalBuilder } from './LexicalBuilder';
2
- import { AnyLexicalPlan, LexicalPlanConfig } from './types';
2
+ import { AnyLexicalPlan, LexicalPlanConfig, LexicalPlanDependency, LexicalPlanOutput } from './types';
3
3
  import { LexicalPlanRegistry } from '@etrepum/lexical-builder';
4
+ import { LexicalEditor } from 'lexical';
4
5
 
5
6
  /**
6
7
  * @internal
@@ -9,10 +10,14 @@ export declare class PlanRep<Plan extends AnyLexicalPlan> {
9
10
  builder: LexicalBuilder;
10
11
  configs: Set<Partial<LexicalPlanConfig<Plan>>>;
11
12
  _config?: LexicalPlanConfig<Plan>;
13
+ _dependency?: LexicalPlanDependency<Plan>;
14
+ _output?: LexicalPlanOutput<Plan>;
12
15
  plan: Plan;
13
16
  constructor(builder: LexicalBuilder, plan: Plan);
14
- getPeerConfig<Name extends keyof LexicalPlanRegistry>(name: string): undefined | LexicalPlanConfig<LexicalPlanRegistry[Name]>;
15
- getDependencyConfig<Dependency extends AnyLexicalPlan>(dep: Dependency): LexicalPlanConfig<Dependency>;
17
+ register(editor: LexicalEditor, signal: AbortSignal): () => void;
18
+ getPeer<Name extends keyof LexicalPlanRegistry>(name: string): undefined | LexicalPlanDependency<LexicalPlanRegistry[Name]>;
19
+ getDependency<Dependency extends AnyLexicalPlan>(dep: Dependency): LexicalPlanDependency<Dependency>;
20
+ getPlanDependency(): LexicalPlanDependency<Plan>;
16
21
  getConfig(): LexicalPlanConfig<Plan>;
17
22
  }
18
23
  //# sourceMappingURL=PlanRep.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"PlanRep.d.ts","sourceRoot":"","sources":["../src/PlanRep.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAMpE;;GAEG;AACH,qBAAa,OAAO,CAAC,IAAI,SAAS,cAAc;IAC9C,OAAO,EAAE,cAAc,CAAC;IACxB,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,EAAE,IAAI,CAAC;gBACC,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,IAAI;IAK/C,aAAa,CAAC,IAAI,SAAS,MAAM,mBAAmB,EAClD,IAAI,EAAE,MAAM,GACX,SAAS,GAAG,iBAAiB,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAI3D,mBAAmB,CAAC,UAAU,SAAS,cAAc,EACnD,GAAG,EAAE,UAAU,GACd,iBAAiB,CAAC,UAAU,CAAC;IAUhC,SAAS,IAAI,iBAAiB,CAAC,IAAI,CAAC;CAcrC"}
1
+ {"version":3,"file":"PlanRep.d.ts","sourceRoot":"","sources":["../src/PlanRep.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EACV,cAAc,EACd,iBAAiB,EACjB,qBAAqB,EACrB,iBAAiB,EAClB,MAAM,SAAS,CAAC;AACjB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAKpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAG7C;;GAEG;AACH,qBAAa,OAAO,CAAC,IAAI,SAAS,cAAc;IAC9C,OAAO,EAAE,cAAc,CAAC;IACxB,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAClC,WAAW,CAAC,EAAE,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAC1C,OAAO,CAAC,EAAE,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,EAAE,IAAI,CAAC;gBACC,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,IAAI;IAK/C,QAAQ,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,GAAG,MAAM,IAAI;IAahE,OAAO,CAAC,IAAI,SAAS,MAAM,mBAAmB,EAC5C,IAAI,EAAE,MAAM,GACX,SAAS,GAAG,qBAAqB,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAQ/D,aAAa,CAAC,UAAU,SAAS,cAAc,EAC7C,GAAG,EAAE,UAAU,GACd,qBAAqB,CAAC,UAAU,CAAC;IAWpC,iBAAiB,IAAI,qBAAqB,CAAC,IAAI,CAAC;IAchD,SAAS,IAAI,iBAAiB,CAAC,IAAI,CAAC;CAarC"}
@@ -9,5 +9,5 @@
9
9
  * A plan to register @lexical/rich-text behavior and nodes
10
10
  * ({@link HeadingNode}, {@link QuoteNode})
11
11
  */
12
- export declare const RichTextPlan: import('@etrepum/lexical-builder').LexicalPlan<{}, "@lexical/rich-text">;
12
+ export declare const RichTextPlan: import('@etrepum/lexical-builder').LexicalPlan<{}, "@lexical/rich-text", unknown>;
13
13
  //# sourceMappingURL=RichTextPlan.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"RichTextPlan.d.ts","sourceRoot":"","sources":["../src/RichTextPlan.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH;;;GAGG;AACH,eAAO,MAAM,YAAY,0EAMvB,CAAC"}
1
+ {"version":3,"file":"RichTextPlan.d.ts","sourceRoot":"","sources":["../src/RichTextPlan.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH;;;GAGG;AACH,eAAO,MAAM,YAAY,mFAMvB,CAAC"}
@@ -1,4 +1,4 @@
1
- import { LexicalPlan, NormalizedLexicalPlanArgument, PlanConfigBase } from './types';
1
+ import { LexicalPlan, NormalizedLexicalPlanArgument, PlanConfigBase, RegisterCleanup } from './types';
2
2
 
3
3
  /**
4
4
  * Define a LexicalPlan from the given object literal. TypeScript will
@@ -34,7 +34,7 @@ import { LexicalPlan, NormalizedLexicalPlanArgument, PlanConfigBase } from './ty
34
34
  * });
35
35
  * ```
36
36
  */
37
- export declare function definePlan<Config extends PlanConfigBase, Name extends string>(plan: LexicalPlan<Config, Name>): LexicalPlan<Config, Name>;
37
+ export declare function definePlan<Config extends PlanConfigBase, Name extends string, Output>(plan: LexicalPlan<Config, Name, Output>): LexicalPlan<Config, Name, Output>;
38
38
  /**
39
39
  * Define a LexicalPlan from the given object literal, assigning an
40
40
  * empty config and the name "[root]". This plan must only be used
@@ -53,7 +53,7 @@ export declare function definePlan<Config extends PlanConfigBase, Name extends s
53
53
  * );
54
54
  * ```
55
55
  */
56
- export declare function defineRootPlan(rootPlan: Omit<LexicalPlan<PlanConfigBase, "[root]">, "config" | "name">): LexicalPlan<PlanConfigBase, "[root]">;
56
+ export declare function defineRootPlan(rootPlan: Omit<LexicalPlan<PlanConfigBase, "[root]", unknown>, "config" | "name">): LexicalPlan<PlanConfigBase, "[root]", unknown>;
57
57
  /**
58
58
  * Override a partial of the configuration of a Plan, to be used
59
59
  * in the dependencies array of another plan, or as
@@ -78,5 +78,6 @@ export declare function defineRootPlan(rootPlan: Omit<LexicalPlan<PlanConfigBase
78
78
  * });
79
79
  * ```
80
80
  */
81
- export declare function configPlan<Config extends PlanConfigBase, Name extends string>(...args: NormalizedLexicalPlanArgument<Config, Name>): NormalizedLexicalPlanArgument<Config, Name>;
81
+ export declare function configPlan<Config extends PlanConfigBase, Name extends string, Output>(...args: NormalizedLexicalPlanArgument<Config, Name, Output>): NormalizedLexicalPlanArgument<Config, Name, Output>;
82
+ export declare function provideOutput<Output>(output: Output, cleanup?: () => void): RegisterCleanup<Output>;
82
83
  //# sourceMappingURL=definePlan.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"definePlan.d.ts","sourceRoot":"","sources":["../src/definePlan.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,6BAA6B,EAC7B,cAAc,EACf,MAAM,SAAS,CAAC;AAEjB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,wBAAgB,UAAU,CAAC,MAAM,SAAS,cAAc,EAAE,IAAI,SAAS,MAAM,EAC3E,IAAI,EAAE,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,GAC9B,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CAE3B;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC,GACvE,WAAW,CAAC,cAAc,EAAE,QAAQ,CAAC,CAGvC;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,UAAU,CAAC,MAAM,SAAS,cAAc,EAAE,IAAI,SAAS,MAAM,EAC3E,GAAG,IAAI,EAAE,6BAA6B,CAAC,MAAM,EAAE,IAAI,CAAC,GACnD,6BAA6B,CAAC,MAAM,EAAE,IAAI,CAAC,CAE7C"}
1
+ {"version":3,"file":"definePlan.d.ts","sourceRoot":"","sources":["../src/definePlan.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,6BAA6B,EAC7B,cAAc,EACd,eAAe,EAChB,MAAM,SAAS,CAAC;AAEjB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,wBAAgB,UAAU,CACxB,MAAM,SAAS,cAAc,EAC7B,IAAI,SAAS,MAAM,EACnB,MAAM,EACN,IAAI,EAAE,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAE5E;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,IAAI,CACZ,WAAW,CAAC,cAAc,EAAE,QAAQ,EAAE,OAAO,CAAC,EAC9C,QAAQ,GAAG,MAAM,CAClB,GACA,WAAW,CAAC,cAAc,EAAE,QAAQ,EAAE,OAAO,CAAC,CAEhD;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,UAAU,CACxB,MAAM,SAAS,cAAc,EAC7B,IAAI,SAAS,MAAM,EACnB,MAAM,EAEN,GAAG,IAAI,EAAE,6BAA6B,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,GAC3D,6BAA6B,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAErD;AAED,wBAAgB,aAAa,CAAC,MAAM,EAClC,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,MAAM,IAAI,GACnB,eAAe,CAAC,MAAM,CAAC,CAEzB"}
@@ -0,0 +1,31 @@
1
+ import { LexicalEditor } from 'lexical';
2
+ import { LexicalPeerDependency } from './types';
3
+
4
+ /**
5
+ * Get the finalized config and output of a Plan that was used to build the
6
+ * editor by name.
7
+ *
8
+ * This can be used from the implementation of a LexicalNode or in other
9
+ * situation where you have an editor reference but it's not easy to pass the
10
+ * config around. Use this version if you do not have a concrete reference to
11
+ * the Plan for some reason (e.g. it is an optional peer dependency).
12
+ *
13
+ * @param editor The editor that may have been built using plan
14
+ * @param planName The name of the Plan
15
+ * @returns The config and output of the Plan or undefined
16
+ */
17
+ export declare function getPeerDependencyFromEditor<Name extends string>(editor: LexicalEditor, planName: Name): LexicalPeerDependency<Name> | undefined;
18
+ /**
19
+ * Get the finalized config and output of a Plan that was used to build the
20
+ * editor by name.
21
+ *
22
+ * This can be used from the implementation of a LexicalNode or in other
23
+ * situation where you have an editor reference but it's not easy to pass the
24
+ * config around. Use this version if you do not have a concrete reference to
25
+ * the Plan for some reason (e.g. it is an optional peer dependency).
26
+ *
27
+ * @param planName The name of the Plan
28
+ * @returns The config and output of the Plan or undefined
29
+ */
30
+ export declare function $getPeerDependency<Name extends string>(planName: Name): LexicalPeerDependency<Name> | undefined;
31
+ //# sourceMappingURL=getPeerDependencyFromEditor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getPeerDependencyFromEditor.d.ts","sourceRoot":"","sources":["../src/getPeerDependencyFromEditor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,aAAa,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAKhD;;;;;;;;;;;;GAYG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,SAAS,MAAM,EAC7D,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,IAAI,GACb,qBAAqB,CAAC,IAAI,CAAC,GAAG,SAAS,CAWzC;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,SAAS,MAAM,EACpD,QAAQ,EAAE,IAAI,GACb,qBAAqB,CAAC,IAAI,CAAC,GAAG,SAAS,CAEzC"}
@@ -0,0 +1,31 @@
1
+ import { LexicalEditor } from 'lexical';
2
+ import { AnyLexicalPlan, LexicalPlanDependency } from './types';
3
+
4
+ /**
5
+ * Get the finalized config and output of a Plan that was used to build the editor.
6
+ *
7
+ * This is useful in the implementation of a LexicalNode or in other
8
+ * situations where you have an editor reference but it's not easy to
9
+ * pass the config or {@link RegisterState} around.
10
+ *
11
+ * It will throw if the Editor was not built using this Plan.
12
+ *
13
+ * @param editor The editor that was built using plan
14
+ * @param plan The concrete reference to a Plan used to build this editor
15
+ * @returns The config and output for that Plan
16
+ */
17
+ export declare function getPlanDependencyFromEditor<Plan extends AnyLexicalPlan>(editor: LexicalEditor, plan: Plan): LexicalPlanDependency<Plan>;
18
+ /**
19
+ * Get the finalized config and output of a Plan that was used to build the editor.
20
+ *
21
+ * This is useful in the implementation of a LexicalNode or in other
22
+ * situations where you have an editor reference but it's not easy to
23
+ * pass the config or {@link RegisterState} around.
24
+ *
25
+ * It will throw if the Editor was not built using this Plan.
26
+ *
27
+ * @param plan The concrete reference to a Plan used to build this editor
28
+ * @returns The config and outputs for that Plan
29
+ */
30
+ export declare function $getPlanDependency<Plan extends AnyLexicalPlan>(plan: Plan): LexicalPlanDependency<Plan>;
31
+ //# sourceMappingURL=getPlanDependencyFromEditor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getPlanDependencyFromEditor.d.ts","sourceRoot":"","sources":["../src/getPlanDependencyFromEditor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,aAAa,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAMhE;;;;;;;;;;;;GAYG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,SAAS,cAAc,EACrE,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE,IAAI,GACT,qBAAqB,CAAC,IAAI,CAAC,CAc7B;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,SAAS,cAAc,EAC5D,IAAI,EAAE,IAAI,GACT,qBAAqB,CAAC,IAAI,CAAC,CAE7B"}
package/dist/index.d.ts CHANGED
@@ -6,13 +6,13 @@
6
6
  *
7
7
  */
8
8
  export { PACKAGE_VERSION } from './PACKAGE_VERSION';
9
- export { configPlan, definePlan, defineRootPlan } from './definePlan';
9
+ export { configPlan, definePlan, defineRootPlan, provideOutput, } from './definePlan';
10
10
  export { LexicalBuilder, buildEditorFromPlans } from './LexicalBuilder';
11
- export { type AnyLexicalPlan, type AnyLexicalPlanArgument, type EditorHandle, type InitialEditorStateType, type LexicalPeerConfig, type LexicalPlan, type LexicalPlanArgument, type LexicalPlanConfig, type LexicalPlanName, type NormalizedLexicalPlanArgument, type PlanConfigBase, type RegisterState, } from './types';
11
+ export { type AnyLexicalPlan, type AnyLexicalPlanArgument, type EditorHandle, type InitialEditorStateType, type LexicalPlan, type LexicalPlanArgument, type LexicalPlanConfig, type LexicalPlanName, type LexicalPlanOutput, type LexicalPlanDependency, type LexicalPeerConfig, type LexicalPeerDependency, type LexicalPeerPlan, type NormalizedLexicalPlanArgument, type PlanConfigBase, type RegisterState, type RegisterCleanup, } from './types';
12
12
  export { safeCast } from './safeCast';
13
13
  export { shallowMergeConfig } from './shallowMergeConfig';
14
- export { getPlanConfigFromEditor } from './getPlanConfigFromEditor';
15
- export { getPeerConfigFromEditor } from './getPeerConfigFromEditor';
14
+ export { $getPlanDependency, getPlanDependencyFromEditor, } from './getPlanDependencyFromEditor';
15
+ export { $getPeerDependency, getPeerDependencyFromEditor, } from './getPeerDependencyFromEditor';
16
16
  export { type AutoFocusConfig, AutoFocusPlan } from './AutoFocusPlan';
17
17
  export { DragonPlan } from './DragonPlan';
18
18
  export { type HistoryConfig, HistoryPlan } from './HistoryPlan';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,sBAAsB,EAC3B,KAAK,YAAY,EACjB,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,EACtB,KAAK,WAAW,EAChB,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,6BAA6B,EAClC,KAAK,cAAc,EACnB,KAAK,aAAa,GACnB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,OAAO,EAAE,KAAK,eAAe,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,KAAK,aAAa,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,WAAW,mBAAmB;CAAG"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EACL,UAAU,EACV,UAAU,EACV,cAAc,EACd,aAAa,GACd,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,sBAAsB,EAC3B,KAAK,YAAY,EACjB,KAAK,sBAAsB,EAC3B,KAAK,WAAW,EAChB,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,eAAe,EACpB,KAAK,6BAA6B,EAClC,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,eAAe,GACrB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EACL,kBAAkB,EAClB,2BAA2B,GAC5B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,kBAAkB,EAClB,2BAA2B,GAC5B,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EAAE,KAAK,eAAe,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,KAAK,aAAa,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,WAAW,mBAAmB;CAAG"}
package/dist/index.js CHANGED
@@ -4,13 +4,13 @@ var __publicField = (obj, key, value) => {
4
4
  __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
5
5
  return value;
6
6
  };
7
- import { $getRoot, $createParagraphNode, createEditor } from "lexical";
7
+ import { $getRoot, $createParagraphNode, createEditor, $getEditor } from "lexical";
8
8
  import { mergeRegister } from "@lexical/utils";
9
9
  import { registerDragonSupport } from "@lexical/dragon";
10
10
  import { createEmptyHistoryState, registerHistory } from "@lexical/history";
11
11
  import { registerPlainText } from "@lexical/plain-text";
12
12
  import { HeadingNode, QuoteNode, registerRichText } from "@lexical/rich-text";
13
- const PACKAGE_VERSION = "0.0.15-nightly.20240607.0";
13
+ const PACKAGE_VERSION = "0.0.15";
14
14
  function definePlan(plan) {
15
15
  return plan;
16
16
  }
@@ -20,6 +20,9 @@ function defineRootPlan(rootPlan) {
20
20
  function configPlan(...args) {
21
21
  return args;
22
22
  }
23
+ function provideOutput(output, cleanup) {
24
+ return Object.assign(() => cleanup && cleanup(), { output });
25
+ }
23
26
  function invariant(cond, message, ...args) {
24
27
  if (cond) {
25
28
  return;
@@ -76,41 +79,71 @@ function shallowMergeConfig(config, overrides) {
76
79
  }
77
80
  return config;
78
81
  }
82
+ const noop$1 = () => {
83
+ };
79
84
  class PlanRep {
80
85
  constructor(builder, plan) {
81
86
  __publicField(this, "builder");
82
87
  __publicField(this, "configs");
83
88
  __publicField(this, "_config");
89
+ __publicField(this, "_dependency");
90
+ __publicField(this, "_output");
84
91
  __publicField(this, "plan");
85
92
  this.builder = builder;
86
93
  this.plan = plan;
87
94
  this.configs = /* @__PURE__ */ new Set();
88
95
  }
89
- getPeerConfig(name) {
96
+ register(editor, signal) {
97
+ if (!this.plan.register) {
98
+ this._output = void 0;
99
+ return noop$1;
100
+ }
101
+ const cleanup = this.plan.register(editor, this.getConfig(), {
102
+ getPeer: this.getPeer.bind(this),
103
+ getDependency: this.getDependency.bind(this),
104
+ signal
105
+ });
106
+ this._output = cleanup.output;
107
+ return cleanup;
108
+ }
109
+ getPeer(name) {
90
110
  const rep = this.builder.planNameMap.get(name);
91
- return rep && rep.getConfig();
111
+ return rep ? rep.getPlanDependency() : void 0;
92
112
  }
93
- getDependencyConfig(dep) {
94
- const pair = this.builder.planMap.get(dep);
113
+ getDependency(dep) {
114
+ const rep = this.builder.getPlanRep(dep);
95
115
  invariant(
96
- pair !== void 0,
116
+ rep !== void 0,
97
117
  "LexicalPlanBuilder: Plan %s missing dependency plan %s to be in registry",
98
118
  this.plan.name,
99
119
  dep.name
100
120
  );
101
- return pair[1].getConfig();
121
+ return rep.getPlanDependency();
102
122
  }
103
- getConfig() {
104
- if (this._config) {
105
- return this._config;
123
+ getPlanDependency() {
124
+ if (!this._dependency) {
125
+ invariant(
126
+ "_output" in this,
127
+ "Plan %s used as a dependency before registration",
128
+ this.plan.name
129
+ );
130
+ this._dependency = {
131
+ config: this.getConfig(),
132
+ output: this._output
133
+ };
106
134
  }
107
- let config = this.plan.config;
108
- const mergeConfig = this.plan.mergeConfig ? this.plan.mergeConfig.bind(this.plan) : shallowMergeConfig;
109
- for (const cfg of this.configs) {
110
- config = mergeConfig(config, cfg);
135
+ return this._dependency;
136
+ }
137
+ getConfig() {
138
+ if (!this._config) {
139
+ let config = this.plan.config;
140
+ const mergeConfig = this.plan.mergeConfig ? this.plan.mergeConfig.bind(this.plan) : shallowMergeConfig;
141
+ for (const cfg of this.configs) {
142
+ config = mergeConfig(config, cfg);
143
+ }
144
+ this._config = config;
111
145
  }
112
- this._config = config;
113
- return config;
146
+ return this._config;
114
147
  }
115
148
  }
116
149
  const buildersForEditors = /* @__PURE__ */ new WeakMap();
@@ -178,6 +211,13 @@ class LexicalBuilder {
178
211
  )
179
212
  );
180
213
  }
214
+ getPlanRep(plan) {
215
+ const pair = this.planMap.get(plan);
216
+ if (pair) {
217
+ const rep = pair[1];
218
+ return rep;
219
+ }
220
+ }
181
221
  addPlan(arg) {
182
222
  let plan;
183
223
  let configs;
@@ -260,15 +300,7 @@ class LexicalBuilder {
260
300
  const cleanups = [];
261
301
  const controller = new AbortController();
262
302
  for (const planRep of this.sortedPlanReps()) {
263
- if (planRep.plan.register) {
264
- cleanups.push(
265
- planRep.plan.register(editor, planRep.getConfig(), {
266
- getDependencyConfig: planRep.getDependencyConfig.bind(planRep),
267
- getPeerConfig: planRep.getPeerConfig.bind(planRep),
268
- signal: controller.signal
269
- })
270
- );
271
- }
303
+ cleanups.push(planRep.register(editor, controller.signal));
272
304
  }
273
305
  return () => {
274
306
  for (let i = cleanups.length - 1; i >= 0; i--) {
@@ -366,30 +398,36 @@ class LexicalBuilder {
366
398
  function safeCast(value) {
367
399
  return value;
368
400
  }
369
- function getPlanConfigFromEditor(editor, plan) {
401
+ function getPlanDependencyFromEditor(editor, plan) {
370
402
  const builder = LexicalBuilder.fromEditor(editor);
371
403
  invariant(
372
404
  builder !== void 0,
373
- "getPlanConfigFromEditor: editor was not created with this build of Lexical Builder %s",
405
+ "getPlanFromEditor: editor was not created with this build of Lexical Builder %s",
374
406
  PACKAGE_VERSION
375
407
  );
376
- const pair = builder.planMap.get(plan);
408
+ const rep = builder.getPlanRep(plan);
377
409
  invariant(
378
- pair !== void 0,
379
- "getPlanConfigFromEditor: Plan %s was not built when creating this editor",
410
+ rep !== void 0,
411
+ "getPlanFromEditor: Plan %s was not built when creating this editor",
380
412
  plan.name
381
413
  );
382
- return pair[1].getConfig();
414
+ return rep.getPlanDependency();
383
415
  }
384
- function getPeerConfigFromEditor(editor, planName) {
416
+ function $getPlanDependency(plan) {
417
+ return getPlanDependencyFromEditor($getEditor(), plan);
418
+ }
419
+ function getPeerDependencyFromEditor(editor, planName) {
385
420
  const builder = LexicalBuilder.fromEditor(editor);
386
421
  invariant(
387
422
  builder !== void 0,
388
- "getPlanConfigFromEditor: editor was not created with this build of Lexical Builder %s",
423
+ "getPeerConfigFromEditor: editor was not created with this build of Lexical Builder %s",
389
424
  PACKAGE_VERSION
390
425
  );
391
426
  const peer = builder.planNameMap.get(planName);
392
- return peer ? peer.getConfig() : void 0;
427
+ return peer ? peer.getPlanDependency() : void 0;
428
+ }
429
+ function $getPeerDependency(planName) {
430
+ return getPeerDependencyFromEditor($getEditor(), planName);
393
431
  }
394
432
  const AutoFocusPlan = definePlan({
395
433
  config: safeCast({}),
@@ -437,6 +475,8 @@ const RichTextPlan = definePlan({
437
475
  register: registerRichText
438
476
  });
439
477
  export {
478
+ $getPeerDependency,
479
+ $getPlanDependency,
440
480
  AutoFocusPlan,
441
481
  DragonPlan,
442
482
  HistoryPlan,
@@ -448,8 +488,9 @@ export {
448
488
  configPlan,
449
489
  definePlan,
450
490
  defineRootPlan,
451
- getPeerConfigFromEditor,
452
- getPlanConfigFromEditor,
491
+ getPeerDependencyFromEditor,
492
+ getPlanDependencyFromEditor,
493
+ provideOutput,
453
494
  safeCast,
454
495
  shallowMergeConfig
455
496
  };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/PACKAGE_VERSION.ts","../src/definePlan.ts","../src/shared/invariant.ts","../src/deepThemeMergeInPlace.ts","../src/initializeEditor.ts","../src/shallowMergeConfig.ts","../src/PlanRep.ts","../src/LexicalBuilder.ts","../src/safeCast.ts","../src/getPlanConfigFromEditor.ts","../src/getPeerConfigFromEditor.ts","../src/AutoFocusPlan.ts","../src/DragonPlan.ts","../src/HistoryPlan.ts","../src/PlainTextPlan.ts","../src/RichTextPlan.ts"],"sourcesContent":["/** The build version of this package (e.g. \"0.16.0\") */\nexport const PACKAGE_VERSION: string = import.meta.env.PACKAGE_VERSION;\n","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nimport type {\n LexicalPlan,\n NormalizedLexicalPlanArgument,\n PlanConfigBase,\n} from \"./types\";\n\n/**\n * Define a LexicalPlan from the given object literal. TypeScript will\n * infer Config and Name in most cases, but you may want to use\n * {@link safeCast} for config if there are default fields or varying types.\n *\n * @param plan The LexicalPlan\n * @returns The unmodified plan argument (this is only an inference helper)\n *\n * @example Basic example\n * ```ts\n * export const MyPlan = definePlan({\n * // Plan names must be unique in an editor\n * name: \"my\",\n * // Config must be an object, but an empty object is fine\n * config: {},\n * nodes: [MyNode],\n * });\n * ```\n *\n * @example Plan with optional configuration\n * ```ts\n * export interface ConfigurableConfig {\n * optional?: string;\n * required: number;\n * }\n * export const ConfigurablePlan = definePlan({\n * name: \"configurable\",\n * // The Plan's config must satisfy the full config type,\n * // but using the Plan as a dependency never requires\n * // configuration and any partial of the config can be specified\n * config: safeCast<ConfigurableConfig>({ required: 1 }),\n * });\n * ```\n */\nexport function definePlan<Config extends PlanConfigBase, Name extends string>(\n plan: LexicalPlan<Config, Name>,\n): LexicalPlan<Config, Name> {\n return plan;\n}\n\n/**\n * Define a LexicalPlan from the given object literal, assigning an\n * empty config and the name \"[root]\". This plan must only be used\n * at most once per editor, usually as the first argument to\n * {@link buildEditorFromPlans}\n *\n * @param rootPlan A plan without the config or name properties\n * @returns The given plan argument, after in-place assignment of config and name\n *\n * @example\n * ```ts\n * const editorHandle = buildEditorFromPlans(\n * defineRootPlan({\n * dependencies: [DragonPlan, RichTextPlan, HistoryPlan],\n * }),\n * );\n * ```\n */\nexport function defineRootPlan(\n rootPlan: Omit<LexicalPlan<PlanConfigBase, \"[root]\">, \"config\" | \"name\">,\n): LexicalPlan<PlanConfigBase, \"[root]\"> {\n // @ts-ignore\n return Object.assign(rootPlan, { name: \"[root]\", config: {} }) as any;\n}\n\n/**\n * Override a partial of the configuration of a Plan, to be used\n * in the dependencies array of another plan, or as\n * an argument to {@link buildEditorFromPlans}.\n *\n * Before building the editor, configurations will be merged using\n * plan.mergeConfig(plan, config) or {@link shallowMergeConfig} if\n * this is not directly implemented by the Plan.\n *\n * @param args A plan followed by one or more config partials for that plan\n * @returns [plan, config, ...configs]\n *\n * @example\n * ```ts\n * export const ReactDecoratorPlan = definePlan({\n * name: \"react-decorator\",\n * dependencies: [\n * configPlan(ReactPlan, {\n * decorators: [<ReactDecorator />]\n * }),\n * ],\n * });\n * ```\n */\nexport function configPlan<Config extends PlanConfigBase, Name extends string>(\n ...args: NormalizedLexicalPlanArgument<Config, Name>\n): NormalizedLexicalPlanArgument<Config, Name> {\n return args;\n}\n","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\n// invariant(condition, message) will refine types based on \"condition\", and\n// if \"condition\" is false will throw an error. This function is special-cased\n// in flow itself, so we can't name it anything else.\nexport default function invariant(\n cond?: boolean,\n message?: string,\n ...args: string[]\n): asserts cond {\n if (cond) {\n return;\n }\n\n throw new Error(\n args.reduce((msg, arg) => msg.replace(\"%s\", String(arg)), message || \"\"),\n );\n}\n","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\n/**\n * Recursively merge the given theme configuration in-place.\n *\n * @returns If `a` and `b` are both objects (and `b` is not an Array) then\n * all keys in `b` are merged into `a` then `a` is returned.\n * Otherwise `b` is returned.\n *\n * @example\n * ```ts\n * const a = { a: \"a\", nested: { a: 1 } };\n * const b = { b: \"b\", nested: { b: 2 } };\n * const rval = deepThemeMergeInPlace(a, b);\n * expect(a).toBe(rval);\n * expect(a).toEqual({ a: \"a\", b: \"b\", nested: { a: 1, b: 2 } });\n * ```\n */\nexport function deepThemeMergeInPlace(a: unknown, b: unknown) {\n if (\n a &&\n b &&\n !Array.isArray(b) &&\n typeof a === \"object\" &&\n typeof b === \"object\"\n ) {\n const aObj = a as Record<string, unknown>;\n const bObj = b as Record<string, unknown>;\n for (const k in bObj) {\n aObj[k] = deepThemeMergeInPlace(aObj[k], bObj[k]);\n }\n return a;\n }\n return b;\n}\n","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nimport type { InitialEditorStateType } from \"./types\";\n\nimport { $createParagraphNode, $getRoot, type LexicalEditor } from \"lexical\";\n\nconst HISTORY_MERGE_OPTIONS = { tag: \"history-merge\" };\n\nfunction $defaultInitializer() {\n const root = $getRoot();\n if (root.isEmpty()) {\n root.append($createParagraphNode());\n }\n}\n\nexport function initializeEditor(\n editor: LexicalEditor,\n $initialEditorState: InitialEditorStateType = $defaultInitializer,\n): void {\n switch (typeof $initialEditorState) {\n case \"function\": {\n editor.update(() => $initialEditorState(editor), HISTORY_MERGE_OPTIONS);\n break;\n }\n case \"string\": {\n const parsedEditorState = editor.parseEditorState($initialEditorState);\n editor.setEditorState(parsedEditorState, HISTORY_MERGE_OPTIONS);\n break;\n }\n case \"object\": {\n if ($initialEditorState) {\n editor.setEditorState($initialEditorState, HISTORY_MERGE_OPTIONS);\n }\n break;\n }\n }\n}\n","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\nimport type { PlanConfigBase } from \"./types\";\n\n/**\n * The default merge strategy for plan configuration is a shallow merge.\n *\n * @param config A full config\n * @param overrides A partial config of overrides\n * @returns config if there are no overrides, otherwise `{...config, ...overrides}`\n */\nexport function shallowMergeConfig<T extends PlanConfigBase>(\n config: T,\n overrides?: Partial<T>,\n): T {\n if (!overrides || config === overrides) {\n return config;\n }\n for (const k in overrides) {\n if (config[k] !== overrides[k]) {\n return { ...config, ...overrides };\n }\n }\n return config;\n}\n","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nimport type { LexicalBuilder } from \"./LexicalBuilder\";\nimport type { AnyLexicalPlan, LexicalPlanConfig } from \"./types\";\nimport type { LexicalPlanRegistry } from \"@etrepum/lexical-builder\";\n\nimport invariant from \"./shared/invariant\";\n\nimport { shallowMergeConfig } from \"./shallowMergeConfig\";\n\n/**\n * @internal\n */\nexport class PlanRep<Plan extends AnyLexicalPlan> {\n builder: LexicalBuilder;\n configs: Set<Partial<LexicalPlanConfig<Plan>>>;\n _config?: LexicalPlanConfig<Plan>;\n plan: Plan;\n constructor(builder: LexicalBuilder, plan: Plan) {\n this.builder = builder;\n this.plan = plan;\n this.configs = new Set();\n }\n getPeerConfig<Name extends keyof LexicalPlanRegistry>(\n name: string,\n ): undefined | LexicalPlanConfig<LexicalPlanRegistry[Name]> {\n const rep = this.builder.planNameMap.get(name);\n return rep && rep.getConfig();\n }\n getDependencyConfig<Dependency extends AnyLexicalPlan>(\n dep: Dependency,\n ): LexicalPlanConfig<Dependency> {\n const pair = this.builder.planMap.get(dep);\n invariant(\n pair !== undefined,\n \"LexicalPlanBuilder: Plan %s missing dependency plan %s to be in registry\",\n this.plan.name,\n dep.name,\n );\n return pair[1].getConfig();\n }\n getConfig(): LexicalPlanConfig<Plan> {\n if (this._config) {\n return this._config;\n }\n let config = this.plan.config;\n const mergeConfig = this.plan.mergeConfig\n ? this.plan.mergeConfig.bind(this.plan)\n : shallowMergeConfig;\n for (const cfg of this.configs) {\n config = mergeConfig(config, cfg);\n }\n this._config = config;\n return config;\n }\n}\n","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\nimport type {\n AnyLexicalPlan,\n AnyLexicalPlanArgument,\n EditorHandle,\n LexicalPlanConfig,\n} from \"./types\";\n\nimport {\n LexicalEditor,\n createEditor,\n type CreateEditorArgs,\n type EditorThemeClasses,\n type HTMLConfig,\n type KlassConstructor,\n type LexicalNode,\n} from \"lexical\";\nimport invariant from \"./shared/invariant\";\n\nimport { deepThemeMergeInPlace } from \"./deepThemeMergeInPlace\";\nimport { initializeEditor } from \"./initializeEditor\";\nimport { PlanRep } from \"./PlanRep\";\nimport { mergeRegister } from \"@lexical/utils\";\nimport { configPlan } from \"./definePlan\";\n\nconst buildersForEditors = new WeakMap<LexicalEditor, LexicalBuilder>();\n\n/**\n * Build a LexicalEditor by combining together one or more plans, optionally\n * overriding some of their configuration.\n *\n * @param plan A plan argument (a plan, or a plan with config overrides)\n * @param plans Optional additional plan arguments\n * @returns An editor handle\n *\n * @example A single root plan with multiple dependencies\n * ```ts\n * const editorHandle = buildEditorFromPlans(\n * defineRootPlan({\n * dependencies: [\n * RichTextPlan,\n * configPlan(EmojiPlan, { emojiBaseUrl: \"/assets/emoji\" }),\n * ],\n * register: (editor: LexicalEditor) => {\n * console.log(\"Editor Created\");\n * return () => console.log(\"Editor Disposed\");\n * },\n * }),\n * );\n * ```\n * @example A very similar minimal configuration without the register hook\n * ```ts\n * const editorHandle = buildEditorFromPlans(\n * RichTextPlan,\n * configPlan(EmojiPlan, { emojiBaseUrl: \"/assets/emoji\" }),\n * );\n * ```\n */\nexport function buildEditorFromPlans(\n plan: AnyLexicalPlanArgument,\n ...plans: AnyLexicalPlanArgument[]\n): EditorHandle {\n const builder = new LexicalBuilder();\n builder.addPlan(plan);\n for (const otherPlan of plans) {\n builder.addPlan(otherPlan);\n }\n return builder.buildEditor();\n}\n\n/** @internal */\nfunction noop() {}\n\n/** @internal */\nclass DisposableEditorHandle implements EditorHandle {\n editor: LexicalEditor;\n dispose: () => void;\n constructor(editor: LexicalEditor, dispose: () => void) {\n this.editor = editor;\n this.dispose = () => {\n try {\n dispose();\n } finally {\n this.dispose = noop;\n }\n };\n }\n // This should be safe even if the runtime doesn't have Symbol.dispose\n // because it will just be `handle[undefined] = dispose;`\n [Symbol.dispose]() {\n this.dispose();\n }\n}\n\n/** Throw the given Error */\nfunction defaultOnError(err: Error) {\n throw err;\n}\n\n/** @internal */\nexport class LexicalBuilder {\n phases: Map<AnyLexicalPlan, PlanRep<AnyLexicalPlan>>[];\n planMap: Map<AnyLexicalPlan, [number, PlanRep<AnyLexicalPlan>]>;\n planNameMap: Map<string, PlanRep<AnyLexicalPlan>>;\n conflicts: Map<string, string>;\n\n constructor() {\n // closure compiler can't handle class initializers\n this.phases = [new Map()];\n this.planMap = new Map();\n this.planNameMap = new Map();\n this.conflicts = new Map();\n }\n\n /** Look up the editor that was created by this LexicalBuilder or undefined */\n static fromEditor(editor: LexicalEditor): LexicalBuilder | undefined {\n return buildersForEditors.get(editor);\n }\n\n buildEditor(): EditorHandle {\n const { $initialEditorState, onError, ...editorConfig } =\n this.buildCreateEditorArgs();\n const editor = createEditor({\n ...editorConfig,\n ...(onError ? { onError: (err) => onError(err, editor) } : {}),\n });\n initializeEditor(editor, $initialEditorState);\n buildersForEditors.set(editor, this);\n return new DisposableEditorHandle(\n editor,\n mergeRegister(\n () => buildersForEditors.delete(editor),\n () => editor.setRootElement(null),\n this.registerEditor(editor),\n ),\n );\n }\n\n addPlan(arg: AnyLexicalPlanArgument): number {\n let plan: AnyLexicalPlan;\n let configs: unknown[];\n if (Array.isArray(arg)) {\n [plan, ...configs] = arg;\n } else {\n plan = arg;\n configs = [];\n }\n let [phase, planRep] = this.planMap.get(plan) || [0, undefined];\n if (!planRep) {\n const hasConflict = this.conflicts.get(plan.name);\n if (typeof hasConflict === \"string\") {\n invariant(\n false,\n \"LexicalBuilder: plan %s conflicts with %s\",\n plan.name,\n hasConflict,\n );\n }\n for (const name of plan.conflictsWith || []) {\n invariant(\n !this.planNameMap.has(name),\n \"LexicalBuilder: plan %s conflicts with %s\",\n plan.name,\n name,\n );\n this.conflicts.set(name, plan.name);\n }\n // TODO detect circular dependencies\n for (const dep of plan.dependencies || []) {\n phase = Math.max(phase, 1 + this.addPlan(dep));\n }\n for (const [depName, cfg] of Object.entries(\n plan.peerDependencies || {},\n )) {\n const dep = this.planNameMap.get(depName);\n if (dep) {\n phase = Math.max(\n phase,\n 1 +\n this.addPlan(\n configPlan(dep.plan, cfg as LexicalPlanConfig<typeof dep.plan>),\n ),\n );\n }\n }\n invariant(\n this.phases.length >= phase,\n \"LexicalBuilder: Expected phase to be no greater than phases.length\",\n );\n if (this.phases.length === phase) {\n this.phases.push(new Map());\n }\n planRep = new PlanRep(this, plan);\n invariant(\n !this.planNameMap.has(plan.name),\n \"LexicalBuilder: Multiple plans registered with name %s, names must be unique\",\n plan.name,\n );\n this.planMap.set(plan, [phase, planRep]);\n this.planNameMap.set(plan.name, planRep);\n const currentPhaseMap = this.phases[phase];\n invariant(\n currentPhaseMap !== undefined,\n \"LexicalBuilder: Expecting phase map for phase %s\",\n String(phase),\n );\n currentPhaseMap.set(plan, planRep);\n }\n for (const config of configs) {\n planRep.configs.add(config as Partial<LexicalPlanConfig<AnyLexicalPlan>>);\n }\n return phase;\n }\n\n *sortedPlanReps() {\n for (const phase of this.phases) {\n yield* phase.values();\n }\n }\n\n registerEditor(editor: LexicalEditor): () => void {\n const cleanups: (() => void)[] = [];\n const controller = new AbortController();\n for (const planRep of this.sortedPlanReps()) {\n if (planRep.plan.register) {\n cleanups.push(\n planRep.plan.register(editor, planRep.getConfig(), {\n getDependencyConfig: planRep.getDependencyConfig.bind(planRep),\n getPeerConfig: planRep.getPeerConfig.bind(planRep),\n signal: controller.signal,\n }),\n );\n }\n }\n return () => {\n for (let i = cleanups.length - 1; i >= 0; i--) {\n const cleanupFun = cleanups[i];\n invariant(\n cleanupFun !== undefined,\n \"LexicalBuilder: Expecting cleanups[%s] to be defined\",\n String(i),\n );\n cleanupFun();\n }\n cleanups.length = 0;\n controller.abort();\n };\n }\n\n buildCreateEditorArgs() {\n const config: Pick<\n CreateEditorArgs,\n \"nodes\" | \"html\" | \"theme\" | \"disableEvents\" | \"editable\" | \"namespace\"\n > &\n Pick<AnyLexicalPlan, \"$initialEditorState\" | \"onError\"> = {\n // Prefer throwing errors rather than console.error by default\n onError: defaultOnError,\n };\n const nodes = new Set<NonNullable<CreateEditorArgs[\"nodes\"]>[number]>();\n const replacedNodes = new Map<\n KlassConstructor<typeof LexicalNode>,\n PlanRep<AnyLexicalPlan>\n >();\n const htmlExport: NonNullable<HTMLConfig[\"export\"]> = new Map();\n const htmlImport: NonNullable<HTMLConfig[\"import\"]> = {};\n const theme: EditorThemeClasses = {};\n for (const planRep of this.sortedPlanReps()) {\n const { plan } = planRep;\n if (plan.onError !== undefined) {\n config.onError = plan.onError;\n }\n if (plan.disableEvents !== undefined) {\n config.disableEvents = plan.disableEvents;\n }\n if (plan.editable !== undefined) {\n config.editable = plan.editable;\n }\n if (plan.namespace !== undefined) {\n config.namespace = plan.namespace;\n }\n if (plan.$initialEditorState !== undefined) {\n config.$initialEditorState = plan.$initialEditorState;\n }\n if (plan.nodes) {\n for (const node of plan.nodes) {\n if (typeof node !== \"function\") {\n const conflictPlan = replacedNodes.get(node.replace);\n if (conflictPlan) {\n invariant(\n false,\n \"LexicalBuilder: Plan %s can not register replacement for node %s because %s already did\",\n plan.name,\n node.replace.name,\n conflictPlan.plan.name,\n );\n }\n replacedNodes.set(node.replace, planRep);\n }\n nodes.add(node);\n }\n }\n if (plan.html) {\n if (plan.html.export) {\n for (const [k, v] of plan.html.export.entries()) {\n htmlExport.set(k, v);\n }\n }\n if (plan.html.import) {\n Object.assign(htmlImport, plan.html.import);\n }\n }\n if (plan.theme) {\n deepThemeMergeInPlace(theme, plan.theme);\n }\n }\n if (Object.keys(theme).length > 0) {\n config.theme = theme;\n }\n if (nodes.size) {\n config.nodes = [...nodes];\n }\n const hasImport = Object.keys(htmlImport).length > 0;\n const hasExport = htmlExport.size > 0;\n if (hasImport || hasExport) {\n config.html = {};\n if (hasImport) {\n config.html.import = htmlImport;\n }\n if (hasExport) {\n config.html.export = htmlExport;\n }\n }\n return config;\n }\n}\n","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\n/**\n * Explicitly and safely cast a value to a specific type when inference or\n * satisfies isn't going to work as expected (often useful for the config\n * property with definePlan)\n */\nexport function safeCast<T>(value: T): T {\n return value;\n}\n","import { LexicalEditor } from \"lexical\";\nimport { LexicalPlan, PlanConfigBase } from \"./types\";\nimport { LexicalBuilder } from \"./LexicalBuilder\";\nimport invariant from \"./shared/invariant\";\nimport { PACKAGE_VERSION } from \"./PACKAGE_VERSION\";\n\n/**\n * Get the finalized configuration of a Plan that was used to build the editor.\n *\n * This is useful in the implementation of a LexicalNode or in other\n * situations where you have an editor reference but it's not easy to\n * pass the config or {@link RegisterState} around.\n *\n * It will throw if the Editor was not built using this Plan.\n *\n * @param editor The editor that was built using plan\n * @param plan The concrete reference to a Plan used to build this editor\n * @returns The configuration for that Plan\n */\nexport function getPlanConfigFromEditor<\n Config extends PlanConfigBase,\n Name extends string,\n>(editor: LexicalEditor, plan: LexicalPlan<Config, Name>): Config {\n const builder = LexicalBuilder.fromEditor(editor);\n invariant(\n builder !== undefined,\n \"getPlanConfigFromEditor: editor was not created with this build of Lexical Builder %s\",\n PACKAGE_VERSION,\n );\n const pair = builder.planMap.get(plan);\n invariant(\n pair !== undefined,\n \"getPlanConfigFromEditor: Plan %s was not built when creating this editor\",\n plan.name,\n );\n return pair[1].getConfig();\n}\n","import { LexicalEditor } from \"lexical\";\nimport { LexicalPeerConfig } from \"./types\";\nimport { LexicalBuilder } from \"./LexicalBuilder\";\nimport invariant from \"./shared/invariant\";\nimport { PACKAGE_VERSION } from \"./PACKAGE_VERSION\";\n\n/**\n * Get the finalized configuration of a Plan using the editor by name, can be\n * used from the implementation of a LexicalNode or in other situations\n * where you have an editor reference but it's not easy to pass the config\n * around. Use this version if you do not have a concrete reference to the\n * Plan for some reason (e.g. it is an optional peer dependency).\n *\n * @param editor The editor that may have been built using plan\n * @param planName The name of the Plan\n * @returns The configuration for that Plan or undefined\n */\nexport function getPeerConfigFromEditor<Name extends string>(\n editor: LexicalEditor,\n planName: Name,\n): LexicalPeerConfig<Name> | undefined {\n const builder = LexicalBuilder.fromEditor(editor);\n invariant(\n builder !== undefined,\n \"getPlanConfigFromEditor: editor was not created with this build of Lexical Builder %s\",\n PACKAGE_VERSION,\n );\n const peer = builder.planNameMap.get(planName);\n return peer ? peer.getConfig() : undefined;\n}\n","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nimport { definePlan } from \"./definePlan\";\nimport { safeCast } from \"./safeCast\";\n\nimport type {} from \"@etrepum/lexical-builder\";\ndeclare module \"@etrepum/lexical-builder\" {\n interface LexicalPlanRegistry {\n [AutoFocusPlan.name]: typeof AutoFocusPlan;\n }\n}\n\nexport interface AutoFocusConfig {\n /**\n * Where to move the selection when the editor is focused and there is no\n * existing selection. Can be \"rootStart\" or \"rootEnd\" (the default).\n */\n defaultSelection?: \"rootStart\" | \"rootEnd\";\n}\n\n/**\n * A Plan to focus the LexicalEditor when the root element is set\n * (typically only when the editor is first created).\n */\nexport const AutoFocusPlan = definePlan({\n config: safeCast<AutoFocusConfig>({}),\n name: \"@etrepum/lexical-builder/AutoFocusPlan\",\n register(editor, { defaultSelection }) {\n return editor.registerRootListener((rootElement) => {\n editor.focus(\n () => {\n // If we try and move selection to the same point with setBaseAndExtent, it won't\n // trigger a re-focus on the element. So in the case this occurs, we'll need to correct it.\n // Normally this is fine, Selection API !== Focus API, but fore the intents of the naming\n // of this plugin, which should preserve focus too.\n const activeElement = document.activeElement;\n if (\n rootElement !== null &&\n (activeElement === null || !rootElement.contains(activeElement))\n ) {\n // Note: preventScroll won't work in Webkit.\n rootElement.focus({ preventScroll: true });\n }\n },\n { defaultSelection },\n );\n });\n },\n});\n","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nimport { registerDragonSupport } from \"@lexical/dragon\";\n\nimport { definePlan } from \"./definePlan\";\n\n/**\n * Add Dragon speech to text input support to the editor, via the\n * @lexical/dragon module.\n */\nexport const DragonPlan = definePlan({\n config: {},\n name: \"@lexical/dragon\",\n register: registerDragonSupport,\n});\n","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\nimport {\n createEmptyHistoryState,\n type HistoryState,\n registerHistory,\n} from \"@lexical/history\";\n\nimport { definePlan } from \"./definePlan\";\nimport { safeCast } from \"./safeCast\";\n\nimport type {} from \"@etrepum/lexical-builder\";\ndeclare module \"@etrepum/lexical-builder\" {\n interface LexicalPlanRegistry {\n [HistoryPlan.name]: typeof HistoryPlan;\n }\n}\n\nexport interface HistoryConfig {\n /**\n * The time (in milliseconds) the editor should delay generating a new history stack,\n * instead of merging the current changes with the current stack. The default is 300ms.\n */\n delay: number;\n /**\n * The initial history state, the default is {@link createEmptyHistoryState}.\n */\n createInitialHistoryState: () => HistoryState;\n}\n\n/**\n * Registers necessary listeners to manage undo/redo history stack and related\n * editor commands, via the @lexical/history module.\n */\nexport const HistoryPlan = definePlan({\n config: safeCast<HistoryConfig>({\n createInitialHistoryState: createEmptyHistoryState,\n delay: 300,\n }),\n name: \"@etrepum/lexical-builder/HistoryPlan\",\n register(editor, { delay, createInitialHistoryState }) {\n return registerHistory(editor, createInitialHistoryState(), delay);\n },\n});\n","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\nimport { registerPlainText } from \"@lexical/plain-text\";\n\nimport { definePlan } from \"./definePlan\";\n\n/**\n * A plan to register @lexical/plain-text behavior\n */\nexport const PlainTextPlan = definePlan({\n config: {},\n conflictsWith: [\"@lexical/rich-text\"],\n name: \"@lexical/plain-text\",\n register: registerPlainText,\n});\n","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nimport { HeadingNode, QuoteNode, registerRichText } from \"@lexical/rich-text\";\n\nimport { definePlan } from \"./definePlan\";\n\n/**\n * A plan to register @lexical/rich-text behavior and nodes\n * ({@link HeadingNode}, {@link QuoteNode})\n */\nexport const RichTextPlan = definePlan({\n config: {},\n conflictsWith: [\"@lexical/plain-text\"],\n name: \"@lexical/rich-text\",\n nodes: [HeadingNode, QuoteNode],\n register: registerRichText,\n});\n"],"names":[],"mappings":";;;;;;;;;;;;AACa,MAAA,kBAA0B;AC+ChC,SAAS,WACd,MAC2B;AACpB,SAAA;AACT;AAoBO,SAAS,eACd,UACuC;AAEhC,SAAA,OAAO,OAAO,UAAU,EAAE,MAAM,UAAU,QAAQ,CAAC,EAAA,CAAG;AAC/D;AA0BO,SAAS,cACX,MAC0C;AACtC,SAAA;AACT;AChGwB,SAAA,UACtB,MACA,YACG,MACW;AACd,MAAI,MAAM;AACR;AAAA,EACF;AAEA,QAAM,IAAI;AAAA,IACR,KAAK,OAAO,CAAC,KAAK,QAAQ,IAAI,QAAQ,MAAM,OAAO,GAAG,CAAC,GAAG,WAAW,EAAE;AAAA,EAAA;AAE3E;ACCgB,SAAA,sBAAsB,GAAY,GAAY;AAC5D,MACE,KACA,KACA,CAAC,MAAM,QAAQ,CAAC,KAChB,OAAO,MAAM,YACb,OAAO,MAAM,UACb;AACA,UAAM,OAAO;AACb,UAAM,OAAO;AACb,eAAW,KAAK,MAAM;AACf,WAAA,CAAC,IAAI,sBAAsB,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC;AAAA,IAClD;AACO,WAAA;AAAA,EACT;AACO,SAAA;AACT;AC5BA,MAAM,wBAAwB,EAAE,KAAK;AAErC,SAAS,sBAAsB;AAC7B,QAAM,OAAO;AACT,MAAA,KAAK,WAAW;AACb,SAAA,OAAO,sBAAsB;AAAA,EACpC;AACF;AAEgB,SAAA,iBACd,QACA,sBAA8C,qBACxC;AACN,UAAQ,OAAO,qBAAqB;AAAA,IAClC,KAAK,YAAY;AACf,aAAO,OAAO,MAAM,oBAAoB,MAAM,GAAG,qBAAqB;AACtE;AAAA,IACF;AAAA,IACA,KAAK,UAAU;AACP,YAAA,oBAAoB,OAAO,iBAAiB,mBAAmB;AAC9D,aAAA,eAAe,mBAAmB,qBAAqB;AAC9D;AAAA,IACF;AAAA,IACA,KAAK,UAAU;AACb,UAAI,qBAAqB;AAChB,eAAA,eAAe,qBAAqB,qBAAqB;AAAA,MAClE;AACA;AAAA,IACF;AAAA,EACF;AACF;AC1BgB,SAAA,mBACd,QACA,WACG;AACC,MAAA,CAAC,aAAa,WAAW,WAAW;AAC/B,WAAA;AAAA,EACT;AACA,aAAW,KAAK,WAAW;AACzB,QAAI,OAAO,CAAC,MAAM,UAAU,CAAC,GAAG;AAC9B,aAAO,EAAE,GAAG,QAAQ,GAAG;IACzB;AAAA,EACF;AACO,SAAA;AACT;ACVO,MAAM,QAAqC;AAAA,EAKhD,YAAY,SAAyB,MAAY;AAJjD;AACA;AACA;AACA;AAEE,SAAK,UAAU;AACf,SAAK,OAAO;AACP,SAAA,8BAAc;EACrB;AAAA,EACA,cACE,MAC0D;AAC1D,UAAM,MAAM,KAAK,QAAQ,YAAY,IAAI,IAAI;AACtC,WAAA,OAAO,IAAI;EACpB;AAAA,EACA,oBACE,KAC+B;AAC/B,UAAM,OAAO,KAAK,QAAQ,QAAQ,IAAI,GAAG;AACzC;AAAA,MACE,SAAS;AAAA,MACT;AAAA,MACA,KAAK,KAAK;AAAA,MACV,IAAI;AAAA,IAAA;AAEC,WAAA,KAAK,CAAC,EAAE;EACjB;AAAA,EACA,YAAqC;AACnC,QAAI,KAAK,SAAS;AAChB,aAAO,KAAK;AAAA,IACd;AACI,QAAA,SAAS,KAAK,KAAK;AACjB,UAAA,cAAc,KAAK,KAAK,cAC1B,KAAK,KAAK,YAAY,KAAK,KAAK,IAAI,IACpC;AACO,eAAA,OAAO,KAAK,SAAS;AACrB,eAAA,YAAY,QAAQ,GAAG;AAAA,IAClC;AACA,SAAK,UAAU;AACR,WAAA;AAAA,EACT;AACF;AC9BA,MAAM,yCAAyB;AAiCf,SAAA,qBACd,SACG,OACW;AACR,QAAA,UAAU,IAAI;AACpB,UAAQ,QAAQ,IAAI;AACpB,aAAW,aAAa,OAAO;AAC7B,YAAQ,QAAQ,SAAS;AAAA,EAC3B;AACA,SAAO,QAAQ;AACjB;AAGA,SAAS,OAAO;AAAC;AAGjB,MAAM,uBAA+C;AAAA,EAGnD,YAAY,QAAuB,SAAqB;AAFxD;AACA;AAEE,SAAK,SAAS;AACd,SAAK,UAAU,MAAM;AACf,UAAA;AACM;MAAA,UACR;AACA,aAAK,UAAU;AAAA,MACjB;AAAA,IAAA;AAAA,EAEJ;AAAA;AAAA;AAAA,EAGA,CAAC,OAAO,OAAO,IAAI;AACjB,SAAK,QAAQ;AAAA,EACf;AACF;AAGA,SAAS,eAAe,KAAY;AAC5B,QAAA;AACR;AAGO,MAAM,eAAe;AAAA,EAM1B,cAAc;AALd;AACA;AACA;AACA;AAIE,SAAK,SAAS,CAAK,oBAAA,IAAK,CAAA;AACnB,SAAA,8BAAc;AACd,SAAA,kCAAkB;AAClB,SAAA,gCAAgB;EACvB;AAAA;AAAA,EAGA,OAAO,WAAW,QAAmD;AAC5D,WAAA,mBAAmB,IAAI,MAAM;AAAA,EACtC;AAAA,EAEA,cAA4B;AAC1B,UAAM,EAAE,qBAAqB,SAAS,GAAG,aAAa,IACpD,KAAK;AACP,UAAM,SAAS,aAAa;AAAA,MAC1B,GAAG;AAAA,MACH,GAAI,UAAU,EAAE,SAAS,CAAC,QAAQ,QAAQ,KAAK,MAAM,EAAE,IAAI,CAAC;AAAA,IAAA,CAC7D;AACD,qBAAiB,QAAQ,mBAAmB;AACzB,uBAAA,IAAI,QAAQ,IAAI;AACnC,WAAO,IAAI;AAAA,MACT;AAAA,MACA;AAAA,QACE,MAAM,mBAAmB,OAAO,MAAM;AAAA,QACtC,MAAM,OAAO,eAAe,IAAI;AAAA,QAChC,KAAK,eAAe,MAAM;AAAA,MAC5B;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEA,QAAQ,KAAqC;AACvC,QAAA;AACA,QAAA;AACA,QAAA,MAAM,QAAQ,GAAG,GAAG;AACrB,OAAA,MAAM,GAAG,OAAO,IAAI;AAAA,IAAA,OAChB;AACE,aAAA;AACP,gBAAU,CAAA;AAAA,IACZ;AACI,QAAA,CAAC,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,CAAC,GAAG,MAAS;AAC9D,QAAI,CAAC,SAAS;AACZ,YAAM,cAAc,KAAK,UAAU,IAAI,KAAK,IAAI;AAC5C,UAAA,OAAO,gBAAgB,UAAU;AACnC;AAAA,UACE;AAAA,UACA;AAAA,UACA,KAAK;AAAA,UACL;AAAA,QAAA;AAAA,MAEJ;AACA,iBAAW,QAAQ,KAAK,iBAAiB,CAAA,GAAI;AAC3C;AAAA,UACE,CAAC,KAAK,YAAY,IAAI,IAAI;AAAA,UAC1B;AAAA,UACA,KAAK;AAAA,UACL;AAAA,QAAA;AAEF,aAAK,UAAU,IAAI,MAAM,KAAK,IAAI;AAAA,MACpC;AAEA,iBAAW,OAAO,KAAK,gBAAgB,CAAA,GAAI;AACzC,gBAAQ,KAAK,IAAI,OAAO,IAAI,KAAK,QAAQ,GAAG,CAAC;AAAA,MAC/C;AACA,iBAAW,CAAC,SAAS,GAAG,KAAK,OAAO;AAAA,QAClC,KAAK,oBAAoB,CAAC;AAAA,MAAA,GACzB;AACD,cAAM,MAAM,KAAK,YAAY,IAAI,OAAO;AACxC,YAAI,KAAK;AACP,kBAAQ,KAAK;AAAA,YACX;AAAA,YACA,IACE,KAAK;AAAA,cACH,WAAW,IAAI,MAAM,GAAyC;AAAA,YAChE;AAAA,UAAA;AAAA,QAEN;AAAA,MACF;AACA;AAAA,QACE,KAAK,OAAO,UAAU;AAAA,QACtB;AAAA,MAAA;AAEE,UAAA,KAAK,OAAO,WAAW,OAAO;AAChC,aAAK,OAAO,KAAS,oBAAA,IAAK,CAAA;AAAA,MAC5B;AACU,gBAAA,IAAI,QAAQ,MAAM,IAAI;AAChC;AAAA,QACE,CAAC,KAAK,YAAY,IAAI,KAAK,IAAI;AAAA,QAC/B;AAAA,QACA,KAAK;AAAA,MAAA;AAEP,WAAK,QAAQ,IAAI,MAAM,CAAC,OAAO,OAAO,CAAC;AACvC,WAAK,YAAY,IAAI,KAAK,MAAM,OAAO;AACjC,YAAA,kBAAkB,KAAK,OAAO,KAAK;AACzC;AAAA,QACE,oBAAoB;AAAA,QACpB;AAAA,QACA,OAAO,KAAK;AAAA,MAAA;AAEE,sBAAA,IAAI,MAAM,OAAO;AAAA,IACnC;AACA,eAAW,UAAU,SAAS;AACpB,cAAA,QAAQ,IAAI,MAAoD;AAAA,IAC1E;AACO,WAAA;AAAA,EACT;AAAA,EAEA,CAAC,iBAAiB;AACL,eAAA,SAAS,KAAK,QAAQ;AAC/B,aAAO,MAAM;IACf;AAAA,EACF;AAAA,EAEA,eAAe,QAAmC;AAChD,UAAM,WAA2B,CAAA;AAC3B,UAAA,aAAa,IAAI;AACZ,eAAA,WAAW,KAAK,kBAAkB;AACvC,UAAA,QAAQ,KAAK,UAAU;AAChB,iBAAA;AAAA,UACP,QAAQ,KAAK,SAAS,QAAQ,QAAQ,aAAa;AAAA,YACjD,qBAAqB,QAAQ,oBAAoB,KAAK,OAAO;AAAA,YAC7D,eAAe,QAAQ,cAAc,KAAK,OAAO;AAAA,YACjD,QAAQ,WAAW;AAAA,UAAA,CACpB;AAAA,QAAA;AAAA,MAEL;AAAA,IACF;AACA,WAAO,MAAM;AACX,eAAS,IAAI,SAAS,SAAS,GAAG,KAAK,GAAG,KAAK;AACvC,cAAA,aAAa,SAAS,CAAC;AAC7B;AAAA,UACE,eAAe;AAAA,UACf;AAAA,UACA,OAAO,CAAC;AAAA,QAAA;AAEC;MACb;AACA,eAAS,SAAS;AAClB,iBAAW,MAAM;AAAA,IAAA;AAAA,EAErB;AAAA,EAEA,wBAAwB;AACtB,UAAM,SAIsD;AAAA;AAAA,MAE1D,SAAS;AAAA,IAAA;AAEL,UAAA,4BAAY;AACZ,UAAA,oCAAoB;AAIpB,UAAA,iCAAoD;AAC1D,UAAM,aAAgD,CAAA;AACtD,UAAM,QAA4B,CAAA;AACvB,eAAA,WAAW,KAAK,kBAAkB;AACrC,YAAA,EAAE,KAAS,IAAA;AACb,UAAA,KAAK,YAAY,QAAW;AAC9B,eAAO,UAAU,KAAK;AAAA,MACxB;AACI,UAAA,KAAK,kBAAkB,QAAW;AACpC,eAAO,gBAAgB,KAAK;AAAA,MAC9B;AACI,UAAA,KAAK,aAAa,QAAW;AAC/B,eAAO,WAAW,KAAK;AAAA,MACzB;AACI,UAAA,KAAK,cAAc,QAAW;AAChC,eAAO,YAAY,KAAK;AAAA,MAC1B;AACI,UAAA,KAAK,wBAAwB,QAAW;AAC1C,eAAO,sBAAsB,KAAK;AAAA,MACpC;AACA,UAAI,KAAK,OAAO;AACH,mBAAA,QAAQ,KAAK,OAAO;AACzB,cAAA,OAAO,SAAS,YAAY;AAC9B,kBAAM,eAAe,cAAc,IAAI,KAAK,OAAO;AACnD,gBAAI,cAAc;AAChB;AAAA,gBACE;AAAA,gBACA;AAAA,gBACA,KAAK;AAAA,gBACL,KAAK,QAAQ;AAAA,gBACb,aAAa,KAAK;AAAA,cAAA;AAAA,YAEtB;AACc,0BAAA,IAAI,KAAK,SAAS,OAAO;AAAA,UACzC;AACA,gBAAM,IAAI,IAAI;AAAA,QAChB;AAAA,MACF;AACA,UAAI,KAAK,MAAM;AACT,YAAA,KAAK,KAAK,QAAQ;AACT,qBAAA,CAAC,GAAG,CAAC,KAAK,KAAK,KAAK,OAAO,WAAW;AACpC,uBAAA,IAAI,GAAG,CAAC;AAAA,UACrB;AAAA,QACF;AACI,YAAA,KAAK,KAAK,QAAQ;AACpB,iBAAO,OAAO,YAAY,KAAK,KAAK,MAAM;AAAA,QAC5C;AAAA,MACF;AACA,UAAI,KAAK,OAAO;AACQ,8BAAA,OAAO,KAAK,KAAK;AAAA,MACzC;AAAA,IACF;AACA,QAAI,OAAO,KAAK,KAAK,EAAE,SAAS,GAAG;AACjC,aAAO,QAAQ;AAAA,IACjB;AACA,QAAI,MAAM,MAAM;AACP,aAAA,QAAQ,CAAC,GAAG,KAAK;AAAA,IAC1B;AACA,UAAM,YAAY,OAAO,KAAK,UAAU,EAAE,SAAS;AAC7C,UAAA,YAAY,WAAW,OAAO;AACpC,QAAI,aAAa,WAAW;AAC1B,aAAO,OAAO;AACd,UAAI,WAAW;AACb,eAAO,KAAK,SAAS;AAAA,MACvB;AACA,UAAI,WAAW;AACb,eAAO,KAAK,SAAS;AAAA,MACvB;AAAA,IACF;AACO,WAAA;AAAA,EACT;AACF;ACvUO,SAAS,SAAY,OAAa;AAChC,SAAA;AACT;ACIgB,SAAA,wBAGd,QAAuB,MAAyC;AAC1D,QAAA,UAAU,eAAe,WAAW,MAAM;AAChD;AAAA,IACE,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,EAAA;AAEF,QAAM,OAAO,QAAQ,QAAQ,IAAI,IAAI;AACrC;AAAA,IACE,SAAS;AAAA,IACT;AAAA,IACA,KAAK;AAAA,EAAA;AAEA,SAAA,KAAK,CAAC,EAAE;AACjB;ACnBgB,SAAA,wBACd,QACA,UACqC;AAC/B,QAAA,UAAU,eAAe,WAAW,MAAM;AAChD;AAAA,IACE,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,EAAA;AAEF,QAAM,OAAO,QAAQ,YAAY,IAAI,QAAQ;AACtC,SAAA,OAAO,KAAK,UAAc,IAAA;AACnC;ACCO,MAAM,gBAAgB,WAAW;AAAA,EACtC,QAAQ,SAA0B,EAAE;AAAA,EACpC,MAAM;AAAA,EACN,SAAS,QAAQ,EAAE,oBAAoB;AAC9B,WAAA,OAAO,qBAAqB,CAAC,gBAAgB;AAC3C,aAAA;AAAA,QACL,MAAM;AAKJ,gBAAM,gBAAgB,SAAS;AAE7B,cAAA,gBAAgB,SACf,kBAAkB,QAAQ,CAAC,YAAY,SAAS,aAAa,IAC9D;AAEA,wBAAY,MAAM,EAAE,eAAe,KAAM,CAAA;AAAA,UAC3C;AAAA,QACF;AAAA,QACA,EAAE,iBAAiB;AAAA,MAAA;AAAA,IACrB,CACD;AAAA,EACH;AACF,CAAC;ACtCM,MAAM,aAAa,WAAW;AAAA,EACnC,QAAQ,CAAC;AAAA,EACT,MAAM;AAAA,EACN,UAAU;AACZ,CAAC;ACmBM,MAAM,cAAc,WAAW;AAAA,EACpC,QAAQ,SAAwB;AAAA,IAC9B,2BAA2B;AAAA,IAC3B,OAAO;AAAA,EAAA,CACR;AAAA,EACD,MAAM;AAAA,EACN,SAAS,QAAQ,EAAE,OAAO,6BAA6B;AACrD,WAAO,gBAAgB,QAAQ,0BAA0B,GAAG,KAAK;AAAA,EACnE;AACF,CAAC;AClCM,MAAM,gBAAgB,WAAW;AAAA,EACtC,QAAQ,CAAC;AAAA,EACT,eAAe,CAAC,oBAAoB;AAAA,EACpC,MAAM;AAAA,EACN,UAAU;AACZ,CAAC;ACHM,MAAM,eAAe,WAAW;AAAA,EACrC,QAAQ,CAAC;AAAA,EACT,eAAe,CAAC,qBAAqB;AAAA,EACrC,MAAM;AAAA,EACN,OAAO,CAAC,aAAa,SAAS;AAAA,EAC9B,UAAU;AACZ,CAAC;"}
1
+ {"version":3,"file":"index.js","sources":["../src/PACKAGE_VERSION.ts","../src/definePlan.ts","../src/shared/invariant.ts","../src/deepThemeMergeInPlace.ts","../src/initializeEditor.ts","../src/shallowMergeConfig.ts","../src/PlanRep.ts","../src/LexicalBuilder.ts","../src/safeCast.ts","../src/getPlanDependencyFromEditor.ts","../src/getPeerDependencyFromEditor.ts","../src/AutoFocusPlan.ts","../src/DragonPlan.ts","../src/HistoryPlan.ts","../src/PlainTextPlan.ts","../src/RichTextPlan.ts"],"sourcesContent":["/** The build version of this package (e.g. \"0.16.0\") */\nexport const PACKAGE_VERSION: string = import.meta.env.PACKAGE_VERSION;\n","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nimport type {\n LexicalPlan,\n NormalizedLexicalPlanArgument,\n PlanConfigBase,\n RegisterCleanup,\n} from \"./types\";\n\n/**\n * Define a LexicalPlan from the given object literal. TypeScript will\n * infer Config and Name in most cases, but you may want to use\n * {@link safeCast} for config if there are default fields or varying types.\n *\n * @param plan The LexicalPlan\n * @returns The unmodified plan argument (this is only an inference helper)\n *\n * @example Basic example\n * ```ts\n * export const MyPlan = definePlan({\n * // Plan names must be unique in an editor\n * name: \"my\",\n * // Config must be an object, but an empty object is fine\n * config: {},\n * nodes: [MyNode],\n * });\n * ```\n *\n * @example Plan with optional configuration\n * ```ts\n * export interface ConfigurableConfig {\n * optional?: string;\n * required: number;\n * }\n * export const ConfigurablePlan = definePlan({\n * name: \"configurable\",\n * // The Plan's config must satisfy the full config type,\n * // but using the Plan as a dependency never requires\n * // configuration and any partial of the config can be specified\n * config: safeCast<ConfigurableConfig>({ required: 1 }),\n * });\n * ```\n */\nexport function definePlan<\n Config extends PlanConfigBase,\n Name extends string,\n Output,\n>(plan: LexicalPlan<Config, Name, Output>): LexicalPlan<Config, Name, Output> {\n return plan;\n}\n\n/**\n * Define a LexicalPlan from the given object literal, assigning an\n * empty config and the name \"[root]\". This plan must only be used\n * at most once per editor, usually as the first argument to\n * {@link buildEditorFromPlans}\n *\n * @param rootPlan A plan without the config or name properties\n * @returns The given plan argument, after in-place assignment of config and name\n *\n * @example\n * ```ts\n * const editorHandle = buildEditorFromPlans(\n * defineRootPlan({\n * dependencies: [DragonPlan, RichTextPlan, HistoryPlan],\n * }),\n * );\n * ```\n */\nexport function defineRootPlan(\n rootPlan: Omit<\n LexicalPlan<PlanConfigBase, \"[root]\", unknown>,\n \"config\" | \"name\"\n >,\n): LexicalPlan<PlanConfigBase, \"[root]\", unknown> {\n return Object.assign(rootPlan, { name: \"[root]\", config: {} }) as any;\n}\n\n/**\n * Override a partial of the configuration of a Plan, to be used\n * in the dependencies array of another plan, or as\n * an argument to {@link buildEditorFromPlans}.\n *\n * Before building the editor, configurations will be merged using\n * plan.mergeConfig(plan, config) or {@link shallowMergeConfig} if\n * this is not directly implemented by the Plan.\n *\n * @param args A plan followed by one or more config partials for that plan\n * @returns [plan, config, ...configs]\n *\n * @example\n * ```ts\n * export const ReactDecoratorPlan = definePlan({\n * name: \"react-decorator\",\n * dependencies: [\n * configPlan(ReactPlan, {\n * decorators: [<ReactDecorator />]\n * }),\n * ],\n * });\n * ```\n */\nexport function configPlan<\n Config extends PlanConfigBase,\n Name extends string,\n Output,\n>(\n ...args: NormalizedLexicalPlanArgument<Config, Name, Output>\n): NormalizedLexicalPlanArgument<Config, Name, Output> {\n return args;\n}\n\nexport function provideOutput<Output>(\n output: Output,\n cleanup?: () => void,\n): RegisterCleanup<Output> {\n return Object.assign(() => cleanup && cleanup(), { output });\n}\n","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\n// invariant(condition, message) will refine types based on \"condition\", and\n// if \"condition\" is false will throw an error. This function is special-cased\n// in flow itself, so we can't name it anything else.\nexport default function invariant(\n cond?: boolean,\n message?: string,\n ...args: string[]\n): asserts cond {\n if (cond) {\n return;\n }\n\n throw new Error(\n args.reduce((msg, arg) => msg.replace(\"%s\", String(arg)), message || \"\"),\n );\n}\n","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\n/**\n * Recursively merge the given theme configuration in-place.\n *\n * @returns If `a` and `b` are both objects (and `b` is not an Array) then\n * all keys in `b` are merged into `a` then `a` is returned.\n * Otherwise `b` is returned.\n *\n * @example\n * ```ts\n * const a = { a: \"a\", nested: { a: 1 } };\n * const b = { b: \"b\", nested: { b: 2 } };\n * const rval = deepThemeMergeInPlace(a, b);\n * expect(a).toBe(rval);\n * expect(a).toEqual({ a: \"a\", b: \"b\", nested: { a: 1, b: 2 } });\n * ```\n */\nexport function deepThemeMergeInPlace(a: unknown, b: unknown) {\n if (\n a &&\n b &&\n !Array.isArray(b) &&\n typeof a === \"object\" &&\n typeof b === \"object\"\n ) {\n const aObj = a as Record<string, unknown>;\n const bObj = b as Record<string, unknown>;\n for (const k in bObj) {\n aObj[k] = deepThemeMergeInPlace(aObj[k], bObj[k]);\n }\n return a;\n }\n return b;\n}\n","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nimport type { InitialEditorStateType } from \"./types\";\n\nimport { $createParagraphNode, $getRoot, type LexicalEditor } from \"lexical\";\n\nconst HISTORY_MERGE_OPTIONS = { tag: \"history-merge\" };\n\nfunction $defaultInitializer() {\n const root = $getRoot();\n if (root.isEmpty()) {\n root.append($createParagraphNode());\n }\n}\n\nexport function initializeEditor(\n editor: LexicalEditor,\n $initialEditorState: InitialEditorStateType = $defaultInitializer,\n): void {\n switch (typeof $initialEditorState) {\n case \"function\": {\n editor.update(() => $initialEditorState(editor), HISTORY_MERGE_OPTIONS);\n break;\n }\n case \"string\": {\n const parsedEditorState = editor.parseEditorState($initialEditorState);\n editor.setEditorState(parsedEditorState, HISTORY_MERGE_OPTIONS);\n break;\n }\n case \"object\": {\n if ($initialEditorState) {\n editor.setEditorState($initialEditorState, HISTORY_MERGE_OPTIONS);\n }\n break;\n }\n }\n}\n","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\nimport type { PlanConfigBase } from \"./types\";\n\n/**\n * The default merge strategy for plan configuration is a shallow merge.\n *\n * @param config A full config\n * @param overrides A partial config of overrides\n * @returns config if there are no overrides, otherwise `{...config, ...overrides}`\n */\nexport function shallowMergeConfig<T extends PlanConfigBase>(\n config: T,\n overrides?: Partial<T>,\n): T {\n if (!overrides || config === overrides) {\n return config;\n }\n for (const k in overrides) {\n if (config[k] !== overrides[k]) {\n return { ...config, ...overrides };\n }\n }\n return config;\n}\n","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nimport type { LexicalBuilder } from \"./LexicalBuilder\";\nimport type {\n AnyLexicalPlan,\n LexicalPlanConfig,\n LexicalPlanDependency,\n LexicalPlanOutput,\n} from \"./types\";\nimport type { LexicalPlanRegistry } from \"@etrepum/lexical-builder\";\n\nimport invariant from \"./shared/invariant\";\n\nimport { shallowMergeConfig } from \"./shallowMergeConfig\";\nimport type { LexicalEditor } from \"lexical\";\n\nconst noop = () => {};\n/**\n * @internal\n */\nexport class PlanRep<Plan extends AnyLexicalPlan> {\n builder: LexicalBuilder;\n configs: Set<Partial<LexicalPlanConfig<Plan>>>;\n _config?: LexicalPlanConfig<Plan>;\n _dependency?: LexicalPlanDependency<Plan>;\n _output?: LexicalPlanOutput<Plan>;\n plan: Plan;\n constructor(builder: LexicalBuilder, plan: Plan) {\n this.builder = builder;\n this.plan = plan;\n this.configs = new Set();\n }\n register(editor: LexicalEditor, signal: AbortSignal): () => void {\n if (!this.plan.register) {\n this._output = undefined;\n return noop;\n }\n const cleanup = this.plan.register(editor, this.getConfig(), {\n getPeer: this.getPeer.bind(this),\n getDependency: this.getDependency.bind(this),\n signal,\n });\n this._output = cleanup.output as LexicalPlanOutput<Plan>;\n return cleanup;\n }\n getPeer<Name extends keyof LexicalPlanRegistry>(\n name: string,\n ): undefined | LexicalPlanDependency<LexicalPlanRegistry[Name]> {\n const rep = this.builder.planNameMap.get(name);\n return rep\n ? (rep.getPlanDependency() as LexicalPlanDependency<\n LexicalPlanRegistry[Name]\n >)\n : undefined;\n }\n getDependency<Dependency extends AnyLexicalPlan>(\n dep: Dependency,\n ): LexicalPlanDependency<Dependency> {\n const rep = this.builder.getPlanRep(dep);\n invariant(\n rep !== undefined,\n \"LexicalPlanBuilder: Plan %s missing dependency plan %s to be in registry\",\n this.plan.name,\n dep.name,\n );\n return rep.getPlanDependency();\n }\n\n getPlanDependency(): LexicalPlanDependency<Plan> {\n if (!this._dependency) {\n invariant(\n \"_output\" in this,\n \"Plan %s used as a dependency before registration\",\n this.plan.name,\n );\n this._dependency = {\n config: this.getConfig(),\n output: this._output!,\n };\n }\n return this._dependency;\n }\n getConfig(): LexicalPlanConfig<Plan> {\n if (!this._config) {\n let config = this.plan.config;\n const mergeConfig = this.plan.mergeConfig\n ? this.plan.mergeConfig.bind(this.plan)\n : shallowMergeConfig;\n for (const cfg of this.configs) {\n config = mergeConfig(config, cfg);\n }\n this._config = config;\n }\n return this._config;\n }\n}\n","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\nimport type {\n AnyLexicalPlan,\n AnyLexicalPlanArgument,\n EditorHandle,\n LexicalPlanConfig,\n} from \"./types\";\n\nimport {\n LexicalEditor,\n createEditor,\n type CreateEditorArgs,\n type EditorThemeClasses,\n type HTMLConfig,\n type KlassConstructor,\n type LexicalNode,\n} from \"lexical\";\nimport invariant from \"./shared/invariant\";\n\nimport { deepThemeMergeInPlace } from \"./deepThemeMergeInPlace\";\nimport { initializeEditor } from \"./initializeEditor\";\nimport { PlanRep } from \"./PlanRep\";\nimport { mergeRegister } from \"@lexical/utils\";\nimport { configPlan } from \"./definePlan\";\n\nconst buildersForEditors = new WeakMap<LexicalEditor, LexicalBuilder>();\n\n/**\n * Build a LexicalEditor by combining together one or more plans, optionally\n * overriding some of their configuration.\n *\n * @param plan A plan argument (a plan, or a plan with config overrides)\n * @param plans Optional additional plan arguments\n * @returns An editor handle\n *\n * @example A single root plan with multiple dependencies\n * ```ts\n * const editorHandle = buildEditorFromPlans(\n * defineRootPlan({\n * dependencies: [\n * RichTextPlan,\n * configPlan(EmojiPlan, { emojiBaseUrl: \"/assets/emoji\" }),\n * ],\n * register: (editor: LexicalEditor) => {\n * console.log(\"Editor Created\");\n * return () => console.log(\"Editor Disposed\");\n * },\n * }),\n * );\n * ```\n * @example A very similar minimal configuration without the register hook\n * ```ts\n * const editorHandle = buildEditorFromPlans(\n * RichTextPlan,\n * configPlan(EmojiPlan, { emojiBaseUrl: \"/assets/emoji\" }),\n * );\n * ```\n */\nexport function buildEditorFromPlans(\n plan: AnyLexicalPlanArgument,\n ...plans: AnyLexicalPlanArgument[]\n): EditorHandle {\n const builder = new LexicalBuilder();\n builder.addPlan(plan);\n for (const otherPlan of plans) {\n builder.addPlan(otherPlan);\n }\n return builder.buildEditor();\n}\n\n/** @internal */\nfunction noop() {}\n\n/** @internal */\nclass DisposableEditorHandle implements EditorHandle {\n editor: LexicalEditor;\n dispose: () => void;\n constructor(editor: LexicalEditor, dispose: () => void) {\n this.editor = editor;\n this.dispose = () => {\n try {\n dispose();\n } finally {\n this.dispose = noop;\n }\n };\n }\n // This should be safe even if the runtime doesn't have Symbol.dispose\n // because it will just be `handle[undefined] = dispose;`\n [Symbol.dispose]() {\n this.dispose();\n }\n}\n\n/** Throw the given Error */\nfunction defaultOnError(err: Error) {\n throw err;\n}\n\n/** @internal */\nexport class LexicalBuilder {\n phases: Map<AnyLexicalPlan, PlanRep<AnyLexicalPlan>>[];\n planMap: Map<AnyLexicalPlan, [number, PlanRep<AnyLexicalPlan>]>;\n planNameMap: Map<string, PlanRep<AnyLexicalPlan>>;\n conflicts: Map<string, string>;\n\n constructor() {\n // closure compiler can't handle class initializers\n this.phases = [new Map()];\n this.planMap = new Map();\n this.planNameMap = new Map();\n this.conflicts = new Map();\n }\n\n /** Look up the editor that was created by this LexicalBuilder or undefined */\n static fromEditor(editor: LexicalEditor): LexicalBuilder | undefined {\n return buildersForEditors.get(editor);\n }\n\n buildEditor(): EditorHandle {\n const { $initialEditorState, onError, ...editorConfig } =\n this.buildCreateEditorArgs();\n const editor = createEditor({\n ...editorConfig,\n ...(onError ? { onError: (err) => onError(err, editor) } : {}),\n });\n initializeEditor(editor, $initialEditorState);\n buildersForEditors.set(editor, this);\n return new DisposableEditorHandle(\n editor,\n mergeRegister(\n () => buildersForEditors.delete(editor),\n () => editor.setRootElement(null),\n this.registerEditor(editor),\n ),\n );\n }\n\n getPlanRep<Plan extends AnyLexicalPlan>(\n plan: Plan,\n ): PlanRep<Plan> | undefined {\n const pair = this.planMap.get(plan);\n if (pair) {\n const rep: PlanRep<AnyLexicalPlan> = pair[1];\n return rep as PlanRep<Plan>;\n }\n }\n\n addPlan(arg: AnyLexicalPlanArgument): number {\n let plan: AnyLexicalPlan;\n let configs: unknown[];\n if (Array.isArray(arg)) {\n [plan, ...configs] = arg;\n } else {\n plan = arg;\n configs = [];\n }\n let [phase, planRep] = this.planMap.get(plan) || [0, undefined];\n if (!planRep) {\n const hasConflict = this.conflicts.get(plan.name);\n if (typeof hasConflict === \"string\") {\n invariant(\n false,\n \"LexicalBuilder: plan %s conflicts with %s\",\n plan.name,\n hasConflict,\n );\n }\n for (const name of plan.conflictsWith || []) {\n invariant(\n !this.planNameMap.has(name),\n \"LexicalBuilder: plan %s conflicts with %s\",\n plan.name,\n name,\n );\n this.conflicts.set(name, plan.name);\n }\n // TODO detect circular dependencies\n for (const dep of plan.dependencies || []) {\n phase = Math.max(phase, 1 + this.addPlan(dep));\n }\n for (const [depName, cfg] of Object.entries(\n plan.peerDependencies || {},\n )) {\n const dep = this.planNameMap.get(depName);\n if (dep) {\n phase = Math.max(\n phase,\n 1 +\n this.addPlan(\n configPlan(dep.plan, cfg as LexicalPlanConfig<typeof dep.plan>),\n ),\n );\n }\n }\n invariant(\n this.phases.length >= phase,\n \"LexicalBuilder: Expected phase to be no greater than phases.length\",\n );\n if (this.phases.length === phase) {\n this.phases.push(new Map());\n }\n planRep = new PlanRep(this, plan);\n invariant(\n !this.planNameMap.has(plan.name),\n \"LexicalBuilder: Multiple plans registered with name %s, names must be unique\",\n plan.name,\n );\n this.planMap.set(plan, [phase, planRep]);\n this.planNameMap.set(plan.name, planRep);\n const currentPhaseMap = this.phases[phase];\n invariant(\n currentPhaseMap !== undefined,\n \"LexicalBuilder: Expecting phase map for phase %s\",\n String(phase),\n );\n currentPhaseMap.set(plan, planRep);\n }\n for (const config of configs) {\n planRep.configs.add(config as Partial<LexicalPlanConfig<AnyLexicalPlan>>);\n }\n return phase;\n }\n\n *sortedPlanReps() {\n for (const phase of this.phases) {\n yield* phase.values();\n }\n }\n\n registerEditor(editor: LexicalEditor): () => void {\n const cleanups: (() => void)[] = [];\n const controller = new AbortController();\n for (const planRep of this.sortedPlanReps()) {\n cleanups.push(planRep.register(editor, controller.signal));\n }\n return () => {\n for (let i = cleanups.length - 1; i >= 0; i--) {\n const cleanupFun = cleanups[i];\n invariant(\n cleanupFun !== undefined,\n \"LexicalBuilder: Expecting cleanups[%s] to be defined\",\n String(i),\n );\n cleanupFun();\n }\n cleanups.length = 0;\n controller.abort();\n };\n }\n\n buildCreateEditorArgs() {\n const config: Pick<\n CreateEditorArgs,\n \"nodes\" | \"html\" | \"theme\" | \"disableEvents\" | \"editable\" | \"namespace\"\n > &\n Pick<AnyLexicalPlan, \"$initialEditorState\" | \"onError\"> = {\n // Prefer throwing errors rather than console.error by default\n onError: defaultOnError,\n };\n const nodes = new Set<NonNullable<CreateEditorArgs[\"nodes\"]>[number]>();\n const replacedNodes = new Map<\n KlassConstructor<typeof LexicalNode>,\n PlanRep<AnyLexicalPlan>\n >();\n const htmlExport: NonNullable<HTMLConfig[\"export\"]> = new Map();\n const htmlImport: NonNullable<HTMLConfig[\"import\"]> = {};\n const theme: EditorThemeClasses = {};\n for (const planRep of this.sortedPlanReps()) {\n const { plan } = planRep;\n if (plan.onError !== undefined) {\n config.onError = plan.onError;\n }\n if (plan.disableEvents !== undefined) {\n config.disableEvents = plan.disableEvents;\n }\n if (plan.editable !== undefined) {\n config.editable = plan.editable;\n }\n if (plan.namespace !== undefined) {\n config.namespace = plan.namespace;\n }\n if (plan.$initialEditorState !== undefined) {\n config.$initialEditorState = plan.$initialEditorState;\n }\n if (plan.nodes) {\n for (const node of plan.nodes) {\n if (typeof node !== \"function\") {\n const conflictPlan = replacedNodes.get(node.replace);\n if (conflictPlan) {\n invariant(\n false,\n \"LexicalBuilder: Plan %s can not register replacement for node %s because %s already did\",\n plan.name,\n node.replace.name,\n conflictPlan.plan.name,\n );\n }\n replacedNodes.set(node.replace, planRep);\n }\n nodes.add(node);\n }\n }\n if (plan.html) {\n if (plan.html.export) {\n for (const [k, v] of plan.html.export.entries()) {\n htmlExport.set(k, v);\n }\n }\n if (plan.html.import) {\n Object.assign(htmlImport, plan.html.import);\n }\n }\n if (plan.theme) {\n deepThemeMergeInPlace(theme, plan.theme);\n }\n }\n if (Object.keys(theme).length > 0) {\n config.theme = theme;\n }\n if (nodes.size) {\n config.nodes = [...nodes];\n }\n const hasImport = Object.keys(htmlImport).length > 0;\n const hasExport = htmlExport.size > 0;\n if (hasImport || hasExport) {\n config.html = {};\n if (hasImport) {\n config.html.import = htmlImport;\n }\n if (hasExport) {\n config.html.export = htmlExport;\n }\n }\n return config;\n }\n}\n","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\n/**\n * Explicitly and safely cast a value to a specific type when inference or\n * satisfies isn't going to work as expected (often useful for the config\n * property with definePlan)\n */\nexport function safeCast<T>(value: T): T {\n return value;\n}\n","import { $getEditor, LexicalEditor } from \"lexical\";\nimport { AnyLexicalPlan, LexicalPlanDependency } from \"./types\";\nimport { LexicalBuilder } from \"./LexicalBuilder\";\nimport invariant from \"./shared/invariant\";\nimport { PACKAGE_VERSION } from \"./PACKAGE_VERSION\";\nimport { PlanRep } from \"./PlanRep\";\n\n/**\n * Get the finalized config and output of a Plan that was used to build the editor.\n *\n * This is useful in the implementation of a LexicalNode or in other\n * situations where you have an editor reference but it's not easy to\n * pass the config or {@link RegisterState} around.\n *\n * It will throw if the Editor was not built using this Plan.\n *\n * @param editor The editor that was built using plan\n * @param plan The concrete reference to a Plan used to build this editor\n * @returns The config and output for that Plan\n */\nexport function getPlanDependencyFromEditor<Plan extends AnyLexicalPlan>(\n editor: LexicalEditor,\n plan: Plan,\n): LexicalPlanDependency<Plan> {\n const builder = LexicalBuilder.fromEditor(editor);\n invariant(\n builder !== undefined,\n \"getPlanFromEditor: editor was not created with this build of Lexical Builder %s\",\n PACKAGE_VERSION,\n );\n const rep = builder.getPlanRep(plan);\n invariant(\n rep !== undefined,\n \"getPlanFromEditor: Plan %s was not built when creating this editor\",\n plan.name,\n );\n return rep.getPlanDependency();\n}\n\n/**\n * Get the finalized config and output of a Plan that was used to build the editor.\n *\n * This is useful in the implementation of a LexicalNode or in other\n * situations where you have an editor reference but it's not easy to\n * pass the config or {@link RegisterState} around.\n *\n * It will throw if the Editor was not built using this Plan.\n *\n * @param plan The concrete reference to a Plan used to build this editor\n * @returns The config and outputs for that Plan\n */\nexport function $getPlanDependency<Plan extends AnyLexicalPlan>(\n plan: Plan,\n): LexicalPlanDependency<Plan> {\n return getPlanDependencyFromEditor($getEditor(), plan);\n}\n","import { $getEditor, LexicalEditor } from \"lexical\";\nimport { LexicalPeerDependency } from \"./types\";\nimport { LexicalBuilder } from \"./LexicalBuilder\";\nimport invariant from \"./shared/invariant\";\nimport { PACKAGE_VERSION } from \"./PACKAGE_VERSION\";\n\n/**\n * Get the finalized config and output of a Plan that was used to build the\n * editor by name.\n *\n * This can be used from the implementation of a LexicalNode or in other\n * situation where you have an editor reference but it's not easy to pass the\n * config around. Use this version if you do not have a concrete reference to\n * the Plan for some reason (e.g. it is an optional peer dependency).\n *\n * @param editor The editor that may have been built using plan\n * @param planName The name of the Plan\n * @returns The config and output of the Plan or undefined\n */\nexport function getPeerDependencyFromEditor<Name extends string>(\n editor: LexicalEditor,\n planName: Name,\n): LexicalPeerDependency<Name> | undefined {\n const builder = LexicalBuilder.fromEditor(editor);\n invariant(\n builder !== undefined,\n \"getPeerConfigFromEditor: editor was not created with this build of Lexical Builder %s\",\n PACKAGE_VERSION,\n );\n const peer = builder.planNameMap.get(planName);\n return peer\n ? (peer.getPlanDependency() as LexicalPeerDependency<Name>)\n : undefined;\n}\n\n/**\n * Get the finalized config and output of a Plan that was used to build the\n * editor by name.\n *\n * This can be used from the implementation of a LexicalNode or in other\n * situation where you have an editor reference but it's not easy to pass the\n * config around. Use this version if you do not have a concrete reference to\n * the Plan for some reason (e.g. it is an optional peer dependency).\n *\n * @param planName The name of the Plan\n * @returns The config and output of the Plan or undefined\n */\nexport function $getPeerDependency<Name extends string>(\n planName: Name,\n): LexicalPeerDependency<Name> | undefined {\n return getPeerDependencyFromEditor($getEditor(), planName);\n}\n","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nimport { definePlan } from \"./definePlan\";\nimport { safeCast } from \"./safeCast\";\n\nimport type {} from \"@etrepum/lexical-builder\";\ndeclare module \"@etrepum/lexical-builder\" {\n interface LexicalPlanRegistry {\n [AutoFocusPlan.name]: typeof AutoFocusPlan;\n }\n}\n\nexport interface AutoFocusConfig {\n /**\n * Where to move the selection when the editor is focused and there is no\n * existing selection. Can be \"rootStart\" or \"rootEnd\" (the default).\n */\n defaultSelection?: \"rootStart\" | \"rootEnd\";\n}\n\n/**\n * A Plan to focus the LexicalEditor when the root element is set\n * (typically only when the editor is first created).\n */\nexport const AutoFocusPlan = definePlan({\n config: safeCast<AutoFocusConfig>({}),\n name: \"@etrepum/lexical-builder/AutoFocusPlan\",\n register(editor, { defaultSelection }) {\n return editor.registerRootListener((rootElement) => {\n editor.focus(\n () => {\n // If we try and move selection to the same point with setBaseAndExtent, it won't\n // trigger a re-focus on the element. So in the case this occurs, we'll need to correct it.\n // Normally this is fine, Selection API !== Focus API, but fore the intents of the naming\n // of this plugin, which should preserve focus too.\n const activeElement = document.activeElement;\n if (\n rootElement !== null &&\n (activeElement === null || !rootElement.contains(activeElement))\n ) {\n // Note: preventScroll won't work in Webkit.\n rootElement.focus({ preventScroll: true });\n }\n },\n { defaultSelection },\n );\n });\n },\n});\n","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nimport { registerDragonSupport } from \"@lexical/dragon\";\n\nimport { definePlan } from \"./definePlan\";\n\n/**\n * Add Dragon speech to text input support to the editor, via the\n * @lexical/dragon module.\n */\nexport const DragonPlan = definePlan({\n config: {},\n name: \"@lexical/dragon\",\n register: registerDragonSupport,\n});\n","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\nimport {\n createEmptyHistoryState,\n type HistoryState,\n registerHistory,\n} from \"@lexical/history\";\n\nimport { definePlan } from \"./definePlan\";\nimport { safeCast } from \"./safeCast\";\n\nimport type {} from \"@etrepum/lexical-builder\";\ndeclare module \"@etrepum/lexical-builder\" {\n interface LexicalPlanRegistry {\n [HistoryPlan.name]: typeof HistoryPlan;\n }\n}\n\nexport interface HistoryConfig {\n /**\n * The time (in milliseconds) the editor should delay generating a new history stack,\n * instead of merging the current changes with the current stack. The default is 300ms.\n */\n delay: number;\n /**\n * The initial history state, the default is {@link createEmptyHistoryState}.\n */\n createInitialHistoryState: () => HistoryState;\n}\n\n/**\n * Registers necessary listeners to manage undo/redo history stack and related\n * editor commands, via the @lexical/history module.\n */\nexport const HistoryPlan = definePlan({\n config: safeCast<HistoryConfig>({\n createInitialHistoryState: createEmptyHistoryState,\n delay: 300,\n }),\n name: \"@etrepum/lexical-builder/HistoryPlan\",\n register(editor, { delay, createInitialHistoryState }) {\n return registerHistory(editor, createInitialHistoryState(), delay);\n },\n});\n","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\nimport { registerPlainText } from \"@lexical/plain-text\";\n\nimport { definePlan } from \"./definePlan\";\n\n/**\n * A plan to register @lexical/plain-text behavior\n */\nexport const PlainTextPlan = definePlan({\n config: {},\n conflictsWith: [\"@lexical/rich-text\"],\n name: \"@lexical/plain-text\",\n register: registerPlainText,\n});\n","/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nimport { HeadingNode, QuoteNode, registerRichText } from \"@lexical/rich-text\";\n\nimport { definePlan } from \"./definePlan\";\n\n/**\n * A plan to register @lexical/rich-text behavior and nodes\n * ({@link HeadingNode}, {@link QuoteNode})\n */\nexport const RichTextPlan = definePlan({\n config: {},\n conflictsWith: [\"@lexical/plain-text\"],\n name: \"@lexical/rich-text\",\n nodes: [HeadingNode, QuoteNode],\n register: registerRichText,\n});\n"],"names":["noop"],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -4,11 +4,11 @@ import { LexicalPlanRegistry } from '@etrepum/lexical-builder';
4
4
  /**
5
5
  * Any concrete {@link LexicalPlan}
6
6
  */
7
- export type AnyLexicalPlan = LexicalPlan<any, string>;
7
+ export type AnyLexicalPlan = LexicalPlan<any, string, any>;
8
8
  /**
9
9
  * Any {@link LexicalPlan} or {@link NormalizedLexicalPlanArgument}
10
10
  */
11
- export type AnyLexicalPlanArgument = LexicalPlanArgument<any, string>;
11
+ export type AnyLexicalPlanArgument = LexicalPlanArgument<any, string, any>;
12
12
  /**
13
13
  * The default plan configuration of an empty object
14
14
  */
@@ -16,7 +16,7 @@ export type PlanConfigBase = Record<never, never>;
16
16
  /**
17
17
  * A tuple of [plan, configOverride, ...configOverrides]
18
18
  */
19
- export type NormalizedLexicalPlanArgument<Config extends PlanConfigBase, Name extends string> = [LexicalPlan<Config, Name>, Partial<Config>, ...Partial<Config>[]];
19
+ export type NormalizedLexicalPlanArgument<Config extends PlanConfigBase, Name extends string, Output extends unknown> = [LexicalPlan<Config, Name, Output>, Partial<Config>, ...Partial<Config>[]];
20
20
  /**
21
21
  * An object that the register method can use to detect unmount and access the
22
22
  * configuration for plan dependencies
@@ -25,20 +25,24 @@ export interface RegisterState {
25
25
  /** An AbortSignal that is aborted when the EditorHandle is disposed */
26
26
  signal: AbortSignal;
27
27
  /**
28
- * Get the configuration of a peerDependency by name, if it exists
28
+ * Get the result of a peerDependency by name, if it exists
29
29
  * (must be a peerDependency of this plan)
30
30
  */
31
- getPeerConfig<Name extends keyof LexicalPlanRegistry>(name: string): undefined | LexicalPlanConfig<LexicalPlanRegistry[Name]>;
31
+ getPeer<Name extends keyof LexicalPlanRegistry>(name: string): undefined | LexicalPlanDependency<LexicalPlanRegistry[Name]>;
32
32
  /**
33
33
  * Get the configuration of a dependency by plan
34
34
  * (must be a direct dependency of this plan)
35
35
  */
36
- getDependencyConfig<Dependency extends AnyLexicalPlan>(dep: Dependency): LexicalPlanConfig<Dependency>;
36
+ getDependency<Dependency extends AnyLexicalPlan>(dep: Dependency): LexicalPlanDependency<Dependency>;
37
37
  }
38
38
  /**
39
39
  * A {@link LexicalPlan} or {@link NormalizedLexicalPlanArgument} (plan with config overrides)
40
40
  */
41
- export type LexicalPlanArgument<Config extends PlanConfigBase, Name extends string> = LexicalPlan<Config, Name> | NormalizedLexicalPlanArgument<Config, Name>;
41
+ export type LexicalPlanArgument<Config extends PlanConfigBase, Name extends string, Output extends unknown> = LexicalPlan<Config, Name, Output> | NormalizedLexicalPlanArgument<Config, Name, Output>;
42
+ export interface LexicalPlanDependency<Dependency extends AnyLexicalPlan> {
43
+ config: LexicalPlanConfig<Dependency>;
44
+ output: LexicalPlanOutput<Dependency>;
45
+ }
42
46
  /**
43
47
  * A Plan is a composable unit of LexicalEditor configuration
44
48
  * (nodes, theme, etc) used to create an editor, plus runtime behavior
@@ -47,7 +51,7 @@ export type LexicalPlanArgument<Config extends PlanConfigBase, Name extends stri
47
51
  * A Plan may depend on other Plans, and provide functionality to other
48
52
  * plans through its config.
49
53
  */
50
- export interface LexicalPlan<Config extends PlanConfigBase = PlanConfigBase, Name extends string = string> {
54
+ export interface LexicalPlan<Config extends PlanConfigBase = PlanConfigBase, Name extends string = string, Output extends unknown = unknown> {
51
55
  /** The name of the Plan, must be unique */
52
56
  name: Name;
53
57
  /** Plan names that must not be loaded with this Plan */
@@ -151,15 +155,30 @@ export interface LexicalPlan<Config extends PlanConfigBase = PlanConfigBase, Nam
151
155
  * dependencies and peerDependencies
152
156
  * @returns A clean-up function
153
157
  */
154
- register?: (editor: LexicalEditor, config: Config, state: RegisterState) => () => void;
158
+ register?: (editor: LexicalEditor, config: Config, state: RegisterState) => RegisterCleanup<Output>;
155
159
  }
160
+ export type RegisterCleanup<Output> = (() => void) & (unknown extends Output ? {
161
+ output?: Output;
162
+ } : {
163
+ output: Output;
164
+ });
156
165
  /**
157
166
  * Get the Config type of a peer Plan from {@link LexicalPlanRegistry} by
158
167
  * name, or the empty {@link PlanConfigBase} if it is not globally registered.
159
168
  */
160
- export type LexicalPeerConfig<Name extends keyof LexicalPlanRegistry | string> = [
169
+ export type LexicalPeerConfig<Name extends keyof LexicalPlanRegistry | string> = LexicalPeerPlan<Name>["config"];
170
+ /**
171
+ * Get the Plan type of a peer Plan from {@link LexicalPlanRegistry} by
172
+ * name, or an "default" Plan type if it is not globally registered.
173
+ */
174
+ export type LexicalPeerPlan<Name extends keyof LexicalPlanRegistry | string> = [
161
175
  Name
162
- ] extends [keyof LexicalPlanRegistry] ? LexicalPlanRegistry[Name]["config"] : PlanConfigBase;
176
+ ] extends [keyof LexicalPlanRegistry] ? LexicalPlanRegistry[Name] : LexicalPlan<PlanConfigBase, Name, unknown>;
177
+ /**
178
+ * Get the Config type of a peer Plan from {@link LexicalPlanRegistry} by
179
+ * name, or the empty {@link PlanConfigBase} if it is not globally registered.
180
+ */
181
+ export type LexicalPeerDependency<Name extends keyof LexicalPlanRegistry | string> = LexicalPlanDependency<LexicalPeerPlan<Name>>;
163
182
  /**
164
183
  * Extract the Config type from a Plan
165
184
  */
@@ -168,6 +187,7 @@ export type LexicalPlanConfig<Plan extends AnyLexicalPlan> = Plan["config"];
168
187
  * Extract the Name type from a Plan
169
188
  */
170
189
  export type LexicalPlanName<Plan extends AnyLexicalPlan> = Plan["name"];
190
+ export type LexicalPlanOutput<Plan> = Plan extends LexicalPlan<infer _Config, infer _Name, infer Output> ? Output : unknown;
171
191
  /**
172
192
  * A handle to the editor and its dispose function
173
193
  */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -12,12 +12,12 @@
12
12
  "plug-in"
13
13
  ],
14
14
  "scripts": {
15
- "build": "vite build",
15
+ "build": "tsc --noEmit && vite build",
16
16
  "dev": "vite build -w",
17
17
  "test": "vitest run",
18
18
  "test:watch": "vitest"
19
19
  },
20
- "version": "0.0.15-nightly.20240607.0",
20
+ "version": "0.0.15",
21
21
  "license": "MIT",
22
22
  "repository": {
23
23
  "type": "git",
@@ -1,16 +0,0 @@
1
- import { LexicalEditor } from 'lexical';
2
- import { LexicalPeerConfig } from './types';
3
-
4
- /**
5
- * Get the finalized configuration of a Plan using the editor by name, can be
6
- * used from the implementation of a LexicalNode or in other situations
7
- * where you have an editor reference but it's not easy to pass the config
8
- * around. Use this version if you do not have a concrete reference to the
9
- * Plan for some reason (e.g. it is an optional peer dependency).
10
- *
11
- * @param editor The editor that may have been built using plan
12
- * @param planName The name of the Plan
13
- * @returns The configuration for that Plan or undefined
14
- */
15
- export declare function getPeerConfigFromEditor<Name extends string>(editor: LexicalEditor, planName: Name): LexicalPeerConfig<Name> | undefined;
16
- //# sourceMappingURL=getPeerConfigFromEditor.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"getPeerConfigFromEditor.d.ts","sourceRoot":"","sources":["../src/getPeerConfigFromEditor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAK5C;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,SAAS,MAAM,EACzD,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,IAAI,GACb,iBAAiB,CAAC,IAAI,CAAC,GAAG,SAAS,CASrC"}
@@ -1,18 +0,0 @@
1
- import { LexicalEditor } from 'lexical';
2
- import { LexicalPlan, PlanConfigBase } from './types';
3
-
4
- /**
5
- * Get the finalized configuration of a Plan that was used to build the editor.
6
- *
7
- * This is useful in the implementation of a LexicalNode or in other
8
- * situations where you have an editor reference but it's not easy to
9
- * pass the config or {@link RegisterState} around.
10
- *
11
- * It will throw if the Editor was not built using this Plan.
12
- *
13
- * @param editor The editor that was built using plan
14
- * @param plan The concrete reference to a Plan used to build this editor
15
- * @returns The configuration for that Plan
16
- */
17
- export declare function getPlanConfigFromEditor<Config extends PlanConfigBase, Name extends string>(editor: LexicalEditor, plan: LexicalPlan<Config, Name>): Config;
18
- //# sourceMappingURL=getPlanConfigFromEditor.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"getPlanConfigFromEditor.d.ts","sourceRoot":"","sources":["../src/getPlanConfigFromEditor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAKtD;;;;;;;;;;;;GAYG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,SAAS,cAAc,EAC7B,IAAI,SAAS,MAAM,EACnB,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,MAAM,CAchE"}