import * as i0 from '@angular/core';
import { Provider, EnvironmentProviders, PipeTransform, OnDestroy, ChangeDetectorRef, InjectionToken, ModuleWithProviders } from '@angular/core';
import * as rxjs from 'rxjs';
import { Subscription } from 'rxjs';
import * as _ngrx_store from '@ngrx/store';
import { ActionReducer, Action, ReducerTypes, ActionCreator } from '@ngrx/store';
import { SetStateActionPayload, Serializer } from '@o3r/core';

/**
 * Function to get dynamic content from body dataset
 */
declare function getDynamicContent(): string;
/**
 * Function to get the cms assets from body dataset
 * This will be used only in a CMS context(not in local or prod) to display correctly the assets in the editor
 */
declare function getCmsAssets(): string;
type DynamicContentFeatureKind = 'base-path' | 'cms-assets-path';
interface DynamicContentFeature<FeatureKind extends DynamicContentFeatureKind> {
    ɵkind: FeatureKind;
    ɵproviders: Provider[];
}
type BasePathFeature = DynamicContentFeature<'base-path'>;
type CmsAssetsPathFeature = DynamicContentFeature<'cms-assets-path'>;
type DynamicContentFeatures = BasePathFeature | CmsAssetsPathFeature;
/**
 * Specify a custom base path
 * @param basePath
 */
declare function withBasePath(basePath: string | (() => string)): BasePathFeature;
/**
 * Specify a custom CMS assets path
 * @param cmsAssetsPath
 */
declare function withCmsAssetsPath(cmsAssetsPath: string | (() => string)): DynamicContentFeature<'cms-assets-path'>;
/**
 * Provide dynamic content default configuration.
 * To customize the location where the application will search for the base path of dynamic content
 * @see {@link withBasePath}
 * @see {@link withCmsAssetsPath}
 * @note The cmsAssets will be used only in the cms editor mode and it will take priority over dynamic content
 * @param features
 * @example
 * ```typescript
 * bootstrapApplication(App,
 *  {
 *    providers: [
 *      provideDynamicContent(
 *        withBasePath('custom/base/path'),
 *        withCmsAssetsPath('custom/cms/assets/path'),
 *      )
 *    ]
 *  }
 * );
 */
declare function provideDynamicContent(...features: DynamicContentFeatures[]): EnvironmentProviders;

/**
 * Service for getting dynamic content path
 */
declare class DynamicContentService {
    private readonly cmsOnlyAssetsPath;
    private readonly store;
    readonly basePath: string;
    private readonly mediaFolder;
    constructor();
    private normalizePath;
    private isAbsoluteUrl;
    private getContentPath;
    private getMediaPath;
    /**
     * Gets the full path of a content relative to the root
     * Content path doesn't consider any override, you will always get the same file
     * @param assetPath asset location in the root folder
     * @example
     * ```typescript
     * getMediaPath('assets/imgs/my-image.png') // will give you the basePath + 'assets/imgs/my-image.png'
     * ```
     */
    getContentPathStream(assetPath?: string): rxjs.Observable<string>;
    /**
     * Gets the stream that provides the full path of a media content
     * A Media content is always stored in the 'assets' media folder, no external content will be accessible through this function
     * If any override is applied to the content, returns the override path instead
     * @param assetPath asset location in the media folder (e.g imgs/my-image.png)
     * @example
     * ```typescript
     * getMediaPathStream('imgs/my-image.png') // will give you the basePath + mediaFolder + 'imgs/my-image.png'
     * ```
     */
    getMediaPathStream(assetPath?: string): rxjs.Observable<string>;
    static ɵfac: i0.ɵɵFactoryDeclaration<DynamicContentService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<DynamicContentService>;
}

declare class O3rDynamicContentPipe implements PipeTransform, OnDestroy {
    protected readonly service: DynamicContentService;
    protected readonly cd: ChangeDetectorRef;
    /** Last query value  */
    protected lastQuery?: string;
    /** Subscription to retrieve media path */
    protected onMediaPathChange?: Subscription;
    /** Path to the media */
    protected mediaPath: string;
    /** @inheritDoc */
    transform(query?: string): string;
    /** @inheritDoc */
    ngOnDestroy(): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<O3rDynamicContentPipe, never>;
    static ɵpipe: i0.ɵɵPipeDeclaration<O3rDynamicContentPipe, "o3rDynamicContent", true>;
}

/**
 * Injection token for the rootpath of dynamic content
 */
declare const DYNAMIC_CONTENT_BASE_PATH_TOKEN: InjectionToken<string>;
/**
 * Injection token for the assets path injected by the cms
 * This token will be injected only in editor mode
 */
declare const CMS_ASSETS_PATH_TOKEN: InjectionToken<string>;

/**
 * Strategies available to read / write data in the RequestParameters service.
 * Rehydrate: if the storage already have data, those will be used by the service, ignoring new data. Otherwise set the storage
 * Merge: storage data will be merged with the ones provided. (provided data has priority)
 * Replace: storage data will be completely replaced by the ones provided
 * ReplaceIfNotEmpty: If no parameters are provided, use the content from storage. Otherwise use the ones provided and update the storage with them.
 */
