twelvelabs-js 0.1.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.
Files changed (194) hide show
  1. package/LICENSE +183 -0
  2. package/README.md +278 -0
  3. package/dist/README.md +278 -0
  4. package/dist/constants.d.ts +4 -0
  5. package/dist/constants.d.ts.map +1 -0
  6. package/dist/constants.js +7 -0
  7. package/dist/constants.js.map +1 -0
  8. package/dist/constants.mjs +4 -0
  9. package/dist/constants.mjs.map +1 -0
  10. package/dist/core.d.ts +23 -0
  11. package/dist/core.d.ts.map +1 -0
  12. package/dist/core.js +145 -0
  13. package/dist/core.js.map +1 -0
  14. package/dist/core.mjs +114 -0
  15. package/dist/core.mjs.map +1 -0
  16. package/dist/error.d.ts +34 -0
  17. package/dist/error.d.ts.map +1 -0
  18. package/dist/error.js +55 -0
  19. package/dist/error.js.map +1 -0
  20. package/dist/error.mjs +40 -0
  21. package/dist/error.mjs.map +1 -0
  22. package/dist/index.d.ts +20 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +69 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/index.mjs +23 -0
  27. package/dist/index.mjs.map +1 -0
  28. package/dist/interfaces.d.ts +7 -0
  29. package/dist/interfaces.d.ts.map +1 -0
  30. package/dist/interfaces.js +3 -0
  31. package/dist/interfaces.js.map +1 -0
  32. package/dist/interfaces.mjs +2 -0
  33. package/dist/interfaces.mjs.map +1 -0
  34. package/dist/models/engine/index.d.ts +16 -0
  35. package/dist/models/engine/index.d.ts.map +1 -0
  36. package/dist/models/engine/index.js +14 -0
  37. package/dist/models/engine/index.js.map +1 -0
  38. package/dist/models/engine/index.mjs +10 -0
  39. package/dist/models/engine/index.mjs.map +1 -0
  40. package/dist/models/generate/index.d.ts +29 -0
  41. package/dist/models/generate/index.d.ts.map +1 -0
  42. package/dist/models/generate/index.js +3 -0
  43. package/dist/models/generate/index.js.map +1 -0
  44. package/dist/models/generate/index.mjs +2 -0
  45. package/dist/models/generate/index.mjs.map +1 -0
  46. package/dist/models/index/index.d.ts +57 -0
  47. package/dist/models/index/index.d.ts.map +1 -0
  48. package/dist/models/index/index.js +72 -0
  49. package/dist/models/index/index.js.map +1 -0
  50. package/dist/models/index/index.mjs +67 -0
  51. package/dist/models/index/index.mjs.map +1 -0
  52. package/dist/models/index.d.ts +8 -0
  53. package/dist/models/index.d.ts.map +1 -0
  54. package/dist/models/index.js +24 -0
  55. package/dist/models/index.js.map +1 -0
  56. package/dist/models/index.mjs +8 -0
  57. package/dist/models/index.mjs.map +1 -0
  58. package/dist/models/interfaces.d.ts +7 -0
  59. package/dist/models/interfaces.d.ts.map +1 -0
  60. package/dist/models/interfaces.js +3 -0
  61. package/dist/models/interfaces.js.map +1 -0
  62. package/dist/models/interfaces.mjs +2 -0
  63. package/dist/models/interfaces.mjs.map +1 -0
  64. package/dist/models/search/index.d.ts +47 -0
  65. package/dist/models/search/index.d.ts.map +1 -0
  66. package/dist/models/search/index.js +22 -0
  67. package/dist/models/search/index.js.map +1 -0
  68. package/dist/models/search/index.mjs +18 -0
  69. package/dist/models/search/index.mjs.map +1 -0
  70. package/dist/models/task/index.d.ts +59 -0
  71. package/dist/models/task/index.d.ts.map +1 -0
  72. package/dist/models/task/index.js +67 -0
  73. package/dist/models/task/index.js.map +1 -0
  74. package/dist/models/task/index.mjs +62 -0
  75. package/dist/models/task/index.mjs.map +1 -0
  76. package/dist/models/video/index.d.ts +52 -0
  77. package/dist/models/video/index.d.ts.map +1 -0
  78. package/dist/models/video/index.js +64 -0
  79. package/dist/models/video/index.js.map +1 -0
  80. package/dist/models/video/index.mjs +59 -0
  81. package/dist/models/video/index.mjs.map +1 -0
  82. package/dist/package.json +37 -0
  83. package/dist/resource.d.ts +12 -0
  84. package/dist/resource.d.ts.map +1 -0
  85. package/dist/resource.js +17 -0
  86. package/dist/resource.js.map +1 -0
  87. package/dist/resource.mjs +13 -0
  88. package/dist/resource.mjs.map +1 -0
  89. package/dist/resources/engine/index.d.ts +8 -0
  90. package/dist/resources/engine/index.d.ts.map +1 -0
  91. package/dist/resources/engine/index.js +42 -0
  92. package/dist/resources/engine/index.js.map +1 -0
  93. package/dist/resources/engine/index.mjs +15 -0
  94. package/dist/resources/engine/index.mjs.map +1 -0
  95. package/dist/resources/generate/index.d.ts +10 -0
  96. package/dist/resources/generate/index.d.ts.map +1 -0
  97. package/dist/resources/generate/index.js +36 -0
  98. package/dist/resources/generate/index.js.map +1 -0
  99. package/dist/resources/generate/index.mjs +32 -0
  100. package/dist/resources/generate/index.mjs.map +1 -0
  101. package/dist/resources/generate/interfaces.d.ts +3 -0
  102. package/dist/resources/generate/interfaces.d.ts.map +1 -0
  103. package/dist/resources/generate/interfaces.js +3 -0
  104. package/dist/resources/generate/interfaces.js.map +1 -0
  105. package/dist/resources/generate/interfaces.mjs +2 -0
  106. package/dist/resources/generate/interfaces.mjs.map +1 -0
  107. package/dist/resources/index/index.d.ts +17 -0
  108. package/dist/resources/index/index.d.ts.map +1 -0
  109. package/dist/resources/index/index.js +82 -0
  110. package/dist/resources/index/index.js.map +1 -0
  111. package/dist/resources/index/index.mjs +55 -0
  112. package/dist/resources/index/index.mjs.map +1 -0
  113. package/dist/resources/index/interfaces.d.ts +18 -0
  114. package/dist/resources/index/interfaces.d.ts.map +1 -0
  115. package/dist/resources/index/interfaces.js +3 -0
  116. package/dist/resources/index/interfaces.js.map +1 -0
  117. package/dist/resources/index/interfaces.mjs +2 -0
  118. package/dist/resources/index/interfaces.mjs.map +1 -0
  119. package/dist/resources/index.d.ts +12 -0
  120. package/dist/resources/index.d.ts.map +1 -0
  121. package/dist/resources/index.js +28 -0
  122. package/dist/resources/index.js.map +1 -0
  123. package/dist/resources/index.mjs +12 -0
  124. package/dist/resources/index.mjs.map +1 -0
  125. package/dist/resources/search/index.d.ts +9 -0
  126. package/dist/resources/search/index.d.ts.map +1 -0
  127. package/dist/resources/search/index.js +45 -0
  128. package/dist/resources/search/index.js.map +1 -0
  129. package/dist/resources/search/index.mjs +18 -0
  130. package/dist/resources/search/index.mjs.map +1 -0
  131. package/dist/resources/search/interfaces.d.ts +13 -0
  132. package/dist/resources/search/interfaces.d.ts.map +1 -0
  133. package/dist/resources/search/interfaces.js +3 -0
  134. package/dist/resources/search/interfaces.js.map +1 -0
  135. package/dist/resources/search/interfaces.mjs +2 -0
  136. package/dist/resources/search/interfaces.mjs.map +1 -0
  137. package/dist/resources/task/index.d.ts +23 -0
  138. package/dist/resources/task/index.d.ts.map +1 -0
  139. package/dist/resources/task/index.js +147 -0
  140. package/dist/resources/task/index.js.map +1 -0
  141. package/dist/resources/task/index.mjs +117 -0
  142. package/dist/resources/task/index.mjs.map +1 -0
  143. package/dist/resources/task/interfaces.d.ts +24 -0
  144. package/dist/resources/task/interfaces.d.ts.map +1 -0
  145. package/dist/resources/task/interfaces.js +3 -0
  146. package/dist/resources/task/interfaces.js.map +1 -0
  147. package/dist/resources/task/interfaces.mjs +2 -0
  148. package/dist/resources/task/interfaces.mjs.map +1 -0
  149. package/dist/resources/video/index.d.ts +16 -0
  150. package/dist/resources/video/index.d.ts.map +1 -0
  151. package/dist/resources/video/index.js +92 -0
  152. package/dist/resources/video/index.js.map +1 -0
  153. package/dist/resources/video/index.mjs +65 -0
  154. package/dist/resources/video/index.mjs.map +1 -0
  155. package/dist/resources/video/interfaces.d.ts +23 -0
  156. package/dist/resources/video/interfaces.d.ts.map +1 -0
  157. package/dist/resources/video/interfaces.js +3 -0
  158. package/dist/resources/video/interfaces.js.map +1 -0
  159. package/dist/resources/video/interfaces.mjs +2 -0
  160. package/dist/resources/video/interfaces.mjs.map +1 -0
  161. package/dist/src/constants.ts +3 -0
  162. package/dist/src/core.ts +138 -0
  163. package/dist/src/error.ts +40 -0
  164. package/dist/src/index.ts +86 -0
  165. package/dist/src/interfaces.ts +6 -0
  166. package/dist/src/models/engine/index.ts +23 -0
  167. package/dist/src/models/generate/index.ts +32 -0
  168. package/dist/src/models/index/index.ts +135 -0
  169. package/dist/src/models/index.ts +7 -0
  170. package/dist/src/models/interfaces.ts +6 -0
  171. package/dist/src/models/search/index.ts +66 -0
  172. package/dist/src/models/task/index.ts +132 -0
  173. package/dist/src/models/video/index.ts +135 -0
  174. package/dist/src/resource.ts +21 -0
  175. package/dist/src/resources/engine/index.ts +17 -0
  176. package/dist/src/resources/generate/index.ts +56 -0
  177. package/dist/src/resources/generate/interfaces.ts +2 -0
  178. package/dist/src/resources/index/index.ts +91 -0
  179. package/dist/src/resources/index/interfaces.ts +16 -0
  180. package/dist/src/resources/index.ts +12 -0
  181. package/dist/src/resources/search/index.ts +28 -0
  182. package/dist/src/resources/search/interfaces.ts +12 -0
  183. package/dist/src/resources/task/index.ts +161 -0
  184. package/dist/src/resources/task/interfaces.ts +23 -0
  185. package/dist/src/resources/video/index.ts +157 -0
  186. package/dist/src/resources/video/interfaces.ts +25 -0
  187. package/dist/src/util.ts +94 -0
  188. package/dist/util.d.ts +5 -0
  189. package/dist/util.d.ts.map +1 -0
  190. package/dist/util.js +94 -0
  191. package/dist/util.js.map +1 -0
  192. package/dist/util.mjs +87 -0
  193. package/dist/util.mjs.map +1 -0
  194. package/package.json +37 -0
