UNPKG

be-enhanced

Version:

be-enhanced provides a base class that enables casting spells, or enhancing server-rendered DOM elements based on cross-cutting custom attributes

176 lines (142 loc) 4.29 kB
import { JSONObject } from '../trans-render/lib/types'; import { Specifier } from '../trans-render/dss/types'; import { URLBuilder } from '../../URLBuilder'; //import {SimpleWCInfo} from 'may-it-be/SimpleWCInfo'; declare class WeakRef<TProps = any>{} /** * fetch-for props */ export interface EndUserProps{ accept?: string, /** * Url to invoke * @readonly true */ src?: string, ':src': string, /** * Specifier for list of form associated or contentEditable peer elements that * should partake in forming the URL. */ for?: string, /** * Indicates whether to treat the response as HTML or JSON or Text */ as?: 'html' | 'json' | 'text', /** * The http verb to be used for the request */ method?: | 'GET' | 'HEAD' | 'POST' | 'PUT' | 'DELETE' | 'OPTIONS' | 'TRACE' | 'PATCH', /** * Either the JSON stringified or the parsed JSON object * If parsed, the web component will stringify it. */ body?: any, /** * Request credentials */ credentials?: RequestCredentials, /** * Directed Scoped Specifier to the * DOM element where the retrieved content should be applied. */ target?: string, /** * If as=html, specify whether to (stream) the contents into an attached shadow DOM or not. */ shadow?: ShadowRootMode, /** * Do not cache results even if the url has been invoked before. */ noCache?: boolean, /** * Stream the contents into the target element */ stream?: boolean, /** * Directed Scoped Specifier to a * (button) element, to delay submitting the fetch request until that button is clicked. */ when?: string, /** * Directed Scoped Specifier to a form element * that we should use to form the url and body from. */ form?: string, } export interface OverridableGetters{ //request$: RequestInit, //accept$?: string, value?: any, //isAttrParsed?: boolean, targetSelf?: boolean targetSpecifier?: Specifier whenCount?: number, nextWhenCount?: number, } export type EventName = string; export interface AllProps extends EndUserProps, OverridableGetters{ readonly resolvedTarget?: Element | null, /** * @readonly * Weak references to input elements */ readonly forRefs: Map<string, [WeakRef<HTMLInputElement>, EventName]>, readonly formData?: FormData, readonly formRef?: WeakRef<HTMLFormElement>, readonly formSpecifier?: Specifier, readonly urlBuilder?: URLBuilder, } export type PAP = Partial<AllProps>; export type ProPP = Promise<PAP>; /** * methods for fetch-for */ export interface Methods extends Actions{ validateResp(resp: Response): boolean, validateOn(): boolean, setTargetProp(target: Element | null, data: any, shadow?: ShadowRootMode): void, } export interface Actions{ do(self: this): Promise<void>; bindSrc(self) parseFor(self: this): ProPP; parseTarget(self: this): ProPP; // listenForInput(self: this): ProPP; // doInitialLoad(self: this): ProPP; initializeWhen(self: this): Promise<PP | undefined>; // onForm(self: this): ProPP; // onFormSpecifier(self: this): ProPP; // onFormRef(self: this): Promise<void>, } // https://github.com/webcomponents-cg/community-protocols/issues/12#issuecomment-872415080 export type loadEventName = 'load'; export type inputEventName = 'input'; export type selectionChangeEventName = 'select'; export interface EventForFetch { href?: string; trigger?: Element, forData: ForData, formData: FormData, body?: string | JSONObject } export type ForData = {[key: string]: HTMLInputElement} // /** // * fetch-for web component // */ // export abstract class ForFetchInfo implements SimpleWCInfo { // src: './for-fetch.js'; // tagName: 'for-fetch'; // props: EndUserProps; // cssParts: { // } // } // export type Package = [ForFetchInfo];