@equinor/fusion-framework-module-app
Advanced tools
Comparing version 5.1.2 to 5.2.0-next.0
# Change Log | ||
## 5.2.0-next.0 | ||
### Minor Changes | ||
- [#927](https://github.com/equinor/fusion-framework/pull/927) [`d81cf902`](https://github.com/equinor/fusion-framework/commit/d81cf9025311d948fefb2c1b469c3a5f091344dd) Thanks [@odinr](https://github.com/odinr)! - Create and expose interface for App | ||
- deprecate [AppModuleProvider.createApp](https://github.com/equinor/fusion-framework/blob/cf08d5ae3cef473e5025fd973a2a7a45a3b22dee/packages/modules/app/src/AppModuleProvider.ts#L171) | ||
this should not create any breaking changes since apps was only created from provider. | ||
if the class is still needed it can be imported: | ||
```ts | ||
import { App } from '@equinor/fusion-framework-module-app/app'; | ||
``` | ||
- [#927](https://github.com/equinor/fusion-framework/pull/927) [`1a7a2d2e`](https://github.com/equinor/fusion-framework/commit/1a7a2d2e03a0c8ac10d19e231b635f93a1ce485b) Thanks [@odinr](https://github.com/odinr)! - Allow updating manifest of application | ||
- add meta data for `setManifest` action to flag if `merge` or `replace` | ||
- add method on `App` to update manifest, _default flag `merge`_ | ||
- check in state reducer if `setManifest` action is `update` or `merge` | ||
- update flow `handleFetchManifest` to prop passing of flag | ||
## 5.1.3 | ||
### Patch Changes | ||
- [#905](https://github.com/equinor/fusion-framework/pull/905) [`a7858a1c`](https://github.com/equinor/fusion-framework/commit/a7858a1c01542e2dc94370709f122b4b99c3219c) Thanks [@odinr](https://github.com/odinr)! - **🚧 Chore: dedupe packages** | ||
- align all versions of typescript | ||
- update types to build | ||
- a couple of typecasts did not [satisfies](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-5-0.html#satisfies-support-in-jsdoc) and was recasted as `unknwon`, marked with `TODO`, should be fixed in future | ||
All notable changes to this project will be documented in this file. | ||
@@ -4,0 +36,0 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. |
import { createAction, createAsyncAction, } from '@equinor/fusion-observable'; | ||
const createActions = () => ({ | ||
setManifest: createAction('set_manifest', (manifest) => ({ | ||
setManifest: createAction('set_manifest', (manifest, update) => ({ | ||
payload: manifest, | ||
meta: { created: Date.now() }, | ||
meta: { | ||
created: Date.now(), | ||
update, | ||
}, | ||
})), | ||
fetchManifest: createAsyncAction('fetch_manifest', (key) => ({ payload: key }), (manifest) => ({ payload: manifest }), (error) => ({ payload: error })), | ||
fetchManifest: createAsyncAction('fetch_manifest', (key, update) => ({ payload: key, meta: { update } }), (manifest) => ({ payload: manifest }), (error) => ({ payload: error })), | ||
setConfig: createAction('set_config', (config) => ({ payload: config })), | ||
@@ -9,0 +12,0 @@ fetchConfig: createAsyncAction('fetch_config', (key) => ({ payload: key }), (config) => ({ payload: config }), (error) => ({ payload: error })), |
@@ -116,5 +116,8 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | ||
} | ||
loadManifest() { | ||
__classPrivateFieldGet(this, _App_state, "f").next(actions.fetchManifest(this.appKey)); | ||
loadManifest(update) { | ||
__classPrivateFieldGet(this, _App_state, "f").next(actions.fetchManifest(this.appKey, update)); | ||
} | ||
updateManifest(manifest, replace) { | ||
__classPrivateFieldGet(this, _App_state, "f").next(actions.setManifest(manifest, !replace)); | ||
} | ||
loadAppModule(allow_cache = true) { | ||
@@ -121,0 +124,0 @@ return __awaiter(this, void 0, void 0, function* () { |
@@ -7,3 +7,8 @@ import { actionBaseType, createReducer as makeReducer, isCompleteAction, isRequestAction, } from '@equinor/fusion-observable'; | ||
.addCase(actions.setManifest, (state, action) => { | ||
state.manifest = action.payload; | ||
if (action.meta.update) { | ||
state.manifest = Object.assign(Object.assign({}, state.manifest), action.payload); | ||
} | ||
else { | ||
state.manifest = action.payload; | ||
} | ||
}) | ||
@@ -10,0 +15,0 @@ .addCase(actions.setConfig, (state, action) => { |
import { from, of, merge } from 'rxjs'; | ||
import { catchError, filter, last, map, switchMap } from 'rxjs/operators'; | ||
import { actions } from './actions'; | ||
export const handleFetchManifest = (provider) => (action$) => action$.pipe(filter(actions.fetchManifest.match), switchMap(({ payload: appKey }) => { | ||
const fetch$ = from(provider.getAppManifest(appKey)).pipe(filter((x) => !!x), map(actions.setManifest)); | ||
export const handleFetchManifest = (provider) => (action$) => action$.pipe(filter(actions.fetchManifest.match), switchMap(({ payload: appKey, meta: { update } }) => { | ||
const fetch$ = from(provider.getAppManifest(appKey)).pipe(filter((x) => !!x), map((manifest) => actions.setManifest(manifest, update))); | ||
return merge(fetch$, fetch$.pipe(last(), map(({ payload }) => actions.fetchManifest.success(payload)))).pipe(catchError((err) => { | ||
@@ -7,0 +7,0 @@ return of(actions.fetchManifest.failure(err)); |
@@ -95,2 +95,3 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { | ||
createApp(value) { | ||
console.warn(); | ||
return new App(value, { provider: this, event: __classPrivateFieldGet(this, _AppModuleProvider_event, "f") }); | ||
@@ -97,0 +98,0 @@ } |
export { AppConfigurator, } from './AppConfigurator'; | ||
export { AppModuleProvider } from './AppModuleProvider'; | ||
export { App } from './app/App'; | ||
export * from './events'; | ||
@@ -5,0 +4,0 @@ export * from './types'; |
import { ActionInstanceMap, ActionTypes } from '@equinor/fusion-observable'; | ||
import { AppConfig, AppManifest, AppModulesInstance, AppScriptModule } from '../types'; | ||
declare const createActions: () => { | ||
setManifest: import("@equinor/fusion-observable").ActionCreatorWithPreparedPayload<[manifest: AppManifest], AppManifest, "set_manifest", never, { | ||
setManifest: import("@equinor/fusion-observable").ActionCreatorWithPreparedPayload<[manifest: AppManifest, update?: boolean | undefined], AppManifest, "set_manifest", never, { | ||
created: number; | ||
update: boolean | undefined; | ||
}>; | ||
fetchManifest: import("@equinor/fusion-observable").ActionCreatorWithPreparedPayload<[key: string], string, "fetch_manifest::request", never, never> & { | ||
fetchManifest: import("@equinor/fusion-observable").ActionCreatorWithPreparedPayload<[key: string, update?: boolean | undefined], string, "fetch_manifest::request", never, { | ||
update: boolean | undefined; | ||
}> & { | ||
success: import("@equinor/fusion-observable").ActionCreatorWithPreparedPayload<[manifest: AppManifest], AppManifest, "fetch_manifest::success", never, never>; | ||
failure: import("@equinor/fusion-observable").ActionCreatorWithPreparedPayload<[error: unknown], unknown, "fetch_manifest::failure", never, never>; | ||
}; | ||
setConfig: import("@equinor/fusion-observable").ActionCreatorWithPreparedPayload<[config: AppConfig<unknown>], AppConfig<unknown>, "set_config", never, never>; | ||
setConfig: import("@equinor/fusion-observable").ActionCreatorWithPreparedPayload<[config: AppConfig], AppConfig, "set_config", never, never>; | ||
fetchConfig: import("@equinor/fusion-observable").ActionCreatorWithPreparedPayload<[key: string], string, "fetch_config::request", never, never> & { | ||
success: import("@equinor/fusion-observable").ActionCreatorWithPreparedPayload<[config: AppConfig<unknown>], AppConfig<unknown>, "fetch_config::success", never, never>; | ||
success: import("@equinor/fusion-observable").ActionCreatorWithPreparedPayload<[config: AppConfig], AppConfig, "fetch_config::success", never, never>; | ||
failure: import("@equinor/fusion-observable").ActionCreatorWithPreparedPayload<[error: unknown], unknown, "fetch_config::failure", never, never>; | ||
@@ -21,3 +24,3 @@ }; | ||
}; | ||
setInstance: import("@equinor/fusion-observable").ActionCreatorWithPreparedPayload<[instance: AppModulesInstance<unknown>], AppModulesInstance<unknown>, "set_instance", never, never>; | ||
setInstance: import("@equinor/fusion-observable").ActionCreatorWithPreparedPayload<[instance: AppModulesInstance], AppModulesInstance, "set_instance", never, never>; | ||
initialize: import("@equinor/fusion-observable").ActionCreatorWithPreparedPayload<[], null, "initialize_app::request", never, never> & { | ||
@@ -29,12 +32,15 @@ success: import("@equinor/fusion-observable").ActionCreatorWithPreparedPayload<[], null, "initialize_app::success", never, never>; | ||
export declare const actions: { | ||
setManifest: import("@equinor/fusion-observable").ActionCreatorWithPreparedPayload<[manifest: AppManifest], AppManifest, "set_manifest", never, { | ||
setManifest: import("@equinor/fusion-observable").ActionCreatorWithPreparedPayload<[manifest: AppManifest, update?: boolean | undefined], AppManifest, "set_manifest", never, { | ||
created: number; | ||
update: boolean | undefined; | ||
}>; | ||
fetchManifest: import("@equinor/fusion-observable").ActionCreatorWithPreparedPayload<[key: string], string, "fetch_manifest::request", never, never> & { | ||
fetchManifest: import("@equinor/fusion-observable").ActionCreatorWithPreparedPayload<[key: string, update?: boolean | undefined], string, "fetch_manifest::request", never, { | ||
update: boolean | undefined; | ||
}> & { | ||
success: import("@equinor/fusion-observable").ActionCreatorWithPreparedPayload<[manifest: AppManifest], AppManifest, "fetch_manifest::success", never, never>; | ||
failure: import("@equinor/fusion-observable").ActionCreatorWithPreparedPayload<[error: unknown], unknown, "fetch_manifest::failure", never, never>; | ||
}; | ||
setConfig: import("@equinor/fusion-observable").ActionCreatorWithPreparedPayload<[config: AppConfig<unknown>], AppConfig<unknown>, "set_config", never, never>; | ||
setConfig: import("@equinor/fusion-observable").ActionCreatorWithPreparedPayload<[config: AppConfig], AppConfig, "set_config", never, never>; | ||
fetchConfig: import("@equinor/fusion-observable").ActionCreatorWithPreparedPayload<[key: string], string, "fetch_config::request", never, never> & { | ||
success: import("@equinor/fusion-observable").ActionCreatorWithPreparedPayload<[config: AppConfig<unknown>], AppConfig<unknown>, "fetch_config::success", never, never>; | ||
success: import("@equinor/fusion-observable").ActionCreatorWithPreparedPayload<[config: AppConfig], AppConfig, "fetch_config::success", never, never>; | ||
failure: import("@equinor/fusion-observable").ActionCreatorWithPreparedPayload<[error: unknown], unknown, "fetch_config::failure", never, never>; | ||
@@ -47,3 +53,3 @@ }; | ||
}; | ||
setInstance: import("@equinor/fusion-observable").ActionCreatorWithPreparedPayload<[instance: AppModulesInstance<unknown>], AppModulesInstance<unknown>, "set_instance", never, never>; | ||
setInstance: import("@equinor/fusion-observable").ActionCreatorWithPreparedPayload<[instance: AppModulesInstance], AppModulesInstance, "set_instance", never, never>; | ||
initialize: import("@equinor/fusion-observable").ActionCreatorWithPreparedPayload<[], null, "initialize_app::request", never, never> & { | ||
@@ -50,0 +56,0 @@ success: import("@equinor/fusion-observable").ActionCreatorWithPreparedPayload<[], null, "initialize_app::success", never, never>; |
@@ -10,3 +10,29 @@ import { AppConfig, AppManifest, AppModulesInstance, AppScriptModule } from '../types'; | ||
export declare function filterEmpty<T>(): OperatorFunction<T | null | undefined, T>; | ||
export declare class App<TEnv = any, TModules extends Array<AnyModule> | unknown = unknown> { | ||
export interface IApp<TEnv = any, TModules extends Array<AnyModule> | unknown = unknown> { | ||
get manifest$(): Observable<AppManifest>; | ||
get config$(): Observable<AppConfig<TEnv>>; | ||
get modules$(): Observable<AppScriptModule>; | ||
get instance$(): Observable<AppModulesInstance<TModules>>; | ||
get state(): AppBundleState; | ||
get appKey(): string; | ||
get manifest(): AppManifest | undefined; | ||
get manifestAsync(): Promise<AppManifest>; | ||
get config(): AppConfig<TEnv> | undefined; | ||
get instance(): AppModulesInstance<TModules> | undefined; | ||
initialize(): Observable<{ | ||
manifest: AppManifest; | ||
script: AppScriptModule; | ||
config: AppConfig; | ||
}>; | ||
loadConfig(): void; | ||
loadManifest(): void; | ||
loadAppModule(allow_cache: boolean): void; | ||
getConfig(force_refresh: boolean): Observable<AppConfig>; | ||
getConfigAsync(allow_cache: boolean): Promise<AppConfig>; | ||
getManifest(force_refresh: boolean): Observable<AppManifest>; | ||
getManifestAsync(allow_cache: boolean): Promise<AppManifest>; | ||
getAppModule(force_refresh: false): Observable<AppScriptModule>; | ||
getAppModuleAsync(allow_cache: true): Promise<AppScriptModule>; | ||
} | ||
export declare class App<TEnv = any, TModules extends Array<AnyModule> | unknown = unknown> implements IApp<TEnv, TModules> { | ||
#private; | ||
@@ -34,3 +60,4 @@ get manifest$(): Observable<AppManifest>; | ||
loadConfig(): void; | ||
loadManifest(): void; | ||
loadManifest(update?: boolean): void; | ||
updateManifest(manifest: AppManifest, replace?: false): void; | ||
loadAppModule(allow_cache?: boolean): Promise<void>; | ||
@@ -37,0 +64,0 @@ getConfig(force_refresh?: boolean): Observable<AppConfig>; |
import { AppBundleState, AppBundleStateInitial } from './types'; | ||
export declare const createReducer: (value: AppBundleStateInitial) => import("@equinor/fusion-observable").ReducerWithInitialState<AppBundleState<any, any>, import("@equinor/fusion-observable").AnyAction>; | ||
export declare const createReducer: (value: AppBundleStateInitial) => import("@equinor/fusion-observable").ReducerWithInitialState<AppBundleState, import("@equinor/fusion-observable").AnyAction>; | ||
export default createReducer; |
@@ -1,2 +0,2 @@ | ||
export { App } from './App'; | ||
export { App, IApp } from './App'; | ||
export { default } from './App'; |
@@ -6,3 +6,3 @@ import { Observable } from 'rxjs'; | ||
import type { AppConfig, AppManifest, CurrentApp } from './types'; | ||
import { App } from './app/App'; | ||
import { App, IApp } from './app/App'; | ||
import { AppModuleConfig } from './AppConfigurator'; | ||
@@ -25,3 +25,3 @@ import { AppBundleStateInitial } from './app/types'; | ||
getAppConfig<TType = unknown>(appKey: string, tag?: string): Observable<AppConfig<TType>>; | ||
setCurrentApp(appKeyOrApp: string | App): void; | ||
setCurrentApp(appKeyOrApp: string | IApp): void; | ||
clearCurrentApp(): void; | ||
@@ -28,0 +28,0 @@ createApp(value: AppBundleStateInitial): App; |
export { AppModuleConfig, AppConfigurator, IAppConfigurator, AppModuleConfig as IAppModuleConfig, } from './AppConfigurator'; | ||
export { AppModuleProvider } from './AppModuleProvider'; | ||
export { App } from './app/App'; | ||
export { IApp } from './app/App'; | ||
export * from './events'; | ||
@@ -5,0 +5,0 @@ export * from './types'; |
@@ -6,3 +6,3 @@ import { AnyModule, CombinedModules, ModulesInstance } from '@equinor/fusion-framework-module'; | ||
import type { ServiceDiscoveryModule } from '@equinor/fusion-framework-module-service-discovery'; | ||
import App from './app'; | ||
import IApp from './app'; | ||
type Fusion = any; | ||
@@ -17,3 +17,3 @@ export type AppEnv<TConfig = unknown, TProps = unknown> = { | ||
export type AppType = 'standalone' | 'report' | 'launcher'; | ||
export type CurrentApp<TModules extends Array<AnyModule> = [], TEnv = any> = App<TEnv, TModules> | null | undefined; | ||
export type CurrentApp<TModules extends Array<AnyModule> = [], TEnv = any> = IApp<TEnv, TModules> | null | undefined; | ||
export type AppAuth = { | ||
@@ -20,0 +20,0 @@ clientId: string; |
{ | ||
"name": "@equinor/fusion-framework-module-app", | ||
"version": "5.1.2", | ||
"version": "5.2.0-next.0", | ||
"description": "", | ||
@@ -42,9 +42,8 @@ "main": "dist/esm/index.js", | ||
"devDependencies": { | ||
"@equinor/fusion-framework-module": "^4.1.0", | ||
"@equinor/fusion-framework-module": "^4.2.0", | ||
"@equinor/fusion-framework-module-event": "^4.0.1", | ||
"@equinor/fusion-framework-module-http": "^5.0.2", | ||
"@equinor/fusion-framework-module-service-discovery": "^7.0.3", | ||
"typescript": "^4.9.3" | ||
}, | ||
"gitHead": "753d04a18764d5a16d9491ec189df90089534879" | ||
"@equinor/fusion-framework-module-http": "^5.0.3", | ||
"@equinor/fusion-framework-module-service-discovery": "^7.0.4", | ||
"typescript": "^5.0.4" | ||
} | ||
} |
@@ -11,9 +11,14 @@ import { | ||
/** Manifest loading */ | ||
setManifest: createAction('set_manifest', (manifest: AppManifest) => ({ | ||
setManifest: createAction('set_manifest', (manifest: AppManifest, update?: boolean) => ({ | ||
payload: manifest, | ||
meta: { created: Date.now() }, | ||
meta: { | ||
// TODO when updating | ||
created: Date.now(), | ||
update, | ||
}, | ||
})), | ||
fetchManifest: createAsyncAction( | ||
'fetch_manifest', | ||
(key: string) => ({ payload: key }), | ||
(key: string, update?: boolean) => ({ payload: key, meta: { update } }), | ||
(manifest: AppManifest) => ({ payload: manifest }), | ||
@@ -20,0 +25,0 @@ (error: unknown) => ({ payload: error }) |
@@ -28,4 +28,42 @@ import { AppConfig, AppManifest, AppModulesInstance, AppScriptModule } from '../types'; | ||
// TODO add comments! | ||
export interface IApp<TEnv = any, TModules extends Array<AnyModule> | unknown = unknown> { | ||
get manifest$(): Observable<AppManifest>; | ||
get config$(): Observable<AppConfig<TEnv>>; | ||
get modules$(): Observable<AppScriptModule>; | ||
get instance$(): Observable<AppModulesInstance<TModules>>; | ||
get state(): AppBundleState; | ||
get appKey(): string; | ||
get manifest(): AppManifest | undefined; | ||
get manifestAsync(): Promise<AppManifest>; | ||
get config(): AppConfig<TEnv> | undefined; | ||
get instance(): AppModulesInstance<TModules> | undefined; | ||
initialize(): Observable<{ | ||
manifest: AppManifest; | ||
script: AppScriptModule; | ||
config: AppConfig; | ||
}>; | ||
loadConfig(): void; | ||
loadManifest(): void; | ||
loadAppModule(allow_cache: boolean): void; | ||
getConfig(force_refresh: boolean): Observable<AppConfig>; | ||
getConfigAsync(allow_cache: boolean): Promise<AppConfig>; | ||
getManifest(force_refresh: boolean): Observable<AppManifest>; | ||
getManifestAsync(allow_cache: boolean): Promise<AppManifest>; | ||
getAppModule(force_refresh: false): Observable<AppScriptModule>; | ||
getAppModuleAsync(allow_cache: true): Promise<AppScriptModule>; | ||
} | ||
// TODO make streams distinct until changed from state | ||
// eslint-disable-next-line @typescript-eslint/no-explicit-any | ||
export class App<TEnv = any, TModules extends Array<AnyModule> | unknown = unknown> { | ||
export class App<TEnv = any, TModules extends Array<AnyModule> | unknown = unknown> | ||
implements IApp<TEnv, TModules> | ||
{ | ||
#state: FlowSubject<AppBundleState, Actions>; | ||
@@ -227,6 +265,10 @@ | ||
public loadManifest() { | ||
this.#state.next(actions.fetchManifest(this.appKey)); | ||
public loadManifest(update?: boolean) { | ||
this.#state.next(actions.fetchManifest(this.appKey, update)); | ||
} | ||
public updateManifest(manifest: AppManifest, replace?: false) { | ||
this.#state.next(actions.setManifest(manifest, !replace)); | ||
} | ||
public async loadAppModule(allow_cache = true) { | ||
@@ -233,0 +275,0 @@ const manifest = await this.getManifestAsync(allow_cache); |
@@ -20,3 +20,7 @@ import { | ||
.addCase(actions.setManifest, (state, action) => { | ||
state.manifest = action.payload; | ||
if (action.meta.update) { | ||
state.manifest = { ...state.manifest, ...action.payload }; | ||
} else { | ||
state.manifest = action.payload; | ||
} | ||
}) | ||
@@ -23,0 +27,0 @@ .addCase(actions.setConfig, (state, action) => { |
@@ -16,6 +16,6 @@ import { from, of, merge } from 'rxjs'; | ||
filter(actions.fetchManifest.match), | ||
switchMap(({ payload: appKey }) => { | ||
switchMap(({ payload: appKey, meta: { update } }) => { | ||
const fetch$ = from(provider.getAppManifest(appKey)).pipe( | ||
filter((x) => !!x), | ||
map(actions.setManifest) | ||
map((manifest) => actions.setManifest(manifest, update)) | ||
); | ||
@@ -22,0 +22,0 @@ return merge( |
@@ -1,3 +0,3 @@ | ||
export { App } from './App'; | ||
export { App, IApp } from './App'; | ||
export { default } from './App'; |
@@ -20,3 +20,3 @@ import { | ||
import { App, filterEmpty } from './app/App'; | ||
import { App, filterEmpty, IApp } from './app/App'; | ||
import { AppModuleConfig } from './AppConfigurator'; | ||
@@ -158,6 +158,6 @@ import { AppConfigError, AppManifestError } from './errors'; | ||
*/ | ||
public setCurrentApp(appKeyOrApp: string | App): void { | ||
public setCurrentApp(appKeyOrApp: string | IApp): void { | ||
const app = | ||
typeof appKeyOrApp === 'string' ? this.createApp({ appKey: appKeyOrApp }) : appKeyOrApp; | ||
this.#current$.next(app as App); | ||
this.#current$.next(app as CurrentApp); | ||
} | ||
@@ -171,4 +171,6 @@ | ||
* This should not be used, only for legacy creation backdoor | ||
* @deprecated | ||
*/ | ||
public createApp(value: AppBundleStateInitial): App { | ||
console.warn(); | ||
return new App(value, { provider: this, event: this.#event }); | ||
@@ -175,0 +177,0 @@ } |
@@ -9,3 +9,3 @@ export { | ||
export { App } from './app/App'; | ||
export { IApp } from './app/App'; | ||
@@ -12,0 +12,0 @@ export * from './events'; |
@@ -6,3 +6,3 @@ import { AnyModule, CombinedModules, ModulesInstance } from '@equinor/fusion-framework-module'; | ||
import type { ServiceDiscoveryModule } from '@equinor/fusion-framework-module-service-discovery'; | ||
import App from './app'; | ||
import IApp from './app'; | ||
@@ -25,4 +25,5 @@ // TODO | ||
// eslint-disable-next-line @typescript-eslint/no-explicit-any | ||
export type CurrentApp<TModules extends Array<AnyModule> = [], TEnv = any> = | ||
| App<TEnv, TModules> | ||
| IApp<TEnv, TModules> | ||
| null | ||
@@ -29,0 +30,0 @@ | undefined; |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
No v1
QualityPackage is not semver >=1. This means it is not stable and does not support ^ ranges.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Mixed license
License(Experimental) Package contains multiple licenses.
Found 1 instance in 1 package
261772
0
2183
76
2