vamtiger-browser-method
Version:
679 lines (678 loc) • 22 kB
TypeScript
import * as tslib from '../node_modules/tslib/tslib';
import { requestIdleCallback } from 'requestidlecallback';
import * as lodash from 'lodash';
export declare enum Environment {
window = "window",
worker = "worker",
serviceWorker = "serviceWorker",
unknown = "unknown"
}
export declare enum CacheName {
vamtigerBrowserMethod = "vamtiger-browser-method"
}
export declare enum EventName {
vamtigerBrowserMethodReady = "vamtigerBrowserMethodReady"
}
export declare enum TimeoutDuration {
webComponent = 5000,
indexDbIsAccessible = 100
}
export declare enum MessageQueueName {
webComponent = "webComponent"
}
export declare enum Prefix {
vamtigerBrowserMethod = "vamtiger-browser-method",
db = "vamtiger-browser-method",
messageIdWindow = "vamtiger-browser-method-window",
messageIdWorker = "vamtiger-browser-method-worker",
messageIdServiceWorker = "vamtiger-browser-method-service-worker",
messageIdUnknownEnvironment = "vamtiger-browser-method-unknown-environment"
}
export declare enum ElementId {
metaElement = "vamtiger-browser-method"
}
export declare enum Origin {
nowhere = "",
everyWhere = "*"
}
export declare enum HostName {
localHost = "localhost"
}
export declare enum LocalHostRelativePath {
vamtigerBrowserMethod = "vamtiger-browser-method.js"
}
export declare enum ScriptType {
js = "text/javascript",
babel = "text/babel",
json = "application/json",
jsonld = "application/ld+json"
}
export declare enum ScriptAttribute {
type = "type"
}
export declare enum DataAttribute {
vamtigerElementQuery = "vamtigerLoadElementQueryCss",
elementQueryCssLoaded = "elementQueryCssLoaded",
customElementName = "customElementName",
visible = "visible"
}
export declare enum ErrorMessage {
failedToLoadScript = "Failed to load script",
windowPropertyNotSet = "Window property not set",
unsupportedFeature = "Unsupported feature",
customElementAreadyDefined = "Custom element already defined",
noElementName = "No Element Name",
noTemplateUrl = "No Template URL",
noElementSelector = "No Template Selector",
noTemplateForUrl = "No Template for URL",
noTemplate = "No Template",
noElementForSelector = "No Element for Selector",
noJsonLdParameter = "No \"jsonLd\" property set",
scriptLoadedButMethodNameNotFound = "Failed to load method: Script loaded, but method name not found",
crossOriginMethodsNotAllowed = "Cross-Origin methods are not allowed"
}
export declare enum StringConstant {
nothing = "",
slash = "/",
dash = "-",
pipe = "|",
comma = ",",
backTick = "`",
doubleQuote = "\"",
commaSpace = ", ",
space = " ",
period = ".",
newline = "\n",
semiColon = ";"
}
export declare enum TagName {
div = "div",
template = "template"
}
export declare enum LinkRel {
stylesheet = "stylesheet"
}
export declare enum LoadScriptElement {
script = "script",
link = "link",
style = "style"
}
export declare enum Selector {
lastStylesheet = "style:last-of-type",
lastMetaElement = "head > meta:last-of-type",
webcomponentsjs = "script[src*=\"@webcomponents/webcomponentsjs\"]",
style = "style",
stylesheet = " link[rel=\"stylesheet\"]",
vamtigerBrowserMethodJs = "[src$=\"vamtiger-browser-method.js\"], [data-name$=\"vamtiger-browser-method.js\"]",
vamtigerBrowserMethodJsonJs = "[src$=\"vamtiger-browser-method.js.json.js\"]",
worker = "[src$=\"js.json.js\"][data-worker]",
workderDependency = "script[data-worker-dependency]",
vamtigerBrowserMethodJson = "[data-name$=\"vamtiger-browser-method.js.json\"]",
vamtigerBrowserMethod = "[src$=\"vamtiger-browser-method.js\"]",
script = "script",
jsonScript = "script[type=\"application/json\"]",
jsonLdScript = "script[type=\"application/ld+json\"]",
a = "a",
linkedDataCaption = "[data-linked-data-caption]",
linkedDataCaptionElement = "[data-linked-data-caption-element]",
jsonLdViewer = "vamtiger-json-ld-viewer",
transpiledJs = "[data-transpiled-js]",
htmlTextMode = "html[data-vamtiger-text-mode]",
customElementNameMetaElement = "meta[data-custom-element-name]",
dependencyUrlMetaElement = "meta[data-dependency]",
urlMetaElement = "meta[data-url]"
}
export declare enum TextModeElementName {
vamtigerJsonLdViewer = "vamtiger-json-ld-viewer"
}
export declare enum MetaElementName {
loadElementQueryCss = "vamtiger-load-element-query-css"
}
export declare enum WorkerType {
all = "all",
worker = "worker",
serviceWorker = "serviceWorker"
}
export declare enum ScriptNameSuffix {
style = "style",
stylesheet = "stylesheet"
}
export declare enum ScriptName {
textMode = "vamtiger-text-mode"
}
export declare enum MessageAction {
ignore = "ignore",
removeRedundantScripts = "removeRedundantScripts",
setWorkerSupport = "setWorkerSupport",
saveWebComponentData = "saveWebComponentData",
getWebComponentData = "getWebComponentData",
dequeue = "dequeue",
loadWebComponentData = "loadWebComponentData",
saveSupport = "saveSupport",
saveCustomElementName = "saveCustomElementName",
getTextModeCss = "getTextModeCss",
loadScript = "loadScript",
loadMethod = "loadMethod",
updateMethod = "updateMethod",
getMethodResult = "getMethodResult",
importDependencies = "importDependencies",
removeDependencyUrl = "removeDependencyUrl"
}
export declare enum CustomEventName {
vamtigerBrowserMethod = "vamtiger-browser-method"
}
export declare enum HandleJsonLdAction {
handleJsonLdLoaded = "vamtiger-browser-method-handle-json-ld-loaded"
}
export declare enum DbName {
vamtigerBrowserSupport = "vamtiger-browser-support"
}
export declare enum DbStoreName {
support = "support",
webComponent = "web-component",
customElementName = "custom-element-name"
}
export declare enum DbMode {
readonly = "readonly",
readwrite = "readwrite",
versionchange = "versionchange"
}
export declare enum DbKeyPath {
webComponent = "url",
support = "environment",
customElementName = "name"
}
export declare enum Dependency {
lodash = "https://cdn.jsdelivr.net/npm/lodash@4.17.11",
jsonLdViewer = "https://vamtiger-project.github.io/vamtiger-json-ld-viewer/build/vamtiger-json-ld-viewer.js"
}
export interface IDequeue {
key: string;
match?: boolean;
data: IAnyObject;
queue: Map<string, Set<IQueueEntry>>;
}
export interface IGetDbParams {
storeName: DbStoreName;
keyPath: DbKeyPath;
mode: DbMode;
}
export interface IGetDbParamsHandleUpgradeNeeded extends Pick<IDbParams, 'db'> {
}
export interface IDbParams {
db: IDBDatabase;
transaction: IDBTransaction;
store: IDBObjectStore;
}
export interface ILoadRemoteScriptParams {
src: string;
}
export interface IRemoveDepencyUrl {
url: string;
}
export interface ILoadRemoteStylesheetScriptParams {
href: string;
}
export interface IIsJsonScript {
script: HTMLScriptElement;
}
export interface ILoadLocalScriptParams {
name: string;
removeExisting?: boolean;
removeFromDom?: boolean;
workerDependency?: boolean;
}
export interface ILoadScriptParams {
js: string;
jsonld?: boolean;
jsonLd?: boolean;
}
export interface ISaveCustomeElementName {
name: string;
}
export interface ILoadJsonScriptParams extends ILoadLocalScriptParams {
json: string;
}
export interface ILoadStylesheetScriptParams {
css: string;
}
export interface IAnyObject {
[key: string]: any;
}
export interface IJsonData {
jsonLd: IAnyObject[];
json?: IAnyObject;
}
export interface IJsonJsonLd {
index: number;
fields: {
[key: string]: string[];
};
}
export interface IImportDependencies {
urls?: string[];
}
export interface ILoadScript {
params: LocalScriptParams | LocalStylesheetScriptParams | ILoadRemoteScriptParams | ILoadRemoteStylesheetScriptParams | ILoadJsonScriptParams;
reject: (error: Error) => void;
}
export interface IUpdateMthod {
name: string;
}
export interface IGetMethodResult {
messageId?: string;
name: string;
params: IAnyObject;
}
export interface IGetMethodResultWindow extends IGetMethodResult {
resolve: (result: any) => void;
reject: (error: Error) => void;
}
export interface IUpdateMthodWrapNamedMethod {
method: Function;
}
export interface ILoadScriptLoadJsJsonJs {
src: string;
workerDependency?: boolean;
}
export interface ILoadShadowStylesheet {
css: string;
element: HTMLElement;
}
export interface IJsonScriptData {
name: string;
text: string;
}
export interface IDefineCustomElement {
name: string;
constructor: {
new (): HTMLElement;
prototype: HTMLElement;
};
ignore?: boolean;
}
export interface IPause {
milliseconds: number;
}
export interface IGetElementBase {
name: string;
loadStylesheets?: boolean;
}
export interface IGetElementTemplate extends IGetElementBase {
template: string;
selector?: string;
}
export interface IGetElementUrl extends IGetElementBase {
url: string;
selector: string;
}
export interface ILoadElementQueryCss {
css: string;
stylesheetName?: string;
hostName?: string;
}
export interface IGetJsonLdArray {
jsonLd: IAnyObject;
}
export interface IGetJsonLdArrayGetEntry {
key: string;
value: string | IAnyObject | IAnyObject[];
}
export interface IGetMetaElement {
selector?: string;
properties?: {
id?: string;
};
attributes?: {
[key: string]: string;
};
dataset?: DOMStringMap;
}
export interface IDispatchEvent {
eventName: EventName;
detail?: IAnyObject;
}
export interface IGetBabelJs {
url?: string;
js?: string;
}
export interface ILoadContainerStylesheets {
name: string;
container: HTMLTemplateElement;
}
export interface IGetData {
json?: string;
jsonLd?: string;
textMode?: boolean;
dependency?: boolean;
}
export interface IGetJson {
json: string;
dependency?: boolean;
}
export interface IGetJsonFromUrl {
json: string;
resolve: (json?: IJsonDataFromUrl) => void;
reject: (error: Error) => void;
}
export interface IGetJsonData {
url: string;
json?: IJsonDataFromUrl;
dependency?: boolean;
}
export interface IGetJsonDataWindow extends IGetJsonData {
resolve: (data: IJsonDataFromUrl) => void;
reject: (error: Error) => void;
}
export interface IJsonDataFromUrl {
jsonLd: IAnyObject;
json: IAnyObject;
}
export interface IGetJsonDataWindow extends IGetJsonData {
resolve: (json: IJsonDataFromUrl) => void;
reject: (error: Error) => void;
}
export interface IGetDataResolve extends IGetData {
data: IJsonData;
jsonLd: string;
resolve: (data: IJsonData) => void;
}
export interface IGetJsonLd {
jsonLd: string;
textMode?: boolean;
loadJsonJsonLd?: boolean;
}
export interface IViewJsonLd {
jsonLd: string;
}
export interface IJosnLdImageObject {
"@context": string;
'@type': string;
name: string;
description: string;
author: {
'@type': string;
givenName: string;
familyName: string;
email: string;
};
datePublished: string;
contentUrl: string;
}
export interface IMessageAction {
action: MessageAction;
params: IAnyObject & {
messageId?: string;
ports?: MessagePort[];
};
workerType?: WorkerType;
}
export interface IRemoveRedundantScripts {
selector: string;
}
export interface IRemoveRedundantScriptsRemoveScripts extends IRemoveRedundantScripts {
parent: HTMLElement;
}
export interface IRemoveRedundantScriptsRemoveScriptsFromParent extends IRemoveRedundantScriptsRemoveScripts {
resolve?: () => void;
reject?: (error: Error) => void;
}
export interface ISupport {
environment: Environment;
cache: boolean;
localStorage: boolean;
indexedDb: boolean;
indexedDbIsAccessible: boolean;
worker: boolean;
sharedWorker: boolean;
textEncoder: boolean;
textDecoder: boolean;
}
export interface ILoadMethod {
name: string;
url: string;
}
export interface ILoadMethodWindow extends ILoadMethod {
resolve: () => void;
reject: (error: Error) => void;
}
export interface ICustomElementName {
name: string;
}
export interface ISaveSupport extends ISupport {
}
export interface ISaveWebComponentData extends IWebComponentData {
}
export interface ISaveJsonLd {
url: string;
data: IJsonDataFromUrl;
dependency?: boolean;
}
export interface ISaveJsonLdWindow extends ISaveJsonLd {
resolve: () => void;
reject: (error: Error) => void;
}
export interface IGetWebComponentData {
key: string;
}
export interface IGetDbName {
dbName: DbName;
}
export interface ISaveIndexedDbData {
storeName: DbStoreName;
keyPath: DbKeyPath;
messageId?: string;
data: IndexDbData;
successAction?: MessageAction;
}
export interface IGetIndexedDbData {
storeName: DbStoreName;
keyPath: DbKeyPath;
key?: string;
messageId?: string;
}
export interface ISaveIndexedDbDataHandleSuccess {
messageId?: string;
key: string;
action?: MessageAction;
data: IndexDbData;
}
export interface IWebComponentData {
url: string;
created?: number;
messageId?: string;
jsonLd: IAnyObject | IAnyObject[];
json: IAnyObject;
}
export interface ISaveWebComponentDataWorker extends ISaveWebComponentData {
}
export interface IQueueEntry {
resolve: (result: any) => void;
reject: (reason: Error) => void;
}
export interface IQueue extends NonNullable<Pick<IQueueEntry, 'resolve' | 'reject'>> {
key: string;
queue: Map<string, Set<IQueueEntry>>;
}
export interface IQueueHandleExpiredQueueEntry {
key: string;
queue: IQueue['queue'];
queueEntry: IQueueEntry;
}
export interface ILoadData {
url: string;
loadJsonJsonLd?: boolean;
}
export interface ILoadDataGetFeldData {
key: string;
urls: string[];
}
export interface ILoadDataGetJsonJsonLd extends IJsonJsonLd {
}
export interface IGetMicrodataCaption {
imageData: IAnyObject;
fieldKey: string;
}
export interface IGetTemplate {
selector: Selector;
attributes?: IAttributes;
properties?: IProperties;
}
export interface IProperties {
name?: string;
src?: string;
alt?: string;
innerHTML?: string;
}
export interface IGetTabLink {
href: string;
text: string;
}
export interface IGetEmailLink {
href: string;
text: string;
}
export interface IVamtigerBrowserMethodLoadMethod {
[key: string]: Function;
}
export interface ISetDependencyUrl {
script: HTMLScriptElement;
}
export interface ISetDependencyUrlWindow {
js: string;
}
export interface IHandleJsonLd extends CustomEvent {
detail: IHandleJsonLdDetail;
}
export interface IHandleJsonLdDetail {
action: HandleJsonLdAction;
params: IJsonDataFromUrl & {
key: string;
};
}
export interface IGetUrlFromQueue {
url: string;
}
export declare type WebComponentDataResolve = (webComponent: IJsonData | undefined) => void;
export declare type ErrorResolve = (error: Error) => void;
export declare type MessageResponse = IMessageAction | undefined | null | false;
export declare type TsLibType = typeof tslib;
export declare type TsLibKey = keyof TsLibType;
export declare type TsLib = {
[K in TsLibKey]: TsLibType[K];
};
export declare type LocalScriptParams = ILoadLocalScriptParams & ILoadScriptParams;
export declare type LocalStylesheetScriptParams = ILoadLocalScriptParams & ILoadStylesheetScriptParams;
export declare type LoadScriptParams = LocalScriptParams | LocalStylesheetScriptParams | ILoadRemoteScriptParams | ILoadRemoteStylesheetScriptParams;
export declare type LoadScriptsParams = LoadScriptParams[];
export declare type LoadScriptsSequentiallyParams = LoadScriptsParams[];
export declare type DependencyKey = keyof typeof Dependency;
export declare type LoadedScript<P extends ILoadScript['params']> = P extends ILoadScriptParams ? HTMLScriptElement : P extends ILoadStylesheetScriptParams ? HTMLStyleElement : P extends ILoadRemoteScriptParams ? HTMLScriptElement : P extends ILoadRemoteStylesheetScriptParams ? HTMLLinkElement : never;
export declare type LoadedScripts<P extends LoadScriptsParams> = P extends ILoadScriptParams[] ? HTMLScriptElement[] : P extends ILoadStylesheetScriptParams[] ? HTMLStyleElement[] : P extends ILoadRemoteScriptParams[] ? HTMLScriptElement[] : P extends ILoadRemoteStylesheetScriptParams[] ? HTMLLinkElement[] : never;
export declare type LoadedScriptsSequentially<P extends LoadScriptsSequentiallyParams> = P extends ILoadScriptParams[][] ? HTMLScriptElement[] : P extends ILoadStylesheetScriptParams[][] ? HTMLStyleElement[] : P extends ILoadRemoteScriptParams[][] ? HTMLScriptElement[] : P extends ILoadRemoteStylesheetScriptParams[][] ? HTMLLinkElement[] : never;
export declare type GetElementParams = IGetElementTemplate | IGetElementUrl;
export declare type VamtigerBrowserMethod = {
origin?: string;
metaElement?: HTMLMetaElement;
loadScript: <P extends LocalScriptParams | LocalStylesheetScriptParams | ILoadRemoteScriptParams | ILoadRemoteStylesheetScriptParams>(params: P) => Promise<LoadedScript<P>>;
loadScripts: <P extends LoadScriptParams[]>(params: P) => Promise<LoadedScripts<P>>;
loadScriptsSequentially: <P extends LoadScriptParams[][]>(params: P) => Promise<LoadedScriptsSequentially<P>>;
loadMethod: (params: ILoadMethod) => Promise<boolean>;
loadShadowStylesheet: ({ css, element }: ILoadShadowStylesheet) => void;
defineCustomElement: ({ name, constructor, ignore }: IDefineCustomElement) => void;
pause: ({ milliseconds }: IPause) => Promise<unknown>;
getElement: <P extends GetElementParams>(params: P) => Promise<HTMLElement>;
getData: <P extends IGetData>(params: P) => Promise<GetDataResult<P>>;
getEnvironment: () => Environment;
environment: Environment;
getMicrodataCaption: (params: IGetMicrodataCaption) => HTMLElement | null | undefined;
queue: Map<string, Set<IQueueEntry>>;
messageQueue: Map<string, Set<IQueueEntry>>;
worker?: Worker;
serviceWorker?: ServiceWorker;
serviceWorkerRegistration?: ServiceWorkerRegistration;
support?: ISupport;
workerSupport?: ISupport;
serviceWorkerSupport?: ISupport;
getJsonLdArray: ({ jsonLd }: IGetJsonLdArray) => Promise<string[][]>;
textMode?: boolean;
intersectionObserver?: IntersectionObserver;
messageChannel?: MessageChannel;
method: IVamtigerBrowserMethodLoadMethod;
};
export interface IAttributes {
id?: string;
for?: string;
slot?: string;
'data-image-figure'?: string;
'data-json-ld'?: string;
itemprop?: string;
}
export interface IGetServiceWorkerClients {
type: ClientTypes;
}
export interface ISendMessageFromServiceWorker {
message: string | Uint8Array;
clients?: ServiceWorkerClient;
}
export interface FetchEvent extends Event {
request: Request;
respondWith(response: Promise<Response> | Response): Promise<Response>;
}
export interface IUpdateRequestCache {
request: Request;
}
export interface IHandleJsonLdLoaded extends IHandleJsonLdDetail {
}
export declare type JsonLdActionParams<A extends HandleJsonLdAction> = A extends HandleJsonLdAction.handleJsonLdLoaded ? IHandleJsonLdLoaded : unknown;
export declare type JsonLdActionMethod<A extends HandleJsonLdAction> = A extends HandleJsonLdAction.handleJsonLdLoaded ? (params: IHandleJsonLdLoaded) => void : unknown;
export declare type ServiceWorkerClient = 'window' | 'worker' | 'sharedworker' | 'all';
export declare type JsonDataResolve = (data: IJsonData) => void;
export declare type WorkerPostMessage = (message: string | Uint8Array) => void;
export declare type IndexDbData = IWebComponentData | ISupport | ICustomElementName;
export declare type GetIndexedDbData<P extends IGetIndexedDbData> = P['keyPath'] extends DbKeyPath.webComponent ? IWebComponentData | undefined : P['keyPath'] extends DbKeyPath.support ? ISaveSupport : P['keyPath'] extends DbKeyPath.customElementName ? ICustomElementName[] : never;
export declare type GetDataResult<P extends IGetData> = P['json'] extends string ? IJsonDataFromUrl : P['jsonLd'] extends string ? IJsonData : unknown;
export declare type DbKeyPathName = keyof typeof DbKeyPath;
export declare type DbStoreNameKey = keyof typeof DbStoreName;
export declare type AttributesKey = keyof IAttributes;
export declare type HandleJsonLdActionKey = keyof typeof HandleJsonLdAction;
export declare type GetTemplate<P extends IGetTemplate> = P['selector'] extends Selector.a ? HTMLAnchorElement : P['selector'] extends Selector.linkedDataCaptionElement ? HTMLSpanElement : P['selector'] extends Selector.linkedDataCaption ? HTMLElement : null;
declare global {
interface Window extends TsLib {
VamtigerBrowserMethod: VamtigerBrowserMethod;
Babel: any;
EQCSS: IAnyObject;
requestIdleCallback?: typeof requestIdleCallback;
_: typeof lodash;
IntersectionObserver: typeof IntersectionObserver;
importScripts?: (url: string) => void;
'vamtiger-browser-method': HTMLMetaElement;
}
namespace NodeJS {
interface Global {
VamtigerBrowserMethod: Window['VamtigerBrowserMethod'];
}
}
}
export declare const regex: {
showRootHost: RegExp;
dash: RegExp;
space: RegExp;
nonWord: RegExp;
backTicks: RegExp;
remoteUrl: RegExp;
jsJsonJs: RegExp;
jsonJs: RegExp;
trailingJs: RegExp;
uppercase: RegExp;
leadingAt: RegExp;
email: RegExp;
trailingHtml: RegExp;
textModeElement: RegExp;
};
export declare const selector: {
redundantScripts: string;
vamtigerBrowserMethod: string;
};
export declare const sendMessageFromWorker: WorkerPostMessage | undefined;
export declare const ignore: () => void;