[Angular] BrowserDomAdapterの読み込み方

JS側でCookie制御をする必要がでてきたので
Angularに則った書き方をしてみようと思ったが
意外と骨が折れたので、記録しておく。

# Step.1 さがす

cookie というキーワードでソースをgrepしてみる。

```shell-session
$ find node_modules/\@angular/ -name '*.d.ts' | xargs -i grep -i cookie {}
    supportsCookies(): boolean;
    getCookie(name: string): string | null;
    setCookie(name: string, value: string): void;
export declare function parseCookieValue(cookieStr: string, name: string): string | null;
    abstract supportsCookies(): boolean;
    abstract getCookie(name: string): string | null;
    abstract setCookie(name: string, value: string): any;
    supportsCookies(): boolean;
    getCookie(name: string): string;
    setCookie(name: string, value: string): void;
export { _createDefaultCookieXSRFStrategy as ɵb, httpFactory as ɵc, jsonpFactory as ɵd } from './src/http_module';
 * using a cookie. See https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)
 * Applications can configure custom cookie and header names by binding an instance of this class
 * with different `cookieName` and `headerName` values. See the main HTTP documentation for more
export declare class CookieXSRFStrategy implements XSRFStrategy {
    private _cookieName;
    constructor(_cookieName?: string, _headerName?: string);
import { CookieXSRFStrategy, XHRBackend } from './backends/xhr_backend';
export declare function _createDefaultCookieXSRFStrategy(): CookieXSRFStrategy;
export { CookieXSRFStrategy, XHRBackend, XHRConnection } from './backends/xhr_backend';
```

get/setCookie がみつかった。

次にファイルを特定する

```shell-session
$ find node_modules/\@angular/ -name '*.d.ts' | xargs -i grep -i setCookie {} -l
node_modules/@angular/platform-browser/src/browser/browser_adapter.d.ts
node_modules/@angular/platform-browser/src/dom/dom_adapter.d.ts
node_modules/@angular/platform-server/src/parse5_adapter.d.ts

```
たぶん``browser_adapter.d.ts``だろうと見当する。

