@notcompose/molecule 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,13 @@
1
+ import { Composer, Modifier, Node } from '@notcompose/core';
2
+ export declare class MoleculeComposition {
3
+ private composer;
4
+ readonly rootNode: Node;
5
+ private content;
6
+ private invalidatedCallback;
7
+ constructor(composer: Composer);
8
+ setContent(content: () => void): void;
9
+ invalidate(): void;
10
+ invokeWhenInvalidated(callback: () => void): void;
11
+ compose(modifier: Modifier): void;
12
+ }
13
+ //# sourceMappingURL=MoleculeComposition.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MoleculeComposition.d.ts","sourceRoot":"","sources":["../../src/MoleculeComposition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAmE,MAAM,kBAAkB,CAAA;AAE5H,qBAAa,mBAAmB;IAMxB,OAAO,CAAC,QAAQ;IALpB,SAAgB,QAAQ,OAA2B;IACnD,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,mBAAmB,CAA4B;IAEvD,YACY,QAAQ,EAAE,QAAQ,EAC1B;IAEJ,UAAU,CAAC,OAAO,EAAE,MAAM,IAAI,GAAG,IAAI,CAEpC;IAED,UAAU,SAKT;IAED,qBAAqB,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAEhD;IAED,OAAO,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAahC;CACJ"}
@@ -0,0 +1,37 @@
1
+ import { Composer, Modifier, Node, RecomposeLambdaExtensionKey, withComposer } from '@notcompose/core';
2
+ export class MoleculeComposition {
3
+ composer;
4
+ rootNode = new Node(null, Modifier);
5
+ content = null;
6
+ invalidatedCallback = null;
7
+ constructor(composer) {
8
+ this.composer = composer;
9
+ }
10
+ setContent(content) {
11
+ this.content = content;
12
+ }
13
+ invalidate() {
14
+ const callback = this.invalidatedCallback;
15
+ if (callback === null)
16
+ return;
17
+ this.invalidatedCallback = null;
18
+ callback();
19
+ }
20
+ invokeWhenInvalidated(callback) {
21
+ this.invalidatedCallback = callback;
22
+ }
23
+ compose(modifier) {
24
+ if (this.content === null)
25
+ throw new Error('No content to compose');
26
+ withComposer(this.composer, () => {
27
+ this.rootNode.modifier = modifier;
28
+ this.composer.startTree(this.rootNode);
29
+ this.composer.applyExtension(RecomposeLambdaExtensionKey, this.content);
30
+ this.composer.startComposingNode();
31
+ this.content();
32
+ this.composer.endComposingNode();
33
+ this.composer.endTree();
34
+ });
35
+ }
36
+ }
37
+ //# sourceMappingURL=MoleculeComposition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MoleculeComposition.js","sourceRoot":"","sources":["../../src/MoleculeComposition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAwB,2BAA2B,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAE5H,MAAM,OAAO,mBAAmB;IAMhB,QAAQ;IALJ,QAAQ,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;IAC3C,OAAO,GAAwB,IAAI,CAAA;IACnC,mBAAmB,GAAwB,IAAI,CAAA;IAEvD,YACY,QAAkB;wBAAlB,QAAQ;IACjB,CAAC;IAEJ,UAAU,CAAC,OAAmB;QAC1B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IAC1B,CAAC;IAED,UAAU;QACN,MAAM,QAAQ,GAAG,IAAI,CAAC,mBAAmB,CAAA;QACzC,IAAI,QAAQ,KAAK,IAAI;YAAE,OAAM;QAC7B,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAA;QAC/B,QAAQ,EAAE,CAAA;IACd,CAAC;IAED,qBAAqB,CAAC,QAAoB;QACtC,IAAI,CAAC,mBAAmB,GAAG,QAAQ,CAAA;IACvC,CAAC;IAED,OAAO,CAAC,QAAkB;QACtB,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI;YACrB,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAA;QAE5C,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE;YAC7B,IAAI,CAAC,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAA;YACjC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YACtC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,2BAA2B,EAAE,IAAI,CAAC,OAAkC,CAAC,CAAA;YAClG,IAAI,CAAC,QAAQ,CAAC,kBAAkB,EAAE,CAAA;YAClC,IAAI,CAAC,OAAQ,EAAE,CAAA;YACf,IAAI,CAAC,QAAQ,CAAC,gBAAgB,EAAE,CAAA;YAChC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAA;QAC3B,CAAC,CAAC,CAAA;IACN,CAAC;CACJ","sourcesContent":["import { Composer, Modifier, Node, type RecomposeLambda, RecomposeLambdaExtensionKey, withComposer } from '@notcompose/core'\n\nexport class MoleculeComposition {\n public readonly rootNode = new Node(null, Modifier)\n private content: (() => void) | null = null\n private invalidatedCallback: (() => void) | null = null\n\n constructor(\n private composer: Composer\n ) {}\n\n setContent(content: () => void): void {\n this.content = content\n }\n\n invalidate() {\n const callback = this.invalidatedCallback\n if (callback === null) return\n this.invalidatedCallback = null\n callback()\n }\n\n invokeWhenInvalidated(callback: () => void): void {\n this.invalidatedCallback = callback\n }\n\n compose(modifier: Modifier): void {\n if (this.content === null)\n throw new Error('No content to compose')\n\n withComposer(this.composer, () => {\n this.rootNode.modifier = modifier\n this.composer.startTree(this.rootNode)\n this.composer.applyExtension(RecomposeLambdaExtensionKey, this.content! satisfies RecomposeLambda)\n this.composer.startComposingNode()\n this.content!()\n this.composer.endComposingNode()\n this.composer.endTree()\n })\n }\n}\n"]}
@@ -0,0 +1,15 @@
1
+ import { type CompositionSession, Modifier, Node } from '@notcompose/core';
2
+ export declare class MoleculeCompositionRunner {
3
+ private compositionSession;
4
+ readonly rootNode: Node;
5
+ private content;
6
+ private invalidatedCallback;
7
+ private runnerFrame;
8
+ private contentFrame;
9
+ constructor(compositionSession: CompositionSession);
10
+ setContent(content: () => void): void;
11
+ invalidate(): void;
12
+ invokeWhenInvalidated(callback: () => void): void;
13
+ compose(modifier: Modifier): void;
14
+ }
15
+ //# sourceMappingURL=MoleculeCompositionRunner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MoleculeCompositionRunner.d.ts","sourceRoot":"","sources":["../../src/MoleculeCompositionRunner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,kBAAkB,EAAmB,QAAQ,EAAE,IAAI,EAA+B,MAAM,kBAAkB,CAAA;AAExH,qBAAa,yBAAyB;IAQ9B,OAAO,CAAC,kBAAkB;IAP9B,SAAgB,QAAQ,OAA2B;IACnD,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,mBAAmB,CAA4B;IACvD,OAAO,CAAC,WAAW,CAAI;IACvB,OAAO,CAAC,YAAY,CAAI;IAExB,YACY,kBAAkB,EAAE,kBAAkB,EAC9C;IAEJ,UAAU,CAAC,OAAO,EAAE,MAAM,IAAI,GAAG,IAAI,CAGpC;IAED,UAAU,SAKT;IAED,qBAAqB,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAEhD;IAED,OAAO,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAiBhC;CACJ"}
@@ -0,0 +1,44 @@
1
+ import { currentComposer, Modifier, Node, RecomposeLambdaExtensionKey } from '@notcompose/core';
2
+ export class MoleculeCompositionRunner {
3
+ compositionSession;
4
+ rootNode = new Node(null, Modifier);
5
+ content = null;
6
+ invalidatedCallback = null;
7
+ runnerFrame = 0;
8
+ contentFrame = 0;
9
+ constructor(compositionSession) {
10
+ this.compositionSession = compositionSession;
11
+ }
12
+ setContent(content) {
13
+ this.content = content;
14
+ this.contentFrame = 0;
15
+ }
16
+ invalidate() {
17
+ const callback = this.invalidatedCallback;
18
+ if (callback === null)
19
+ return;
20
+ this.invalidatedCallback = null;
21
+ callback();
22
+ }
23
+ invokeWhenInvalidated(callback) {
24
+ this.invalidatedCallback = callback;
25
+ }
26
+ compose(modifier) {
27
+ if (this.content === null)
28
+ throw new Error('No content to compose');
29
+ this.runnerFrame++;
30
+ this.contentFrame++;
31
+ this.compositionSession.compose(() => {
32
+ this.rootNode.modifier = modifier;
33
+ currentComposer().startTree(this.rootNode);
34
+ currentComposer().applyExtension(RecomposeLambdaExtensionKey, this.content);
35
+ currentComposer().startComposingNode();
36
+ this.content();
37
+ currentComposer().endComposingNode();
38
+ currentComposer().endTree();
39
+ }, {
40
+ debugInformation: `currentContentRootFrame = ${this.contentFrame}\nmoleculeRunnerRootFrame = ${this.runnerFrame}`
41
+ });
42
+ }
43
+ }
44
+ //# sourceMappingURL=MoleculeCompositionRunner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MoleculeCompositionRunner.js","sourceRoot":"","sources":["../../src/MoleculeCompositionRunner.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,eAAe,EAAE,QAAQ,EAAE,IAAI,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAA;AAExH,MAAM,OAAO,yBAAyB;IAQtB,kBAAkB;IAPd,QAAQ,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;IAC3C,OAAO,GAAwB,IAAI,CAAA;IACnC,mBAAmB,GAAwB,IAAI,CAAA;IAC/C,WAAW,GAAG,CAAC,CAAA;IACf,YAAY,GAAG,CAAC,CAAA;IAExB,YACY,kBAAsC;kCAAtC,kBAAkB;IAC3B,CAAC;IAEJ,UAAU,CAAC,OAAmB;QAC1B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QACtB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAA;IACzB,CAAC;IAED,UAAU;QACN,MAAM,QAAQ,GAAG,IAAI,CAAC,mBAAmB,CAAA;QACzC,IAAI,QAAQ,KAAK,IAAI;YAAE,OAAM;QAC7B,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAA;QAC/B,QAAQ,EAAE,CAAA;IACd,CAAC;IAED,qBAAqB,CAAC,QAAoB;QACtC,IAAI,CAAC,mBAAmB,GAAG,QAAQ,CAAA;IACvC,CAAC;IAED,OAAO,CAAC,QAAkB;QACtB,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI;YACrB,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAA;QAC5C,IAAI,CAAC,WAAW,EAAE,CAAA;QAClB,IAAI,CAAC,YAAY,EAAE,CAAA;QAEnB,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,GAAG,EAAE;YACjC,IAAI,CAAC,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAA;YACjC,eAAe,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YAC1C,eAAe,EAAE,CAAC,cAAc,CAAC,2BAA2B,EAAE,IAAI,CAAC,OAAQ,CAAC,CAAA;YAC5E,eAAe,EAAE,CAAC,kBAAkB,EAAE,CAAA;YACtC,IAAI,CAAC,OAAQ,EAAE,CAAA;YACf,eAAe,EAAE,CAAC,gBAAgB,EAAE,CAAA;YACpC,eAAe,EAAE,CAAC,OAAO,EAAE,CAAA;QAC/B,CAAC,EAAE;YACC,gBAAgB,EAAE,6BAA6B,IAAI,CAAC,YAAY,+BAA+B,IAAI,CAAC,WAAW,EAAE;SACpH,CAAC,CAAA;IACN,CAAC;CACJ","sourcesContent":["import { type CompositionSession, currentComposer, Modifier, Node, RecomposeLambdaExtensionKey } from '@notcompose/core'\n\nexport class MoleculeCompositionRunner {\n public readonly rootNode = new Node(null, Modifier)\n private content: (() => void) | null = null\n private invalidatedCallback: (() => void) | null = null\n private runnerFrame = 0\n private contentFrame = 0\n\n constructor(\n private compositionSession: CompositionSession,\n ) {}\n\n setContent(content: () => void): void {\n this.content = content\n this.contentFrame = 0\n }\n\n invalidate() {\n const callback = this.invalidatedCallback\n if (callback === null) return\n this.invalidatedCallback = null\n callback()\n }\n\n invokeWhenInvalidated(callback: () => void): void {\n this.invalidatedCallback = callback\n }\n\n compose(modifier: Modifier): void {\n if (this.content === null)\n throw new Error('No content to compose')\n this.runnerFrame++\n this.contentFrame++\n\n this.compositionSession.compose(() => {\n this.rootNode.modifier = modifier\n currentComposer().startTree(this.rootNode)\n currentComposer().applyExtension(RecomposeLambdaExtensionKey, this.content!)\n currentComposer().startComposingNode()\n this.content!()\n currentComposer().endComposingNode()\n currentComposer().endTree()\n }, {\n debugInformation: `currentContentRootFrame = ${this.contentFrame}\\nmoleculeRunnerRootFrame = ${this.runnerFrame}`\n })\n }\n}\n"]}
@@ -0,0 +1,3 @@
1
+ /// <reference lib="esnext.disposable" preserve="true" />
2
+ export * from './runMolecule.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAEA,cAAc,kBAAkB,CAAA"}
@@ -0,0 +1,3 @@
1
+ /// <reference lib="esnext.disposable" preserve="true" />
2
+ export * from './runMolecule.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,yDAAyD;AAEzD,cAAc,kBAAkB,CAAA","sourcesContent":["/// <reference lib=\"esnext.disposable\" preserve=\"true\" />\n\nexport * from './runMolecule.js'\n"]}
@@ -0,0 +1,3 @@
1
+ import { type State } from '@notcompose/core';
2
+ export declare function runMolecule<T>(content: () => T): State<T>;
3
+ //# sourceMappingURL=runMolecule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runMolecule.d.ts","sourceRoot":"","sources":["../../src/runMolecule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsP,KAAK,KAAK,EAAoB,MAAM,kBAAkB,CAAA;AAInT,wBAAgB,WAAW,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CA+CzD"}
@@ -0,0 +1,45 @@
1
+ import { CleanCompositionPlugin, Composer, ComposerApplierPlugin, ComposerVerifierPlugin, CompositionSessionDefault, CurrentComposerRecomputeScope, Modifier, mutableStateOf, NameModifier, Recomposer, RecomputeScopeApplierPlugin, RememberObserverPlugin, StateReadsPlugin } from '@notcompose/core';
2
+ import { MoleculeCompositionRunner } from './MoleculeCompositionRunner.js';
3
+ const Empty = Symbol('Empty');
4
+ export function runMolecule(content) {
5
+ const recomposer = new Recomposer();
6
+ const composer = new Composer([
7
+ recomposer,
8
+ // Для дебага, кинет исключение если методы плагинов вызовутся неправильно
9
+ new ComposerVerifierPlugin(),
10
+ // Удаляет пометку о грязной ноде сразу после начала композиции
11
+ new CleanCompositionPlugin(),
12
+ // Отслеживает чтения стейтов во время композиции;
13
+ // Составляет список стейтов от которых зависит каждая нода;
14
+ // Позже используется для рекомпозиции при изменении стейта;
15
+ // + recomposer помечает ноду грязной при изменении стейтов, от которых она зависит
16
+ new StateReadsPlugin(recomposer),
17
+ // Вызывает onRemembered и onForgotten для запомненых объектов реализующих RememberObserver
18
+ // В частности это нужно для работы LaunchedEffect и DisposableEffect (см. исходники)
19
+ new RememberObserverPlugin(),
20
+ ]);
21
+ const state = mutableStateOf(Empty);
22
+ const compositionSession = new CompositionSessionDefault(composer, [
23
+ new RecomputeScopeApplierPlugin(CurrentComposerRecomputeScope),
24
+ new ComposerApplierPlugin(),
25
+ ]);
26
+ const composition = new MoleculeCompositionRunner(compositionSession);
27
+ composition.setContent(() => {
28
+ state.value = content();
29
+ });
30
+ function recompose() {
31
+ composition.compose(Modifier.then(NameModifier('Root')));
32
+ }
33
+ recompose();
34
+ void (async () => {
35
+ // noinspection InfiniteLoopJS
36
+ while (true) {
37
+ await recomposer.awaitNeedRecompose();
38
+ recomposer.recompose(compositionSession);
39
+ }
40
+ })();
41
+ if (state.value === Empty)
42
+ throw new Error('State cannot be empty');
43
+ return state;
44
+ }
45
+ //# sourceMappingURL=runMolecule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runMolecule.js","sourceRoot":"","sources":["../../src/runMolecule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,QAAQ,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,6BAA6B,EAAE,QAAQ,EAAE,cAAc,EAAE,YAAY,EAAE,UAAU,EAAE,2BAA2B,EAAE,sBAAsB,EAAc,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AACnT,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAA;AAE1E,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,CAAA;AAC7B,MAAM,UAAU,WAAW,CAAI,OAAgB;IAC3C,MAAM,UAAU,GAAG,IAAI,UAAU,EAAE,CAAA;IACnC,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC;QAC1B,UAAU;QACV,0EAA0E;QAC1E,IAAI,sBAAsB,EAAE;QAC5B,+DAA+D;QAC/D,IAAI,sBAAsB,EAAE;QAC5B,kDAAkD;QAClD,4DAA4D;QAC5D,4DAA4D;QAC5D,mFAAmF;QACnF,IAAI,gBAAgB,CAAC,UAAU,CAAC;QAChC,2FAA2F;QAC3F,qFAAqF;QACrF,IAAI,sBAAsB,EAAE;KAC/B,CAAC,CAAA;IAEF,MAAM,KAAK,GAAG,cAAc,CAAmB,KAAK,CAAC,CAAA;IAErD,MAAM,kBAAkB,GAAG,IAAI,yBAAyB,CAAC,QAAQ,EAAE;QAC/D,IAAI,2BAA2B,CAAC,6BAA6B,CAAC;QAC9D,IAAI,qBAAqB,EAAE;KAC9B,CAAC,CAAA;IAEF,MAAM,WAAW,GAAG,IAAI,yBAAyB,CAAC,kBAAkB,CAAC,CAAA;IACrE,WAAW,CAAC,UAAU,CAAC,GAAG,EAAE;QACxB,KAAK,CAAC,KAAK,GAAG,OAAO,EAAE,CAAA;IAC3B,CAAC,CAAC,CAAA;IAEF,SAAS,SAAS;QACd,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;IAC5D,CAAC;IAED,SAAS,EAAE,CAAA;IAEX,KAAK,CAAC,KAAK,IAAI,EAAE;QACb,8BAA8B;QAC9B,OAAO,IAAI,EAAE,CAAC;YACV,MAAM,UAAU,CAAC,kBAAkB,EAAE,CAAA;YACrC,UAAU,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAA;QAC5C,CAAC;IACL,CAAC,CAAC,EAAE,CAAA;IAEJ,IAAI,KAAK,CAAC,KAAK,KAAK,KAAK;QACrB,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAA;IAC5C,OAAO,KAAiB,CAAA;AAC5B,CAAC","sourcesContent":["import { CleanCompositionPlugin, Composer, ComposerApplierPlugin, ComposerVerifierPlugin, CompositionSessionDefault, CurrentComposerRecomputeScope, Modifier, mutableStateOf, NameModifier, Recomposer, RecomputeScopeApplierPlugin, RememberObserverPlugin, type State, StateReadsPlugin } from '@notcompose/core'\nimport { MoleculeCompositionRunner } from './MoleculeCompositionRunner.js'\n\nconst Empty = Symbol('Empty')\nexport function runMolecule<T>(content: () => T): State<T> {\n const recomposer = new Recomposer()\n const composer = new Composer([\n recomposer,\n // Для дебага, кинет исключение если методы плагинов вызовутся неправильно\n new ComposerVerifierPlugin(),\n // Удаляет пометку о грязной ноде сразу после начала композиции\n new CleanCompositionPlugin(),\n // Отслеживает чтения стейтов во время композиции;\n // Составляет список стейтов от которых зависит каждая нода;\n // Позже используется для рекомпозиции при изменении стейта;\n // + recomposer помечает ноду грязной при изменении стейтов, от которых она зависит\n new StateReadsPlugin(recomposer),\n // Вызывает onRemembered и onForgotten для запомненых объектов реализующих RememberObserver\n // В частности это нужно для работы LaunchedEffect и DisposableEffect (см. исходники)\n new RememberObserverPlugin(),\n ])\n\n const state = mutableStateOf<T | typeof Empty>(Empty)\n\n const compositionSession = new CompositionSessionDefault(composer, [\n new RecomputeScopeApplierPlugin(CurrentComposerRecomputeScope),\n new ComposerApplierPlugin(),\n ])\n\n const composition = new MoleculeCompositionRunner(compositionSession)\n composition.setContent(() => {\n state.value = content()\n })\n\n function recompose() {\n composition.compose(Modifier.then(NameModifier('Root')))\n }\n\n recompose()\n\n void (async () => {\n // noinspection InfiniteLoopJS\n while (true) {\n await recomposer.awaitNeedRecompose()\n recomposer.recompose(compositionSession)\n }\n })()\n\n if (state.value === Empty)\n throw new Error('State cannot be empty')\n return state as State<T>\n}\n"]}
package/package.json ADDED
@@ -0,0 +1,37 @@
1
+ {
2
+ "name": "@notcompose/molecule",
3
+ "version": "0.1.2",
4
+ "description": "notcompose molecule",
5
+ "type": "module",
6
+ "main": "./build/dist/index.js",
7
+ "types": "./build/dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./build/dist/index.d.ts",
11
+ "import": "./build/dist/index.js",
12
+ "default": "./build/dist/index.js"
13
+ }
14
+ },
15
+ "files": [
16
+ "build/dist"
17
+ ],
18
+ "peerDependencies": {
19
+ "@notcompose/core": "^0.1.0"
20
+ },
21
+ "devDependencies": {
22
+ "@notcompose/core": "0.1.2"
23
+ },
24
+ "publishConfig": {
25
+ "access": "public"
26
+ },
27
+ "license": "MIT",
28
+ "repository": {
29
+ "type": "git",
30
+ "url": "git+https://github.com/y9maly/notcompose.git",
31
+ "directory": "notcompose-molecule"
32
+ },
33
+ "scripts": {
34
+ "build": "tsc -p tsconfig.json",
35
+ "test": "vitest run"
36
+ }
37
+ }