UNPKG

@lightningjs/sdk

Version:

The Lightning-SDK helps you build great Lightning-based TV apps!

187 lines (164 loc) 6.18 kB
/* * If not stated otherwise in this file or this component's LICENSE file the * following copyright and licenses apply: * * Copyright 2022 Metrological * * Licensed under the Apache License, Version 2.0 (the License); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * Tests for the Router Lightning augmentations */ import { expectAssignable, expectNotAssignable, expectType } from "tsd"; import { Lightning, Router } from "../../index.js"; declare module '../../index.js' { namespace Router { interface CustomWidgets { MyClockWidget: typeof Lightning.components.BloomComponent MyMenuWidget: typeof Lightning.components.ListComponent } } } function Component_widgets_Tests() { /// `this.widgets` / `this.params` should be available to Components that set `IsPage` to `true` class MyPage extends Lightning.Component< Lightning.Component.TemplateSpecLoose, { IsPage: true } & Lightning.Component.TypeConfig > { _init() { /// Expect `widgets` to be a WidgetContainer expectType<Router.WidgetContainer>(this.widgets); /// Expect the widgets in `widgets` to be of the correct types expectType<Lightning.components.BloomComponent>(this.widgets.myclockwidget); expectType<Lightning.components.ListComponent>(this.widgets.mymenuwidget); /// Should error on unknown widgets (including PascalCase forms of known widgets) // @ts-expect-error this.widgets.MyClockWidget // @ts-expect-error this.widgets.unknownwidget; /// Expect `params` to be the correct type expectType<Router.PageParams | undefined>(this.params); } } /// `this.widgets` / `this.params` should not be available if `IsPage` is not set to `true` class MyComponent1 extends Lightning.Component< Lightning.Component.TemplateSpecLoose, Lightning.Component.TypeConfig > { _init() { expectType<unknown>(this.widgets); expectType<unknown>(this.params); } } class MyComponent2 extends Lightning.Component< Lightning.Component.TemplateSpecLoose, { IsPage: false } & Lightning.Component.TypeConfig > { _init() { expectType<unknown>(this.widgets); expectType<unknown>(this.params); } } } function Component_override_Tests() { interface MyPageTypeConfig extends Lightning.Component.TypeConfig { IsPage: true; HistoryStateType: { param1: boolean; param2: number; } } /// Overrides with explicit TypeConfig / HistoryStateType class MyPage extends Lightning.Component< Lightning.Component.TemplateSpecLoose, MyPageTypeConfig > { /// historyState should be overridable override historyState(params: Router.HistoryState<MyPageTypeConfig>): Router.HistoryState<MyPageTypeConfig> { if (params) { /// Expect type of params to now be the same exact type as `HistoryStateType` in the `TypeConfig` expectType<MyPageTypeConfig['HistoryStateType']>(params); } else { /// Expect that `Router.HistoryState` for this Page is assingable expectAssignable<Router.HistoryState<MyPageTypeConfig>>({ param1: true, param2: 123 }); /// Both params are required expectNotAssignable<Router.HistoryState<MyPageTypeConfig>>({ param1: true }); /// Adding an unknown param should not be assignable to the History State expectNotAssignable<Router.HistoryState<MyPageTypeConfig>>({ param1: true, param2: 123, unknownParam: 'abc' }); return { param1: false, param2: 321 } } } /// pageTransition should be overridable override pageTransition(pageIn: Router.PageInstance, pageOut: Router.PageInstance | null): Router.PageTransition | Promise<void> { /// Should be able to assign all of the default transition types to `Router.PageTransition` expectAssignable<Router.PageTransition>('crossFade'); expectAssignable<Router.PageTransition>('down'); expectAssignable<Router.PageTransition>('fade'); expectAssignable<Router.PageTransition>('left'); expectAssignable<Router.PageTransition>('right'); expectAssignable<Router.PageTransition>('up'); /// Should not be able to assign an unknown transition string expectNotAssignable<Router.PageTransition>('unknownTransition'); /// Should be able to return a promise return Promise.resolve(); } /// Ensure all the event handler are overridable without errors override _onDataProvided(): void { // Nothing to test inside } override _onMounted(): void { // Nothing to test inside } override _onChanged(): void { // Nothing to test inside } override _onUrlParams(params: Router.PageParams): void { // Nothing to test inside } override _onActivated(page: Router.PageInstance): void { // Nothing to test inside } } /// `historyState` should work default to `Record<string, unknown>` if not specified in TypeConfig class MyPage2 extends Lightning.Component { /// Should be no errors with this override signature override historyState(params: Router.HistoryState): Router.HistoryState { if (params) { /// Expect params, at this point, to be a Record<string, unknown> expectType<Record<string, unknown>>(params); } else { /// Expect anything goes for assigning to default HistoryState expectAssignable<Router.HistoryState>({ unknownParam1: false, unknownParam2: 321, }); return { unknownParam1: true, unknownParam2: 123, }; } } } }