declare enum StorageStrategy {
    Rehydrate = 0,
    Merge = 1,
    Replace = 2,
    ReplaceIfNotEmpty = 3
}
/**
 * Configuration used by a user to feed the request parameters service.
 */
interface RequestParametersConfig {
    /**
     * Strategy used by the RequestParameters Service. See StorageStrategy for more info
     */
    strategy: StorageStrategy;
    /**
     * Storage used by the RequestParameters service
     */
    storage?: Storage;
    /**
     * Value of the DOM element containing your query parameters (e.g. `document.body.dataset.query`)
     */
    queryParamsValue: string;
    /**
     * Value of the DOM element containing your post parameters (e.g. `document.body.dataset.post`)
     */
    postParamsValue: string;
}
declare const defaultRequestParametersConfig: Readonly<RequestParametersConfig>;

/**
 * Empty configuration factory, used when config is not provided. It needs a separate function for AOT.
 */
declare function defaultConfigFactory(): {};
/**
 * Provide request parameters config
 * We don't provide directly the value and use a factory because otherwise AOT compilation will resolve to undefined whatever is taken from window
 * @param config
 */
declare function provideRequestParameters(config?: () => Partial<RequestParametersConfig>): i0.EnvironmentProviders;

type ParamsList = 'query' | 'post';
type ParamsType = {
    [k in ParamsList]: {
        [key: string]: string;
    };
};
/**
 * Partial configuration for RequestParameters Service
 */
interface PartialRequestParametersConfig extends Partial<RequestParametersConfig> {
}
/**
 * Service used to store the request parameters of your requests so that subsequent calls or refresh the page will preserve
 * them.
 */
declare class RequestParametersService implements ParamsType {
    private _query;
    private _post;
    private readonly config;
    constructor();
    /**
     * Depending on the strategy, set the internal values for the parameters.
     * See StorageStrategy for more info.
     * @param key
     * @param value
     */
    private setParameters;
    /**
     * Get all the query parameters in a map.
     */
    get query(): {
        [key: string]: any;
    };
    /**
     * Get all the post parameters in a map.
     */
    get post(): {
        [key: string]: any;
    };
    /**
     * Get a specific query parameter value, given the key.
     * @param key
     */
    getQueryParameter(key: string): string | undefined;
    /**
     * Get a specific query parameter value as boolean, given the key.
     * @param key
     */
    getQueryParameterAsBoolean(key: string): boolean | undefined;
    /**
     * Get a specific post parameter value, given the key.
     * @param key
     */
    getPostParameter(key: string): string | undefined;
    /**
     * Get a specific post parameter value as boolean, given the key.
     * @param key
     */
    getPostParameterAsBoolean(key: string): boolean | undefined;
    /**
     * Get a specific parameter value, given the key.
     * @param key
     */
    getParameter(key: string): string | undefined;
    /**
     * Get a specific parameter value as boolean, given the key.
     * @param key
     */
    getParameterAsBoolean(key: string): boolean | undefined;
    /**
     * Clear GET parameters from the storage
     * @param paramsToClear the list on key that you want to clear in get parameters
     */
    clearQueryParameters(paramsToClear?: string[]): void;
    /**
     * Clear POST parameters from the storage
     * @param paramsToClear the list on key that you want to clean in post parameters
     */
    clearPostParameters(paramsToClear?: string[]): void;
    /**
     * Get all the parameters in a map.
     * @param priority the parameter to be given priority in case same key is in get and post params.
     */
    getParams(priority?: ParamsList): {
        [x: string]: any;
    };
    /**
     * Filter Parameters(both Query/POST) from the storage
     * @param paramstoFilter the list on key that you want to filter from parameters
     * @param priority the priorty of the parameter type(POST/Query)
     */
    getFilteredParameters(paramstoFilter?: string[], priority?: ParamsList): {
        [x: string]: any;
    };
    static ɵfac: i0.ɵɵFactoryDeclaration<RequestParametersService, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<RequestParametersService>;
}

/**
 * @deprecated Will be removed in v15
 */
declare class StyleLazyLoaderModule {
    static ɵfac: i0.ɵɵFactoryDeclaration<StyleLazyLoaderModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<StyleLazyLoaderModule, never, never, never>;
    static ɵinj: i0.ɵɵInjectorDeclaration<StyleLazyLoaderModule>;
}

/**
 * Interface to describe a style to lazy load from a url.
 */
interface StyleURL {
    /** url to file */
    href: string;
    /** id of the HTML element */
    id?: string;
    /** html integrity attribute to verify fetched resources */
    integrity?: string;
    /** html crossOrigin attribute for CORS support. */
    crossOrigin?: 'anonymous' | 'use-credentials' | '';
}
/**
 * Service to lazy load a CSS file
 */
