zoom-api-js 0.1.3 → 0.3.0

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.mjs CHANGED
@@ -1,12 +1,3 @@
1
- var __typeError = (msg) => {
2
- throw TypeError(msg);
3
- };
4
- var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
5
- var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
6
- var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
7
- var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
8
-
9
- // src/utils/lang.ts
10
1
  function notEmpty(value) {
11
2
  return value !== null && value !== void 0;
12
3
  }
@@ -14,9 +5,8 @@ function compactObject(obj) {
14
5
  return Object.fromEntries(Object.entries(obj).filter(([, value]) => notEmpty(value)));
15
6
  }
16
7
 
17
- // src/meeting/fetcher.ts
18
- var baseUrl = "https://api.zoom.us/v2";
19
- async function fetch2({
8
+ const baseUrl = "https://api.zoom.us/v2";
9
+ async function fetch$1({
20
10
  url,
21
11
  method,
22
12
  body,
@@ -69,21 +59,19 @@ async function fetch2({
69
59
  throw errorObject;
70
60
  }
71
61
  }
72
- var resolveUrl = (url, queryParams = {}, pathParams = {}) => {
62
+ const resolveUrl = (url, queryParams = {}, pathParams = {}) => {
73
63
  let query = new URLSearchParams(queryParams).toString();
74
64
  if (query) query = `?${query}`;
75
65
  return url.replace(/\{\w*\}/g, (key) => pathParams[key.slice(1, -1)] ?? "") + query;
76
66
  };
77
67
 
78
- // src/client.ts
79
- var _token, _fetch;
80
- var ZoomApi = class {
68
+ class ZoomApi {
69
+ #token;
70
+ #fetch;
81
71
  constructor(options) {
82
- __privateAdd(this, _token);
83
- __privateAdd(this, _fetch);
84
- __privateSet(this, _token, options.token);
85
- __privateSet(this, _fetch, options.fetch || fetch);
86
- if (!__privateGet(this, _fetch)) throw new Error("Fetch is required");
72
+ this.#token = options.token;
73
+ this.#fetch = options.fetch || fetch;
74
+ if (!this.#fetch) throw new Error("Fetch is required");
87
75
  }
88
76
  get auth() {
89
77
  return {
@@ -92,7 +80,7 @@ var ZoomApi = class {
92
80
  clientId,
93
81
  clientSecret
94
82
  }) => {
95
- const response = await __privateGet(this, _fetch).call(this, "https://zoom.us/oauth/token", {
83
+ const response = await this.#fetch("https://zoom.us/oauth/token", {
96
84
  method: "POST",
97
85
  body: new URLSearchParams({
98
86
  grant_type: "refresh_token",
@@ -116,13 +104,9 @@ var ZoomApi = class {
116
104
  async request(endpoint, params) {
117
105
  const [method = "", url = ""] = endpoint.split(" ");
118
106
  const extraParams = params || {};
119
- const result = await fetch2({ ...extraParams, method, url, token: __privateGet(this, _token), fetchImpl: __privateGet(this, _fetch) });
107
+ const result = await fetch$1({ ...extraParams, method, url, token: this.#token, fetchImpl: this.#fetch });
120
108
  return result;
121
109
  }
122
- };
123
- _token = new WeakMap();
124
- _fetch = new WeakMap();
125
- export {
126
- ZoomApi
127
- };
128
- //# sourceMappingURL=index.mjs.map
110
+ }
111
+
112
+ export { ZoomApi };
package/package.json CHANGED
@@ -1,26 +1,26 @@
1
1
  {
2
2
  "name": "zoom-api-js",
3
- "version": "0.1.3",
4
- "description": "Zoom API client for Node.js",
3
+ "version": "0.3.0",
4
+ "description": "Zoom auto-generated type-safe API client",
5
5
  "author": "SferaDev",
6
6
  "license": "ISC",
7
7
  "bugs": {
8
8
  "url": "https://github.com/SferaDev/openapi-clients/issues"
9
9
  },
10
10
  "homepage": "https://github.com/SferaDev/openapi-clients#readme",
11
- "main": "dist/index.js",
11
+ "main": "dist/index.cjs",
12
12
  "module": "dist/index.mjs",
13
13
  "typings": "dist/index.d.ts",
14
14
  "exports": {
15
15
  "./package.json": "./package.json",
16
16
  ".": {
17
17
  "import": {
18
- "types": "./dist/index.d.ts",
18
+ "types": "./dist/index.d.mts",
19
19
  "default": "./dist/index.mjs"
20
20
  },
21
21
  "require": {
22
- "types": "./dist/index.d.ts",
23
- "default": "./dist/index.js"
22
+ "types": "./dist/index.d.cts",
23
+ "default": "./dist/index.cjs"
24
24
  }
25
25
  }
26
26
  },
@@ -28,13 +28,9 @@
28
28
  "type": "git",
29
29
  "url": "git+https://github.com/SferaDev/openapi-clients.git"
30
30
  },
31
- "devDependencies": {
32
- "case": "^1.6.3",
33
- "openapi3-ts": "^4.4.0"
34
- },
35
31
  "scripts": {
36
32
  "tsc": "tsc --noEmit",
37
- "build": "rimraf dist && tsup",
33
+ "build": "unbuild",
38
34
  "generate": "openapi-codegen meeting"
39
35
  }
40
36
  }
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/index.ts","../src/utils/lang.ts","../src/meeting/fetcher.ts","../src/client.ts"],"sourcesContent":["export * from \"./client\";\n\nimport type * as Schemas from \"./api/schemas\";\nimport type * as Components from \"./api/components\";\nexport { Schemas, Components };\n","function notEmpty<T>(value: T | null | undefined): value is T {\n return value !== null && value !== undefined;\n}\n\nexport function compactObject<T>(obj: Record<string, T | null | undefined>): Record<string, T> {\n return Object.fromEntries(Object.entries(obj).filter(([, value]) => notEmpty(value))) as Record<string, T>;\n}\n","import { FetchImpl } from '../utils/fetch';\nimport { compactObject } from '../utils/lang';\n\nexport type FetcherExtraProps = {\n token: string | null;\n fetchImpl: FetchImpl;\n};\n\nconst baseUrl = 'https://api.zoom.us/v2';\n\nexport type ErrorWrapper<TError> = TError | { status: 'unknown'; payload: string };\n\nexport type FetcherOptions<TBody, THeaders, TQueryParams, TPathParams> = {\n url: string;\n method: string;\n body?: TBody | undefined;\n headers?: THeaders | undefined;\n queryParams?: TQueryParams | undefined;\n pathParams?: TPathParams | undefined;\n signal?: AbortSignal | undefined;\n} & FetcherExtraProps;\n\nexport async function fetch<\n TData,\n TError,\n TBody extends {} | FormData | undefined | null,\n THeaders extends {},\n TQueryParams extends {},\n TPathParams extends {}\n>({\n url,\n method,\n body,\n headers,\n pathParams,\n queryParams,\n signal,\n token,\n fetchImpl\n}: FetcherOptions<TBody, THeaders, TQueryParams, TPathParams>): Promise<TData> {\n try {\n const requestHeaders: HeadersInit = compactObject({\n 'Content-Type': 'application/json',\n Authorization: token ? `Bearer ${token}` : undefined,\n ...headers\n });\n\n /**\n * As the fetch API is being used, when multipart/form-data is specified\n * the Content-Type header must be deleted so that the browser can set\n * the correct boundary.\n * https://developer.mozilla.org/en-US/docs/Web/API/FormData/Using_FormData_Objects#sending_files_using_a_formdata_object\n */\n if (requestHeaders['Content-Type']?.toLowerCase().includes('multipart/form-data')) {\n delete requestHeaders['Content-Type'];\n }\n\n const payload =\n body instanceof FormData\n ? body\n : requestHeaders['Content-Type'] === 'application/json'\n ? JSON.stringify(body)\n : (body as string);\n\n const response = await fetchImpl(`${baseUrl}${resolveUrl(url, queryParams, pathParams)}`, {\n signal,\n method: method.toUpperCase(),\n body: payload,\n headers: requestHeaders\n });\n\n if (!response.ok) {\n let error: ErrorWrapper<TError>;\n try {\n error = await response.json();\n } catch (e) {\n error = {\n status: 'unknown' as const,\n payload: e instanceof Error ? `Unexpected error (${e.message})` : 'Unexpected error'\n };\n }\n\n throw error;\n }\n\n if (response.headers?.get('content-type')?.includes('json')) {\n return await response.json();\n } else {\n // if it is not a json response, assume it is a blob and cast it to TData\n return (await response.text()) as unknown as TData;\n }\n } catch (e) {\n let errorObject: Error = {\n name: 'unknown' as const,\n message: e instanceof Error ? `Network error (${e.message})` : 'Network error',\n stack: e as string\n };\n throw errorObject;\n }\n}\n\nconst resolveUrl = (url: string, queryParams: Record<string, string> = {}, pathParams: Record<string, string> = {}) => {\n let query = new URLSearchParams(queryParams).toString();\n if (query) query = `?${query}`;\n return url.replace(/\\{\\w*\\}/g, (key) => pathParams[key.slice(1, -1)] ?? '') + query;\n};\n","import { operationsByPath as meetingOperationsByPath } from './meeting/extra';\nimport { FetcherExtraProps, fetch as zoomFetch } from './meeting/fetcher';\nimport { FetchImpl } from './utils/fetch';\n\nexport interface ZoomApiOptions {\n token: string | null;\n fetch?: FetchImpl;\n}\n\ntype MeetingRequestEndpointParams<T extends keyof typeof meetingOperationsByPath> = Omit<\n Parameters<(typeof meetingOperationsByPath)[T]>[0],\n keyof FetcherExtraProps\n>;\n\ntype MeetingRequestEndpointResult<T extends keyof typeof meetingOperationsByPath> = ReturnType<(typeof meetingOperationsByPath)[T]>;\n\nexport class ZoomApi {\n #token: string | null;\n #fetch: FetchImpl;\n\n constructor(options: ZoomApiOptions) {\n this.#token = options.token;\n\n this.#fetch = options.fetch || (fetch as FetchImpl);\n if (!this.#fetch) throw new Error('Fetch is required');\n }\n\n get auth() {\n return {\n refreshToken: async ({\n refreshToken,\n clientId,\n clientSecret\n }: RefreshTokenOptions): Promise<RefreshTokenResult> => {\n const response = await this.#fetch(\"https://zoom.us/oauth/token\", {\n method: \"POST\",\n body: new URLSearchParams({\n grant_type: \"refresh_token\",\n refresh_token: refreshToken,\n client_id: clientId,\n client_secret: clientSecret\n })\n });\n\n if (!response.ok) {\n throw new Error(\"Failed to refresh Zoom token\");\n }\n\n const result = await response.json();\n\n return {\n access_token: result.access_token,\n expires_in: result.expires_in,\n refresh_token: result.refresh_token\n }\n }\n };\n }\n\n public async request<Endpoint extends keyof typeof meetingOperationsByPath>(\n endpoint: Endpoint,\n params: MeetingRequestEndpointParams<Endpoint>\n ) {\n const [method = '', url = ''] = endpoint.split(' ');\n const extraParams = (params || {}) as Record<string, unknown>;\n\n const result = await zoomFetch({ ...extraParams, method, url, token: this.#token, fetchImpl: this.#fetch });\n return result as MeetingRequestEndpointResult<Endpoint>;\n }\n}\n\ntype RefreshTokenOptions = {\n refreshToken: string;\n clientId: string;\n clientSecret: string;\n};\n\ntype RefreshTokenResult = {\n access_token: string;\n expires_in: number;\n refresh_token: string;\n}\n"],"mappings":"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","names":["fetch","fetch"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/utils/lang.ts","../src/meeting/fetcher.ts","../src/client.ts"],"sourcesContent":["function notEmpty<T>(value: T | null | undefined): value is T {\n return value !== null && value !== undefined;\n}\n\nexport function compactObject<T>(obj: Record<string, T | null | undefined>): Record<string, T> {\n return Object.fromEntries(Object.entries(obj).filter(([, value]) => notEmpty(value))) as Record<string, T>;\n}\n","import { FetchImpl } from '../utils/fetch';\nimport { compactObject } from '../utils/lang';\n\nexport type FetcherExtraProps = {\n token: string | null;\n fetchImpl: FetchImpl;\n};\n\nconst baseUrl = 'https://api.zoom.us/v2';\n\nexport type ErrorWrapper<TError> = TError | { status: 'unknown'; payload: string };\n\nexport type FetcherOptions<TBody, THeaders, TQueryParams, TPathParams> = {\n url: string;\n method: string;\n body?: TBody | undefined;\n headers?: THeaders | undefined;\n queryParams?: TQueryParams | undefined;\n pathParams?: TPathParams | undefined;\n signal?: AbortSignal | undefined;\n} & FetcherExtraProps;\n\nexport async function fetch<\n TData,\n TError,\n TBody extends {} | FormData | undefined | null,\n THeaders extends {},\n TQueryParams extends {},\n TPathParams extends {}\n>({\n url,\n method,\n body,\n headers,\n pathParams,\n queryParams,\n signal,\n token,\n fetchImpl\n}: FetcherOptions<TBody, THeaders, TQueryParams, TPathParams>): Promise<TData> {\n try {\n const requestHeaders: HeadersInit = compactObject({\n 'Content-Type': 'application/json',\n Authorization: token ? `Bearer ${token}` : undefined,\n ...headers\n });\n\n /**\n * As the fetch API is being used, when multipart/form-data is specified\n * the Content-Type header must be deleted so that the browser can set\n * the correct boundary.\n * https://developer.mozilla.org/en-US/docs/Web/API/FormData/Using_FormData_Objects#sending_files_using_a_formdata_object\n */\n if (requestHeaders['Content-Type']?.toLowerCase().includes('multipart/form-data')) {\n delete requestHeaders['Content-Type'];\n }\n\n const payload =\n body instanceof FormData\n ? body\n : requestHeaders['Content-Type'] === 'application/json'\n ? JSON.stringify(body)\n : (body as string);\n\n const response = await fetchImpl(`${baseUrl}${resolveUrl(url, queryParams, pathParams)}`, {\n signal,\n method: method.toUpperCase(),\n body: payload,\n headers: requestHeaders\n });\n\n if (!response.ok) {\n let error: ErrorWrapper<TError>;\n try {\n error = await response.json();\n } catch (e) {\n error = {\n status: 'unknown' as const,\n payload: e instanceof Error ? `Unexpected error (${e.message})` : 'Unexpected error'\n };\n }\n\n throw error;\n }\n\n if (response.headers?.get('content-type')?.includes('json')) {\n return await response.json();\n } else {\n // if it is not a json response, assume it is a blob and cast it to TData\n return (await response.text()) as unknown as TData;\n }\n } catch (e) {\n let errorObject: Error = {\n name: 'unknown' as const,\n message: e instanceof Error ? `Network error (${e.message})` : 'Network error',\n stack: e as string\n };\n throw errorObject;\n }\n}\n\nconst resolveUrl = (url: string, queryParams: Record<string, string> = {}, pathParams: Record<string, string> = {}) => {\n let query = new URLSearchParams(queryParams).toString();\n if (query) query = `?${query}`;\n return url.replace(/\\{\\w*\\}/g, (key) => pathParams[key.slice(1, -1)] ?? '') + query;\n};\n","import { operationsByPath as meetingOperationsByPath } from './meeting/extra';\nimport { FetcherExtraProps, fetch as zoomFetch } from './meeting/fetcher';\nimport { FetchImpl } from './utils/fetch';\n\nexport interface ZoomApiOptions {\n token: string | null;\n fetch?: FetchImpl;\n}\n\ntype MeetingRequestEndpointParams<T extends keyof typeof meetingOperationsByPath> = Omit<\n Parameters<(typeof meetingOperationsByPath)[T]>[0],\n keyof FetcherExtraProps\n>;\n\ntype MeetingRequestEndpointResult<T extends keyof typeof meetingOperationsByPath> = ReturnType<(typeof meetingOperationsByPath)[T]>;\n\nexport class ZoomApi {\n #token: string | null;\n #fetch: FetchImpl;\n\n constructor(options: ZoomApiOptions) {\n this.#token = options.token;\n\n this.#fetch = options.fetch || (fetch as FetchImpl);\n if (!this.#fetch) throw new Error('Fetch is required');\n }\n\n get auth() {\n return {\n refreshToken: async ({\n refreshToken,\n clientId,\n clientSecret\n }: RefreshTokenOptions): Promise<RefreshTokenResult> => {\n const response = await this.#fetch(\"https://zoom.us/oauth/token\", {\n method: \"POST\",\n body: new URLSearchParams({\n grant_type: \"refresh_token\",\n refresh_token: refreshToken,\n client_id: clientId,\n client_secret: clientSecret\n })\n });\n\n if (!response.ok) {\n throw new Error(\"Failed to refresh Zoom token\");\n }\n\n const result = await response.json();\n\n return {\n access_token: result.access_token,\n expires_in: result.expires_in,\n refresh_token: result.refresh_token\n }\n }\n };\n }\n\n public async request<Endpoint extends keyof typeof meetingOperationsByPath>(\n endpoint: Endpoint,\n params: MeetingRequestEndpointParams<Endpoint>\n ) {\n const [method = '', url = ''] = endpoint.split(' ');\n const extraParams = (params || {}) as Record<string, unknown>;\n\n const result = await zoomFetch({ ...extraParams, method, url, token: this.#token, fetchImpl: this.#fetch });\n return result as MeetingRequestEndpointResult<Endpoint>;\n }\n}\n\ntype RefreshTokenOptions = {\n refreshToken: string;\n clientId: string;\n clientSecret: string;\n};\n\ntype RefreshTokenResult = {\n access_token: string;\n expires_in: number;\n refresh_token: string;\n}\n"],"mappings":"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","names":["fetch","fetch"]}