next-tinacms-azure 0.0.0-8f121d7-20250516044444 → 0.0.0-8f7f815-20250623000754

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/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": "0.0.0-8f121d7-20250516044444",
3
+ "version": "0.0.0-8f7f815-20250623000754",
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": "0.0.0-8f121d7-20250516044444",
42
- "tinacms": "0.0.0-8f121d7-20250516044444"
41
+ "@tinacms/scripts": "0.0.0-8f7f815-20250623000754",
42
+ "tinacms": "0.0.0-8f7f815-20250623000754"
43
43
  },
44
44
  "peerDependencies": {
45
- "tinacms": "0.0.0-8f121d7-20250516044444",
46
- "@tinacms/auth": "1.0.12"
45
+ "tinacms": "0.0.0-8f7f815-20250623000754",
46
+ "@tinacms/auth": "0.0.0-8f7f815-20250623000754"
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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"}