react-arbiter
Advanced tools
Comparing version 0.8.0 to 0.9.0
# React Arbiter Changelog | ||
## 0.9.0 | ||
- Introduced loading strategies via `strategy` | ||
- Added `blazingStrategy` for loading modules one-by-one | ||
- Updated dependencies | ||
## 0.8.0 | ||
@@ -4,0 +10,0 @@ |
@@ -21,3 +21,4 @@ import * as React from 'react'; | ||
constructor(props: ArbiterRecallProps<TApi>); | ||
private finish; | ||
private setLoaded; | ||
private setModules; | ||
componentDidMount(): void; | ||
@@ -24,0 +25,0 @@ componentWillUnmount(): void; |
"use strict"; | ||
var __rest = (this && this.__rest) || function (s, e) { | ||
var t = {}; | ||
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) | ||
t[p] = s[p]; | ||
if (s != null && typeof Object.getOwnPropertySymbols === "function") | ||
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { | ||
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) | ||
t[p[i]] = s[p[i]]; | ||
} | ||
return t; | ||
}; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const React = require("react"); | ||
const utils_1 = require("../utils"); | ||
const strategies_1 = require("../strategies"); | ||
/** | ||
@@ -12,27 +24,17 @@ * Represents an arbiter recall component to load extension components. | ||
this.mounted = false; | ||
this.setLoaded = () => this.mounted && this.setState({ loaded: true }); | ||
this.setModules = (error, modules) => this.mounted && | ||
this.setState({ | ||
error, | ||
modules, | ||
}); | ||
this.state = { | ||
loaded: props.async || false, | ||
loaded: false, | ||
modules: [], | ||
}; | ||
} | ||
finish(error, newModules) { | ||
const { createApi, modules: oldModules = [] } = this.props; | ||
for (const oldModule of oldModules) { | ||
const [newModule] = newModules.filter(m => m.name === oldModule.name); | ||
if (newModule) { | ||
newModules.splice(newModules.indexOf(newModule), 1); | ||
} | ||
} | ||
this.setState({ | ||
error, | ||
loaded: true, | ||
modules: utils_1.createModules(createApi, [...oldModules, ...newModules]), | ||
}); | ||
} | ||
componentDidMount() { | ||
const { fetchModules, dependencies, getDependencies, fetchDependency, cache } = this.props; | ||
const _a = this.props, { async, strategy = async ? strategies_1.asyncStrategy : strategies_1.standardStrategy } = _a, options = __rest(_a, ["async", "strategy"]); | ||
this.mounted = true; | ||
if (utils_1.isfunc(fetchModules)) { | ||
utils_1.loadModules(fetchModules, fetchDependency, dependencies, getDependencies, cache).then(modules => this.mounted && this.finish(undefined, modules), error => this.mounted && this.finish(error, [])); | ||
} | ||
strategy(options, this.setModules).then(this.setLoaded, this.setLoaded); | ||
} | ||
@@ -39,0 +41,0 @@ componentWillUnmount() { |
@@ -5,2 +5,3 @@ export * from './components'; | ||
export * from './utils'; | ||
export * from './strategies'; | ||
export * from './wrappers'; |
@@ -9,2 +9,3 @@ "use strict"; | ||
__export(require("./utils")); | ||
__export(require("./strategies")); | ||
__export(require("./wrappers")); |
@@ -128,3 +128,9 @@ import { ComponentType, Ref } from 'react'; | ||
} | ||
export interface ArbiterOptions<TApi> { | ||
export interface ArbiterRecallModulesLoaded<TApi> { | ||
(error: Error | undefined, modules: Array<ArbiterModule<TApi>>): void; | ||
} | ||
export interface ArbiterRecallStrategy<TApi> { | ||
(options: ArbiterRecallOptions<TApi>, modulesLoaded: ArbiterRecallModulesLoaded<TApi>): Promise<void>; | ||
} | ||
export interface ArbiterRecallOptions<TApi> { | ||
/** | ||
@@ -163,2 +169,4 @@ * The callback function for creating an API object. | ||
cache?: ArbiterModuleCache; | ||
} | ||
export interface ArbiterOptions<TApi> extends ArbiterRecallOptions<TApi> { | ||
/** | ||
@@ -169,3 +177,9 @@ * Optionally, sets the loading scheme to be asynchronous and | ||
async?: boolean; | ||
/** | ||
* Optionally, defines the recall strategy. This could override | ||
* the async option, as async is just a shorthand for the async | ||
* loading strategy. | ||
*/ | ||
strategy?: ArbiterRecallStrategy<TApi>; | ||
} | ||
export declare type ComponentDefinition<T> = ComponentType<T> | RenderCallback<T>; |
@@ -1,4 +0,10 @@ | ||
import { defaultFetchDependency } from './fetch'; | ||
import { AvailableDependencies, ArbiterModule, DependencyGetter, ApiCreator, ArbiterModuleFetcher, ArbiterModuleCache } from '../types'; | ||
import { AvailableDependencies, ArbiterModule, DependencyGetter, ApiCreator, ArbiterModuleFetcher, ArbiterModuleCache, DependencyFetcher } from '../types'; | ||
/** | ||
* Loads the modules metadata and puts them in the cache, if provided. | ||
* @param fetchModules The function to resolve the modules. | ||
* @param cache The optional cache to use initially and update later. | ||
*/ | ||
export declare function loadModulesMetadata(fetchModules: ArbiterModuleFetcher, cache?: ArbiterModuleCache): Promise<import("../types").ArbiterModuleMetadata[]>; | ||
export declare function getDependencyResolver(globalDependencies?: AvailableDependencies, getLocalDependencies?: DependencyGetter): DependencyGetter; | ||
/** | ||
* Loads the modules by first getting them, then evaluating the raw content. | ||
@@ -10,3 +16,3 @@ * @param fetchModules The function to resolve the modules. | ||
*/ | ||
export declare function loadModules<TApi>(fetchModules: ArbiterModuleFetcher, fetchDependency?: typeof defaultFetchDependency, globalDependencies?: AvailableDependencies, getLocalDependencies?: DependencyGetter, cache?: ArbiterModuleCache): Promise<Array<ArbiterModule<TApi>>>; | ||
export declare function loadModules<TApi>(fetchModules: ArbiterModuleFetcher, fetchDependency?: DependencyFetcher, globalDependencies?: AvailableDependencies, getLocalDependencies?: DependencyGetter, cache?: ArbiterModuleCache): Promise<Array<ArbiterModule<TApi>>>; | ||
/** | ||
@@ -13,0 +19,0 @@ * Sets up the evaluated modules to become integrated modules. |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const setup_1 = require("./setup"); | ||
const load_1 = require("./load"); | ||
const fetch_1 = require("./fetch"); | ||
const setup_1 = require("./setup"); | ||
const isfunc_1 = require("./isfunc"); | ||
@@ -32,2 +31,20 @@ const defaultGlobalDependencies = {}; | ||
/** | ||
* Loads the modules metadata and puts them in the cache, if provided. | ||
* @param fetchModules The function to resolve the modules. | ||
* @param cache The optional cache to use initially and update later. | ||
*/ | ||
function loadModulesMetadata(fetchModules, cache = defaultCache) { | ||
if (checkFetchModules(fetchModules)) { | ||
return Promise.resolve(cache.retrieve()).then(cachedModules => Promise.resolve(fetchModules(cachedModules || [])).then(receivedModules => cache.update(cachedModules, receivedModules))); | ||
} | ||
return Promise.resolve([]); | ||
} | ||
exports.loadModulesMetadata = loadModulesMetadata; | ||
function getDependencyResolver(globalDependencies = defaultGlobalDependencies, getLocalDependencies = defaultGetDependencies) { | ||
return target => { | ||
return getLocalDependencies(target) || globalDependencies; | ||
}; | ||
} | ||
exports.getDependencyResolver = getDependencyResolver; | ||
/** | ||
* Loads the modules by first getting them, then evaluating the raw content. | ||
@@ -39,12 +56,5 @@ * @param fetchModules The function to resolve the modules. | ||
*/ | ||
function loadModules(fetchModules, fetchDependency = fetch_1.defaultFetchDependency, globalDependencies = defaultGlobalDependencies, getLocalDependencies = defaultGetDependencies, cache = defaultCache) { | ||
if (checkFetchModules(fetchModules)) { | ||
const getDependencies = target => { | ||
return getLocalDependencies(target) || globalDependencies; | ||
}; | ||
return Promise.resolve(cache.retrieve()).then(cachedModules => Promise.resolve(fetchModules(cachedModules || [])) | ||
.then(receivedModules => cache.update(cachedModules, receivedModules)) | ||
.then(moduleData => Promise.all(moduleData.map(m => load_1.loadModule(m, fetchDependency, getDependencies))))); | ||
} | ||
return Promise.resolve([]); | ||
function loadModules(fetchModules, fetchDependency, globalDependencies, getLocalDependencies, cache) { | ||
const getDependencies = getDependencyResolver(globalDependencies, getLocalDependencies); | ||
return loadModulesMetadata(fetchModules, cache).then(moduleData => Promise.all(moduleData.map(m => load_1.loadModule(m, getDependencies, fetchDependency)))); | ||
} | ||
@@ -51,0 +61,0 @@ exports.loadModules = loadModules; |
@@ -1,2 +0,3 @@ | ||
import { ArbiterModuleMetadata, ArbiterModule, DependencyFetcher, DependencyGetter } from '../types'; | ||
import { defaultFetchDependency } from './fetch'; | ||
import { ArbiterModuleMetadata, ArbiterModule, DependencyGetter } from '../types'; | ||
/** | ||
@@ -10,2 +11,2 @@ * Loads the given raw module content by resolving its dependencies and | ||
*/ | ||
export declare function loadModule<TApi>(meta: ArbiterModuleMetadata, fetchDependency: DependencyFetcher, getDependencies: DependencyGetter): Promise<ArbiterModule<TApi>>; | ||
export declare function loadModule<TApi>(meta: ArbiterModuleMetadata, getDependencies: DependencyGetter, fetchDependency?: typeof defaultFetchDependency): Promise<ArbiterModule<TApi>>; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const dependency_1 = require("./dependency"); | ||
const fetch_1 = require("./fetch"); | ||
function createEmptyModule(meta) { | ||
@@ -20,3 +21,3 @@ return Object.assign({}, meta, { setup() { } }); | ||
*/ | ||
function loadModule(meta, fetchDependency, getDependencies) { | ||
function loadModule(meta, getDependencies, fetchDependency = fetch_1.defaultFetchDependency) { | ||
const { link, content } = meta; | ||
@@ -23,0 +24,0 @@ const retrieve = link ? fetchDependency(link) : content ? Promise.resolve(content) : undefined; |
{ | ||
"name": "react-arbiter", | ||
"version": "0.8.0", | ||
"version": "0.9.0", | ||
"description": "Recall all your modules to extend your SPA dynamically at runtime.", | ||
@@ -42,8 +42,8 @@ "main": "dist/index.js", | ||
"enzyme-adapter-react-16": "^1.14.0", | ||
"enzyme-to-json": "^3.3.5", | ||
"enzyme-to-json": "^3.4.0", | ||
"jest": "^24.8.0", | ||
"jest-cli": "^24.8.0", | ||
"prettier": "^1.18.2", | ||
"react": "^16.8.6", | ||
"react-dom": "^16.8.6", | ||
"react": "^16.9.0", | ||
"react-dom": "^16.9.0", | ||
"ts-jest": "^24.0.2", | ||
@@ -50,0 +50,0 @@ "tslint": "^5.18.0", |
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
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
82150
51
1175