next-tinacms-azure 1.0.7 → 1.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/auth.js CHANGED
@@ -697,7 +697,7 @@ var require_headers = __commonJS({
697
697
  }
698
698
  const lowercased = prop.toLowerCase();
699
699
  const original = Object.keys(headers2).find((o) => o.toLowerCase() === lowercased);
700
- return _reflect.ReflectAdapter.set(target, original != null ? original : prop, value, receiver);
700
+ return _reflect.ReflectAdapter.set(target, original ?? prop, value, receiver);
701
701
  },
702
702
  has(target, prop) {
703
703
  if (typeof prop === "symbol") return _reflect.ReflectAdapter.has(target, prop);
@@ -412,14 +412,13 @@ var require_next_url = __commonJS({
412
412
  options = opts || baseOrOpts || {};
413
413
  }
414
414
  this[Internal] = {
415
- url: parseURL(input, base != null ? base : options.base),
415
+ url: parseURL(input, base ?? options.base),
416
416
  options,
417
417
  basePath: ""
418
418
  };
419
419
  this.analyze();
420
420
  }
421
421
  analyze() {
422
- var _a, _b;
423
422
  var _this_Internal_options_nextConfig_i18n, _this_Internal_options_nextConfig, _this_Internal_domainLocale, _this_Internal_options_nextConfig_i18n1, _this_Internal_options_nextConfig1;
424
423
  const info = (0, _getnextpathnameinfo.getNextPathnameInfo)(this[Internal].url.pathname, {
425
424
  nextConfig: this[Internal].options.nextConfig,
@@ -431,9 +430,9 @@ var require_next_url = __commonJS({
431
430
  const defaultLocale = ((_this_Internal_domainLocale = this[Internal].domainLocale) == null ? void 0 : _this_Internal_domainLocale.defaultLocale) || ((_this_Internal_options_nextConfig1 = this[Internal].options.nextConfig) == null ? void 0 : (_this_Internal_options_nextConfig_i18n1 = _this_Internal_options_nextConfig1.i18n) == null ? void 0 : _this_Internal_options_nextConfig_i18n1.defaultLocale);
432
431
  this[Internal].url.pathname = info.pathname;
433
432
  this[Internal].defaultLocale = defaultLocale;
434
- this[Internal].basePath = (_a = info.basePath) != null ? _a : "";
433
+ this[Internal].basePath = info.basePath ?? "";
435
434
  this[Internal].buildId = info.buildId;
436
- this[Internal].locale = (_b = info.locale) != null ? _b : defaultLocale;
435
+ this[Internal].locale = info.locale ?? defaultLocale;
437
436
  this[Internal].trailingSlash = info.trailingSlash;
438
437
  }
439
438
  formatPathname() {
@@ -456,8 +455,7 @@ var require_next_url = __commonJS({
456
455
  this[Internal].buildId = buildId;
457
456
  }
458
457
  get locale() {
459
- var _a;
460
- return (_a = this[Internal].locale) != null ? _a : "";
458
+ return this[Internal].locale ?? "";
461
459
  }
462
460
  set locale(locale) {
463
461
  var _this_Internal_options_nextConfig_i18n, _this_Internal_options_nextConfig;
@@ -1332,8 +1330,7 @@ var require_response = __commonJS({
1332
1330
  return new _NextResponse(response.body, response);
1333
1331
  }
1334
1332
  static redirect(url, init) {
1335
- var _a;
1336
- const status = typeof init === "number" ? init : (_a = init == null ? void 0 : init.status) != null ? _a : 307;
1333
+ const status = typeof init === "number" ? init : (init == null ? void 0 : init.status) ?? 307;
1337
1334
  if (!REDIRECTS.has(status)) {
1338
1335
  throw new RangeError('Failed to execute "redirect" on "response": Invalid status code');
1339
1336
  }
@@ -1717,7 +1714,6 @@ var SUPPORTED_IMAGE_TYPES = [
1717
1714
  var createMediaDeliveryHandlers = (config) => {
1718
1715
  return {
1719
1716
  async GET(req, context) {
1720
- var _a, _b;
1721
1717
  try {
1722
1718
  const accountNameMatch = /AccountName=([^;]+)/.exec(
1723
1719
  config.connectionString
@@ -1806,10 +1802,10 @@ var createMediaDeliveryHandlers = (config) => {
1806
1802
  }
1807
1803
  let outputFormat = "jpeg";
1808
1804
  let outputContentType = "image/jpeg";
1809
- if (format === "webp" || format === "auto" && ((_a = req.headers.get("accept")) == null ? void 0 : _a.includes("image/webp"))) {
1805
+ if (format === "webp" || format === "auto" && req.headers.get("accept")?.includes("image/webp")) {
1810
1806
  outputFormat = "webp";
1811
1807
  outputContentType = "image/webp";
1812
- } else if (format === "avif" || format === "auto" && ((_b = req.headers.get("accept")) == null ? void 0 : _b.includes("image/avif"))) {
1808
+ } else if (format === "avif" || format === "auto" && req.headers.get("accept")?.includes("image/avif")) {
1813
1809
  outputFormat = "avif";
1814
1810
  outputContentType = "image/avif";
1815
1811
  }
package/dist/handlers.js CHANGED
@@ -412,14 +412,13 @@ var require_next_url = __commonJS({
412
412
  options = opts || baseOrOpts || {};
413
413
  }
414
414
  this[Internal] = {
415
- url: parseURL(input, base != null ? base : options.base),
415
+ url: parseURL(input, base ?? options.base),
416
416
  options,
417
417
  basePath: ""
418
418
  };
419
419
  this.analyze();
420
420
  }
421
421
  analyze() {
422
- var _a, _b;
423
422
  var _this_Internal_options_nextConfig_i18n, _this_Internal_options_nextConfig, _this_Internal_domainLocale, _this_Internal_options_nextConfig_i18n1, _this_Internal_options_nextConfig1;
424
423
  const info = (0, _getnextpathnameinfo.getNextPathnameInfo)(this[Internal].url.pathname, {
425
424
  nextConfig: this[Internal].options.nextConfig,
@@ -431,9 +430,9 @@ var require_next_url = __commonJS({
431
430
  const defaultLocale = ((_this_Internal_domainLocale = this[Internal].domainLocale) == null ? void 0 : _this_Internal_domainLocale.defaultLocale) || ((_this_Internal_options_nextConfig1 = this[Internal].options.nextConfig) == null ? void 0 : (_this_Internal_options_nextConfig_i18n1 = _this_Internal_options_nextConfig1.i18n) == null ? void 0 : _this_Internal_options_nextConfig_i18n1.defaultLocale);
432
431
  this[Internal].url.pathname = info.pathname;
433
432
  this[Internal].defaultLocale = defaultLocale;
434
- this[Internal].basePath = (_a = info.basePath) != null ? _a : "";
433
+ this[Internal].basePath = info.basePath ?? "";
435
434
  this[Internal].buildId = info.buildId;
436
- this[Internal].locale = (_b = info.locale) != null ? _b : defaultLocale;
435
+ this[Internal].locale = info.locale ?? defaultLocale;
437
436
  this[Internal].trailingSlash = info.trailingSlash;
438
437
  }
439
438
  formatPathname() {
@@ -456,8 +455,7 @@ var require_next_url = __commonJS({
456
455
  this[Internal].buildId = buildId;
457
456
  }
458
457
  get locale() {
459
- var _a;
460
- return (_a = this[Internal].locale) != null ? _a : "";
458
+ return this[Internal].locale ?? "";
461
459
  }
462
460
  set locale(locale) {
463
461
  var _this_Internal_options_nextConfig_i18n, _this_Internal_options_nextConfig;
@@ -1332,8 +1330,7 @@ var require_response = __commonJS({
1332
1330
  return new _NextResponse(response.body, response);
1333
1331
  }
1334
1332
  static redirect(url, init) {
1335
- var _a;
1336
- const status = typeof init === "number" ? init : (_a = init == null ? void 0 : init.status) != null ? _a : 307;
1333
+ const status = typeof init === "number" ? init : (init == null ? void 0 : init.status) ?? 307;
1337
1334
  if (!REDIRECTS.has(status)) {
1338
1335
  throw new RangeError('Failed to execute "redirect" on "response": Invalid status code');
1339
1336
  }
@@ -1705,7 +1702,7 @@ __export(handlers_exports, {
1705
1702
  });
1706
1703
  module.exports = __toCommonJS(handlers_exports);
1707
1704
  var import_storage_blob = require("@azure/storage-blob");
1708
- var import_node_path = __toESM(require("path"));
1705
+ var import_node_path = __toESM(require("node:path"));
1709
1706
  var import_server = __toESM(require_server());
1710
1707
  var createMediaHandlers = (config) => {
1711
1708
  function withAuth(handler) {
@@ -1773,7 +1770,6 @@ async function deleteAsset(_, context, config) {
1773
1770
  });
1774
1771
  }
1775
1772
  async function listMedia(req, config) {
1776
- var _a;
1777
1773
  try {
1778
1774
  const client = import_storage_blob.BlobServiceClient.fromConnectionString(
1779
1775
  config.connectionString
@@ -1786,7 +1782,7 @@ async function listMedia(req, config) {
1786
1782
  filesOnly: req.nextUrl.searchParams.get("filesOnly") === "true" || false
1787
1783
  };
1788
1784
  const useRootDirectory = !mediaListOptions.directory || mediaListOptions.directory === "/" || mediaListOptions.directory === '""';
1789
- const prefix = useRootDirectory ? "" : ((_a = mediaListOptions.directory) == null ? void 0 : _a.endsWith("/")) ? mediaListOptions.directory : `${mediaListOptions.directory}/`;
1785
+ const prefix = useRootDirectory ? "" : mediaListOptions.directory?.endsWith("/") ? mediaListOptions.directory : `${mediaListOptions.directory}/`;
1790
1786
  const files = [];
1791
1787
  const folders = [];
1792
1788
  for await (const blob of containerClient.listBlobsByHierarchy("/", {
package/dist/index.js CHANGED
@@ -118,9 +118,9 @@
118
118
  };
119
119
  }
120
120
  buildQuery(options) {
121
- const params = Object.keys(options).filter(
122
- (key) => options[key] !== "" && options[key] !== void 0
123
- ).map((key) => `${key}=${options[key]}`).join("&");
121
+ const params = Object.entries(options).filter(([_, value]) => value !== "" && value !== void 0).map(([key, value]) => {
122
+ return typeof value === "object" ? `${key}=${encodeURIComponent(JSON.stringify(value))}` : `${key}=${encodeURIComponent(String(value))}`;
123
+ }).join("&");
124
124
  return `?${params}`;
125
125
  }
126
126
  }
@@ -147,4 +147,3 @@
147
147
  exports2.createTinaCloudAzureMediaStore = createTinaCloudAzureMediaStore;
148
148
  Object.defineProperty(exports2, Symbol.toStringTag, { value: "Module" });
149
149
  });
150
- //# sourceMappingURL=index.js.map
package/dist/index.mjs CHANGED
@@ -115,9 +115,9 @@ class AzureMediaStore {
115
115
  };
116
116
  }
117
117
  buildQuery(options) {
118
- const params = Object.keys(options).filter(
119
- (key) => options[key] !== "" && options[key] !== void 0
120
- ).map((key) => `${key}=${options[key]}`).join("&");
118
+ const params = Object.entries(options).filter(([_, value]) => value !== "" && value !== void 0).map(([key, value]) => {
119
+ return typeof value === "object" ? `${key}=${encodeURIComponent(JSON.stringify(value))}` : `${key}=${encodeURIComponent(String(value))}`;
120
+ }).join("&");
121
121
  return `?${params}`;
122
122
  }
123
123
  }
@@ -144,4 +144,3 @@ export {
144
144
  TinaCloudAzureMediaStore,
145
145
  createTinaCloudAzureMediaStore
146
146
  };
147
- //# sourceMappingURL=index.mjs.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "next-tinacms-azure",
3
- "version": "1.0.7",
3
+ "version": "1.0.9",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -38,12 +38,12 @@
38
38
  "react": "^18.3.1",
39
39
  "react-dom": "^18.3.1",
40
40
  "typescript": "^5.7.3",
41
- "@tinacms/scripts": "1.3.4",
42
- "tinacms": "2.7.7"
41
+ "@tinacms/scripts": "1.3.5",
42
+ "tinacms": "2.7.9"
43
43
  },
44
44
  "peerDependencies": {
45
- "tinacms": "2.7.7",
46
- "@tinacms/auth": "1.0.12"
45
+ "@tinacms/auth": "1.0.12",
46
+ "tinacms": "2.7.9"
47
47
  },
48
48
  "publishConfig": {
49
49
  "registry": "https://registry.npmjs.org"
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sources":["../src/errors.ts","../src/azure-media-store.ts","../src/azure-tina-cloud-media-store.ts"],"sourcesContent":["/**\n\n*/\n\ninterface MediaListErrorConfig {\n title: string;\n message: string;\n docsLink: string;\n}\n\nclass MediaListError extends Error {\n public ERR_TYPE = 'MediaListError';\n public title: string;\n public docsLink: string;\n\n constructor(config: MediaListErrorConfig) {\n super(config.message);\n this.title = config.title;\n this.docsLink = config.docsLink;\n }\n}\n\nexport const E_DEFAULT = new MediaListError({\n title: 'An Error Occurred',\n message: 'Something went wrong fetching your media from Azure Blob Storage.',\n docsLink: 'https://tina.io/docs/reference/media/external/azure',\n});\n\nexport const E_UNAUTHORIZED = new MediaListError({\n title: 'Unauthorized',\n message: \"You don't have access to this resource.\",\n docsLink:\n 'https://tina.io/docs/reference/media/external/cloudinary/#set-up-api-routes-nextjs-example',\n});\n\nexport const E_CONFIG = new MediaListError({\n title: 'Missing Credentials',\n message:\n 'Unable to connect to Cloudinary because one or more environment variables are missing.',\n docsLink: 'https://tina.io/docs/media-cloudinary/',\n});\n\nexport const E_KEY_FAIL = new MediaListError({\n title: 'Bad Credentials',\n message:\n 'Unable to connect to Cloudinary because one or more environment variables are misconfigured.',\n docsLink: 'https://tina.io/docs/media-cloudinary/',\n});\n\nexport const E_BAD_ROUTE = new MediaListError({\n title: 'Bad Route',\n message: 'The Cloudinary API route is missing or misconfigured.',\n docsLink:\n 'https://tina.io/docs/reference/media/external/cloudinary/#set-up-api-routes-nextjs-example',\n});\n\nexport const interpretErrorMessage = (message: string) => {\n switch (message) {\n case 'Must supply cloud_name':\n case 'Must supply api_key':\n case 'Must supply api_secret':\n return E_CONFIG;\n case 'unknown api_key':\n return E_KEY_FAIL;\n default:\n return E_DEFAULT;\n }\n};\n","import type {\n Media,\n MediaList,\n MediaListOptions,\n MediaStore,\n MediaUploadOptions,\n} from 'tinacms';\nimport { DEFAULT_MEDIA_UPLOAD_TYPES } from 'tinacms';\nimport { E_UNAUTHORIZED, E_BAD_ROUTE, interpretErrorMessage } from './errors';\n\nexport type AzureMediaStoreOptions = {\n baseUrl?: string;\n};\n\nexport class AzureMediaStore implements MediaStore {\n baseUrl: string;\n constructor(options?: AzureMediaStoreOptions) {\n this.baseUrl = options?.baseUrl || '/api/azure/media';\n }\n fetchFunction = (input: RequestInfo, init?: RequestInit) =>\n fetch(input, init);\n\n accept = DEFAULT_MEDIA_UPLOAD_TYPES;\n\n async persist(media: MediaUploadOptions[]): Promise<Media[]> {\n const newFiles: Media[] = [];\n\n for (const item of media) {\n const { file, directory } = item;\n const formData = new FormData();\n formData.append('file', file);\n formData.append('directory', directory);\n formData.append('filename', file.name);\n\n const res = await this.fetchFunction(this.baseUrl, {\n method: 'POST',\n body: formData,\n });\n\n if (res.status !== 200) {\n const responseData = await res.json();\n throw new Error(responseData.message);\n }\n const fileRes = await res.json();\n\n const parsedRes: Media = {\n type: 'file',\n id: fileRes.name,\n filename: fileRes.filename,\n directory: '/',\n thumbnails: {\n '75x75': fileRes.url,\n '400x400': fileRes.url,\n '1000x1000': fileRes.url,\n },\n src: fileRes.url,\n };\n\n newFiles.push(parsedRes);\n }\n return newFiles;\n }\n async delete(media: Media) {\n await this.fetchFunction(\n `${this.baseUrl}/${encodeURIComponent(media.id)}`,\n {\n method: 'DELETE',\n }\n );\n }\n async list(options: MediaListOptions): Promise<MediaList> {\n const query = this.buildQuery(options);\n const response = await this.fetchFunction(this.baseUrl + query);\n\n if (response.status === 401) {\n throw E_UNAUTHORIZED;\n }\n if (response.status === 404) {\n throw E_BAD_ROUTE;\n }\n if (response.status >= 500) {\n const { e } = await response.json();\n const error = interpretErrorMessage(e);\n throw error;\n }\n const { items, offset } = await response.json();\n return {\n items: items.map((item) => item),\n nextOffset: offset,\n };\n }\n\n parse = (img: Media) => {\n return img.src;\n };\n\n buildQuery(options: MediaListOptions) {\n const params = Object.keys(options)\n .filter(\n (key) =>\n options[key as keyof MediaListOptions] !== '' &&\n options[key as keyof MediaListOptions] !== undefined\n )\n .map((key) => `${key}=${options[key as keyof MediaListOptions]}`)\n .join('&');\n\n return `?${params}`;\n }\n}\n","import type { Client } from 'tinacms';\nimport type { AzureMediaStoreOptions } from './azure-media-store';\nimport { AzureMediaStore } from './azure-media-store';\n\nexport const createTinaCloudAzureMediaStore = (\n options: AzureMediaStoreOptions = { baseUrl: '/api/azure/media' }\n) =>\n class TinaCloudAzureMediaStore extends AzureMediaStore {\n client: Client;\n constructor(client: Client) {\n super(options);\n this.client = client;\n this.fetchFunction = async (input: RequestInfo, init?: RequestInit) => {\n try {\n const url = input.toString();\n const query = `${url.includes('?') ? '&' : '?'}clientID=${\n client.clientId\n }`;\n\n const res = client.authProvider.fetchWithToken(url + query, init);\n return res;\n } catch (error) {\n console.error(error);\n return new Response(null, { status: 500 });\n }\n };\n }\n };\n\nexport const TinaCloudAzureMediaStore = createTinaCloudAzureMediaStore();\n"],"names":["DEFAULT_MEDIA_UPLOAD_TYPES"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.mjs","sources":["../src/errors.ts","../src/azure-media-store.ts","../src/azure-tina-cloud-media-store.ts"],"sourcesContent":["/**\n\n*/\n\ninterface MediaListErrorConfig {\n title: string;\n message: string;\n docsLink: string;\n}\n\nclass MediaListError extends Error {\n public ERR_TYPE = 'MediaListError';\n public title: string;\n public docsLink: string;\n\n constructor(config: MediaListErrorConfig) {\n super(config.message);\n this.title = config.title;\n this.docsLink = config.docsLink;\n }\n}\n\nexport const E_DEFAULT = new MediaListError({\n title: 'An Error Occurred',\n message: 'Something went wrong fetching your media from Azure Blob Storage.',\n docsLink: 'https://tina.io/docs/reference/media/external/azure',\n});\n\nexport const E_UNAUTHORIZED = new MediaListError({\n title: 'Unauthorized',\n message: \"You don't have access to this resource.\",\n docsLink:\n 'https://tina.io/docs/reference/media/external/cloudinary/#set-up-api-routes-nextjs-example',\n});\n\nexport const E_CONFIG = new MediaListError({\n title: 'Missing Credentials',\n message:\n 'Unable to connect to Cloudinary because one or more environment variables are missing.',\n docsLink: 'https://tina.io/docs/media-cloudinary/',\n});\n\nexport const E_KEY_FAIL = new MediaListError({\n title: 'Bad Credentials',\n message:\n 'Unable to connect to Cloudinary because one or more environment variables are misconfigured.',\n docsLink: 'https://tina.io/docs/media-cloudinary/',\n});\n\nexport const E_BAD_ROUTE = new MediaListError({\n title: 'Bad Route',\n message: 'The Cloudinary API route is missing or misconfigured.',\n docsLink:\n 'https://tina.io/docs/reference/media/external/cloudinary/#set-up-api-routes-nextjs-example',\n});\n\nexport const interpretErrorMessage = (message: string) => {\n switch (message) {\n case 'Must supply cloud_name':\n case 'Must supply api_key':\n case 'Must supply api_secret':\n return E_CONFIG;\n case 'unknown api_key':\n return E_KEY_FAIL;\n default:\n return E_DEFAULT;\n }\n};\n","import type {\n Media,\n MediaList,\n MediaListOptions,\n MediaStore,\n MediaUploadOptions,\n} from 'tinacms';\nimport { DEFAULT_MEDIA_UPLOAD_TYPES } from 'tinacms';\nimport { E_UNAUTHORIZED, E_BAD_ROUTE, interpretErrorMessage } from './errors';\n\nexport type AzureMediaStoreOptions = {\n baseUrl?: string;\n};\n\nexport class AzureMediaStore implements MediaStore {\n baseUrl: string;\n constructor(options?: AzureMediaStoreOptions) {\n this.baseUrl = options?.baseUrl || '/api/azure/media';\n }\n fetchFunction = (input: RequestInfo, init?: RequestInit) =>\n fetch(input, init);\n\n accept = DEFAULT_MEDIA_UPLOAD_TYPES;\n\n async persist(media: MediaUploadOptions[]): Promise<Media[]> {\n const newFiles: Media[] = [];\n\n for (const item of media) {\n const { file, directory } = item;\n const formData = new FormData();\n formData.append('file', file);\n formData.append('directory', directory);\n formData.append('filename', file.name);\n\n const res = await this.fetchFunction(this.baseUrl, {\n method: 'POST',\n body: formData,\n });\n\n if (res.status !== 200) {\n const responseData = await res.json();\n throw new Error(responseData.message);\n }\n const fileRes = await res.json();\n\n const parsedRes: Media = {\n type: 'file',\n id: fileRes.name,\n filename: fileRes.filename,\n directory: '/',\n thumbnails: {\n '75x75': fileRes.url,\n '400x400': fileRes.url,\n '1000x1000': fileRes.url,\n },\n src: fileRes.url,\n };\n\n newFiles.push(parsedRes);\n }\n return newFiles;\n }\n async delete(media: Media) {\n await this.fetchFunction(\n `${this.baseUrl}/${encodeURIComponent(media.id)}`,\n {\n method: 'DELETE',\n }\n );\n }\n async list(options: MediaListOptions): Promise<MediaList> {\n const query = this.buildQuery(options);\n const response = await this.fetchFunction(this.baseUrl + query);\n\n if (response.status === 401) {\n throw E_UNAUTHORIZED;\n }\n if (response.status === 404) {\n throw E_BAD_ROUTE;\n }\n if (response.status >= 500) {\n const { e } = await response.json();\n const error = interpretErrorMessage(e);\n throw error;\n }\n const { items, offset } = await response.json();\n return {\n items: items.map((item) => item),\n nextOffset: offset,\n };\n }\n\n parse = (img: Media) => {\n return img.src;\n };\n\n buildQuery(options: MediaListOptions) {\n const params = Object.keys(options)\n .filter(\n (key) =>\n options[key as keyof MediaListOptions] !== '' &&\n options[key as keyof MediaListOptions] !== undefined\n )\n .map((key) => `${key}=${options[key as keyof MediaListOptions]}`)\n .join('&');\n\n return `?${params}`;\n }\n}\n","import type { Client } from 'tinacms';\nimport type { AzureMediaStoreOptions } from './azure-media-store';\nimport { AzureMediaStore } from './azure-media-store';\n\nexport const createTinaCloudAzureMediaStore = (\n options: AzureMediaStoreOptions = { baseUrl: '/api/azure/media' }\n) =>\n class TinaCloudAzureMediaStore extends AzureMediaStore {\n client: Client;\n constructor(client: Client) {\n super(options);\n this.client = client;\n this.fetchFunction = async (input: RequestInfo, init?: RequestInit) => {\n try {\n const url = input.toString();\n const query = `${url.includes('?') ? '&' : '?'}clientID=${\n client.clientId\n }`;\n\n const res = client.authProvider.fetchWithToken(url + query, init);\n return res;\n } catch (error) {\n console.error(error);\n return new Response(null, { status: 500 });\n }\n };\n }\n };\n\nexport const TinaCloudAzureMediaStore = createTinaCloudAzureMediaStore();\n"],"names":[],"mappings":"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"}