@@ -0,0 +1,157 @@
1
+ import { RequestOptions } from '../../core';
2
+ import * as Models from '../../models';
3
+ import { APIResource } from '../../resource';
4
+ import { convertKeysToSnakeCase, handleComparisonParams, removeUndefinedValues } from '../../util';
5
+ import { ListVideoParams, UpdateVideoParams, VideoFilterOptions } from './interfaces';
6
+
7
+ export class Video extends APIResource {
8
+ async retrieve(indexId: string, id: string, options: RequestOptions = {}): Promise<Models.Video> {
9
+ const res = await this._get<Models.VideoResponse>(
10
+ `indexes/${indexId}/videos/${id}`,
11
+ {},
12
+ { ...options, skipCamelKeys: ['metadata'] },
13
+ );
14
+ return new Models.Video(this, indexId, res);
15
+ }
16
+
17
+ async list(
18
+ indexId: string,
19
+ {
20
+ id,
21
+ size,
22
+ width,
23
+ height,
24
+ duration,
25
+ fps,
26
+ createdAt,
27
+ updatedAt,
28
+ indexedAt,
29
+ ...restParams
30
+ }: ListVideoParams = {},
31
+ options: RequestOptions = {},
32
+ ): Promise<Models.Video[]> {
33
+ const _params = convertKeysToSnakeCase({
34
+ ...restParams,
35
+ _id: id,
36
+ });
37
+ handleComparisonParams(_params, 'size', size);
38
+ handleComparisonParams(_params, 'width', width);
39
+ handleComparisonParams(_params, 'height', height);
40
+ handleComparisonParams(_params, 'duration', duration);
41
+ handleComparisonParams(_params, 'fps', fps);
42
+ handleComparisonParams(_params, 'createdAt', createdAt);
43
+ handleComparisonParams(_params, 'updatedAt', updatedAt);
44
+ handleComparisonParams(_params, 'updatedAt', updatedAt);
45
+ const res = await this._get<{ data: Models.VideoResponse[] }>(
46
+ `indexes/${indexId}/videos`,
47
+ removeUndefinedValues(_params),
48
+ { ...options, skipCamelKeys: ['metadata'] },
49
+ );
50
+ return res.data.map((v) => new Models.Video(this, indexId, v));
51
+ }
52
+
53
+ async listPagination(
54
+ indexId: string,
55
+ {
56
+ id,
57
+ size,
58
+ width,
59
+ height,
60
+ duration,
61
+ fps,
62
+ createdAt,
63
+ updatedAt,
64
+ indexedAt,
65
+ ...restParams
66
+ }: ListVideoParams = {},
67
+ options: RequestOptions = {},
68
+ ): Promise<Models.VideoListWithPagination> {
69
+ const originParams = { id, ...restParams };
70
+ const _params = convertKeysToSnakeCase({
71
+ ...restParams,
72
+ _id: id,
73
+ });
74
+ handleComparisonParams(_params, 'size', size);
75
+ handleComparisonParams(_params, 'width', width);
76
+ handleComparisonParams(_params, 'height', height);
77
+ handleComparisonParams(_params, 'duration', duration);
78
+ handleComparisonParams(_params, 'fps', fps);
79
+ handleComparisonParams(_params, 'createdAt', createdAt);
80
+ handleComparisonParams(_params, 'updatedAt', updatedAt);
81
+ handleComparisonParams(_params, 'updatedAt', updatedAt);
82
+ const res = await this._get<{ data: Models.VideoResponse[]; pageInfo: Models.PageInfo }>(
83
+ `indexes/${indexId}/videos`,
84
+ removeUndefinedValues(_params),
85
+ { ...options, skipCamelKeys: ['metadata'] },
86
+ );
87
+ return new Models.VideoListWithPagination(this, originParams, indexId, res.data, res.pageInfo);
88
+ }
89
+
90
+ async update(
91
+ indexId: string,
92
+ id: string,
93
+ { title, metadata }: UpdateVideoParams,
94
+ options: RequestOptions = {},
95
+ ): Promise<void> {
96
+ await this._put<void>(
97
+ `indexes/${indexId}/videos/${id}`,
98
+ removeUndefinedValues(convertKeysToSnakeCase({ videoTitle: title, metadata })),
99
+ options,
100
+ );
101
+ }
102
+
103
+ async delete(indexId: string, id: string, options: RequestOptions = {}): Promise<void> {
104
+ await this._delete<void>(`indexes/${indexId}/videos/${id}`, options);
105
+ }
106
+
107
+ async transcription(
108
+ indexId: string,
109
+ id: string,
110
+ filter: VideoFilterOptions = {},
111
+ options: RequestOptions = {},
112
+ ): Promise<Models.VideoValue[]> {
113
+ const res = await this._get<{ data: Models.VideoValue[] }>(
114
+ `indexes/${indexId}/videos/${id}/transcription`,
115
+ removeUndefinedValues(filter),
116
+ options,
117
+ );
118
+ return res.data || [];
119
+ }
120
+
121
+ async textInVideo(
122
+ indexId: string,
123
+ id: string,
124
+ filter: VideoFilterOptions = {},
125
+ options: RequestOptions = {},
126
+ ): Promise<Models.VideoValue[]> {
127
+ const res = await this._get<{ data: Models.VideoValue[] }>(
128
+ `indexes/${indexId}/videos/${id}/text-in-video`,
129
+ removeUndefinedValues(filter),
130
+ options,
131
+ );
132
+ return res.data || [];
133
+ }
134
+
135
+ async logo(
136
+ indexId: string,
137
+ id: string,
138
+ filter: VideoFilterOptions = {},
139
+ options: RequestOptions = {},
140
+ ): Promise<Models.VideoValue[]> {
141
+ const res = await this._get<{ data: Models.VideoValue[] }>(
142
+ `indexes/${indexId}/videos/${id}/logo`,
143
+ removeUndefinedValues(filter),
144
+ options,
145
+ );
146
+ return res.data || [];
147
+ }
148
+
149
+ async thumbnail(indexId: string, id: string, time?: number, options: RequestOptions = {}): Promise<string> {
150
+ const res = await this._get<{ thumbnail: string }>(
151
+ `indexes/${indexId}/videos/${id}/transcription`,
152
+ removeUndefinedValues({ time }),
153
+ options,
154
+ );
155
+ return res.thumbnail;
156
+ }
157
+ }
@@ -0,0 +1,25 @@
1
+ import { PageOptions } from '../../interfaces';
2
+
3
+ export interface ListVideoParams extends PageOptions {
4
+ id?: string;
5
+ filename?: string;
6
+ size?: number | Record<string, number>;
7
+ width?: number | Record<string, number>;
8
+ height?: number | Record<string, number>;
9
+ duration?: number | Record<string, number>;
10
+ fps?: number | Record<string, number>;
11
+ metadata?: Record<string, any>;
12
+ createdAt?: string | Record<string, string>;
13
+ updatedAt?: string | Record<string, string>;
14
+ indexedAt?: string | Record<string, string>;
15
+ }
16
+
17
+ export interface UpdateVideoParams {
18
+ title?: string;
19
+ metadata?: Record<string, any>;
20
+ }
21
+
22
+ export interface VideoFilterOptions {
23
+ start?: number;
24
+ end?: number;
25
+ }
@@ -0,0 +1,94 @@
1
+ // Converts object keys from snake_case or leading underscore format to camelCase.
2
+ // This function is recursive, so it works on nested objects and arrays of objects as well.
3
+ //
4
+ // Examples:
5
+ // 1. Converting simple object keys:
6
+ // Input: {"first_name": "John", "last_name": "Doe"}
7
+ // Output: {"firstName": "John", "lastName": "Doe"}
8
+ //
9
+ // 2. Handling keys with leading underscores:
10
+ // Input: {"_id": 123, "user_name": "johndoe"}
11
+ // Output: {"id": 123, "userName": "johndoe"}
12
+ //
13
+ // 3. Working with nested objects:
14
+ // Input: {"user_details": {"first_name": "John", "last_name": "Doe"}}
15
+ // Output: {"userDetails": {"firstName": "John", "lastName": "Doe"}}
16
+ //
17
+ // 4. Processing arrays of objects:
18
+ // Input: [{"user_name": "johndoe"}, {"user_name": "janedoe"}]
19
+ // Output: [{"userName": "johndoe"}, {"userName": "janedoe"}]
20
+ export function convertKeysToCamelCase(obj: any, skipKeys?: string[]): any {
21
+ if (Array.isArray(obj)) {
22
+ return obj.map((v) => convertKeysToCamelCase(v));
23
+ } else if (obj !== null && obj.constructor === Object) {
24
+ return Object.keys(obj).reduce((result, key) => {
25
+ // Skip converting keys by `skipKeys`
26
+ if (skipKeys?.includes(key)) {
27
+ return { ...result, [key]: obj[key] };
28
+ }
29
+ // Check if key starts with "_"
30
+ if (key.startsWith('_')) {
31
+ // If so, remove the underscore and use the rest of the key as is
32
+ const newKey = key.substring(1);
33
+ return {
34
+ ...result,
35
+ [newKey]: convertKeysToCamelCase(obj[key]),
36
+ };
37
+ } else {
38
+ // Use the existing replacement logic for other keys
39
+ const camelCaseKey = key.replace(/([-_][a-z])/g, (group) =>
40
+ group.toUpperCase().replace('-', '').replace('_', ''),
41
+ );
42
+ return {
43
+ ...result,
44
+ [camelCaseKey]: convertKeysToCamelCase(obj[key]),
45
+ };
46
+ }
47
+ }, {});
48
+ }
49
+ return obj;
50
+ }
51
+
52
+ // Convert keys of an object from camelCase to snake_case, always applying deeply
53
+ export function convertKeysToSnakeCase<T>(obj: T): T {
54
+ if (Array.isArray(obj)) {
55
+ return obj.map((item) => convertKeysToSnakeCase(item)) as unknown as T; // Recursively apply to array elements
56
+ } else if (obj !== null && typeof obj === 'object' && !(obj instanceof Date)) {
57
+ return Object.keys(obj).reduce((acc, key) => {
58
+ const snakeKey = key.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`);
59
+ acc[snakeKey] = convertKeysToSnakeCase(obj[key]); // Recursively apply to nested objects
60
+ return acc;
61
+ }, {} as T);
62
+ }
63
+ return obj;
64
+ }
65
+
66
+ export function removeUndefinedValues(obj: Record<string, any>): Record<string, any> {
67
+ return Object.entries(obj).reduce(
68
+ (acc, [key, value]) => {
69
+ if (value !== undefined) {
70
+ acc[key] = value;
71
+ }
72
+ return acc;
73
+ },
74
+ {} as Record<string, any>,
75
+ );
76
+ }
77
+
78
+ export function handleComparisonParams(
79
+ params: Record<string, any>,
80
+ key: string,
81
+ value: any | Record<string, any>,
82
+ ): void {
83
+ if (typeof value === 'object') {
84
+ for (const op in value) {
85
+ if (value.hasOwnProperty(op)) {
86
+ const paramKey = `${key}[${op}]`;
87
+ params[paramKey] = value[op];
88
+ }
89
+ }
90
+ params[key] = undefined;
91
+ } else {
92
+ params[key] = value;
93
+ }
94
+ }
package/dist/util.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ export declare function convertKeysToCamelCase(obj: any, skipKeys?: string[]): any;
2
+ export declare function convertKeysToSnakeCase<T>(obj: T): T;
3
+ export declare function removeUndefinedValues(obj: Record<string, any>): Record<string, any>;
4
+ export declare function handleComparisonParams(params: Record<string, any>, key: string, value: any | Record<string, any>): void;
5
+ //# sourceMappingURL=util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["src/util.ts"],"names":[],"mappings":"AAmBA,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAG,GAAG,CA8BzE;AAGD,wBAAgB,sBAAsB,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAWnD;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAUnF;AAED,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC3B,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC/B,IAAI,CAYN"}
package/dist/util.js ADDED
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.handleComparisonParams = exports.removeUndefinedValues = exports.convertKeysToSnakeCase = exports.convertKeysToCamelCase = void 0;
4
+ // Converts object keys from snake_case or leading underscore format to camelCase.
5
+ // This function is recursive, so it works on nested objects and arrays of objects as well.
6
+ //
7
+ // Examples:
8
+ // 1. Converting simple object keys:
9
+ // Input: {"first_name": "John", "last_name": "Doe"}
10
+ // Output: {"firstName": "John", "lastName": "Doe"}
11
+ //
12
+ // 2. Handling keys with leading underscores:
13
+ // Input: {"_id": 123, "user_name": "johndoe"}
14
+ // Output: {"id": 123, "userName": "johndoe"}
15
+ //
16
+ // 3. Working with nested objects:
17
+ // Input: {"user_details": {"first_name": "John", "last_name": "Doe"}}
18
+ // Output: {"userDetails": {"firstName": "John", "lastName": "Doe"}}
19
+ //
20
+ // 4. Processing arrays of objects:
21
+ // Input: [{"user_name": "johndoe"}, {"user_name": "janedoe"}]
22
+ // Output: [{"userName": "johndoe"}, {"userName": "janedoe"}]
23
+ function convertKeysToCamelCase(obj, skipKeys) {
24
+ if (Array.isArray(obj)) {
25
+ return obj.map((v) => convertKeysToCamelCase(v));
26
+ }
27
+ else if (obj !== null && obj.constructor === Object) {
28
+ return Object.keys(obj).reduce((result, key) => {
29
+ // Skip converting keys by `skipKeys`
30
+ if (skipKeys?.includes(key)) {
31
+ return { ...result, [key]: obj[key] };
32
+ }
33
+ // Check if key starts with "_"
34
+ if (key.startsWith('_')) {
35
+ // If so, remove the underscore and use the rest of the key as is
36
+ const newKey = key.substring(1);
37
+ return {
38
+ ...result,
39
+ [newKey]: convertKeysToCamelCase(obj[key]),
40
+ };
41
+ }
42
+ else {
43
+ // Use the existing replacement logic for other keys
44
+ const camelCaseKey = key.replace(/([-_][a-z])/g, (group) => group.toUpperCase().replace('-', '').replace('_', ''));
45
+ return {
46
+ ...result,
47
+ [camelCaseKey]: convertKeysToCamelCase(obj[key]),
48
+ };
49
+ }
50
+ }, {});
51
+ }
52
+ return obj;
53
+ }
54
+ exports.convertKeysToCamelCase = convertKeysToCamelCase;
55
+ // Convert keys of an object from camelCase to snake_case, always applying deeply
56
+ function convertKeysToSnakeCase(obj) {
57
+ if (Array.isArray(obj)) {
58
+ return obj.map((item) => convertKeysToSnakeCase(item)); // Recursively apply to array elements
59
+ }
60
+ else if (obj !== null && typeof obj === 'object' && !(obj instanceof Date)) {
61
+ return Object.keys(obj).reduce((acc, key) => {
62
+ const snakeKey = key.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`);
63
+ acc[snakeKey] = convertKeysToSnakeCase(obj[key]); // Recursively apply to nested objects
64
+ return acc;
65
+ }, {});
66
+ }
67
+ return obj;
68
+ }
69
+ exports.convertKeysToSnakeCase = convertKeysToSnakeCase;
70
+ function removeUndefinedValues(obj) {
71
+ return Object.entries(obj).reduce((acc, [key, value]) => {
72
+ if (value !== undefined) {
73
+ acc[key] = value;
74
+ }
75
+ return acc;
76
+ }, {});
77
+ }
78
+ exports.removeUndefinedValues = removeUndefinedValues;
79
+ function handleComparisonParams(params, key, value) {
80
+ if (typeof value === 'object') {
81
+ for (const op in value) {
82
+ if (value.hasOwnProperty(op)) {
83
+ const paramKey = `${key}[${op}]`;
84
+ params[paramKey] = value[op];
85
+ }
86
+ }
87
+ params[key] = undefined;
88
+ }
89
+ else {
90
+ params[key] = value;
91
+ }
92
+ }
93
+ exports.handleComparisonParams = handleComparisonParams;
94
+ //# sourceMappingURL=util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["src/util.ts"],"names":[],"mappings":"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"}
package/dist/util.mjs ADDED
@@ -0,0 +1,87 @@
1
+ // Converts object keys from snake_case or leading underscore format to camelCase.
2
+ // This function is recursive, so it works on nested objects and arrays of objects as well.
3
+ //
4
+ // Examples:
5
+ // 1. Converting simple object keys:
6
+ // Input: {"first_name": "John", "last_name": "Doe"}
7
+ // Output: {"firstName": "John", "lastName": "Doe"}
8
+ //
9
+ // 2. Handling keys with leading underscores:
10
+ // Input: {"_id": 123, "user_name": "johndoe"}
11
+ // Output: {"id": 123, "userName": "johndoe"}
12
+ //
13
+ // 3. Working with nested objects:
14
+ // Input: {"user_details": {"first_name": "John", "last_name": "Doe"}}
15
+ // Output: {"userDetails": {"firstName": "John", "lastName": "Doe"}}
16
+ //
17
+ // 4. Processing arrays of objects:
18
+ // Input: [{"user_name": "johndoe"}, {"user_name": "janedoe"}]
19
+ // Output: [{"userName": "johndoe"}, {"userName": "janedoe"}]
20
+ export function convertKeysToCamelCase(obj, skipKeys) {
21
+ if (Array.isArray(obj)) {
22
+ return obj.map((v) => convertKeysToCamelCase(v));
23
+ }
24
+ else if (obj !== null && obj.constructor === Object) {
25
+ return Object.keys(obj).reduce((result, key) => {
26
+ // Skip converting keys by `skipKeys`
27
+ if (skipKeys?.includes(key)) {
28
+ return { ...result, [key]: obj[key] };
29
+ }
30
+ // Check if key starts with "_"
31
+ if (key.startsWith('_')) {
32
+ // If so, remove the underscore and use the rest of the key as is
33
+ const newKey = key.substring(1);
34
+ return {
35
+ ...result,
36
+ [newKey]: convertKeysToCamelCase(obj[key]),
37
+ };
38
+ }
39
+ else {
40
+ // Use the existing replacement logic for other keys
41
+ const camelCaseKey = key.replace(/([-_][a-z])/g, (group) => group.toUpperCase().replace('-', '').replace('_', ''));
42
+ return {
43
+ ...result,
44
+ [camelCaseKey]: convertKeysToCamelCase(obj[key]),
45
+ };
46
+ }
47
+ }, {});
48
+ }
49
+ return obj;
50
+ }
51
+ // Convert keys of an object from camelCase to snake_case, always applying deeply
52
+ export function convertKeysToSnakeCase(obj) {
53
+ if (Array.isArray(obj)) {
54
+ return obj.map((item) => convertKeysToSnakeCase(item)); // Recursively apply to array elements
55
+ }
56
+ else if (obj !== null && typeof obj === 'object' && !(obj instanceof Date)) {
57
+ return Object.keys(obj).reduce((acc, key) => {
58
+ const snakeKey = key.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`);
59
+ acc[snakeKey] = convertKeysToSnakeCase(obj[key]); // Recursively apply to nested objects
60
+ return acc;
61
+ }, {});
62
+ }
63
+ return obj;
64
+ }
65
+ export function removeUndefinedValues(obj) {
66
+ return Object.entries(obj).reduce((acc, [key, value]) => {
67
+ if (value !== undefined) {
68
+ acc[key] = value;
69
+ }
70
+ return acc;
71
+ }, {});
72
+ }
73
+ export function handleComparisonParams(params, key, value) {
74
+ if (typeof value === 'object') {
75
+ for (const op in value) {
76
+ if (value.hasOwnProperty(op)) {
77
+ const paramKey = `${key}[${op}]`;
78
+ params[paramKey] = value[op];
79
+ }
80
+ }
81
+ params[key] = undefined;
82
+ }
83
+ else {
84
+ params[key] = value;
85
+ }
86
+ }
87
+ //# sourceMappingURL=util.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.mjs","sourceRoot":"","sources":["src/util.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,37 @@
1
+ {
2
+ "name": "twelvelabs-js",
3
+ "version": "0.1.0",
4
+ "description": "Official TwelveLabs SDK for Javascript",
5
+ "author": "TwelveLabs",
6
+ "repository": "github:twelvelabs-io/twelvelabs-js",
7
+ "license": "Apache-2.0",
8
+ "main": "dist/index.js",
9
+ "types": "dist/index.d.ts",
10
+ "type": "commonjs",
11
+ "files": [
12
+ "/dist"
13
+ ],
14
+ "scripts": {
15
+ "lint": "eslint --ext ts,js .",
16
+ "fix": "eslint --fix --ext ts,js .",
17
+ "build-local": "bash build-local"
18
+ },
19
+ "dependencies": {
20
+ "form-data": "^4.0.0",
21
+ "node-fetch": "^2.6.7"
22
+ },
23
+ "devDependencies": {
24
+ "@types/node": "^18.11.18",
25
+ "@types/node-fetch": "^2.6.4",
26
+ "@typescript-eslint/eslint-plugin": "^6.7.0",
27
+ "@typescript-eslint/parser": "^6.7.0",
28
+ "eslint": "^8.49.0",
29
+ "eslint-plugin-prettier": "^5.0.1",
30
+ "eslint-plugin-unused-imports": "^3.0.0",
31
+ "prettier": "^3.0.0",
32
+ "ts-node": "^10.5.0",
33
+ "tsc-multi": "^1.1.0",
34
+ "tsconfig-paths": "^4.2.0",
35
+ "typescript": "^4.8.2"
36
+ }
37
+ }