@flighthq/lifecycle 0.5.1-next.1350.8ce488b → 0.5.1-next.1404.457d1da
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/lifecycle.d.ts +9 -9
- package/dist/lifecycle.d.ts.map +1 -1
- package/dist/lifecycle.js.map +1 -1
- package/package.json +4 -4
- package/src/lifecycle.test.ts +12 -10
- package/src/lifecycleHost.test.ts +6 -6
package/README.md
CHANGED
|
@@ -13,5 +13,5 @@ Import the supported application-facing API from `@flighthq/lifecycle`. The `@fl
|
|
|
13
13
|
This package is part of the locked-version Flight SDK graph. Applications may instead install and import `@flighthq/sdk` when package-level tree shaking is sufficient.
|
|
14
14
|
|
|
15
15
|
- [Flight project](https://github.com/flighthq/flight)
|
|
16
|
-
- [Source for @flighthq/lifecycle@0.5.1-next.
|
|
17
|
-
- [License](https://github.com/flighthq/flight/blob/
|
|
16
|
+
- [Source for @flighthq/lifecycle@0.5.1-next.1404.457d1da](https://github.com/flighthq/flight/tree/457d1da918a60be5853b84eb6c25530a66662cef/packages/lifecycle)
|
|
17
|
+
- [License](https://github.com/flighthq/flight/blob/457d1da918a60be5853b84eb6c25530a66662cef/LICENSE.md)
|
package/dist/lifecycle.d.ts
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import type { BackendOperationExplanation, LifecycleOperation, EntityConstruction } from '@flighthq/types/contract';
|
|
2
|
-
import type { AppLaunchKind,
|
|
3
|
-
export declare function attachAppLifecycle(hostLifecycle: Readonly<
|
|
2
|
+
import type { AppLaunchKind, HostLifecycleCapability, AppLifecycle, AppLifecycleState } from '@flighthq/types/contract';
|
|
3
|
+
export declare function attachAppLifecycle(hostLifecycle: Readonly<HostLifecycleCapability>, app: AppLifecycle): void;
|
|
4
4
|
export declare function createAppLifecycle(): AppLifecycle;
|
|
5
5
|
export declare function detachAppLifecycle(app: AppLifecycle): void;
|
|
6
6
|
export declare function disposeAppLifecycle(app: AppLifecycle): void;
|
|
7
|
-
export declare function explainLifecycleOperation(hostLifecycle: Readonly<
|
|
8
|
-
export declare function getAppLaunchKind(hostLifecycle: Readonly<
|
|
9
|
-
export declare function getAppLifecycleState(hostLifecycle: Readonly<
|
|
10
|
-
export declare function hasLifecycleOperation(hostLifecycle: Readonly<
|
|
7
|
+
export declare function explainLifecycleOperation(hostLifecycle: Readonly<HostLifecycleCapability>, operation: LifecycleOperation): BackendOperationExplanation;
|
|
8
|
+
export declare function getAppLaunchKind(hostLifecycle: Readonly<HostLifecycleCapability>): AppLaunchKind;
|
|
9
|
+
export declare function getAppLifecycleState(hostLifecycle: Readonly<HostLifecycleCapability>): AppLifecycleState;
|
|
10
|
+
export declare function hasLifecycleOperation(hostLifecycle: Readonly<HostLifecycleCapability>, operation: LifecycleOperation): boolean;
|
|
11
11
|
export declare function initializeAppLifecycle(out: EntityConstruction<AppLifecycle>): void;
|
|
12
|
-
export declare function isAppActive(hostLifecycle: Readonly<
|
|
13
|
-
export declare function isAppBackground(hostLifecycle: Readonly<
|
|
14
|
-
export declare function isAppInactive(hostLifecycle: Readonly<
|
|
12
|
+
export declare function isAppActive(hostLifecycle: Readonly<HostLifecycleCapability>): boolean;
|
|
13
|
+
export declare function isAppBackground(hostLifecycle: Readonly<HostLifecycleCapability>): boolean;
|
|
14
|
+
export declare function isAppInactive(hostLifecycle: Readonly<HostLifecycleCapability>): boolean;
|
|
15
15
|
export declare function requestAppBack(app: AppLifecycle): boolean;
|
|
16
16
|
//# sourceMappingURL=lifecycle.d.ts.map
|
package/dist/lifecycle.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../src/lifecycle.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,2BAA2B,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACpH,OAAO,KAAK,EACV,aAAa,EACb,
|
|
1
|
+
{"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../src/lifecycle.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,2BAA2B,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACpH,OAAO,KAAK,EACV,aAAa,EACb,uBAAuB,EACvB,YAAY,EACZ,iBAAiB,EAElB,MAAM,0BAA0B,CAAC;AAYlC,wBAAgB,kBAAkB,CAAC,aAAa,EAAE,QAAQ,CAAC,uBAAuB,CAAC,EAAE,GAAG,EAAE,YAAY,GAAG,IAAI,CAqC5G;AAED,wBAAgB,kBAAkB,IAAI,YAAY,CAIjD;AAGD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,CAM1D;AAID,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,CAG3D;AAID,wBAAgB,yBAAyB,CACvC,aAAa,EAAE,QAAQ,CAAC,uBAAuB,CAAC,EAChD,SAAS,EAAE,kBAAkB,GAC5B,2BAA2B,CAG7B;AAMD,wBAAgB,gBAAgB,CAAC,aAAa,EAAE,QAAQ,CAAC,uBAAuB,CAAC,GAAG,aAAa,CAGhG;AAGD,wBAAgB,oBAAoB,CAAC,aAAa,EAAE,QAAQ,CAAC,uBAAuB,CAAC,GAAG,iBAAiB,CAExG;AAGD,wBAAgB,qBAAqB,CACnC,aAAa,EAAE,QAAQ,CAAC,uBAAuB,CAAC,EAChD,SAAS,EAAE,kBAAkB,GAC5B,OAAO,CAET;AAGD,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,kBAAkB,CAAC,YAAY,CAAC,GAAG,IAAI,CAQlF;AAGD,wBAAgB,WAAW,CAAC,aAAa,EAAE,QAAQ,CAAC,uBAAuB,CAAC,GAAG,OAAO,CAErF;AAGD,wBAAgB,eAAe,CAAC,aAAa,EAAE,QAAQ,CAAC,uBAAuB,CAAC,GAAG,OAAO,CAEzF;AAID,wBAAgB,aAAa,CAAC,aAAa,EAAE,QAAQ,CAAC,uBAAuB,CAAC,GAAG,OAAO,CAEvF;AAOD,wBAAgB,cAAc,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAGzD"}
|
package/dist/lifecycle.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../src/lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAUtE,qGAAqG;AACrG,kGAAkG;AAClG,8FAA8F;AAC9F,qGAAqG;AACrG,qFAAqF;AACrF,EAAE;AACF,8FAA8F;AAC9F,+FAA+F;AAC/F,mGAAmG;AACnG,oGAAoG;AACpG,MAAM,UAAU,kBAAkB,CAAC,
|
|
1
|
+
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../src/lifecycle.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flighthq/lifecycle",
|
|
3
|
-
"version": "0.5.1-next.
|
|
3
|
+
"version": "0.5.1-next.1404.457d1da",
|
|
4
4
|
"author": "Joshua Granick and other contributors",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -38,9 +38,9 @@
|
|
|
38
38
|
"clean:dist": "tsx ../../scripts/clean-package-dist.ts"
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"@flighthq/entity": "0.5.1-next.
|
|
42
|
-
"@flighthq/signals": "0.5.1-next.
|
|
43
|
-
"@flighthq/types": "0.5.1-next.
|
|
41
|
+
"@flighthq/entity": "0.5.1-next.1404.457d1da",
|
|
42
|
+
"@flighthq/signals": "0.5.1-next.1404.457d1da",
|
|
43
|
+
"@flighthq/types": "0.5.1-next.1404.457d1da"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
46
|
"typescript": "^5.3.0"
|
package/src/lifecycle.test.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { allocateEntity, finishEntity } from '@flighthq/entity/contract';
|
|
2
2
|
import { cancelSignal, connectSignal } from '@flighthq/signals/contract';
|
|
3
3
|
import type {
|
|
4
|
-
|
|
4
|
+
HostLifecycleCapability,
|
|
5
5
|
AppLaunchKind,
|
|
6
6
|
AppLifecycleState,
|
|
7
7
|
AppMemoryPressure,
|
|
@@ -25,14 +25,16 @@ import {
|
|
|
25
25
|
requestAppBack,
|
|
26
26
|
} from './lifecycle';
|
|
27
27
|
|
|
28
|
-
type FakeBackend =
|
|
28
|
+
type FakeBackend = HostLifecycleCapability & {
|
|
29
29
|
state: AppLifecycleState;
|
|
30
30
|
fire: () => void;
|
|
31
31
|
fireMemory: (level: AppMemoryPressure) => void;
|
|
32
32
|
};
|
|
33
33
|
|
|
34
|
-
function hostOf(backend:
|
|
35
|
-
|
|
34
|
+
function hostOf(backend: HostLifecycleCapability): {
|
|
35
|
+
readonly system: { readonly lifecycle: HostLifecycleCapability };
|
|
36
|
+
} {
|
|
37
|
+
return { system: { lifecycle: backend } } as { readonly system: { readonly lifecycle: HostLifecycleCapability } };
|
|
36
38
|
}
|
|
37
39
|
|
|
38
40
|
function fakeBackend(): FakeBackend {
|
|
@@ -376,7 +378,7 @@ describe('explainLifecycleOperation', () => {
|
|
|
376
378
|
it('reports an operation the host provider omits as unimplemented', () => {
|
|
377
379
|
const host = hostOf(
|
|
378
380
|
(() => {
|
|
379
|
-
const out = allocateEntity<
|
|
381
|
+
const out = allocateEntity<HostLifecycleCapability>();
|
|
380
382
|
out.getState = () => 'active' as const;
|
|
381
383
|
out.subscribe = () => () => {};
|
|
382
384
|
return finishEntity(out);
|
|
@@ -395,7 +397,7 @@ describe('explainLifecycleOperation', () => {
|
|
|
395
397
|
const rich = hostOf(fakeBackend());
|
|
396
398
|
const bare = hostOf(
|
|
397
399
|
(() => {
|
|
398
|
-
const out = allocateEntity<
|
|
400
|
+
const out = allocateEntity<HostLifecycleCapability>();
|
|
399
401
|
out.getState = () => 'active' as const;
|
|
400
402
|
out.subscribe = () => () => {};
|
|
401
403
|
return finishEntity(out);
|
|
@@ -414,7 +416,7 @@ describe('getAppLaunchKind', () => {
|
|
|
414
416
|
});
|
|
415
417
|
|
|
416
418
|
it('delegates to backend.getLaunchKind when present', () => {
|
|
417
|
-
const out = allocateEntity<
|
|
419
|
+
const out = allocateEntity<HostLifecycleCapability>();
|
|
418
420
|
out.getState = () => 'active' as AppLifecycleState;
|
|
419
421
|
out.subscribe = () => () => {};
|
|
420
422
|
out.getLaunchKind = () => 'cold' as AppLaunchKind;
|
|
@@ -444,7 +446,7 @@ describe('hasLifecycleOperation', () => {
|
|
|
444
446
|
it('is false for an operation the host provider omits', () => {
|
|
445
447
|
const host = hostOf(
|
|
446
448
|
(() => {
|
|
447
|
-
const out = allocateEntity<
|
|
449
|
+
const out = allocateEntity<HostLifecycleCapability>();
|
|
448
450
|
out.getState = () => 'active' as const;
|
|
449
451
|
out.subscribe = () => () => {};
|
|
450
452
|
return finishEntity(out);
|
|
@@ -466,8 +468,8 @@ describe('initializeAppLifecycle', () => {
|
|
|
466
468
|
const OPTIONAL_OPERATIONS: readonly LifecycleOperation[] = ['getLaunchKind', 'subscribeMemoryWarning'];
|
|
467
469
|
|
|
468
470
|
// A host implementing only the REQUIRED members — partial support declared by absence.
|
|
469
|
-
function partialBackend():
|
|
470
|
-
const out = allocateEntity<
|
|
471
|
+
function partialBackend(): HostLifecycleCapability {
|
|
472
|
+
const out = allocateEntity<HostLifecycleCapability>();
|
|
471
473
|
out.getState = (() => undefined) as never;
|
|
472
474
|
out.subscribe = (() => undefined) as never;
|
|
473
475
|
return finishEntity(out);
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import type { AppLifecycleState,
|
|
1
|
+
import type { AppLifecycleState, HostLifecycleCapability } from '@flighthq/types/contract';
|
|
2
2
|
|
|
3
3
|
import { getAppLaunchKind, getAppLifecycleState, isAppActive, isAppBackground, isAppInactive } from './lifecycle';
|
|
4
4
|
|
|
5
|
-
function hostWith(backend: Partial<
|
|
6
|
-
readonly system: { readonly lifecycle:
|
|
5
|
+
function hostWith(backend: Partial<HostLifecycleCapability>): {
|
|
6
|
+
readonly system: { readonly lifecycle: HostLifecycleCapability };
|
|
7
7
|
} {
|
|
8
|
-
return { system: { lifecycle: backend as
|
|
9
|
-
readonly system: { readonly lifecycle:
|
|
8
|
+
return { system: { lifecycle: backend as HostLifecycleCapability } } as {
|
|
9
|
+
readonly system: { readonly lifecycle: HostLifecycleCapability };
|
|
10
10
|
};
|
|
11
11
|
}
|
|
12
12
|
|
|
13
|
-
function stateHost(state: AppLifecycleState): { readonly system: { readonly lifecycle:
|
|
13
|
+
function stateHost(state: AppLifecycleState): { readonly system: { readonly lifecycle: HostLifecycleCapability } } {
|
|
14
14
|
return hostWith({ getState: () => state, subscribe: () => () => {} });
|
|
15
15
|
}
|
|
16
16
|
|