declare class StyleLazyLoader {
    private readonly dcService;
    private readonly DEFAULT_STYLE_ELEMENT_ID;
    /**
     * Load a new CSS from an absolute URL, if we already HTML element exists with the url, otherwise
     * @param styleUrlConfig object containing CSS File absolute URL to load, integrity and crossOrigin attributes
     * and the styleId id of the dynamic style in the body tag.
     */
    loadStyleFromURL(styleUrlConfig: StyleURL): HTMLLinkElement;
    /**
     * Load a new CSS File
     * @param styleUrlConfig CSS File config containing URL to load, integrity and crossOrigin attributes
     * and the styleId id of the dynamic style in the body tag
     */
    asyncLoadStyleFromDynamicContent(styleUrlConfig: StyleURL): Promise<void>;
    static ɵfac: i0.ɵɵFactoryDeclaration<StyleLazyLoader, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<StyleLazyLoader>;
}

/**
 * AssetPathOverride store state
 */
interface AssetPathOverrideState {
    /** Mapping of asset path (key) and its override (value)*/
    assetPathOverrides: Record<string, string>;
}
/**
 * Name of the AssetPathOverride Store
 */
declare const ASSET_PATH_OVERRIDE_STORE_NAME = "assetPathOverride";
/**
 * AssetPathOverride Store Interface
 */
interface AssetPathOverrideStore {
    /** AssetPathOverride state */
    [ASSET_PATH_OVERRIDE_STORE_NAME]: AssetPathOverrideState;
}

/**
 * Clear all overrides and fill the store with the payload
 */
declare const setAssetPathOverride: _ngrx_store.ActionCreator<"[AssetPathOverride] set entities", (props: SetStateActionPayload<AssetPathOverrideState>) => SetStateActionPayload<AssetPathOverrideState> & _ngrx_store.Action<"[AssetPathOverride] set entities">>;

/** Token of the AssetPathOverride reducer */
declare const ASSET_PATH_OVERRIDE_REDUCER_TOKEN: InjectionToken<ActionReducer<AssetPathOverrideState, Action<string>>>;
/** Provide default reducer for AssetPathOverride store */
declare function getDefaultAssetPathOverrideReducer(): ActionReducer<AssetPathOverrideState, Action<string>>;
declare class AssetPathOverrideStoreModule {
    static forRoot<T extends AssetPathOverrideState>(reducerFactory: () => ActionReducer<T, Action>): ModuleWithProviders<AssetPathOverrideStoreModule>;
    static ɵfac: i0.ɵɵFactoryDeclaration<AssetPathOverrideStoreModule, never>;
    static ɵmod: i0.ɵɵNgModuleDeclaration<AssetPathOverrideStoreModule, never, [typeof _ngrx_store.StoreFeatureModule], never>;
    static ɵinj: i0.ɵɵInjectorDeclaration<AssetPathOverrideStoreModule>;
}

/**
 * AssetPathOverride Store initial value
 */
declare const assetPathOverrideInitialState: AssetPathOverrideState;
/**
 *  List of basic actions for AssetPathOverride Store
 */
declare const assetPathOverrideReducerFeatures: ReducerTypes<AssetPathOverrideState, ActionCreator[]>[];
/**
 * AssetPathOverride Store reducer
 */
declare const assetPathOverrideReducer: _ngrx_store.ActionReducer<AssetPathOverrideState, _ngrx_store.Action<string>>;

/** Select AssetPathOverride State */
declare const selectAssetPathOverrideState: _ngrx_store.MemoizedSelector<object, AssetPathOverrideState, _ngrx_store.DefaultProjectorFn<AssetPathOverrideState>>;
/** Select all assetPath override map */
declare const selectAssetPathOverride: _ngrx_store.MemoizedSelector<object, Record<string, string>, (s1: AssetPathOverrideState) => Record<string, string>>;

/**
 * Deserializer
 * @param rawObject
 */
declare const assetPathOverrideStorageDeserializer: (rawObject: any) => any;
declare const assetPathOverrideStorageSync: Serializer<AssetPathOverrideState>;

export { ASSET_PATH_OVERRIDE_REDUCER_TOKEN, ASSET_PATH_OVERRIDE_STORE_NAME, AssetPathOverrideStoreModule, CMS_ASSETS_PATH_TOKEN, DYNAMIC_CONTENT_BASE_PATH_TOKEN, DynamicContentService, O3rDynamicContentPipe, RequestParametersService, StorageStrategy, StyleLazyLoader, StyleLazyLoaderModule, assetPathOverrideInitialState, assetPathOverrideReducer, assetPathOverrideReducerFeatures, assetPathOverrideStorageDeserializer, assetPathOverrideStorageSync, defaultConfigFactory, defaultRequestParametersConfig, getCmsAssets, getDefaultAssetPathOverrideReducer, getDynamicContent, provideDynamicContent, provideRequestParameters, selectAssetPathOverride, selectAssetPathOverrideState, setAssetPathOverride, withBasePath, withCmsAssetsPath };
export type { AssetPathOverrideState, AssetPathOverrideStore, ParamsList, ParamsType, PartialRequestParametersConfig, RequestParametersConfig, StyleURL };
//# sourceMappingURL=o3r-dynamic-content.d.ts.map
