{"version":3,"file":"daffodil-core-external-script.mjs","sources":["../../../libs/core/external-script/src/external-script.service.ts","../../../libs/core/external-script/src/daffodil-core-external-script.ts"],"sourcesContent":["\nimport {\n  Inject,\n  Injectable,\n  DOCUMENT,\n} from '@angular/core';\nimport {\n  BehaviorSubject,\n  Observable,\n} from 'rxjs';\nimport { filter } from 'rxjs/operators';\n\nimport { DaffExternalScriptServiceInterface } from './interface';\nimport { DaffExternalScript } from './script';\n\nexport interface LoadedExternalScript extends DaffExternalScript {\n  ready: boolean | undefined;\n  subject: Observable<boolean>;\n  el: HTMLElement | undefined;\n}\n\n/**\n * A service for loading external scripts into the document.\n *\n * ### Usage example\n *\n * @example Loading an external script into the document\n *\n * ```ts\n * import { DOCUMENT } from '@angular/common';\n * import { inject } from '@angular/core';\n *\n * import { DaffExternalScriptService } from '@daffodil/core/external-script';\n *\n * const externalScriptService = new DaffExternalScriptService(inject(DOCUMENT));\n *\n * externalScriptService.load('exampleScript', {\n *   src: 'https://example.com/script.js',\n *   async: true,\n *   defer: false,\n *   'data-custom-attribute': 'value',\n * }).subscribe({\n *   next: (result) => {\n *     console.log('Script loaded successfully:', result);\n *   },\n *   error: (error) => {\n *     console.error('Error loading script:', error);\n *   },\n * });\n * ```\n */\n@Injectable({\n  providedIn: 'root',\n})\nexport class DaffExternalScriptService implements DaffExternalScriptServiceInterface {\n  readonly scriptMap: Map<string, LoadedExternalScript> = new Map();\n  private doc: Document;\n\n  constructor(\n    @Inject(DOCUMENT) doc,\n  ) {\n    this.doc = doc;\n  }\n\n  /**\n   * @inheritdoc\n   */\n  load(name: string, script: DaffExternalScript): Observable<boolean> {\n    // Don't load the same script twice.\n    if(this.scriptMap.has(name)){\n      return this.scriptMap.get(name).subject;\n    }\n\n    const scriptEl = this.doc.createElement('script');\n\n    scriptEl.setAttribute('type', 'text/javascript');\n\n    scriptEl.setAttribute('src', script.src);\n\n    scriptEl.setAttribute('charset', 'utf-8');\n\n    // Set custom attributes prefixed with 'data-'.\n    Object.keys(script).filter(key => key.startsWith('data-')).map((key) => {\n      // setAttribute would lowercase the value of \"key\", which isn't always correct.\n      // setAttributeNS maintains key casing.\n      scriptEl.setAttributeNS(null, key,script[key]);\n    });\n\n    if(script.async) {\n      scriptEl.async = true;\n    }\n\n    if(script.defer) {\n      scriptEl.defer = true;\n    }\n\n    const readySubject = new BehaviorSubject<boolean | undefined>(undefined);\n\n    scriptEl.onload = () => {\n      this.scriptMap.get(name).ready = true;\n      readySubject.next(true);\n    };\n\n    scriptEl.onerror = () => {\n      this.scriptMap.get(name).ready = false;\n      readySubject.error(new Error(`Failed to load ${ script.src }`));\n    };\n\n    this.doc.body.appendChild(scriptEl);\n    this.scriptMap.set(name, { ...script, ready: undefined, subject: readySubject, el: scriptEl });\n\n    return readySubject.pipe(\n      filter((s) => s !== undefined),\n    );\n  }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}