@sprucelabs/heartwood-view-controllers 112.0.0 → 112.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/build/esm/index.d.ts +1 -0
  2. package/build/esm/index.js +1 -0
  3. package/build/esm/skillViewControllers/LockScreen.svc.d.ts +7 -5
  4. package/build/esm/skillViewControllers/LockScreen.svc.js +11 -3
  5. package/build/esm/tests/utilities/assertSupport.d.ts +4 -1
  6. package/build/esm/tests/utilities/assertSupport.js +9 -0
  7. package/build/esm/tests/utilities/lockScreenAssert.d.ts +7 -0
  8. package/build/esm/tests/utilities/lockScreenAssert.js +35 -0
  9. package/build/esm/tests/utilities/vcAssert.js +4 -0
  10. package/build/esm/types/heartwood.types.d.ts +1 -2
  11. package/build/esm/viewControllers/Abstract.ac.d.ts +5 -0
  12. package/build/esm/viewControllers/Abstract.ac.js +9 -1
  13. package/build/esm/viewControllers/Abstract.vc.d.ts +3 -2
  14. package/build/esm/viewControllers/ViewControllerFactory.d.ts +3 -3
  15. package/build/index.d.ts +1 -0
  16. package/build/index.js +6 -4
  17. package/build/skillViewControllers/LockScreen.svc.d.ts +7 -5
  18. package/build/skillViewControllers/LockScreen.svc.js +11 -3
  19. package/build/tests/utilities/assertSupport.d.ts +4 -1
  20. package/build/tests/utilities/assertSupport.js +10 -0
  21. package/build/tests/utilities/lockScreenAssert.d.ts +7 -0
  22. package/build/tests/utilities/lockScreenAssert.js +26 -0
  23. package/build/tests/utilities/vcAssert.js +4 -0
  24. package/build/types/heartwood.types.d.ts +1 -2
  25. package/build/viewControllers/Abstract.ac.d.ts +5 -0
  26. package/build/viewControllers/Abstract.ac.js +8 -1
  27. package/build/viewControllers/Abstract.vc.d.ts +3 -2
  28. package/build/viewControllers/ViewControllerFactory.d.ts +3 -3
  29. package/package.json +9 -9
@@ -56,6 +56,7 @@ export { default as buildActiveRecordCard } from './builders/buildActiveRecordCa
56
56
  export { default as buildActiveRecordList } from './builders/buildActiveRecordList';
57
57
  export { default as activeRecordCardAssert } from './tests/utilities/activeRecordCardAssert';
58
58
  export { default as MockActiveRecordCard } from './tests/MockActiveRecordCard';
59
+ export { default as lockScreenAssert } from './tests/utilities/lockScreenAssert';
59
60
  export { default as PolarAreaViewController } from './viewControllers/PolarAreaViewController.vc';
60
61
  export { default as AuthenticatorImpl } from './auth/Authenticator';
61
62
  export { default as buildBigForm } from './builders/buildBigForm';
@@ -55,6 +55,7 @@ export { default as buildActiveRecordCard } from './builders/buildActiveRecordCa
55
55
  export { default as buildActiveRecordList } from './builders/buildActiveRecordList.js';
56
56
  export { default as activeRecordCardAssert } from './tests/utilities/activeRecordCardAssert.js';
57
57
  export { default as MockActiveRecordCard } from './tests/MockActiveRecordCard.js';
58
+ export { default as lockScreenAssert } from './tests/utilities/lockScreenAssert.js';
58
59
  export { default as PolarAreaViewController } from './viewControllers/PolarAreaViewController.vc.js';
59
60
  export { default as AuthenticatorImpl } from './auth/Authenticator.js';
60
61
  export { default as buildBigForm } from './builders/buildBigForm.js';
@@ -1,13 +1,15 @@
1
- import { LockScreen, SkillView, ViewControllerOptions } from '../types/heartwood.types';
1
+ import { LockScreen, SkillView, SkillViewController, ViewControllerOptions } from '../types/heartwood.types';
2
2
  import AbstractSkillViewController from './Abstract.svc';
3
3
  export default class LockScreenSkillViewController extends AbstractSkillViewController<Record<string, any>, LockScreen> {
4
4
  private skillViewController?;
5
- private onHideHandler?;
5
+ private hideHandler?;
6
+ private isVisible;
6
7
  constructor(options: ViewControllerOptions & LockScreen);
7
- setOnHideHandler(onHideHandler: OnHideHandler): void;
8
+ setHideHindler(hideHandler: HideDialogHandler): void;
8
9
  hide(): Promise<void>;
10
+ getSkillViewVc(): SkillViewController<Record<string, any>, import("@sprucelabs/mercury-types").SpruceSchemas.HeartwoodViewControllers.v2021_02_11.SkillView> | undefined;
11
+ getIsVisible(): boolean;
9
12
  render(): LockScreen;
10
13
  }
11
14
  export type LockScreenSkillViewControllerOptions = SkillView;
