{"version":3,"sources":["jsdelivr-header.js","/npm/@googleworkspace/drive-picker-element@0.7.3/src/utils.ts","/npm/@googleworkspace/drive-picker-element@0.7.3/src/drive-picker/drive-picker-docs-view-element.ts","/npm/@googleworkspace/drive-picker-element@0.7.3/src/drive-picker/drive-picker-element.ts","/npm/@googleworkspace/drive-picker-element@0.7.3/src/index.ts"],"names":[],"mappings":"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","file":"/npm/@googleworkspace/drive-picker-element@0.7.3/dist/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/@googleworkspace/drive-picker-element@0.7.3/dist/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","/**\n * Copyright 2024 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst GAPI_URL = \"https://apis.google.com/js/api.js\";\nexport const GSI_URL = \"https://accounts.google.com/gsi/client\";\n\nexport async function loadApi(api = \"client:picker\"): Promise<typeof google> {\n\tif (!window.gapi) {\n\t\tawait injectScript(GAPI_URL);\n\t}\n\n\tawait new Promise<void>((r) => {\n\t\twindow.gapi.load(api, r);\n\t});\n\n\treturn window.google;\n}\n\nexport class ClientConfigError extends Error {\n\tconstructor(\n\t\tpublic readonly configError: google.accounts.oauth2.ClientConfigError,\n\t) {\n\t\tsuper(configError.message);\n\t}\n}\n\nexport async function requestAccessToken(\n\ttokenClientConfig: Omit<\n\t\tgoogle.accounts.oauth2.TokenClientConfig,\n\t\t\"callback\" | \"error_callback\"\n\t>,\n): Promise<google.accounts.oauth2.TokenResponse> {\n\tif (!window.google?.accounts?.oauth2) {\n\t\tawait injectScript(GSI_URL);\n\t}\n\treturn new Promise((resolve, reject) => {\n\t\tconst client = window.google.accounts.oauth2.initTokenClient({\n\t\t\t...tokenClientConfig,\n\t\t\tcallback: resolve,\n\t\t\terror_callback: reject,\n\t\t});\n\n\t\tclient.requestAccessToken();\n\t});\n}\n\n/**\n * Injects a script into the document head.\n *\n * This function always creates and appends a new script element, even if a script with the same src\n * already exists. This is done to avoid race conditions where an existing script might have already\n * loaded (or failed) before we could attach event listeners, causing the promise to hang indefinitely.\n *\n * To ensure compatibility with Content Security Policy (CSP) and other requirements, this function\n * copies all attributes (including `nonce`, `integrity`, `crossorigin`, etc.) from any existing\n * script tag with the same src to the new script tag.\n *\n * Note: The script at the provided `src` must be idempotent, as it may be executed multiple times\n * if it is already present in the document.\n */\nexport async function injectScript(src: string): Promise<void> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst newScript = document.createElement(\"script\");\n\t\tnewScript.src = src;\n\t\tnewScript.onload = () => resolve();\n\t\tnewScript.onerror = (err) => reject(err);\n\n\t\t// Check for an existing script to copy attributes from.\n\t\t// This is important for CSP compliance (nonce, integrity) and other attributes.\n\t\tconst existingScript = document.querySelector<HTMLScriptElement>(\n\t\t\t`script[src=\"${src}\"]`,\n\t\t);\n\t\tif (existingScript) {\n\t\t\tconsole.log(\n\t\t\t\t`drive-picker: appending a copy of an existing script ${src}`,\n\t\t\t);\n\t\t\t// Copy all attributes except those that would conflict or are handled manually\n\t\t\tArray.from(existingScript.attributes).forEach((attr) => {\n\t\t\t\tif ([\"id\", \"src\", \"onload\", \"onerror\"].includes(attr.name)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tnewScript.setAttribute(attr.name, attr.value);\n\t\t\t});\n\n\t\t\t// Nonce must be copied as a property because it's not always exposed in attributes.\n\t\t\t// The nonce attribute is hidden from getAttribute() and attributes for security reasons.\n\t\t\t// It is safe to reuse the same nonce for multiple scripts on the same page (same HTTP response).\n\t\t\tif (existingScript.nonce) {\n\t\t\t\tnewScript.nonce = existingScript.nonce;\n\t\t\t}\n\t\t}\n\n\t\tdocument.head.appendChild(newScript);\n\t});\n}\n\nexport function getNumberAttribute(\n\telement: Element,\n\tname: string,\n): number | null {\n\tconst value = element.getAttribute(name);\n\treturn value ? Number(value) : null;\n}\n\nexport enum BoolAttrWithDefault {\n\tFALSE = 0,\n\tTRUE = 1,\n\tDEFAULT = 2,\n}\n\nexport function getBoolAttr(element: Element, name: string): boolean {\n\treturn element.hasAttribute(name);\n}\n\nexport function getBoolAttrWithDefault(\n\telement: Element,\n\tname: string,\n): BoolAttrWithDefault {\n\tconst attributeValue = element.getAttribute(name)?.toUpperCase();\n\n\tif (!attributeValue) {\n\t\treturn BoolAttrWithDefault.DEFAULT;\n\t}\n\n\tconst value =\n\t\tBoolAttrWithDefault[attributeValue as keyof typeof BoolAttrWithDefault];\n\n\tif (value !== undefined) {\n\t\treturn value;\n\t}\n\n\tthrow new Error(\n\t\t`Invalid value, \"${attributeValue}\", for attribute ${name}. Must be one of ${Object.keys(BoolAttrWithDefault).filter(Number.isNaN).join(\", \")}`,\n\t);\n}\n\nexport function setBoolAttrWithDefault<T>(\n\tname: string,\n\telement: Element,\n\tsetter: (value: boolean) => T,\n\tinstance: T,\n): T {\n\tconst attr = getBoolAttrWithDefault(element, name);\n\n\tif (attr === BoolAttrWithDefault.DEFAULT) {\n\t\treturn instance;\n\t}\n\n\treturn setter.call(instance, attr === BoolAttrWithDefault.TRUE);\n}\n","/**\n * Copyright 2024 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { setBoolAttrWithDefault } from \"../utils\";\n\ntype ViewId = keyof typeof google.picker.ViewId;\n\n/**\n * The `drive-picker-docs-view` element is used to define a [`google.picker.DocsView`](https://developers.google.com/drive/picker/reference/picker.docsview).\n *\n * @element drive-picker-docs-view\n * @attr {\"default\"|\"true\"|\"false\"} enable-drives - Whether to allow the user to select files from shared drives. See [`DocsView.enableDrives`](https://developers.google.com/drive/picker/reference/picker.docsview.setenabledrives).\n * @attr {\"default\"|\"true\"|\"false\"} include-folders - Whether to include folders in the view. See [`DocsView.includeFolders`](https://developers.google.com/drive/picker/reference/picker.docsview.setincludefolders).\n * @attr {string} mime-types - A comma-separated list of MIME types to filter the view. See [`View.setMimeTypes`](https://developers.google.com/drive/picker/reference/picker.view.setmimetypes).\n * @attr {string} file-ids - A comma-separated list of file IDs to filter the view. See [`View.setFileIds`](https://developers.google.com/workspace/drive/picker/reference/picker.docsview.setfileids).\n * @attr {string} mode - The mode of the view. See [`DocsViewMode`](https://developers.google.com/drive/picker/reference/picker.docsviewmode).\n * @attr {\"default\"|\"true\"|\"false\"} owned-by-me - Whether to show files owned by the user. See [`DocsView.ownedByMe`](https://developers.google.com/drive/picker/reference/picker.docsview.setownedbyme).\n * @attr {string} parent - The ID of the folder to view. See [`DocsView.setParent`](https://developers.google.com/drive/picker/reference/picker.docsview.setparent).\n * @attr {string} query - The query string to filter the view. See [`View.setQuery`](https://developers.google.com/drive/picker/reference/picker.view.setquery).\n * @attr {\"default\"|\"true\"|\"false\"} select-folder-enabled - Whether to allow the user to select folders. See [`DocsView.selectFolderEnabled`](https://developers.google.com/drive/picker/reference/picker.docsview.setselectfolderenabled).\n * @attr {\"default\"|\"true\"|\"false\"} starred - Whether to show starred files. See [`DocsView.starred`](https://developers.google.com/drive/picker/reference/picker.docsview.setstarred).\n * @attr {string} view-id - The `keyof typeof google.picker.ViewId`. For example, `\"DOCS\"`, which is equivalent to `google.picker.ViewId.DOCS`. See [`ViewId`](https://developers.google.com/drive/picker/reference/picker.viewid).\n *\n * @example\n *\n * ```html\n * <drive-picker-docs-view ownedByMe=\"\"></drive-picker-docs-view>\n * ```\n *\n * @see https://developers.google.com/drive/picker/reference/picker.docsview\n *\n */\nexport class DrivePickerDocsViewElement extends HTMLElement {\n\tstatic get observedAttributes() {\n\t\treturn [\n\t\t\t\"enable-drives\",\n\t\t\t\"file-ids\",\n\t\t\t\"include-folders\",\n\t\t\t\"mime-types\",\n\t\t\t\"mode\",\n\t\t\t\"owned-by-me\",\n\t\t\t\"parent\",\n\t\t\t\"query\",\n\t\t\t\"select-folder-enabled\",\n\t\t\t\"starred\",\n\t\t\t\"view-id\",\n\t\t];\n\t}\n\n\t/**\n\t * Gets the Google Drive Picker view based on the current attribute values.\n\t * @returns {google.picker.DocsView} The Google Drive picker view.\n\t */\n\tpublic get view(): google.picker.DocsView {\n\t\tconst view = new window.google.picker.DocsView(this.viewId);\n\n\t\tsetBoolAttrWithDefault(\"enable-drives\", this, view.setEnableDrives, view);\n\t\tsetBoolAttrWithDefault(\n\t\t\t\"include-folders\",\n\t\t\tthis,\n\t\t\tview.setIncludeFolders,\n\t\t\tview,\n\t\t);\n\t\tsetBoolAttrWithDefault(\"owned-by-me\", this, view.setOwnedByMe, view);\n\t\tsetBoolAttrWithDefault(\n\t\t\t\"select-folder-enabled\",\n\t\t\tthis,\n\t\t\tview.setSelectFolderEnabled,\n\t\t\tview,\n\t\t);\n\t\tsetBoolAttrWithDefault(\"starred\", this, view.setStarred, view);\n\n\t\tconst mimetypes = this.getAttribute(\"mime-types\");\n\t\tif (mimetypes !== null) view.setMimeTypes(mimetypes);\n\n\t\tconst fileIds = this.getAttribute(\"file-ids\");\n\t\tif (fileIds !== null) view.setFileIds(fileIds);\n\n\t\tconst mode = this.getAttribute(\"mode\");\n\t\tif (mode)\n\t\t\tview.setMode(\n\t\t\t\tgoogle.picker.DocsViewMode[\n\t\t\t\t\tmode as keyof typeof google.picker.DocsViewMode\n\t\t\t\t],\n\t\t\t);\n\n\t\tconst parent = this.getAttribute(\"parent\");\n\t\tif (parent !== null) view.setParent(parent);\n\n\t\tconst query = this.getAttribute(\"query\");\n\t\tif (query !== null) view.setQuery(query);\n\n\t\treturn view;\n\t}\n\n\tprivate get viewId(): google.picker.ViewId | undefined {\n\t\tconst viewId = this.getAttribute(\"view-id\");\n\t\treturn viewId ? window.google.picker.ViewId[viewId as ViewId] : undefined;\n\t}\n}\n","/**\n * Copyright 2024 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n\tgetBoolAttr,\n\tgetNumberAttribute,\n\tloadApi,\n\trequestAccessToken,\n\tsetBoolAttrWithDefault,\n} from \"../utils\";\n\ntype View = google.picker.DocsView;\n\ninterface DrivePickerDocsViewElement extends HTMLElement {\n\tview: google.picker.DocsView;\n}\n\nexport type OAuthErrorEvent = CustomEvent<\n\t| google.accounts.oauth2.ClientConfigError\n\t| google.accounts.oauth2.TokenResponse\n>;\nexport type OAuthResponseEvent =\n\tCustomEvent<google.accounts.oauth2.TokenResponse>;\nexport type PickerCanceledEvent = CustomEvent<google.picker.ResponseObject>;\nexport type PickerPickedEvent = CustomEvent<google.picker.ResponseObject>;\nexport type PickerErrorEvent = CustomEvent<unknown>;\n\ndeclare global {\n\tinterface GlobalEventHandlersEventMap {\n\t\t/** @deprecated - Use \"picker-oauth-error\" */\n\t\t\"picker:authenticated\": CustomEvent<{ token: string }>;\n\t\t/** @deprecated - Use \"picker-oauth-error\" */\n\t\t\"picker:oauth:error\": OAuthErrorEvent;\n\t\t\"picker-oauth-error\": OAuthErrorEvent;\n\t\t/** @deprecated - Use \"picker-oauth-response\" */\n\t\t\"picker:oauth:response\": OAuthResponseEvent;\n\t\t\"picker-oauth-response\": OAuthResponseEvent;\n\t\t/** @deprecated - Use \"picker-canceled\" */\n\t\t\"picker:canceled\": PickerCanceledEvent;\n\t\t\"picker-canceled\": PickerCanceledEvent;\n\t\t/** @deprecated - Use \"picker-picked\" */\n\t\t\"picker:picked\": PickerPickedEvent;\n\t\t\"picker-picked\": PickerPickedEvent;\n\t\t/** @deprecated - Use \"picker-error\" */\n\t\t\"picker:error\": PickerErrorEvent;\n\t\t\"picker-error\": PickerErrorEvent;\n\t}\n}\n\n/**\n * The `drive-picker` web component provides a convenient way to declaratively\n * build\n * [`google.picker.Picker`](https://developers.google.com/drive/picker/reference/picker)\n * by using the component attributes mapped to the corresponding methods of\n * [`google.picker.PickerBuilder`](https://developers.google.com/drive/picker/reference/picker.pickerbuilder).\n *\n * @element drive-picker\n *\n * @fires {PickerCanceledEvent} picker-canceled - Triggered when the user cancels the picker dialog. See [`ResponseObject`](https://developers.google.com/drive/picker/reference/picker.responseobject).\n * @fires {PickerPickedEvent} picker-picked - Triggered when the user picks one or more items. See [`ResponseObject`](https://developers.google.com/drive/picker/reference/picker.responseobject).\n * @fires {PickerErrorEvent} picker-error - Triggered when an error occurs. See [`ResponseObject`](https://developers.google.com/drive/picker/reference/picker.responseobject).\n * @fires {OAuthErrorEvent} picker-oauth-error - Triggered when an error occurs in the OAuth flow. See the [error guide](https://developers.google.com/identity/oauth2/web/guides/error). Note that the `TokenResponse` object can have error fields.\n * @fires {OAuthResponseEvent} picker-oauth-response - Triggered when an OAuth flow completes. See the [token model guide](https://developers.google.com/identity/oauth2/web/guides/use-token-model).\n *\n * @slot - The default slot contains View elements to display in the picker.\n * Each View element should implement a property `view` of type\n * `google.picker.View`.\n * @attr {string} app-id - The Google Drive app ID. See [`PickerBuilder.setAppId`](https://developers.google.com/drive/picker/reference/picker.pickerbuilder.setappid).\n * @attr {string} client-id - The OAuth 2.0 client ID. See [Using OAuth 2.0 to Access Google APIs](https://developers.google.com/identity/protocols/oauth2).\n * @attr {string} developer-key - The API key for accessing Google Picker API. See [`PickerBuilder.setDeveloperKey`](https://developers.google.com/drive/picker/reference/picker.pickerbuilder.setdeveloperkey).\n * @attr {number} [debounce-delay=0] - The debounce delay in milliseconds before building the picker after an attribute change.\n * @attr {\"default\"|\"true\"|\"false\"} hide-title-bar - Hides the title bar of the\n * picker if set to true. See [`PickerBuilder.hideTitleBar`](https://developers.google.com/drive/picker/reference/picker.pickerbuilder.hidetitlebar).\n * @attr {string} locale - The locale to use for the picker. See [`PickerBuilder.setLocale`](https://developers.google.com/drive/picker/reference/picker.pickerbuilder.setlocale).\n * @attr {number} max-items - The maximum number of items that can be selected. See [`PickerBuilder.setMaxItems`](https://developers.google.com/drive/picker/reference/picker.pickerbuilder.setmaxitems).\n * @attr {boolean} mine-only - If set to true, only shows files owned by the\n * user. See [`PickerBuilder.enableFeature`](https://developers.google.com/drive/picker/reference/picker.pickerbuilder.enablefeature).\n * @attr {boolean} multiselect - Enables multiple file selection if set to true. See [`PickerBuilder.enableFeature`](https://developers.google.com/drive/picker/reference/picker.pickerbuilder.enablefeature).\n * @attr {boolean} nav-hidden - Hides the navigation pane if set to true. See [`PickerBuilder.enableFeature`](https://developers.google.com/drive/picker/reference/picker.pickerbuilder.enablefeature).\n * @attr {string} oauth-token - The OAuth 2.0 token for authentication. See [`PickerBuilder.setOAuthToken`](https://developers.google.com/drive/picker/reference/picker.pickerbuilder.setoauthtoken).\n * @attr {string} origin - The origin parameter for the picker. See [`PickerBuilder.setOrigin`](https://developers.google.com/drive/picker/reference/picker.pickerbuilder.setorigin).\n * @attr {string} relay-url - The relay URL for the picker. See [`PickerBuilder.setRelayUrl`](https://developers.google.com/drive/picker/reference/picker.pickerbuilder.setrelayurl).\n * @attr {string} scope - The OAuth 2.0 scope for the picker. The default is `https://www.googleapis.com/auth/drive.file`. See [Drive API scopes](https://developers.google.com/drive/api/guides/api-specific-auth#drive-scopes).\n * @attr {string} title - The title of the picker. See [`PickerBuilder.setTitle`](https://developers.google.com/drive/picker/reference/picker.pickerbuilder.settitle).\n * @attr {string} hd - The hosted domain to restrict sign-in to.  (Optional)  See the `hd` field in the OpenID Connect docs.\n * @attr {boolean} include-granted-scopes - Enables applications to use incremental authorization. See [`TokenClientConfig.include_granted_scopes`](https://developers.google.com/identity/oauth2/web/reference/js-reference#TokenClientConfig).\n * @attr {string} login-hint - An email address or an ID token 'sub' value. Google will use the value as a hint of which user to sign in. See the `login_hint` field in the OpenID Connect docs.\n * @attr {\"\"|\"none\"|\"consent\"|\"select_account\"} prompt - A space-delimited, case-sensitive list of prompts to present the user.  See [`TokenClientConfig.prompt`](https://developers.google.com/identity/oauth2/web/reference/js-reference#TokenClientConfig)\n *\n * @example\n *\n *```html\n *<drive-picker\n *  app-id=\"246724281745\"\n *  client-id=\"246724281745-v9ouai8ood5o69r3ug29aaqeqflomijd.apps.googleusercontent.com\"\n *>\n *  <drive-picker-docs-view></drive-picker-docs-view>\n *</drive-picker>\n *```\n *\n */\nexport class DrivePickerElement extends HTMLElement {\n\tstatic get observedAttributes() {\n\t\treturn [\n\t\t\t\"app-id\",\n\t\t\t\"client-id\",\n\t\t\t\"debounce-delay\",\n\t\t\t\"developer-key\",\n\t\t\t\"hide-title-bar\",\n\t\t\t\"locale\",\n\t\t\t\"max-items\",\n\t\t\t\"mine-only\",\n\t\t\t\"multiselect\",\n\t\t\t\"nav-hidden\",\n\t\t\t\"oauth-token\",\n\t\t\t\"origin\",\n\t\t\t\"relay-url\",\n\t\t\t\"scope\",\n\t\t\t\"title\",\n\t\t];\n\t}\n\tprivate picker: google.picker.Picker | undefined;\n\tprivate observer: MutationObserver | undefined;\n\tprivate google: typeof google | undefined;\n\tprivate loading: Promise<void> | undefined;\n\tprivate debounceTimer: number | undefined;\n\n\t/**\n\t * The visibility of the picker.\n\t */\n\tpublic get visible(): boolean {\n\t\treturn Boolean(this.picker?.isVisible());\n\t}\n\n\t/**\n\t * Controls the visibility of the picker after the picker dialog has been\n\t * closed. If any of the attributes change, the picker will be rebuilt and\n\t * the visibility will be reset.\n\t */\n\tset visible(value: boolean) {\n\t\tthis.picker?.setVisible(value);\n\t}\n\n\tpublic get tokenClientConfig(): Omit<\n\t\tgoogle.accounts.oauth2.TokenClientConfig,\n\t\t\"callback\" | \"error_callback\"\n\t> {\n\t\tconst clientId = this.getAttribute(\"client-id\");\n\t\tconst scope =\n\t\t\tthis.getAttribute(\"scope\") ??\n\t\t\t\"https://www.googleapis.com/auth/drive.file\";\n\n\t\tif (!clientId || !scope) {\n\t\t\tthrow new Error(\"client-id and scope are required attributes\");\n\t\t}\n\n\t\treturn {\n\t\t\tclient_id: clientId,\n\t\t\thd: this.getAttribute(\"hd\") ?? undefined,\n\t\t\tinclude_granted_scopes: Boolean(\n\t\t\t\tthis.getAttribute(\"include-granted-scope\"),\n\t\t\t),\n\t\t\tlogin_hint: this.getAttribute(\"login-hint\") ?? undefined,\n\t\t\tprompt: (this.getAttribute(\"prompt\") ??\n\t\t\t\t\"\") as google.accounts.oauth2.TokenClientConfig[\"prompt\"],\n\t\t\tscope,\n\t\t};\n\t}\n\n\tattributeChangedCallback() {\n\t\tif (!this.isConnected) return;\n\n\t\tthis.scheduleBuild();\n\t}\n\n\tprivate scheduleBuild() {\n\t\t// Clear any previously scheduled build to ensure we don't build multiple times\n\t\tclearTimeout(this.debounceTimer);\n\n\t\t// Schedule a new build to run after a short delay.\n\t\t// This coalesces multiple rapid changes into a single build call.\n\t\tthis.debounceTimer = window.setTimeout(() => {\n\t\t\tthis.build();\n\t\t}, getNumberAttribute(this, \"debounce-delay\") ?? 0);\n\t}\n\n\tprivate async build() {\n\t\tthis.picker?.dispose();\n\n\t\t// this await is necessary as an attribute may have changed\n\t\t// prior to the API initially being loaded\n\t\tawait this.loading;\n\n\t\tif (!this.google) return;\n\n\t\tlet builder = new this.google.picker.PickerBuilder().setCallback(\n\t\t\t(data: google.picker.ResponseObject) => {\n\t\t\t\tthis.callbackToDispatchEvent(data);\n\t\t\t},\n\t\t);\n\n\t\tconst appId = this.getAttribute(\"app-id\");\n\t\tif (appId) {\n\t\t\tbuilder = builder.setAppId(appId);\n\t\t} else {\n\t\t\tconsole.warn(\n\t\t\t\t\"drive-picker: app-id attribute is missing. This may cause issues with backend API integration.\",\n\t\t\t);\n\t\t}\n\n\t\tconst developerKey = this.getAttribute(\"developer-key\");\n\t\tif (developerKey !== null) builder = builder.setDeveloperKey(developerKey);\n\n\t\tconst locale = this.getAttribute(\"locale\");\n\t\tif (locale !== null)\n\t\t\tbuilder = builder.setLocale(locale as google.picker.Locales);\n\n\t\tconst maxItems = getNumberAttribute(this, \"max-items\");\n\t\tif (maxItems !== null) builder = builder.setMaxItems(maxItems);\n\n\t\tconst origin = this.getAttribute(\"origin\");\n\t\tif (origin !== null) builder = builder.setOrigin(origin);\n\n\t\tconst relayUrl = this.getAttribute(\"relay-url\");\n\t\tif (relayUrl !== null) builder = builder.setRelayUrl(relayUrl);\n\n\t\tconst title = this.getAttribute(\"title\");\n\t\tif (title !== null) builder = builder.setTitle(title);\n\n\t\tsetBoolAttrWithDefault(\n\t\t\t\"hide-title-bar\",\n\t\t\tthis,\n\t\t\tbuilder.hideTitleBar,\n\t\t\tbuilder,\n\t\t);\n\n\t\t// OAuth token is required either as an attribute or from the OAuth flow using the client ID and scope\n\t\tconst oauthToken =\n\t\t\tthis.getAttribute(\"oauth-token\") ?? (await this.requestAccessToken());\n\n\t\tif (!oauthToken) return;\n\n\t\tbuilder = builder.setOAuthToken(oauthToken);\n\n\t\tif (getBoolAttr(this, \"multiselect\")) {\n\t\t\tbuilder = builder.enableFeature(\n\t\t\t\tthis.google.picker.Feature.MULTISELECT_ENABLED,\n\t\t\t);\n\t\t}\n\n\t\tif (getBoolAttr(this, \"mine-only\")) {\n\t\t\tbuilder = builder.enableFeature(this.google.picker.Feature.MINE_ONLY);\n\t\t}\n\n\t\tif (getBoolAttr(this, \"nav-hidden\")) {\n\t\t\tbuilder = builder.enableFeature(this.google.picker.Feature.NAV_HIDDEN);\n\t\t}\n\n\t\tfor (const view of this.views) {\n\t\t\tbuilder = builder.addView(view);\n\t\t}\n\n\t\tthis.picker = builder.build();\n\n\t\tthis.picker.setVisible(true);\n\t}\n\n\t/**\n\t * The `google.Picker.View` objects to display in the picker as defined by the slot elements.\n\t */\n\tprivate get views(): (View | google.picker.ViewId)[] {\n\t\tconst views = nestedViews(this);\n\t\treturn views.length ? views : [\"all\" as google.picker.ViewId];\n\t}\n\n\tasync connectedCallback(): Promise<void> {\n\t\tthis.loading = loadApi().then((google) => {\n\t\t\tthis.google = google;\n\t\t});\n\n\t\t// Watch for changes in the picker element slot and their attributes\n\t\tthis.observer = new MutationObserver((mutations) => {\n\t\t\tconst filteredMutations = mutations.filter(\n\t\t\t\t(mutation) =>\n\t\t\t\t\tmutation.type === \"childList\" ||\n\t\t\t\t\t(mutation.type === \"attributes\" && mutation.target !== this),\n\t\t\t);\n\n\t\t\tif (filteredMutations.length) {\n\t\t\t\tthis.scheduleBuild();\n\t\t\t}\n\t\t});\n\n\t\tthis.observer?.observe(this, {\n\t\t\tchildList: true,\n\t\t\tsubtree: true,\n\t\t\tattributes: true,\n\t\t});\n\n\t\tthis.scheduleBuild();\n\t}\n\n\tprivate callbackToDispatchEvent(detail: google.picker.ResponseObject) {\n\t\t// TODO - remove deprecated events\n\t\tlet eventTypes: (keyof GlobalEventHandlersEventMap)[];\n\n\t\tswitch (detail.action) {\n\t\t\tcase google.picker.Action.CANCEL:\n\t\t\t\teventTypes = [\"picker:canceled\", \"picker-canceled\"];\n\t\t\t\tbreak;\n\t\t\tcase google.picker.Action.PICKED:\n\t\t\t\teventTypes = [\"picker:picked\", \"picker-picked\"];\n\t\t\t\tbreak;\n\t\t\tcase google.picker.Action.ERROR:\n\t\t\t\teventTypes = [\"picker:error\", \"picker-error\"];\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\treturn;\n\t\t}\n\n\t\tfor (const eventType of eventTypes) {\n\t\t\tthis.dispatchEvent(\n\t\t\t\tnew CustomEvent(eventType, {\n\t\t\t\t\tdetail,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate async requestAccessToken(): Promise<string | undefined> {\n\t\treturn requestAccessToken(this.tokenClientConfig)\n\t\t\t.then((response) => {\n\t\t\t\tconst { access_token: token } = response;\n\t\t\t\tif (!token) {\n\t\t\t\t\tthis.dispatchEvent(\n\t\t\t\t\t\tnew CustomEvent(\"picker:oauth:error\", {\n\t\t\t\t\t\t\tdetail: response,\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t\tthis.dispatchEvent(\n\t\t\t\t\t\tnew CustomEvent(\"picker-oauth-error\", {\n\t\t\t\t\t\t\tdetail: response,\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t\t// TODO - remove deprecated event\n\t\t\t\tthis.dispatchEvent(\n\t\t\t\t\tnew CustomEvent(\"picker:authenticated\", { detail: { token } }),\n\t\t\t\t);\n\t\t\t\tthis.dispatchEvent(\n\t\t\t\t\tnew CustomEvent(\"picker-oauth-response\", { detail: response }),\n\t\t\t\t);\n\t\t\t\t// TODO - remove deprecated event\n\t\t\t\tthis.dispatchEvent(\n\t\t\t\t\tnew CustomEvent(\"picker:oauth:response\", { detail: response }),\n\t\t\t\t);\n\t\t\t\tthis.dispatchEvent(\n\t\t\t\t\tnew CustomEvent(\"picker-oauth-response\", { detail: response }),\n\t\t\t\t);\n\t\t\t\treturn token;\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\t// TODO - remove deprecated event\n\t\t\t\tthis.dispatchEvent(\n\t\t\t\t\tnew CustomEvent(\"picker:oauth:error\", {\n\t\t\t\t\t\tdetail: error,\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t\tthis.dispatchEvent(\n\t\t\t\t\tnew CustomEvent(\"picker-oauth-error\", {\n\t\t\t\t\t\tdetail: error,\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t\treturn undefined;\n\t\t\t});\n\t}\n\n\tdisconnectedCallback(): void {\n\t\tthis.picker?.dispose();\n\t}\n}\n\nfunction isView(obj: HTMLElement): obj is DrivePickerDocsViewElement {\n\treturn \"view\" in obj && obj.view instanceof window.google.picker.View;\n}\n\nfunction filterElementsToViewOrViewGroup(\n\telements: Array<HTMLElement>,\n): Array<View> {\n\treturn elements\n\t\t.filter((element) => isView(element))\n\t\t.map((element) => element.view);\n}\n\nfunction nestedViews(target: HTMLElement, selector = \"*\"): Array<View> {\n\treturn filterElementsToViewOrViewGroup(\n\t\tArray.from(target.querySelectorAll<HTMLElement>(selector)),\n\t);\n}\n","/**\n * Copyright 2024 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n\tDrivePickerDocsViewElement,\n\ttype DrivePickerDocsViewElementProps,\n\tDrivePickerElement,\n\ttype DrivePickerElementProps,\n\ttype OAuthErrorEvent,\n\ttype OAuthResponseEvent,\n\ttype PickerCanceledEvent,\n\ttype PickerErrorEvent,\n\ttype PickerPickedEvent,\n} from \"./drive-picker\";\n\ncustomElements.define(\"drive-picker\", DrivePickerElement);\ncustomElements.define(\"drive-picker-docs-view\", DrivePickerDocsViewElement);\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t\"drive-picker\": DrivePickerElement;\n\t}\n\tinterface HTMLElementTagNameMap {\n\t\t\"drive-picker-docs-view\": DrivePickerDocsViewElement;\n\t}\n}\n\nexport type {\n\tDrivePickerElement,\n\tDrivePickerDocsViewElement,\n\tDrivePickerElementProps,\n\tDrivePickerDocsViewElementProps,\n\tOAuthErrorEvent,\n\tOAuthResponseEvent,\n\tPickerCanceledEvent,\n\tPickerErrorEvent,\n\tPickerPickedEvent,\n};\n"]}