typescript-fetch.runtimeSagasAndRecords.mustache Maven / Gradle / Ivy
/* tslint:disable */
/* eslint-disable */
import {fromJS as originalFromJS, isIndexed, List, Map as ImmMap, RecordOf} from 'immutable';
import {normalize, NormalizedSchema, schema, Schema} from "normalizr";
import {ActionDefinition, createAction} from "redux-ts-simple";
export const knownRecordFactories = new Map();
export const knownIndexedSetByKey: (string | number)[] = [];
export function appFromJS(any: any): any {
return originalFromJS(any, (key, value) => {
if (isIndexed(value)) {
return knownIndexedSetByKey.indexOf(key) !== -1 ? value.toSet() : value.toList();
} // we're reviving an array -> it's a List
const MatchingType = knownRecordFactories.get(value.get('recType')) as { new(input?: any): any }; // check if we know a Record with this type
if (MatchingType) {
return new MatchingType(value);
}
return value.toMap(); // no matching Record type found -> it's a plain old Map
});
}
export type NormalizedRecordEntity = NormalizedSchema<{ [key: string]: Map> }, string>;
export type NormalizedRecordEntities = NormalizedSchema<{ [key: string]: Map> }, List>;
export abstract class ApiRecordUtils> {
public abstract normalize(apiObject: TAPI, asEntity?: boolean): any;
public getSchema(): Schema {
console.log("Entity mode not supported on this record.");
return new schema.Entity("entityNotSupported");
}
public normalizeArray(apiObjectArray: TAPI[], asEntity?: boolean): TAPI[] {
apiObjectArray.forEach(apiObject => this.normalize(apiObject, asEntity));
return apiObjectArray;
}
public normalizeAsEntities(apiObject: TAPI): NormalizedSchema {
const normalized = this.normalize(apiObject, true);
return normalize(normalized, this.getSchema());
}
public normalizeArrayAsEntities(apiObject: TAPI[]): NormalizedSchema {
const normalized = this.normalizeArray(apiObject, true);
return normalize(normalized, new schema.Array(this.getSchema()));
}
public fromApi(apiObject: TAPI): TREC {
return appFromJS(this.normalize(apiObject));
}
public fromApiArray(apiObjectArray: TAPI[]): List {
this.normalizeArray(apiObjectArray);
return appFromJS(apiObjectArray);
}
public fromApiAsEntities(apiObject: TAPI): NormalizedRecordEntity {
return ApiRecordUtils.toNormalizedRecordEntities(this.normalizeAsEntities(apiObject), false);
}
public fromApiArrayAsEntities(apiObject: TAPI[]): NormalizedRecordEntities {
return ApiRecordUtils.toNormalizedRecordEntities(this.normalizeArrayAsEntities(apiObject), true);
}
public toApi(record: TREC): TAPI {
const apiObject = record.toJS();
delete apiObject.recType;
return apiObject;
}
public toApiArray(records: List): TAPI[] {
return records.map(record => this.toApi(record)).toArray();
}
public static toNormalizedRecordEntities(normalizedAsEntities: any, forArray: boolean) {
const entities = normalizedAsEntities.entities;
for (const entityKey of Object.keys(entities)) {
entities[entityKey] = appFromJS(entities[entityKey]);
}
normalizedAsEntities.result = appFromJS(normalizedAsEntities.result || (forArray ? "" : []));
return normalizedAsEntities;
}
}
export const allApiActionFailures: SagaActionDefinition[] = [];
export interface BaseEntitySupportPayloadApiAction {
toInlined?: boolean;
toEntities?: boolean;
markErrorsAsHandled?: boolean;
}
export interface BasePayloadApiAction {
markErrorsAsHandled?: boolean;
}
export interface SagaActionDefinition extends ActionDefinition {
toString: () => string;
}
export function createSagaAction(type: string, options?: { doNotAutoRegisterFailure?: boolean, namespace?: string }): SagaActionDefinition {
const {doNotAutoRegisterFailure, namespace} = options || {} as any;
let actionDefinition = createAction(namespace ? `${namespace}-${type}` : type);
(actionDefinition as any).toString = () => actionDefinition.type;
if (type.endsWith("Failure") && !doNotAutoRegisterFailure) {
allApiActionFailures.push(actionDefinition);
}
return actionDefinition;
}
export let apiCall: any>(context: Ctx, fn: Fn, ...args: Parameters) => Generator;
export function setApiCall(apiCallFc: any>(context: Ctx, fn: Fn, ...args: Parameters) => Generator) {
console.log("init apiCall");
apiCall = apiCallFc;
}
export const normalizedEntities = createSagaAction("normalizedEntities");