```ts:browser_adapter.d.ts
import { GenericBrowserDomAdapter } from './generic_browser_adapter';
/**
 * A `DomAdapter` powered by full browser DOM APIs.
 *
 * @security Tread carefully! Interacting with the DOM directly is dangerous and
 * can introduce XSS risks.
 */
export declare class BrowserDomAdapter extends GenericBrowserDomAdapter {
    parse(templateHtml: string): void;
    static makeCurrent(): void;
    hasProperty(element: Node, name: string): boolean;
    setProperty(el: Node, name: string, value: any): void;
    getProperty(el: Node, name: string): any;
    invoke(el: Node, methodName: string, args: any[]): any;
    logError(error: string): void;
    log(error: string): void;
    logGroup(error: string): void;
    logGroupEnd(): void;
    readonly attrToPropMap: any;
    contains(nodeA: any, nodeB: any): boolean;
    querySelector(el: Element, selector: string): any;
    querySelectorAll(el: any, selector: string): any[];
    on(el: Node, evt: any, listener: any): void;
    onAndCancel(el: Node, evt: any, listener: any): Function;
    dispatchEvent(el: Node, evt: any): void;
    createMouseEvent(eventType: string): MouseEvent;
    createEvent(eventType: any): Event;
    preventDefault(evt: Event): void;
    isPrevented(evt: Event): boolean;
    getInnerHTML(el: HTMLElement): string;
    getTemplateContent(el: Node): Node | null;
    getOuterHTML(el: HTMLElement): string;
    nodeName(node: Node): string;
    nodeValue(node: Node): string | null;
    type(node: HTMLInputElement): string;
    content(node: Node): Node;
    firstChild(el: Node): Node | null;
    nextSibling(el: Node): Node | null;
    parentElement(el: Node): Node | null;
    childNodes(el: any): Node[];
    childNodesAsList(el: Node): any[];
    clearNodes(el: Node): void;
    appendChild(el: Node, node: Node): void;
    removeChild(el: Node, node: Node): void;
    replaceChild(el: Node, newChild: Node, oldChild: Node): void;
    remove(node: Node): Node;
    insertBefore(parent: Node, ref: Node, node: Node): void;
    insertAllBefore(parent: Node, ref: Node, nodes: Node[]): void;
    insertAfter(parent: Node, ref: Node, node: any): void;
    setInnerHTML(el: Element, value: string): void;
    getText(el: Node): string | null;
    setText(el: Node, value: string): void;
    getValue(el: any): string;
    setValue(el: any, value: string): void;
    getChecked(el: any): boolean;
    setChecked(el: any, value: boolean): void;
    createComment(text: string): Comment;
    createTemplate(html: any): HTMLElement;
    createElement(tagName: string, doc?: Document): HTMLElement;
    createElementNS(ns: string, tagName: string, doc?: Document): Element;
    createTextNode(text: string, doc?: Document): Text;
    createScriptTag(attrName: string, attrValue: string, doc?: Document): HTMLScriptElement;
    createStyleElement(css: string, doc?: Document): HTMLStyleElement;
    createShadowRoot(el: HTMLElement): DocumentFragment;
    getShadowRoot(el: HTMLElement): DocumentFragment;
    getHost(el: HTMLElement): HTMLElement;
    clone(node: Node): Node;
    getElementsByClassName(element: any, name: string): HTMLElement[];
    getElementsByTagName(element: any, name: string): HTMLElement[];
    classList(element: any): any[];
    addClass(element: any, className: string): void;
    removeClass(element: any, className: string): void;
    hasClass(element: any, className: string): boolean;
    setStyle(element: any, styleName: string, styleValue: string): void;
    removeStyle(element: any, stylename: string): void;
    getStyle(element: any, stylename: string): string;
    hasStyle(element: any, styleName: string, styleValue?: string | null): boolean;
    tagName(element: any): string;
    attributeMap(element: any): Map<string, string>;
    hasAttribute(element: Element, attribute: string): boolean;
    hasAttributeNS(element: Element, ns: string, attribute: string): boolean;
    getAttribute(element: Element, attribute: string): string | null;
    getAttributeNS(element: Element, ns: string, name: string): string;
    setAttribute(element: Element, name: string, value: string): void;
    setAttributeNS(element: Element, ns: string, name: string, value: string): void;
    removeAttribute(element: Element, attribute: string): void;
    removeAttributeNS(element: Element, ns: string, name: string): void;
    templateAwareRoot(el: Node): any;
    createHtmlDocument(): HTMLDocument;
    getBoundingClientRect(el: Element): any;
    getTitle(doc: Document): string;
    setTitle(doc: Document, newTitle: string): void;
    elementMatches(n: any, selector: string): boolean;
    isTemplateElement(el: Node): boolean;
    isTextNode(node: Node): boolean;
    isCommentNode(node: Node): boolean;
    isElementNode(node: Node): boolean;
    hasShadowRoot(node: any): boolean;
    isShadowRoot(node: any): boolean;
    importIntoDoc(node: Node): any;
    adoptNode(node: Node): any;
    getHref(el: Element): string;
    getEventKey(event: any): string;
    getGlobalEventTarget(doc: Document, target: string): EventTarget | null;
    getHistory(): History;
    getLocation(): Location;
    getBaseHref(doc: Document): string | null;
    resetBaseElement(): void;
    getUserAgent(): string;
    setData(element: Element, name: string, value: string): void;
    getData(element: Element, name: string): string | null;
    getComputedStyle(element: any): any;
    supportsWebAnimation(): boolean;
    performanceNow(): number;
    supportsCookies(): boolean;
    getCookie(name: string): string | null;
    setCookie(name: string, value: string): void;
}
export declare function parseCookieValue(cookieStr: string, name: string): string | null;
```

ビンゴ。

おもむろに読み込む。

```ts:sample.service.ts
import {Injectable} from "@angular/core";
import {BrowserDomAdapter} from "@angular/platform-browser";

@Injectable()
export class SampleService
{
  private browserDomAdapter: BrowserDomAdapter = new BrowserDomAdapter();

  public constructor()
  {
    this.browserDomAdapter.setCookie("setCookie", "true");
  }
}
```

```shell-session
error TS2305: Module '"node_modules/@angular/platform-browser/platform-browser"' has no exported member 'BrowserDomAdapter'.
```

んん？


# Step.2 しらべる

[公式サイト](https://angular.io/)で``BrowserDomAdapter ``と調べてみるが**No results found.**

しかたがないので、``d.ts``をたどる

```
$ find node_modules/\@angular/ -name '*.d.ts' | xargs -i grep -i BrowserDomAdapter {}
export { GenericBrowserDomAdapter as ɵh } from './src/browser/generic_browser_adapter';
export declare abstract class GenericBrowserDomAdapter extends DomAdapter {
import { GenericBrowserDomAdapter } from './generic_browser_adapter';
export declare class BrowserDomAdapter extends GenericBrowserDomAdapter {
export { BrowserDomAdapter as ɵBrowserDomAdapter } from './browser/browser_adapter';
```

**BrowserDomAdapter as ɵBrowserDomAdapter**を発見

``private_export.d.ts``に記述してあったけれども、
この接頭文字**ɵ**は、なにか共通ルールがあるのかな～。


# Setp.3 よみこむ

```ts:sample.service.ts
import {Injectable} from "@angular/core";
import {ɵBrowserDomAdapter} from "@angular/platform-browser";

@Injectable()
export class SampleService
{
  private browserDomAdapter: ɵBrowserDomAdapter = new ɵBrowserDomAdapter();

  public constructor()
  {
    this.browserDomAdapter.setCookie("setCookie", "true");
  }
}
```

めでたしめでたし。