12
- type OnHideHandler = () => Promise<void> | void;
13
- export {};
15
+ export type HideDialogHandler = () => Promise<void> | void;
@@ -11,18 +11,26 @@ import AbstractSkillViewController from './Abstract.svc.js';
11
11
  export default class LockScreenSkillViewController extends AbstractSkillViewController {
12
12
  constructor(options) {
13
13
  super(options);
14
+ this.isVisible = true;
14
15
  const { controller } = options;
15
16
  this.skillViewController = controller;
16
17
  }
17
- setOnHideHandler(onHideHandler) {
18
- this.onHideHandler = onHideHandler;
18
+ setHideHindler(hideHandler) {
19
+ this.hideHandler = hideHandler;
19
20
  }
20
21
  hide() {
21
22
  return __awaiter(this, void 0, void 0, function* () {
22
23
  var _a;
23
- yield ((_a = this.onHideHandler) === null || _a === void 0 ? void 0 : _a.call(this));
24
+ yield ((_a = this.hideHandler) === null || _a === void 0 ? void 0 : _a.call(this));
25
+ this.isVisible = false;
24
26
  });
25
27
  }
28
+ getSkillViewVc() {
29
+ return this.skillViewController;
30
+ }
31
+ getIsVisible() {
32
+ return this.isVisible;
33
+ }
26
34
  render() {
27
35
  var _a;
28
36
  return {
@@ -1,6 +1,8 @@
1
1
  import { SelectChoice } from '@sprucelabs/schema';
2
2
  import { SpruceSchemas } from '@sprucelabs/spruce-core-schemas';
3
+ import AppController from '../../__tests__/testDirsAndFiles/skill_with_app/src/App.ac';
3
4
  import { ConfirmOptions, ViewController, Router, CardSection, Card, TriggerRenderHandler, RouterDestination } from '../../types/heartwood.types';
5
+ import AbstractAppController from '../../viewControllers/Abstract.ac';
4
6
  export type Vc = ViewController<any>;
5
7
  export declare const WAIT_TIMEOUT = 5000;
6
8
  export interface AssertConfirmViewController {
@@ -24,7 +26,8 @@ export interface ButtonViewController {
24
26
  triggerRender(): void;
25
27
  setTriggerRenderHandler(handler: TriggerRenderHandler): void;
26
28
  }
27
- export declare function getVcName(vc: ViewController<any>): any;
29
+ export declare function getVcName(vc: ViewController<any> | AbstractAppController | AppController): any;
30
+ export declare function getControllerType(vc: ViewController<any> | AbstractAppController | AppController): "App" | "SkillView" | "ViewController";
28
31
  export declare function wait(...promises: (Promise<any> | undefined | any)[]): Promise<any>;
29
32
  export declare function assertToolInstanceOf(tool: SpruceSchemas.HeartwoodViewControllers.v2021_02_11.ToolBeltTool, Class: any): ViewController<any>;
30
33
  export declare function isVcInstanceOf<C>(vc: any, Class: new () => C): C | false;
@@ -8,7 +8,9 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
8
8
  });
9
9
  };
10
10
  import { assert } from '@sprucelabs/test-utils';
11
+ import AbstractSkillViewController from '../../skillViewControllers/Abstract.svc.js';
11
12
  import renderUtil from '../../utilities/render.utility.js';
13
+ import AbstractAppController from '../../viewControllers/Abstract.ac.js';
12
14
  import sectionIdOrIdxToIdx from '../../viewControllers/card/sectionIdOrIdxToIdx.js';
13
15
  export const WAIT_TIMEOUT = 5000;
14
16
  export function pluckAllFromView(model, key) {
@@ -31,6 +33,13 @@ export function getVcName(vc) {
31
33
  //@ts-ignore
32
34
  (_e = vc.costructor) === null || _e === void 0 ? void 0 : _e.name) !== null && _f !== void 0 ? _f : `view controller`);
33
35
  }
36
+ export function getControllerType(vc) {
37
+ return vc instanceof AbstractAppController
38
+ ? 'App'
39
+ : vc instanceof AbstractSkillViewController
40
+ ? 'SkillView'
41
+ : 'ViewController';
42
+ }
34
43
  export function wait(...promises) {
35
44
  return __awaiter(this, void 0, void 0, function* () {
36
45
  return new Promise((resolve, reject) => {
@@ -0,0 +1,7 @@
1
+ import AbstractSkillViewController from '../../skillViewControllers/Abstract.svc';
2
+ import LockScreenSkillViewController from '../../skillViewControllers/LockScreen.svc';
3
+ import AbstractAppController from '../../viewControllers/Abstract.ac';
4
+ declare const lockScreenAssert: {
5
+ actionRendersLockScreen(svcOrApp: AbstractSkillViewController | AbstractAppController, action: () => Promise<void> | void): Promise<LockScreenSkillViewController>;
6
+ };
7
+ export default lockScreenAssert;
@@ -0,0 +1,35 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { assertOptions } from '@sprucelabs/schema';
11
+ import { assert } from '@sprucelabs/test-utils';
12
+ import { getControllerType, getVcName } from './assertSupport.js';
13
+ const lockScreenAssert = {
14
+ actionRendersLockScreen(svcOrApp, action) {
15
+ return __awaiter(this, void 0, void 0, function* () {
16
+ assertOptions({
17
+ svcOrApp,
18
+ action,
19
+ }, ['svcOrApp', 'action']);
20
+ let lockScreen;
21
+ const originalRenderLockScreen =
22
+ //@ts-ignore
23
+ svcOrApp.renderLockScreen.bind(svcOrApp);
24
+ //@ts-ignore
25
+ svcOrApp.renderLockScreen = (options) => {
26
+ lockScreen = originalRenderLockScreen(options);
27
+ return lockScreen;
28
+ };
29
+ yield action();
30
+ assert.isTruthy(lockScreen, `You did not call this.renderLockScreen in your ${getControllerType(svcOrApp)} called ${getVcName(svcOrApp)}`);
31
+ return lockScreen;
32
+ });
33
+ },
34
+ };
35
+ export default lockScreenAssert;
@@ -11,6 +11,7 @@ import { assertOptions, validateSchemaValues } from '@sprucelabs/schema';
11
11
  import { assert } from '@sprucelabs/test-utils';
12
12
  import cardSchema from './../../.spruce/schemas/heartwoodViewControllers/v2021_02_11/card.schema.js';
13
13
  import { CORE_CONTROLLER_MAP } from '../../controllerMap.js';
14
+ import LockScreenSkillViewController from '../../skillViewControllers/LockScreen.svc.js';
14
15
  import renderUtil from '../../utilities/render.utility.js';
15
16
  import DialogViewController from '../../viewControllers/Dialog.vc.js';
16
17
  import ListViewController from '../../viewControllers/list/List.vc.js';
@@ -919,6 +920,9 @@ const vcAssert = {
919
920
  if (vc instanceof DialogViewController) {
920
921
  vc = vc.getCardVc();
921
922
  }
923
+ else if (vc instanceof LockScreenSkillViewController) {
924
+ vc = vc.getSkillViewVc();
925
+ }
922
926
  const model = renderUtil.render(vc);
923
927
  assert.isTruthy(model.controller, `Your view controller does not return a controller. Make sure you return 'controller:this' from render() or that you're rending a built in view with 'render() { return this.cardVc.render() }'.`);
924
928
  try {
@@ -361,7 +361,6 @@ export interface OpenNavigationOptions {
361
361
  to: AddressFieldValue;
362
362
  }
363
363
  export type SkillViewControllerArgs<N extends SkillViewControllerId, O extends SkillViewControllerArgsMap = SkillViewControllerArgsMap> = N extends keyof O ? O[N] : Record<string, never>;
364
- export type Client = MercuryClient;
365
364
  export interface OnRenderHandler {
366
365
  onRender?(): void;
367
366
  }
@@ -399,7 +398,7 @@ export interface FormInputViewController<View extends Record<string, any> = any>
399
398
  export interface ViewControllerOptions {
400
399
  plugins: ViewControllerPlugins;
401
400
  vcFactory: ViewControllerFactory;
402
- connectToApi: () => Promise<Client>;
401
+ connectToApi: () => Promise<MercuryClient>;
403
402
  renderInDialogHandler: RenderInDialogHandler;
404
403
  renderLockScreenHandler: RenderLockScreenHandler;
405
404
  confirmHandler: ConfirmHandler;
@@ -1,9 +1,14 @@
1
+ import { MercuryClient } from '@sprucelabs/mercury-client';
2
+ import { LockScreenSkillViewControllerOptions } from '../skillViewControllers/LockScreen.svc';
1
3
  import { AppController, AppControllerLoadOptions, ControllerOptions, ViewControllerId, ViewControllerMap, ViewControllerOptions, ViewControllerPlugins } from '../types/heartwood.types';
2
4
  export default abstract class AbstractAppController implements AppController {
3
5
  static id: string;
4
6
  protected plugins: ViewControllerPlugins;
5
7
  private views;
8
+ private renderLockScreenHandler;
9
+ protected connectToApi: () => Promise<MercuryClient>;
6
10
  constructor(options: ViewControllerOptions);
7
11
  load(options: AppControllerLoadOptions): Promise<void>;
12
+ protected renderLockScreen(options: LockScreenSkillViewControllerOptions): import("../skillViewControllers/LockScreen.svc").default;
8
13
  Controller<N extends ViewControllerId, O extends ControllerOptions<N>>(id: N, options: O): ViewControllerMap[N];
9
14
  }
@@ -9,13 +9,21 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
9
9
  };
10
10
  export default class AbstractAppController {
11
11
  constructor(options) {
12
- const { plugins, vcFactory } = options;
12
+ const { plugins, vcFactory, renderLockScreenHandler, connectToApi } = options;
13
13
  this.plugins = plugins;
14
14
  this.views = vcFactory;
15
+ this.renderLockScreenHandler = renderLockScreenHandler;
16
+ this.connectToApi = connectToApi;
15
17
  }
16
18
  load(options) {
17
19
  return __awaiter(this, void 0, void 0, function* () { });
18
20
  }
21
+ renderLockScreen(options) {
22
+ var _a;
23
+ const controller = this.Controller('lock-screen', Object.assign({}, options));
24
+ (_a = this.renderLockScreenHandler) === null || _a === void 0 ? void 0 : _a.call(this, controller.render());
25
+ return controller;
26
+ }
19
27
  Controller(id, options) {
20
28
  return this.views.Controller(id, options);
21
29
  }
@@ -1,6 +1,7 @@
1
1
  import { DateUtil } from '@sprucelabs/calendar-utils';
2
+ import { MercuryClient } from '@sprucelabs/mercury-client';
2
3
  import { Log } from '@sprucelabs/spruce-skill-utils';
3
- import { Client, ViewController, ViewControllerOptions, ConfirmOptions, ViewControllerId, ViewControllerMap, ControllerOptions, VoteOptions, Device, MapUtil, AlertOptions, ToastOptions, TriggerRenderHandler, ViewControllerPlugins } from '../types/heartwood.types';
4
+ import { ViewController, ViewControllerOptions, ConfirmOptions, ViewControllerId, ViewControllerMap, ControllerOptions, VoteOptions, Device, MapUtil, AlertOptions, ToastOptions, TriggerRenderHandler, ViewControllerPlugins } from '../types/heartwood.types';
4
5
  import { DialogViewControllerOptions } from './Dialog.vc';
5
6
  import ViewControllerFactory from './ViewControllerFactory';
6
7
  export default abstract class AbstractViewController<ViewModel extends Record<string, any>> implements ViewController<ViewModel> {
@@ -10,7 +11,7 @@ export default abstract class AbstractViewController<ViewModel extends Record<st
10
11
  private confirmHandler;
11
12
  private wasDestroyed;
12
13
  private activeDialog?;
13
- protected connectToApi: () => Promise<Client>;
14
+ protected connectToApi: () => Promise<MercuryClient>;
14
15
  protected dates: DateUtil;
15
16
  protected maps: MapUtil;
16
17
  private voteHandler;
@@ -3,17 +3,17 @@ import { Log } from '@sprucelabs/spruce-skill-utils';
3
3
  import { ConfirmHandler, ControllerOptions, ImportedViewController, RenderInDialogHandler, ViewController, ViewControllerMap, ViewControllerId, VoteHandler, Device, MapUtil, ViewControllerConstructor, ToastHandler, ViewControllerPlugins, ViewControllerPluginsByName, ConnectToApi, ViewControllerPlugin, ViewControllerPluginOptions, ViewControllerOptions, AppController, AppControllerConstructor, AppControllerId, AppControllerMap, RenderLockScreenHandler } from '../types/heartwood.types';
4
4
  export default class ViewControllerFactory {
5
5
  static Class?: typeof ViewControllerFactory;
6
+ protected connectToApi: ConnectToApi;
7
+ protected log?: Log;
8
+ protected plugins: ViewControllerPlugins;
6
9
  private controllerMap;
7
10
  private renderInDialogHandler;
8
11
  private confirmHandler;
9
- private connectToApi;
10
12
  private voteHandler;
11
13
  private device;
12
14
  private dates;
13
15
  private maps;
14
16
  private toastHandler;
15
- protected log?: Log;
16
- protected plugins: ViewControllerPlugins;
17
17
  private AppMap;
18
18
  private renderLockScreenHandler;
19
19
  constructor(options: ViewControllerFactoryConstructorOptions);
package/build/index.d.ts CHANGED
@@ -56,6 +56,7 @@ export { default as buildActiveRecordCard } from './builders/buildActiveRecordCa
56
56
  export { default as buildActiveRecordList } from './builders/buildActiveRecordList';
57
57
  export { default as activeRecordCardAssert } from './tests/utilities/activeRecordCardAssert';
58
58
  export { default as MockActiveRecordCard } from './tests/MockActiveRecordCard';
59
+ export { default as lockScreenAssert } from './tests/utilities/lockScreenAssert';
59
60
  export { default as PolarAreaViewController } from './viewControllers/PolarAreaViewController.vc';
60
61
  export { default as AuthenticatorImpl } from './auth/Authenticator';
61
62
  export { default as buildBigForm } from './builders/buildBigForm';
package/build/index.js CHANGED
@@ -17,10 +17,10 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
17
17
  return (mod && mod.__esModule) ? mod : { "default": mod };
18
18
  };
19
19
  Object.defineProperty(exports, "__esModule", { value: true });
20
- exports.buttonSchema = exports.lineIconSchema = exports.fancyIconSchema = exports.selectInputSchema = exports.skillViewSchema = exports.bigFormSchema = exports.calendarEventColorsSchema = exports.buildSkillView = exports.buildForm = exports.buildBigForm = exports.AuthenticatorImpl = exports.PolarAreaViewController = exports.MockActiveRecordCard = exports.activeRecordCardAssert = exports.buildActiveRecordList = exports.buildActiveRecordCard = exports.AbstractInputViewController = exports.AutocompleteInputViewController = exports.AbstractCalendarEventViewController = exports.RatingsViewController = exports.ProgressViewController = exports.StatsViewController = exports.FeedViewController = exports.ActiveRecordListViewController = exports.ActiveRecordCardViewController = exports.TalkingSprucebotViewController = exports.ButtonBarViewController = exports.CalendarViewController = exports.SwipeCardViewControllerImpl = exports.SwipeViewControllerImpl = exports.PagerViewController = exports.ProgressNavigatorViewController = exports.CountdownTimerViewController = exports.FormBuilderCardViewControllerImpl = exports.LoginViewController = exports.BarChartViewController = exports.ToolBeltViewController = exports.FormViewControllerImpl = exports.ListCellViewController = exports.ListRowViewController = exports.ListViewController = exports.NavigationViewController = exports.LockScreenSkillViewController = exports.DialogViewController = exports.ConfirmViewController = exports.CardViewControllerImpl = exports.ButtonGroupViewController = exports.AbstractAppController = exports.AbstractViewController = exports.AbstractSkillViewController = void 0;
21
- exports.ratingsSchema = exports.progressSchema = exports.statsStatSchema = exports.statsSchema = exports.toggleInputSchema = exports.listToggleInputSchema = exports.addressInputSchema = exports.buttonBarButtonSchema = exports.buttonBarSchema = exports.toolBeltToolSchema = exports.toolBeltSchema = exports.calendarTimeSchema = exports.calendarPersonSchema = exports.calendarSchema = exports.themePropsSchema = exports.themeSchema = exports.cardFooterButtonSchema = exports.criticalErrorSchema = exports.sprucebotTypedMessageSentenceSchema = exports.sprucebotTypedMessageAvatarSchema = exports.selectInputChoiceSchema = exports.calendarEventColorOverrideSchema = exports.portalSchema = exports.listTextInputSchema = exports.listSelectInputSchema = exports.listCellButtonSchema = exports.dropdownButtonSchema = exports.bigFormSectionSchema = exports.textInputSchema = exports.phoneInputSchema = exports.inputSchema = exports.dropdownSchema = exports.sprucebotTypedMessageSchema = exports.talkingSprucebotSchema = exports.sprucebotAvatarSchema = exports.formBuilderImportExportObjectSchema = exports.listCellSchema = exports.listRowSchema = exports.listSchema = exports.layoutSchema = exports.cardSectionSchema = exports.cardHeaderSchema = exports.cardFooterSchema = exports.cardBodySchema = exports.cardSchema = exports.formSectionSchema = exports.formSchema = exports.textSchema = exports.lockScreenSchema = exports.dialogSchema = void 0;
22
- exports.countdownTimerInteractor = exports.countdownTimerAssert = exports.calendarInteractor = exports.interactor = exports.normalizeScopeFromVc = exports.autocompleteInteractor = exports.formAssert = exports.autocompleteAssert = exports.listAssert = exports.buttonAssert = exports.deviceAssert = exports.navigationAssert = exports.toolBeltAssert = exports.toastAssert = exports.vcPluginAssert = exports.vcDurationAssert = exports.pagerAssert = exports.vcAssert = exports.vcAssertUtil = exports.feedAssert = exports.feedInteractor = exports.normalizeFormSectionFieldNamesUtil = exports.ViewControllerError = exports.SpyDevice = exports.StubStorage = exports.ViewControllerFactory = exports.ViewControllerImporter = exports.ViewControllerExporter = exports.pagerSchema = exports.polarAreaDataItemSchema = exports.polarAreaSchema = exports.inputButtonSchema = exports.mapPinSchema = exports.mapSchema = exports.latLngSchema = exports.formBuilderImportExportPageSchema = exports.autocompleteSuggestionSchema = exports.autocompleteInputSchema = exports.feedSchema = exports.calendarShiftSchema = exports.receiptTotalSchema = exports.receiptSectionSchema = exports.receiptLineItemSchema = exports.receiptHeaderSchema = exports.receiptSchema = exports.listDateInputSchema = exports.calendarSelectedDateSchema = exports.calendarEventSchema = exports.ratingsInputSchema = exports.listRatingsInputSchema = void 0;
23
- exports.navigationRouteSchema = exports.routerDestinationSchema = exports.navigationDropdownButtonSchema = exports.navigationButtonDropdownSchema = exports.barChartDataSetSchema = exports.barChartDataPointSchema = exports.barChartSchema = exports.progressDetailsSchema = exports.progressNavigatorStepSchema = exports.progressNavigatorSchema = exports.countdownTimerSchema = exports.permissionContractReferenceSchema = exports.navigationButtonSchema = exports.navigationSchema = exports.ToolBeltStateMachine = exports.removeUniversalViewOptions = exports.buildSkillViewLayout = exports.splitCardsIntoLayouts = exports.listUtil = exports.mapInteractor = exports.mapAssert = exports.renderUtil = exports.routerTestPatcher = exports.dialogTestPatcher = exports.confirmTestPatcher = exports.calendarSeeder = exports.interactionUtil = exports.barChartAssert = exports.progressNavigatorAssert = void 0;
20
+ exports.lineIconSchema = exports.fancyIconSchema = exports.selectInputSchema = exports.skillViewSchema = exports.bigFormSchema = exports.calendarEventColorsSchema = exports.buildSkillView = exports.buildForm = exports.buildBigForm = exports.AuthenticatorImpl = exports.PolarAreaViewController = exports.lockScreenAssert = exports.MockActiveRecordCard = exports.activeRecordCardAssert = exports.buildActiveRecordList = exports.buildActiveRecordCard = exports.AbstractInputViewController = exports.AutocompleteInputViewController = exports.AbstractCalendarEventViewController = exports.RatingsViewController = exports.ProgressViewController = exports.StatsViewController = exports.FeedViewController = exports.ActiveRecordListViewController = exports.ActiveRecordCardViewController = exports.TalkingSprucebotViewController = exports.ButtonBarViewController = exports.CalendarViewController = exports.SwipeCardViewControllerImpl = exports.SwipeViewControllerImpl = exports.PagerViewController = exports.ProgressNavigatorViewController = exports.CountdownTimerViewController = exports.FormBuilderCardViewControllerImpl = exports.LoginViewController = exports.BarChartViewController = exports.ToolBeltViewController = exports.FormViewControllerImpl = exports.ListCellViewController = exports.ListRowViewController = exports.ListViewController = exports.NavigationViewController = exports.LockScreenSkillViewController = exports.DialogViewController = exports.ConfirmViewController = exports.CardViewControllerImpl = exports.ButtonGroupViewController = exports.AbstractAppController = exports.AbstractViewController = exports.AbstractSkillViewController = void 0;
21
+ exports.progressSchema = exports.statsStatSchema = exports.statsSchema = exports.toggleInputSchema = exports.listToggleInputSchema = exports.addressInputSchema = exports.buttonBarButtonSchema = exports.buttonBarSchema = exports.toolBeltToolSchema = exports.toolBeltSchema = exports.calendarTimeSchema = exports.calendarPersonSchema = exports.calendarSchema = exports.themePropsSchema = exports.themeSchema = exports.cardFooterButtonSchema = exports.criticalErrorSchema = exports.sprucebotTypedMessageSentenceSchema = exports.sprucebotTypedMessageAvatarSchema = exports.selectInputChoiceSchema = exports.calendarEventColorOverrideSchema = exports.portalSchema = exports.listTextInputSchema = exports.listSelectInputSchema = exports.listCellButtonSchema = exports.dropdownButtonSchema = exports.bigFormSectionSchema = exports.textInputSchema = exports.phoneInputSchema = exports.inputSchema = exports.dropdownSchema = exports.sprucebotTypedMessageSchema = exports.talkingSprucebotSchema = exports.sprucebotAvatarSchema = exports.formBuilderImportExportObjectSchema = exports.listCellSchema = exports.listRowSchema = exports.listSchema = exports.layoutSchema = exports.cardSectionSchema = exports.cardHeaderSchema = exports.cardFooterSchema = exports.cardBodySchema = exports.cardSchema = exports.formSectionSchema = exports.formSchema = exports.textSchema = exports.lockScreenSchema = exports.dialogSchema = exports.buttonSchema = void 0;
22
+ exports.countdownTimerAssert = exports.calendarInteractor = exports.interactor = exports.normalizeScopeFromVc = exports.autocompleteInteractor = exports.formAssert = exports.autocompleteAssert = exports.listAssert = exports.buttonAssert = exports.deviceAssert = exports.navigationAssert = exports.toolBeltAssert = exports.toastAssert = exports.vcPluginAssert = exports.vcDurationAssert = exports.pagerAssert = exports.vcAssert = exports.vcAssertUtil = exports.feedAssert = exports.feedInteractor = exports.normalizeFormSectionFieldNamesUtil = exports.ViewControllerError = exports.SpyDevice = exports.StubStorage = exports.ViewControllerFactory = exports.ViewControllerImporter = exports.ViewControllerExporter = exports.pagerSchema = exports.polarAreaDataItemSchema = exports.polarAreaSchema = exports.inputButtonSchema = exports.mapPinSchema = exports.mapSchema = exports.latLngSchema = exports.formBuilderImportExportPageSchema = exports.autocompleteSuggestionSchema = exports.autocompleteInputSchema = exports.feedSchema = exports.calendarShiftSchema = exports.receiptTotalSchema = exports.receiptSectionSchema = exports.receiptLineItemSchema = exports.receiptHeaderSchema = exports.receiptSchema = exports.listDateInputSchema = exports.calendarSelectedDateSchema = exports.calendarEventSchema = exports.ratingsInputSchema = exports.listRatingsInputSchema = exports.ratingsSchema = void 0;
23
+ exports.navigationRouteSchema = exports.routerDestinationSchema = exports.navigationDropdownButtonSchema = exports.navigationButtonDropdownSchema = exports.barChartDataSetSchema = exports.barChartDataPointSchema = exports.barChartSchema = exports.progressDetailsSchema = exports.progressNavigatorStepSchema = exports.progressNavigatorSchema = exports.countdownTimerSchema = exports.permissionContractReferenceSchema = exports.navigationButtonSchema = exports.navigationSchema = exports.ToolBeltStateMachine = exports.removeUniversalViewOptions = exports.buildSkillViewLayout = exports.splitCardsIntoLayouts = exports.listUtil = exports.mapInteractor = exports.mapAssert = exports.renderUtil = exports.routerTestPatcher = exports.dialogTestPatcher = exports.confirmTestPatcher = exports.calendarSeeder = exports.interactionUtil = exports.barChartAssert = exports.progressNavigatorAssert = exports.countdownTimerInteractor = void 0;
24
24
  __exportStar(require("./constants"), exports);
25
25
  __exportStar(require("./types/heartwood.types"), exports);
26
26
  __exportStar(require("./utilities/removeUniversalViewOptions"), exports);
@@ -116,6 +116,8 @@ var activeRecordCardAssert_1 = require("./tests/utilities/activeRecordCardAssert
116
116
  Object.defineProperty(exports, "activeRecordCardAssert", { enumerable: true, get: function () { return __importDefault(activeRecordCardAssert_1).default; } });
117
117
  var MockActiveRecordCard_1 = require("./tests/MockActiveRecordCard");
118
118
  Object.defineProperty(exports, "MockActiveRecordCard", { enumerable: true, get: function () { return __importDefault(MockActiveRecordCard_1).default; } });
119
+ var lockScreenAssert_1 = require("./tests/utilities/lockScreenAssert");
120
+ Object.defineProperty(exports, "lockScreenAssert", { enumerable: true, get: function () { return __importDefault(lockScreenAssert_1).default; } });
119
121
  var PolarAreaViewController_vc_1 = require("./viewControllers/PolarAreaViewController.vc");
120
122
  Object.defineProperty(exports, "PolarAreaViewController", { enumerable: true, get: function () { return __importDefault(PolarAreaViewController_vc_1).default; } });
121
123
  var Authenticator_1 = require("./auth/Authenticator");
@@ -1,13 +1,15 @@
1
- import { LockScreen, SkillView, ViewControllerOptions } from '../types/heartwood.types';
1
+ import { LockScreen, SkillView, SkillViewController, ViewControllerOptions } from '../types/heartwood.types';
2
2
  import AbstractSkillViewController from './Abstract.svc';
3
3
  export default class LockScreenSkillViewController extends AbstractSkillViewController<Record<string, any>, LockScreen> {
4
4
  private skillViewController?;
5
- private onHideHandler?;
5
+ private hideHandler?;
6
+ private isVisible;
6
7
  constructor(options: ViewControllerOptions & LockScreen);
7
- setOnHideHandler(onHideHandler: OnHideHandler): void;
8
+ setHideHindler(hideHandler: HideDialogHandler): void;
8
9
  hide(): Promise<void>;
10
+ getSkillViewVc(): SkillViewController<Record<string, any>, import("@sprucelabs/mercury-types").SpruceSchemas.HeartwoodViewControllers.v2021_02_11.SkillView> | undefined;
11
+ getIsVisible(): boolean;
9
12
  render(): LockScreen;
10
13
  }
11
14
  export type LockScreenSkillViewControllerOptions = SkillView;
12
- type OnHideHandler = () => Promise<void> | void;
13
- export {};
15
+ export type HideDialogHandler = () => Promise<void> | void;
@@ -7,14 +7,22 @@ const Abstract_svc_1 = __importDefault(require("./Abstract.svc"));
7
7
  class LockScreenSkillViewController extends Abstract_svc_1.default {
8
8
  constructor(options) {
9
9
  super(options);
10
+ this.isVisible = true;
10
11
  const { controller } = options;
11
12
  this.skillViewController = controller;
12
13
  }
13
- setOnHideHandler(onHideHandler) {
14
- this.onHideHandler = onHideHandler;
14
+ setHideHindler(hideHandler) {
15
+ this.hideHandler = hideHandler;
15
16
  }
16
17
  async hide() {
17
- await this.onHideHandler?.();
18
+ await this.hideHandler?.();
19
+ this.isVisible = false;
20
+ }
21
+ getSkillViewVc() {
22
+ return this.skillViewController;
23
+ }
24
+ getIsVisible() {
25
+ return this.isVisible;
18
26
  }
19
27
  render() {
20
28
  return {
@@ -1,6 +1,8 @@
1
1
  import { SelectChoice } from '@sprucelabs/schema';
2
2
  import { SpruceSchemas } from '@sprucelabs/spruce-core-schemas';
3
+ import AppController from '../../__tests__/testDirsAndFiles/skill_with_app/src/App.ac';
3
4
  import { ConfirmOptions, ViewController, Router, CardSection, Card, TriggerRenderHandler, RouterDestination } from '../../types/heartwood.types';
5
+ import AbstractAppController from '../../viewControllers/Abstract.ac';
4
6
  export type Vc = ViewController<any>;
5
7
  export declare const WAIT_TIMEOUT = 5000;
6
8
  export interface AssertConfirmViewController {
@@ -24,7 +26,8 @@ export interface ButtonViewController {
24
26
  triggerRender(): void;
25
27
  setTriggerRenderHandler(handler: TriggerRenderHandler): void;
26
28
  }
27
- export declare function getVcName(vc: ViewController<any>): any;
29
+ export declare function getVcName(vc: ViewController<any> | AbstractAppController | AppController): any;
30
+ export declare function getControllerType(vc: ViewController<any> | AbstractAppController | AppController): "App" | "SkillView" | "ViewController";
28
31
  export declare function wait(...promises: (Promise<any> | undefined | any)[]): Promise<any>;
29
32
  export declare function assertToolInstanceOf(tool: SpruceSchemas.HeartwoodViewControllers.v2021_02_11.ToolBeltTool, Class: any): ViewController<any>;
30
33
  export declare function isVcInstanceOf<C>(vc: any, Class: new () => C): C | false;
@@ -7,12 +7,15 @@ exports.WAIT_TIMEOUT = void 0;
7
7
  exports.pluckAllFromView = pluckAllFromView;
8
8
  exports.pluckFirstFromCard = pluckFirstFromCard;
9
9
  exports.getVcName = getVcName;
10
+ exports.getControllerType = getControllerType;
10
11
  exports.wait = wait;
11
12
  exports.assertToolInstanceOf = assertToolInstanceOf;
12
13
  exports.isVcInstanceOf = isVcInstanceOf;
13
14
  exports.checkForCardSection = checkForCardSection;
14
15
  const test_utils_1 = require("@sprucelabs/test-utils");
16
+ const Abstract_svc_1 = __importDefault(require("../../skillViewControllers/Abstract.svc"));
15
17
  const render_utility_1 = __importDefault(require("../../utilities/render.utility"));
18
+ const Abstract_ac_1 = __importDefault(require("../../viewControllers/Abstract.ac"));
16
19
  const sectionIdOrIdxToIdx_1 = __importDefault(require("../../viewControllers/card/sectionIdOrIdxToIdx"));
17
20
  exports.WAIT_TIMEOUT = 5000;
18
21
  function pluckAllFromView(model, key) {
@@ -35,6 +38,13 @@ function getVcName(vc) {
35
38
  vc.costructor?.name ??
36
39
  `view controller`);
37
40
  }
41
+ function getControllerType(vc) {
42
+ return vc instanceof Abstract_ac_1.default
43
+ ? 'App'
44
+ : vc instanceof Abstract_svc_1.default
45
+ ? 'SkillView'
46
+ : 'ViewController';
47
+ }
38
48
  async function wait(...promises) {
39
49
  return new Promise((resolve, reject) => {
40
50
  let isDone = false;
@@ -0,0 +1,7 @@
1
+ import AbstractSkillViewController from '../../skillViewControllers/Abstract.svc';
2
+ import LockScreenSkillViewController from '../../skillViewControllers/LockScreen.svc';
3
+ import AbstractAppController from '../../viewControllers/Abstract.ac';
4
+ declare const lockScreenAssert: {
5
+ actionRendersLockScreen(svcOrApp: AbstractSkillViewController | AbstractAppController, action: () => Promise<void> | void): Promise<LockScreenSkillViewController>;
6
+ };
7
+ export default lockScreenAssert;
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const schema_1 = require("@sprucelabs/schema");
4
+ const test_utils_1 = require("@sprucelabs/test-utils");
5
+ const assertSupport_1 = require("./assertSupport");
6
+ const lockScreenAssert = {
7
+ async actionRendersLockScreen(svcOrApp, action) {
8
+ (0, schema_1.assertOptions)({
9
+ svcOrApp,
10
+ action,
11
+ }, ['svcOrApp', 'action']);
12
+ let lockScreen;
13
+ const originalRenderLockScreen =
14
+ //@ts-ignore
15
+ svcOrApp.renderLockScreen.bind(svcOrApp);
16
+ //@ts-ignore
17
+ svcOrApp.renderLockScreen = (options) => {
18
+ lockScreen = originalRenderLockScreen(options);
19
+ return lockScreen;
20
+ };
21
+ await action();
22
+ test_utils_1.assert.isTruthy(lockScreen, `You did not call this.renderLockScreen in your ${(0, assertSupport_1.getControllerType)(svcOrApp)} called ${(0, assertSupport_1.getVcName)(svcOrApp)}`);
23
+ return lockScreen;
24
+ },
25
+ };
26
+ exports.default = lockScreenAssert;
@@ -10,6 +10,7 @@ const schema_1 = require("@sprucelabs/schema");
10
10
  const test_utils_1 = require("@sprucelabs/test-utils");
11
11
  const card_schema_1 = __importDefault(require("./../../.spruce/schemas/heartwoodViewControllers/v2021_02_11/card.schema"));
12
12
  const controllerMap_1 = require("../../controllerMap");
13
+ const LockScreen_svc_1 = __importDefault(require("../../skillViewControllers/LockScreen.svc"));
13
14
  const render_utility_1 = __importDefault(require("../../utilities/render.utility"));
14
15
  const Dialog_vc_1 = __importDefault(require("../../viewControllers/Dialog.vc"));
15
16
  const List_vc_1 = __importDefault(require("../../viewControllers/list/List.vc"));
@@ -871,6 +872,9 @@ const vcAssert = {
871
872
  if (vc instanceof Dialog_vc_1.default) {
872
873
  vc = vc.getCardVc();
873
874
  }
875
+ else if (vc instanceof LockScreen_svc_1.default) {
876
+ vc = vc.getSkillViewVc();
877
+ }
874
878
  const model = render_utility_1.default.render(vc);
875
879
  test_utils_1.assert.isTruthy(model.controller, `Your view controller does not return a controller. Make sure you return 'controller:this' from render() or that you're rending a built in view with 'render() { return this.cardVc.render() }'.`);
876
880
  try {
@@ -361,7 +361,6 @@ export interface OpenNavigationOptions {
361
361
  to: AddressFieldValue;
362
362
  }
363
363
  export type SkillViewControllerArgs<N extends SkillViewControllerId, O extends SkillViewControllerArgsMap = SkillViewControllerArgsMap> = N extends keyof O ? O[N] : Record<string, never>;
364
- export type Client = MercuryClient;
365
364
  export interface OnRenderHandler {
366
365
  onRender?(): void;
367
366
  }
@@ -399,7 +398,7 @@ export interface FormInputViewController<View extends Record<string, any> = any>
399
398
  export interface ViewControllerOptions {
400
399
  plugins: ViewControllerPlugins;
401
400
  vcFactory: ViewControllerFactory;
402
- connectToApi: () => Promise<Client>;
401
+ connectToApi: () => Promise<MercuryClient>;
403
402
  renderInDialogHandler: RenderInDialogHandler;
404
403
  renderLockScreenHandler: RenderLockScreenHandler;
405
404
  confirmHandler: ConfirmHandler;
@@ -1,9 +1,14 @@
1
+ import { MercuryClient } from '@sprucelabs/mercury-client';
2
+ import { LockScreenSkillViewControllerOptions } from '../skillViewControllers/LockScreen.svc';
1
3
  import { AppController, AppControllerLoadOptions, ControllerOptions, ViewControllerId, ViewControllerMap, ViewControllerOptions, ViewControllerPlugins } from '../types/heartwood.types';
2
4
  export default abstract class AbstractAppController implements AppController {
3
5
  static id: string;
4
6
  protected plugins: ViewControllerPlugins;
5
7
  private views;
8
+ private renderLockScreenHandler;
9
+ protected connectToApi: () => Promise<MercuryClient>;
6
10
  constructor(options: ViewControllerOptions);
7
11
  load(options: AppControllerLoadOptions): Promise<void>;
12
+ protected renderLockScreen(options: LockScreenSkillViewControllerOptions): import("../skillViewControllers/LockScreen.svc").default;
8
13
  Controller<N extends ViewControllerId, O extends ControllerOptions<N>>(id: N, options: O): ViewControllerMap[N];
9
14
  }
@@ -2,11 +2,18 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  class AbstractAppController {
4
4
  constructor(options) {
5
- const { plugins, vcFactory } = options;
5
+ const { plugins, vcFactory, renderLockScreenHandler, connectToApi } = options;
6
6
  this.plugins = plugins;
7
7
  this.views = vcFactory;
8
+ this.renderLockScreenHandler = renderLockScreenHandler;
9
+ this.connectToApi = connectToApi;
8
10
  }
9
11
  async load(options) { }
12
+ renderLockScreen(options) {
13
+ const controller = this.Controller('lock-screen', { ...options });
14
+ this.renderLockScreenHandler?.(controller.render());
15
+ return controller;
16
+ }
10
17
  Controller(id, options) {
11
18
  return this.views.Controller(id, options);
12
19
  }
@@ -1,6 +1,7 @@
1
1
  import { DateUtil } from '@sprucelabs/calendar-utils';
2
+ import { MercuryClient } from '@sprucelabs/mercury-client';
2
3
  import { Log } from '@sprucelabs/spruce-skill-utils';
3
- import { Client, ViewController, ViewControllerOptions, ConfirmOptions, ViewControllerId, ViewControllerMap, ControllerOptions, VoteOptions, Device, MapUtil, AlertOptions, ToastOptions, TriggerRenderHandler, ViewControllerPlugins } from '../types/heartwood.types';
4
+ import { ViewController, ViewControllerOptions, ConfirmOptions, ViewControllerId, ViewControllerMap, ControllerOptions, VoteOptions, Device, MapUtil, AlertOptions, ToastOptions, TriggerRenderHandler, ViewControllerPlugins } from '../types/heartwood.types';
4
5
  import { DialogViewControllerOptions } from './Dialog.vc';
5
6
  import ViewControllerFactory from './ViewControllerFactory';
6
7
  export default abstract class AbstractViewController<ViewModel extends Record<string, any>> implements ViewController<ViewModel> {
@@ -10,7 +11,7 @@ export default abstract class AbstractViewController<ViewModel extends Record<st
10
11
  private confirmHandler;
11
12
  private wasDestroyed;
12
13
  private activeDialog?;
13
- protected connectToApi: () => Promise<Client>;
14
+ protected connectToApi: () => Promise<MercuryClient>;
14
15
  protected dates: DateUtil;
15
16
  protected maps: MapUtil;
16
17
  private voteHandler;
@@ -3,17 +3,17 @@ import { Log } from '@sprucelabs/spruce-skill-utils';
3
3
  import { ConfirmHandler, ControllerOptions, ImportedViewController, RenderInDialogHandler, ViewController, ViewControllerMap, ViewControllerId, VoteHandler, Device, MapUtil, ViewControllerConstructor, ToastHandler, ViewControllerPlugins, ViewControllerPluginsByName, ConnectToApi, ViewControllerPlugin, ViewControllerPluginOptions, ViewControllerOptions, AppController, AppControllerConstructor, AppControllerId, AppControllerMap, RenderLockScreenHandler } from '../types/heartwood.types';
4
4
  export default class ViewControllerFactory {
5
5
  static Class?: typeof ViewControllerFactory;
6
+ protected connectToApi: ConnectToApi;
7
+ protected log?: Log;
8
+ protected plugins: ViewControllerPlugins;
6
9
  private controllerMap;
7
10
  private renderInDialogHandler;
8
11
  private confirmHandler;
9
- private connectToApi;
10
12
  private voteHandler;
11
13
  private device;
12
14
  private dates;
13
15
  private maps;
14
16
  private toastHandler;
15
- protected log?: Log;
16
- protected plugins: ViewControllerPlugins;
17
17
  private AppMap;
18
18
  private renderLockScreenHandler;
19
19
  constructor(options: ViewControllerFactoryConstructorOptions);
package/package.json CHANGED
@@ -13,7 +13,7 @@
13
13
  "sideEffects": false,
14
14
  "license": "MIT",
15
15
  "description": "All the power of Heartwood in one, convenient package.",
16
- "version": "112.0.0",
16
+ "version": "112.1.0",
17
17
  "skill": {
18
18
  "namespace": "HeartwoodViewControllers",
19
19
  "commandOverrides": {
@@ -77,15 +77,15 @@
77
77
  "@babel/plugin-transform-runtime": "^7.25.9",
78
78
  "@babel/preset-env": "^7.26.0",
79
79
  "@babel/preset-typescript": "^7.26.0",
80
- "@sprucelabs/calendar-utils": "^42.0.526",
80
+ "@sprucelabs/calendar-utils": "^42.0.527",
81
81
  "@sprucelabs/error": "^6.0.551",
82
82
  "@sprucelabs/globby": "^2.0.499",
83
- "@sprucelabs/mercury-core-events": "^25.0.76",
84
- "@sprucelabs/mercury-types": "^47.0.623",
83
+ "@sprucelabs/mercury-core-events": "^25.0.77",
84
+ "@sprucelabs/mercury-types": "^47.0.624",
85
85
  "@sprucelabs/schema": "^30.0.584",
86
- "@sprucelabs/spruce-core-schemas": "^40.1.569",
87
- "@sprucelabs/spruce-event-utils": "^40.1.347",
88
- "@sprucelabs/spruce-skill-utils": "^31.0.647",
86
+ "@sprucelabs/spruce-core-schemas": "^40.1.570",
87
+ "@sprucelabs/spruce-event-utils": "^40.1.348",
88
+ "@sprucelabs/spruce-skill-utils": "^31.0.648",
89
89
  "@sprucelabs/test-utils": "^5.1.520",
90
90
  "@swc/core": "1.2.103",
91
91
  "babel-loader": "^9.2.1",
@@ -101,8 +101,8 @@
101
101
  "devDependencies": {
102
102
  "@sprucelabs/esm-postbuild": "^6.0.529",
103
103
  "@sprucelabs/jest-json-reporter": "^8.0.553",
104
- "@sprucelabs/mercury-client": "^42.0.631",
105
- "@sprucelabs/mercury-event-emitter": "^42.0.631",
104
+ "@sprucelabs/mercury-client": "^42.0.632",
105
+ "@sprucelabs/mercury-event-emitter": "^42.0.632",
106
106
  "@sprucelabs/resolve-path-aliases": "^2.0.520",
107
107
  "@sprucelabs/semantic-release": "^5.0.2",
108
108
  "@sprucelabs/test": "^9.0.63",