mtlx-sdk 0.0.0-bootstrap.0 → 0.10.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 (115) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +175 -0
  3. package/dist/client.d.ts +67 -0
  4. package/dist/client.d.ts.map +1 -0
  5. package/dist/client.js +141 -0
  6. package/dist/client.js.map +1 -0
  7. package/dist/index.d.ts +26 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +26 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/lib/buildPath.d.ts +19 -0
  12. package/dist/lib/buildPath.d.ts.map +1 -0
  13. package/dist/lib/buildPath.js +46 -0
  14. package/dist/lib/buildPath.js.map +1 -0
  15. package/dist/lib/dashboardLinks.d.ts +19 -0
  16. package/dist/lib/dashboardLinks.d.ts.map +1 -0
  17. package/dist/lib/dashboardLinks.js +37 -0
  18. package/dist/lib/dashboardLinks.js.map +1 -0
  19. package/dist/lib/enums.d.ts +41 -0
  20. package/dist/lib/enums.d.ts.map +1 -0
  21. package/dist/lib/enums.js +293 -0
  22. package/dist/lib/enums.js.map +1 -0
  23. package/dist/lib/eventRouter.d.ts +41 -0
  24. package/dist/lib/eventRouter.d.ts.map +1 -0
  25. package/dist/lib/eventRouter.js +43 -0
  26. package/dist/lib/eventRouter.js.map +1 -0
  27. package/dist/lib/fetchBinary.d.ts +15 -0
  28. package/dist/lib/fetchBinary.d.ts.map +1 -0
  29. package/dist/lib/fetchBinary.js +35 -0
  30. package/dist/lib/fetchBinary.js.map +1 -0
  31. package/dist/lib/fileFormats.d.ts +67 -0
  32. package/dist/lib/fileFormats.d.ts.map +1 -0
  33. package/dist/lib/fileFormats.js +92 -0
  34. package/dist/lib/fileFormats.js.map +1 -0
  35. package/dist/lib/list.d.ts +59 -0
  36. package/dist/lib/list.d.ts.map +1 -0
  37. package/dist/lib/list.js +53 -0
  38. package/dist/lib/list.js.map +1 -0
  39. package/dist/lib/parseResult.d.ts +14 -0
  40. package/dist/lib/parseResult.d.ts.map +1 -0
  41. package/dist/lib/parseResult.js +13 -0
  42. package/dist/lib/parseResult.js.map +1 -0
  43. package/dist/lib/schemas.d.ts +48 -0
  44. package/dist/lib/schemas.d.ts.map +1 -0
  45. package/dist/lib/schemas.js +43 -0
  46. package/dist/lib/schemas.js.map +1 -0
  47. package/dist/lib/types.d.ts +46 -0
  48. package/dist/lib/types.d.ts.map +1 -0
  49. package/dist/lib/types.js +22 -0
  50. package/dist/lib/types.js.map +1 -0
  51. package/dist/lib/upload.d.ts +36 -0
  52. package/dist/lib/upload.d.ts.map +1 -0
  53. package/dist/lib/upload.js +79 -0
  54. package/dist/lib/upload.js.map +1 -0
  55. package/dist/lib/url.d.ts +7 -0
  56. package/dist/lib/url.d.ts.map +1 -0
  57. package/dist/lib/url.js +26 -0
  58. package/dist/lib/url.js.map +1 -0
  59. package/dist/routes/apiTokens.d.ts +172 -0
  60. package/dist/routes/apiTokens.d.ts.map +1 -0
  61. package/dist/routes/apiTokens.js +133 -0
  62. package/dist/routes/apiTokens.js.map +1 -0
  63. package/dist/routes/assets.d.ts +545 -0
  64. package/dist/routes/assets.d.ts.map +1 -0
  65. package/dist/routes/assets.js +275 -0
  66. package/dist/routes/assets.js.map +1 -0
  67. package/dist/routes/auth.d.ts +102 -0
  68. package/dist/routes/auth.d.ts.map +1 -0
  69. package/dist/routes/auth.js +98 -0
  70. package/dist/routes/auth.js.map +1 -0
  71. package/dist/routes/avatars.d.ts +130 -0
  72. package/dist/routes/avatars.d.ts.map +1 -0
  73. package/dist/routes/avatars.js +121 -0
  74. package/dist/routes/avatars.js.map +1 -0
  75. package/dist/routes/comments.d.ts +165 -0
  76. package/dist/routes/comments.d.ts.map +1 -0
  77. package/dist/routes/comments.js +106 -0
  78. package/dist/routes/comments.js.map +1 -0
  79. package/dist/routes/error.d.ts +10 -0
  80. package/dist/routes/error.d.ts.map +1 -0
  81. package/dist/routes/error.js +12 -0
  82. package/dist/routes/error.js.map +1 -0
  83. package/dist/routes/files.d.ts +70 -0
  84. package/dist/routes/files.d.ts.map +1 -0
  85. package/dist/routes/files.js +80 -0
  86. package/dist/routes/files.js.map +1 -0
  87. package/dist/routes/health.d.ts +10 -0
  88. package/dist/routes/health.d.ts.map +1 -0
  89. package/dist/routes/health.js +12 -0
  90. package/dist/routes/health.js.map +1 -0
  91. package/dist/routes/media.d.ts +22 -0
  92. package/dist/routes/media.d.ts.map +1 -0
  93. package/dist/routes/media.js +18 -0
  94. package/dist/routes/media.js.map +1 -0
  95. package/dist/routes/notifications.d.ts +164 -0
  96. package/dist/routes/notifications.d.ts.map +1 -0
  97. package/dist/routes/notifications.js +97 -0
  98. package/dist/routes/notifications.js.map +1 -0
  99. package/dist/routes/oembed.d.ts +80 -0
  100. package/dist/routes/oembed.d.ts.map +1 -0
  101. package/dist/routes/oembed.js +74 -0
  102. package/dist/routes/oembed.js.map +1 -0
  103. package/dist/routes/serverEvents.d.ts +521 -0
  104. package/dist/routes/serverEvents.d.ts.map +1 -0
  105. package/dist/routes/serverEvents.js +136 -0
  106. package/dist/routes/serverEvents.js.map +1 -0
  107. package/dist/routes/tasks.d.ts +242 -0
  108. package/dist/routes/tasks.d.ts.map +1 -0
  109. package/dist/routes/tasks.js +185 -0
  110. package/dist/routes/tasks.js.map +1 -0
  111. package/dist/routes/users.d.ts +1055 -0
  112. package/dist/routes/users.d.ts.map +1 -0
  113. package/dist/routes/users.js +233 -0
  114. package/dist/routes/users.js.map +1 -0
  115. package/package.json +46 -4
@@ -0,0 +1,92 @@
1
+ const FILE_FORMAT_DEFINITIONS = {
2
+ gif: { name: 'GIF', mimeType: 'image/gif', extension: '.gif' },
3
+ jpg: { name: 'JPEG', mimeType: 'image/jpeg', extension: '.jpg', alternativeExtensions: ['.jpeg'] },
4
+ mtlx: {
5
+ name: 'MaterialX',
6
+ mimeType: 'application/xml',
7
+ extension: '.mtlx',
8
+ alternativeMimeTypes: ['text/xml'],
9
+ },
10
+ mtlxzip: {
11
+ name: 'MaterialX Package (MTLX.ZIP)',
12
+ mimeType: 'application/zip',
13
+ extension: '.mtlx.zip',
14
+ alternativeMimeTypes: ['application/octet-stream'],
15
+ },
16
+ png: { name: 'PNG', mimeType: 'image/png', extension: '.png' },
17
+ webp: { name: 'WebP', mimeType: 'image/webp', extension: '.webp' },
18
+ };
19
+ export const FileFormat = Object.keys(FILE_FORMAT_DEFINITIONS);
20
+ export const MimeType = [
21
+ ...new Set(Object.values(FILE_FORMAT_DEFINITIONS).map((definition) => definition.mimeType)),
22
+ ];
23
+ export const FileFormatToFileFormatInfo = FileFormat.reduce((acc, format) => {
24
+ const definition = FILE_FORMAT_DEFINITIONS[format];
25
+ const alternativeExtensions = 'alternativeExtensions' in definition ? definition.alternativeExtensions : [];
26
+ const alternativeMimeTypes = 'alternativeMimeTypes' in definition ? definition.alternativeMimeTypes : [];
27
+ acc[format] = { format, ...definition, alternativeExtensions, alternativeMimeTypes };
28
+ return acc;
29
+ }, {});
30
+ export function getFileFormatInfos(formats) {
31
+ return formats.map((format) => FileFormatToFileFormatInfo[format]);
32
+ }
33
+ export const MATERIAL_ASSET_FILE_FORMATS = ['mtlx', 'mtlxzip'];
34
+ function getDescriptionExtensionList(fileFormatInfos) {
35
+ return Array.from(new Set(fileFormatInfos.flatMap((fileFormatInfo) => [fileFormatInfo.extension, ...fileFormatInfo.alternativeExtensions].map((ext) => ext.replace('.', '').toUpperCase())))).join(', ');
36
+ }
37
+ function buildAssetTypeDescription(prefix, fileFormatInfos) {
38
+ return `${prefix} (${getDescriptionExtensionList(fileFormatInfos)})`;
39
+ }
40
+ export const ASSET_TYPE_FILE_MAPPINGS = {
41
+ MATERIAL: {
42
+ fileFormats: MATERIAL_ASSET_FILE_FORMATS,
43
+ description: buildAssetTypeDescription('MaterialX material files', getFileFormatInfos(MATERIAL_ASSET_FILE_FORMATS)),
44
+ },
45
+ };
46
+ export const AVATAR_FILE_FORMATS = ['png', 'jpg', 'gif', 'webp'];
47
+ function normalizeExtension(ext) {
48
+ return ext.startsWith('.') ? ext.toLowerCase() : `.${ext.toLowerCase()}`;
49
+ }
50
+ export function getFileFormatMimeTypes(fileFormats) {
51
+ return [...new Set(fileFormats.map((fileFormat) => FileFormatToFileFormatInfo[fileFormat].mimeType))];
52
+ }
53
+ export function getFileFormatExtensions(fileFormats) {
54
+ return [
55
+ ...new Set(fileFormats.flatMap((fileFormat) => {
56
+ const info = FileFormatToFileFormatInfo[fileFormat];
57
+ return [info.extension, ...info.alternativeExtensions];
58
+ })),
59
+ ];
60
+ }
61
+ export function getFileFormatInfoAcceptObject(fileFormats) {
62
+ const acceptObject = {};
63
+ for (const fileFormatInfo of getFileFormatInfos(fileFormats)) {
64
+ const extensions = [
65
+ fileFormatInfo.extension,
66
+ ...fileFormatInfo.alternativeExtensions,
67
+ ...(acceptObject[fileFormatInfo.mimeType] ?? []),
68
+ ];
69
+ acceptObject[fileFormatInfo.mimeType] = [...new Set(extensions)];
70
+ }
71
+ return acceptObject;
72
+ }
73
+ export function getFileFormatInfoFromMimeType(mimeType, fileFormats) {
74
+ return getFileFormatInfos(fileFormats).find((fileFormatInfo) => fileFormatInfo.mimeType === mimeType || fileFormatInfo.alternativeMimeTypes.includes(mimeType));
75
+ }
76
+ export function getFileFormatInfoFromExtension(ext, fileFormats) {
77
+ const normalizedExt = normalizeExtension(ext);
78
+ return getFileFormatInfos(fileFormats).find((fileFormatInfo) => fileFormatInfo.extension === normalizedExt || fileFormatInfo.alternativeExtensions.includes(normalizedExt));
79
+ }
80
+ /** Given a MIME type, return the matching format key from the allowed set, or undefined if not found. */
81
+ export function getMimeFileFormat(mimeType, formats) {
82
+ return getFileFormatInfoFromMimeType(mimeType, formats)?.format;
83
+ }
84
+ export function getAssetTypeFromFileFormat(fileFormat) {
85
+ for (const [assetType, mapping] of Object.entries(ASSET_TYPE_FILE_MAPPINGS)) {
86
+ if (mapping.fileFormats.includes(fileFormat)) {
87
+ return assetType;
88
+ }
89
+ }
90
+ return;
91
+ }
92
+ //# sourceMappingURL=fileFormats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileFormats.js","sources":["../../src/lib/fileFormats.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ import * as z from 'zod';
2
+ export declare const listResultSchema: <T extends z.ZodTypeAny>(item: T) => z.ZodObject<{
3
+ rows: z.ZodArray<T>;
4
+ rowCount: z.ZodInt;
5
+ }, z.core.$strict>;
6
+ export type ListResult<T> = {
7
+ rows: T[];
8
+ rowCount: number;
9
+ };
10
+ export declare const paginationSchema: z.ZodObject<{
11
+ pageOffset: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
12
+ pageSize: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
13
+ }, z.core.$strip>;
14
+ export type Pagination = z.infer<typeof paginationSchema>;
15
+ export declare const paginationOptionalSchema: z.ZodObject<{
16
+ pageOffset: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
17
+ pageSize: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
18
+ }, z.core.$strip>;
19
+ export type PaginationOptional = z.infer<typeof paginationOptionalSchema>;
20
+ export declare const sortDirEnum: z.ZodEnum<{
21
+ asc: "asc";
22
+ desc: "desc";
23
+ }>;
24
+ export type SortDir = z.infer<typeof sortDirEnum>;
25
+ export declare const sortingSchema: z.ZodObject<{
26
+ sortBy: z.ZodString;
27
+ sortDir: z.ZodDefault<z.ZodEnum<{
28
+ asc: "asc";
29
+ desc: "desc";
30
+ }>>;
31
+ }, z.core.$strip>;
32
+ export type Sorting<TField extends string = string> = {
33
+ sortBy: TField;
34
+ sortDir: SortDir;
35
+ };
36
+ export declare const sortingOptionalSchema: z.ZodObject<{
37
+ sortBy: z.ZodOptional<z.ZodString>;
38
+ sortDir: z.ZodOptional<z.ZodEnum<{
39
+ asc: "asc";
40
+ desc: "desc";
41
+ }>>;
42
+ }, z.core.$strip>;
43
+ export type SortingOptional = z.infer<typeof sortingOptionalSchema>;
44
+ export declare const createSortingSchema: <const TField extends string>(fields: readonly [TField, ...TField[]]) => z.ZodObject<{
45
+ sortBy: z.ZodEnum<{ [k in TField]: k; } extends infer T ? { [k in keyof T]: T[k]; } : never>;
46
+ sortDir: z.ZodDefault<z.ZodEnum<{
47
+ asc: "asc";
48
+ desc: "desc";
49
+ }>>;
50
+ }, z.core.$strip>;
51
+ export declare const createSortingOptionalSchema: <const TField extends string>(fields: readonly [TField, ...TField[]]) => z.ZodObject<{
52
+ sortBy: z.ZodOptional<z.ZodEnum<{ [k in TField]: k; } extends infer T ? { [k in keyof T]: T[k]; } : never>>;
53
+ sortDir: z.ZodOptional<z.ZodEnum<{
54
+ asc: "asc";
55
+ desc: "desc";
56
+ }>>;
57
+ }, z.core.$strip>;
58
+ export type SortingFromFields<TFields extends readonly string[]> = Sorting<TFields[number]>;
59
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sources":["../../src/lib/list.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAEzB,eAAO,MAAM,gBAAgB,GAAI,CAAC,SAAS,CAAC,CAAC,UAAU,QAAQ,CAAC;;;kBAI5D,CAAC;AAEL,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI;IAC1B,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,eAAO,MAAM,gBAAgB;;;iBAc3B,CAAC;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE1D,eAAO,MAAM,wBAAwB;;;iBAcnC,CAAC;AACH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAE1E,eAAO,MAAM,WAAW;;;EAAyF,CAAC;AAClH,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAElD,eAAO,MAAM,aAAa;;;;;;iBAGxB,CAAC;AACH,MAAM,MAAM,OAAO,CAAC,MAAM,SAAS,MAAM,GAAG,MAAM,IAAI;IACpD,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,eAAO,MAAM,qBAAqB;;;;;;iBAGhC,CAAC;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE,eAAO,MAAM,mBAAmB,GAAI,KAAK,CAAC,MAAM,SAAS,MAAM,UAAU,SAAS,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC;;;;;;iBAInG,CAAC;AAEL,eAAO,MAAM,2BAA2B,GAAI,KAAK,CAAC,MAAM,SAAS,MAAM,UAAU,SAAS,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC;;;;;;iBAI3G,CAAC;AAEL,MAAM,MAAM,iBAAiB,CAAC,OAAO,SAAS,SAAS,MAAM,EAAE,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC"}
@@ -0,0 +1,53 @@
1
+ import * as z from 'zod';
2
+ export const listResultSchema = (item) => z.strictObject({
3
+ rows: z.array(item),
4
+ rowCount: z.int().min(0),
5
+ });
6
+ export const paginationSchema = z.object({
7
+ pageOffset: z.coerce
8
+ .number()
9
+ .int()
10
+ .min(0)
11
+ .default(0)
12
+ .describe('The number of items to skip before starting to return results. Must be 0 or greater.'),
13
+ pageSize: z.coerce
14
+ .number()
15
+ .int()
16
+ .min(1)
17
+ .max(1000)
18
+ .default(50)
19
+ .describe('The maximum number of items to return. Must be between 1 and 1000.'),
20
+ });
21
+ export const paginationOptionalSchema = z.object({
22
+ pageOffset: z.coerce
23
+ .number()
24
+ .int()
25
+ .min(0)
26
+ .optional()
27
+ .describe('The number of items to skip before starting to return results. Must be 0 or greater.'),
28
+ pageSize: z.coerce
29
+ .number()
30
+ .int()
31
+ .min(1)
32
+ .max(1000)
33
+ .optional()
34
+ .describe('The maximum number of items to return. Must be between 1 and 1000.'),
35
+ });
36
+ export const sortDirEnum = z.enum(['asc', 'desc']).describe('The direction to sort by. Must be "asc" or "desc".');
37
+ export const sortingSchema = z.object({
38
+ sortBy: z.string().max(256),
39
+ sortDir: sortDirEnum.default('desc'),
40
+ });
41
+ export const sortingOptionalSchema = z.object({
42
+ sortBy: z.string().max(256).optional().describe('The field to sort by.'),
43
+ sortDir: sortDirEnum.optional().describe('The direction to sort by. Must be "asc" or "desc".'),
44
+ });
45
+ export const createSortingSchema = (fields) => z.object({
46
+ sortBy: z.enum(fields).describe('The field to sort by'),
47
+ sortDir: sortDirEnum.default('desc').describe('The direction to sort by'),
48
+ });
49
+ export const createSortingOptionalSchema = (fields) => z.object({
50
+ sortBy: z.enum(fields).optional().describe('The field to sort by'),
51
+ sortDir: sortDirEnum.optional().describe('The direction to sort by'),
52
+ });
53
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sources":["../../src/lib/list.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAEzB,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAyB,IAAO,EAAE,EAAE,CAClE,CAAC,CAAC,YAAY,CAAC;IACb,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;IACnB,QAAQ,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;CACzB,CAAC,CAAC;AAOL,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,UAAU,EAAE,CAAC,CAAC,MAAM;SACjB,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,CAAC;SACN,OAAO,CAAC,CAAC,CAAC;SACV,QAAQ,CAAC,sFAAsF,CAAC;IACnG,QAAQ,EAAE,CAAC,CAAC,MAAM;SACf,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,IAAI,CAAC;SACT,OAAO,CAAC,EAAE,CAAC;SACX,QAAQ,CAAC,oEAAoE,CAAC;CAClF,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/C,UAAU,EAAE,CAAC,CAAC,MAAM;SACjB,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,EAAE;SACV,QAAQ,CAAC,sFAAsF,CAAC;IACnG,QAAQ,EAAE,CAAC,CAAC,MAAM;SACf,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,IAAI,CAAC;SACT,QAAQ,EAAE;SACV,QAAQ,CAAC,oEAAoE,CAAC;CAClF,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,oDAAoD,CAAC,CAAC;AAGlH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC;IAC3B,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;CACrC,CAAC,CAAC;AAMH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;IACxE,OAAO,EAAE,WAAW,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oDAAoD,CAAC;CAC/F,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAA8B,MAAsC,EAAE,EAAE,CACzG,CAAC,CAAC,MAAM,CAAC;IACP,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,sBAAsB,CAAC;IACvD,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,0BAA0B,CAAC;CAC1E,CAAC,CAAC;AAEL,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAA8B,MAAsC,EAAE,EAAE,CACjH,CAAC,CAAC,MAAM,CAAC;IACP,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;IAClE,OAAO,EAAE,WAAW,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;CACrE,CAAC,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type * as z from 'zod';
2
+ /**
3
+ * Parses data using a Zod schema.
4
+ * @param schema - The zod schema to use for validation/type inference
5
+ * @param data - The raw response data to parse
6
+ * @returns The parsed or type-asserted data matching the schema's inferred type
7
+ */
8
+ export declare const parseResult: <T extends z.ZodTypeAny>(schema: T, data: unknown) => z.infer<T>;
9
+ /**
10
+ * Legacy version that accepts a client parameter (unused, kept for backward compatibility).
11
+ * This is used internally by client.ts to maintain the old API signature.
12
+ */
13
+ export declare const parseResultWithClient: <T extends z.ZodTypeAny>(_client: unknown, schema: T, data: unknown) => z.infer<T>;
14
+ //# sourceMappingURL=parseResult.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseResult.d.ts","sources":["../../src/lib/parseResult.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,CAAC,MAAM,KAAK,CAAC;AAE9B;;;;;GAKG;AACH,eAAO,MAAM,WAAW,GAAI,CAAC,SAAS,CAAC,CAAC,UAAU,UAAU,CAAC,QAAQ,OAAO,KAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAuB,CAAC;AAEhH;;;GAGG;AACH,eAAO,MAAM,qBAAqB,GAAI,CAAC,SAAS,CAAC,CAAC,UAAU,WAAW,OAAO,UAAU,CAAC,QAAQ,OAAO,KAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CACzF,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Parses data using a Zod schema.
3
+ * @param schema - The zod schema to use for validation/type inference
4
+ * @param data - The raw response data to parse
5
+ * @returns The parsed or type-asserted data matching the schema's inferred type
6
+ */
7
+ export const parseResult = (schema, data) => schema.parse(data);
8
+ /**
9
+ * Legacy version that accepts a client parameter (unused, kept for backward compatibility).
10
+ * This is used internally by client.ts to maintain the old API signature.
11
+ */
12
+ export const parseResultWithClient = (_client, schema, data) => parseResult(schema, data);
13
+ //# sourceMappingURL=parseResult.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseResult.js","sources":["../../src/lib/parseResult.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAyB,MAAS,EAAE,IAAa,EAAc,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAEhH;;;GAGG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAyB,OAAgB,EAAE,MAAS,EAAE,IAAa,EAAc,EAAE,CACtH,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC"}
@@ -0,0 +1,48 @@
1
+ import * as z from 'zod';
2
+ export declare const descriptionSchema: z.ZodString;
3
+ export declare const shortDescriptionSchema: z.ZodString;
4
+ export declare const nullableDescriptionSchema: z.ZodNullable<z.ZodString>;
5
+ export declare const assetVisibilitySchema: z.ZodEnum<{
6
+ PRIVATE: "PRIVATE";
7
+ PUBLIC: "PUBLIC";
8
+ UNLISTED: "UNLISTED";
9
+ }>;
10
+ export declare const aiUsageSchema: z.ZodEnum<{
11
+ AI_FREE: "AI_FREE";
12
+ AI_USED: "AI_USED";
13
+ UNDISCLOSED: "UNDISCLOSED";
14
+ }>;
15
+ export declare const commentTextSchema: z.ZodString;
16
+ export declare const jwtSchema: z.ZodString;
17
+ /**
18
+ * Accepts either a boolean or a stringbool (e.g. "true"/"false", "1"/"0") for use in params and query schemas.
19
+ * Use consistently so callers can pass either from query strings or programmatically.
20
+ */
21
+ export declare const booleanPropSchema: z.ZodUnion<readonly [z.ZodBoolean, z.ZodCodec<z.ZodString, z.ZodBoolean>]>;
22
+ export declare const coreEntityNameRegex = "[a-zA-Z][a-zA-Z0-9]*(?:-[a-zA-Z0-9]+)*";
23
+ export declare const entityNameRegex: RegExp;
24
+ export declare const entityNameSchema: (description: string) => z.ZodString;
25
+ export declare const userNameSchema: z.ZodString;
26
+ export declare const userNameParamsSchema: z.ZodObject<{
27
+ userName: z.ZodString;
28
+ }, z.core.$strict>;
29
+ export type UserNameParams = z.infer<typeof userNameParamsSchema>;
30
+ export declare const standardUserNameSchema: z.ZodString;
31
+ export declare const assetNameSchema: z.ZodString;
32
+ export declare const assetParamsSchema: z.ZodObject<{
33
+ userName: z.ZodString;
34
+ assetName: z.ZodString;
35
+ }, z.core.$strict>;
36
+ export type AssetParams = z.infer<typeof assetParamsSchema>;
37
+ export declare const commentParamsSchema: z.ZodObject<{
38
+ userName: z.ZodString;
39
+ assetName: z.ZodString;
40
+ commentId: z.ZodCoercedNumber<unknown>;
41
+ }, z.core.$strict>;
42
+ export type CommentParams = z.infer<typeof commentParamsSchema>;
43
+ export declare const taskParamsSchema: z.ZodObject<{
44
+ userName: z.ZodString;
45
+ }, z.core.$strict>;
46
+ export type TaskParams = z.infer<typeof taskParamsSchema>;
47
+ export declare const apiTokenNameSchema: z.ZodString;
48
+ //# sourceMappingURL=schemas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.d.ts","sources":["../../src/lib/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAGzB,eAAO,MAAM,iBAAiB,aAAmE,CAAC;AAClG,eAAO,MAAM,sBAAsB,aAAuE,CAAC;AAC3G,eAAO,MAAM,yBAAyB,4BAA2E,CAAC;AAElH,eAAO,MAAM,qBAAqB;;;;EAAwE,CAAC;AAC3G,eAAO,MAAM,aAAa;;;;EAAqE,CAAC;AAEhG,eAAO,MAAM,iBAAiB,aAAoE,CAAC;AAEnG,eAAO,MAAM,SAAS,aAGM,CAAC;AAE7B;;;GAGG;AACH,eAAO,MAAM,iBAAiB,4EAAyC,CAAC;AAExE,eAAO,MAAM,mBAAmB,2CAA2C,CAAC;AAC5E,eAAO,MAAM,eAAe,QAAyC,CAAC;AAEtE,eAAO,MAAM,gBAAgB,gBAAiB,MAAM,gBAS1B,CAAC;AAE3B,eAAO,MAAM,cAAc,aAA2C,CAAC;AAEvE,eAAO,MAAM,oBAAoB;;kBAE/B,CAAC;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE,eAAO,MAAM,sBAAsB,aAA2C,CAAC;AAE/E,eAAO,MAAM,eAAe,aAA4C,CAAC;AAEzE,eAAO,MAAM,iBAAiB;;;kBAG5B,CAAC;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D,eAAO,MAAM,mBAAmB;;;;kBAE9B,CAAC;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,eAAO,MAAM,gBAAgB;;kBAE3B,CAAC;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE1D,eAAO,MAAM,kBAAkB,aAAgD,CAAC"}
@@ -0,0 +1,43 @@
1
+ import * as z from 'zod';
2
+ import { Enums } from './enums.js';
3
+ export const descriptionSchema = z.string().max(10_240).describe('The description of the entity');
4
+ export const shortDescriptionSchema = z.string().max(1024).describe('The short description of the entity');
5
+ export const nullableDescriptionSchema = z.string().nullable().describe('The nullable description of the entity');
6
+ export const assetVisibilitySchema = z.enum(Enums.AssetVisibility).describe('The visibility of the asset');
7
+ export const aiUsageSchema = z.enum(Enums.AiUsage).describe('The AI usage policy of the asset');
8
+ export const commentTextSchema = z.string().min(1).max(10_240).describe('The text of the comment');
9
+ export const jwtSchema = z
10
+ .string()
11
+ .max(1024 * 10)
12
+ .describe('The JWT token');
13
+ /**
14
+ * Accepts either a boolean or a stringbool (e.g. "true"/"false", "1"/"0") for use in params and query schemas.
15
+ * Use consistently so callers can pass either from query strings or programmatically.
16
+ */
17
+ export const booleanPropSchema = z.union([z.boolean(), z.stringbool()]);
18
+ export const coreEntityNameRegex = '[a-zA-Z][a-zA-Z0-9]*(?:-[a-zA-Z0-9]+)*';
19
+ export const entityNameRegex = new RegExp(`^${coreEntityNameRegex}$`);
20
+ export const entityNameSchema = (description) => z
21
+ .string()
22
+ .min(1, 'Name is required')
23
+ .max(30, 'Name must be at most 30 characters')
24
+ .regex(entityNameRegex, 'Name must start with a letter and can only contain letters, numbers, and dashes (-). No consecutive or trailing dashes (-) allowed.')
25
+ .describe(description);
26
+ export const userNameSchema = entityNameSchema('The name of the user');
27
+ export const userNameParamsSchema = z.strictObject({
28
+ userName: userNameSchema,
29
+ });
30
+ export const standardUserNameSchema = entityNameSchema('The name of the user');
31
+ export const assetNameSchema = entityNameSchema('The name of the asset');
32
+ export const assetParamsSchema = z.strictObject({
33
+ userName: userNameSchema,
34
+ assetName: assetNameSchema,
35
+ });
36
+ export const commentParamsSchema = assetParamsSchema.extend({
37
+ commentId: z.coerce.number().int().describe('The ID of the comment'),
38
+ });
39
+ export const taskParamsSchema = z.strictObject({
40
+ userName: userNameSchema,
41
+ });
42
+ export const apiTokenNameSchema = entityNameSchema('The name of the API token');
43
+ //# sourceMappingURL=schemas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.js","sources":["../../src/lib/schemas.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import type { Stream } from 'node:stream';
2
+ import * as z from 'zod';
3
+ export type BinaryResponse = 'arraybuffer' | 'stream' | 'blob';
4
+ export type BinaryResponseType<T extends BinaryResponse> = T extends 'stream' ? Stream : T extends 'arraybuffer' ? ArrayBuffer : Blob;
5
+ export declare const defaultBinaryResponse: <T extends BinaryResponse>() => T;
6
+ export declare const imageResizeOptionsSchemaProps: {
7
+ width: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
8
+ height: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
9
+ quality: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
10
+ };
11
+ export declare const ImageResizeOptionsSchema: z.ZodObject<{
12
+ width: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
13
+ height: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
14
+ quality: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
15
+ }, z.core.$strict>;
16
+ export type ImageResizeOptions = z.infer<typeof ImageResizeOptionsSchema>;
17
+ export declare const ImageTransformFormatSchema: z.ZodEnum<{
18
+ avif: "avif";
19
+ jpg: "jpg";
20
+ png: "png";
21
+ webp: "webp";
22
+ }>;
23
+ export type ImageTransformFormat = z.infer<typeof ImageTransformFormatSchema>;
24
+ export declare const imageTransformOptionsSchemaProps: {
25
+ width: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
26
+ height: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
27
+ quality: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
28
+ format: z.ZodOptional<z.ZodEnum<{
29
+ avif: "avif";
30
+ jpg: "jpg";
31
+ png: "png";
32
+ webp: "webp";
33
+ }>>;
34
+ };
35
+ export declare const ImageTransformOptionsSchema: z.ZodObject<{
36
+ width: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
37
+ height: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
38
+ quality: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
39
+ format: z.ZodOptional<z.ZodEnum<{
40
+ avif: "avif";
41
+ jpg: "jpg";
42
+ png: "png";
43
+ webp: "webp";
44
+ }>>;
45
+ }, z.core.$strict>;
46
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sources":["../../src/lib/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAEzB,MAAM,MAAM,cAAc,GAAG,aAAa,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE/D,MAAM,MAAM,kBAAkB,CAAC,CAAC,SAAS,cAAc,IAAI,CAAC,SAAS,QAAQ,GACzE,MAAM,GACN,CAAC,SAAS,aAAa,GACrB,WAAW,GACX,IAAI,CAAC;AAEX,eAAO,MAAM,qBAAqB,GAAI,CAAC,SAAS,cAAc,OAAK,CACT,CAAC;AAS3D,eAAO,MAAM,6BAA6B;IACxC,KAAK;IACL,MAAM;IACN,OAAO;CACR,CAAC;AAEF,eAAO,MAAM,wBAAwB;;;;kBAAgD,CAAC;AACtF,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAG1E,eAAO,MAAM,0BAA0B;;;;;EAAyC,CAAC;AACjF,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAE9E,eAAO,MAAM,gCAAgC;;;;;;;;;;CAG5C,CAAC;AAEF,eAAO,MAAM,2BAA2B;;;;;;;;;;kBAAmD,CAAC"}
@@ -0,0 +1,22 @@
1
+ import * as z from 'zod';
2
+ export const defaultBinaryResponse = () => (typeof window !== 'undefined' ? 'blob' : 'stream');
3
+ /*
4
+ // eslint-disable-next-line @typescript-eslint/no-empty-object-type
5
+ export type Optional<T> = T | {};
6
+
7
+ export const optional = <T extends z.ZodTypeAny>(schema: T) =>
8
+ z.union([z.strictObject({}), schema]);*/
9
+ export const imageResizeOptionsSchemaProps = {
10
+ width: z.coerce.number().int().positive().optional().describe('The width of the resized image'),
11
+ height: z.coerce.number().int().positive().optional().describe('The height of the resized image'),
12
+ quality: z.coerce.number().int().min(1).max(100).optional().describe('The quality of the resized image'),
13
+ };
14
+ export const ImageResizeOptionsSchema = z.strictObject(imageResizeOptionsSchemaProps);
15
+ // Define the image format schema
16
+ export const ImageTransformFormatSchema = z.enum(['jpg', 'png', 'webp', 'avif']);
17
+ export const imageTransformOptionsSchemaProps = {
18
+ format: ImageTransformFormatSchema.optional().describe('The image format to transform to'),
19
+ ...imageResizeOptionsSchemaProps,
20
+ };
21
+ export const ImageTransformOptionsSchema = z.strictObject(imageTransformOptionsSchemaProps);
22
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sources":["../../src/lib/types.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAUzB,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAgC,EAAE,CACrE,CAAC,OAAO,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAM,CAAC;AAE3D;;;;;0CAK0C;AAE1C,MAAM,CAAC,MAAM,6BAA6B,GAAG;IAC3C,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;IAC/F,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;IACjG,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;CACzG,CAAC;AAEF,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC,YAAY,CAAC,6BAA6B,CAAC,CAAC;AAGtF,iCAAiC;AACjC,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAGjF,MAAM,CAAC,MAAM,gCAAgC,GAAG;IAC9C,MAAM,EAAE,0BAA0B,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;IAC1F,GAAG,6BAA6B;CACjC,CAAC;AAEF,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,CAAC,YAAY,CAAC,gCAAgC,CAAC,CAAC"}
@@ -0,0 +1,36 @@
1
+ import type { ApiClient } from '../client.js';
2
+ export declare const uploadFileToUploadUrl: (uploadUrl: string, file: File | Buffer | Uint8Array, mimetype?: string) => Promise<void>;
3
+ export type UploadFileProps = {
4
+ params: {
5
+ userName: string;
6
+ };
7
+ fileData: Buffer | Uint8Array;
8
+ filename: string;
9
+ };
10
+ /**
11
+ * Uploads a file and returns the upload token.
12
+ * This helper function infers the MIME type from the file extension,
13
+ * prepares the upload, and uploads the file to the signed URL.
14
+ *
15
+ * @param client - The API client instance
16
+ * @param props - The upload properties
17
+ * @param props.params - Path parameters (userName)
18
+ * @param props.fileData - File data as Buffer or Uint8Array
19
+ * @param props.filename - Filename (used for MIME type inference and upload metadata)
20
+ * @returns Promise resolving to the upload token
21
+ * @example
22
+ * ```typescript
23
+ * import { readFile } from 'node:fs/promises';
24
+ * import { basename } from 'node:path';
25
+ *
26
+ * const fileData = await readFile('model.glb');
27
+ * const filename = basename('model.glb');
28
+ * const uploadToken = await uploadFile(client, {
29
+ * params: { userName: 'my-user' },
30
+ * fileData,
31
+ * filename,
32
+ * });
33
+ * ```
34
+ */
35
+ export declare const uploadFile: (client: ApiClient, props: UploadFileProps) => Promise<string>;
36
+ //# sourceMappingURL=upload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.d.ts","sources":["../../src/lib/upload.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAI9C,eAAO,MAAM,qBAAqB,cACrB,MAAM,QACX,IAAI,GAAG,MAAM,GAAG,UAAU,aACrB,MAAM,KAChB,OAAO,CAAC,IAAI,CAgCd,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE;QACN,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,QAAQ,EAAE,MAAM,GAAG,UAAU,CAAC;IAC9B,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,UAAU,WAAkB,SAAS,SAAS,eAAe,KAAG,OAAO,CAAC,MAAM,CAsB1F,CAAC"}
@@ -0,0 +1,79 @@
1
+ import { createAssetParamsSchema, prepareAssetUpload } from '../routes/assets.js';
2
+ import { FileFormat, getFileFormatInfoFromExtension } from './fileFormats.js';
3
+ export const uploadFileToUploadUrl = async (uploadUrl, file, mimetype) => {
4
+ let body;
5
+ let contentType;
6
+ if (file instanceof File) {
7
+ // If file.type is empty (browser didn't recognize it), use provided mimetype
8
+ // Otherwise, ensure they match to prevent mismatches
9
+ if (file.type && mimetype && mimetype !== file.type) {
10
+ throw new Error(`MIME type mismatch: ${mimetype} !== ${file.type}`);
11
+ }
12
+ contentType = file.type || mimetype || 'application/octet-stream';
13
+ body = file;
14
+ }
15
+ else if (file instanceof Buffer || file instanceof Uint8Array) {
16
+ contentType = mimetype ?? 'application/octet-stream';
17
+ // Convert Buffer/Uint8Array to ArrayBuffer for fetch
18
+ body = file.buffer.slice(file.byteOffset, file.byteOffset + file.byteLength);
19
+ }
20
+ else {
21
+ // should never happen
22
+ throw new Error('Unsupported file type. Expected File, Buffer, or Uint8Array');
23
+ }
24
+ const response = await fetch(uploadUrl, {
25
+ method: 'PUT',
26
+ body,
27
+ headers: {
28
+ 'Content-Type': contentType,
29
+ },
30
+ });
31
+ if (!response.ok) {
32
+ throw new Error(`Failed to upload file: ${response.status} ${response.statusText}`);
33
+ }
34
+ };
35
+ /**
36
+ * Uploads a file and returns the upload token.
37
+ * This helper function infers the MIME type from the file extension,
38
+ * prepares the upload, and uploads the file to the signed URL.
39
+ *
40
+ * @param client - The API client instance
41
+ * @param props - The upload properties
42
+ * @param props.params - Path parameters (userName)
43
+ * @param props.fileData - File data as Buffer or Uint8Array
44
+ * @param props.filename - Filename (used for MIME type inference and upload metadata)
45
+ * @returns Promise resolving to the upload token
46
+ * @example
47
+ * ```typescript
48
+ * import { readFile } from 'node:fs/promises';
49
+ * import { basename } from 'node:path';
50
+ *
51
+ * const fileData = await readFile('model.glb');
52
+ * const filename = basename('model.glb');
53
+ * const uploadToken = await uploadFile(client, {
54
+ * params: { userName: 'my-user' },
55
+ * fileData,
56
+ * filename,
57
+ * });
58
+ * ```
59
+ */
60
+ export const uploadFile = async (client, props) => {
61
+ const params = createAssetParamsSchema.parse(props.params);
62
+ const { fileData, filename } = props;
63
+ // Infer MIME type from extension
64
+ const ext = filename.includes('.') ? `.${filename.split('.').pop()}` : '';
65
+ const contentType = getFileFormatInfoFromExtension(ext, FileFormat)?.mimeType ?? 'application/octet-stream';
66
+ // Prepare upload
67
+ const { uploadUrl, uploadToken } = await prepareAssetUpload(client, {
68
+ params,
69
+ body: {
70
+ filename,
71
+ contentType,
72
+ size: fileData.length,
73
+ },
74
+ });
75
+ // Upload file to signed URL
76
+ await uploadFileToUploadUrl(uploadUrl, fileData, contentType);
77
+ return uploadToken;
78
+ };
79
+ //# sourceMappingURL=upload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.js","sources":["../../src/lib/upload.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAClF,OAAO,EAAE,UAAU,EAAE,8BAA8B,EAAE,MAAM,kBAAkB,CAAC;AAE9E,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,EACxC,SAAiB,EACjB,IAAgC,EAChC,QAAiB,EACF,EAAE;IACjB,IAAI,IAAc,CAAC;IAEnB,IAAI,WAAmB,CAAC;IACxB,IAAI,IAAI,YAAY,IAAI,EAAE,CAAC;QACzB,6EAA6E;QAC7E,qDAAqD;QACrD,IAAI,IAAI,CAAC,IAAI,IAAI,QAAQ,IAAI,QAAQ,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;YACpD,MAAM,IAAI,KAAK,CAAC,uBAAuB,QAAQ,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACtE,CAAC;QACD,WAAW,GAAG,IAAI,CAAC,IAAI,IAAI,QAAQ,IAAI,0BAA0B,CAAC;QAClE,IAAI,GAAG,IAAI,CAAC;IACd,CAAC;SAAM,IAAI,IAAI,YAAY,MAAM,IAAI,IAAI,YAAY,UAAU,EAAE,CAAC;QAChE,WAAW,GAAG,QAAQ,IAAI,0BAA0B,CAAC;QACrD,qDAAqD;QACrD,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;IAC/E,CAAC;SAAM,CAAC;QACN,sBAAsB;QACtB,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;IACjF,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,SAAS,EAAE;QACtC,MAAM,EAAE,KAAK;QACb,IAAI;QACJ,OAAO,EAAE;YACP,cAAc,EAAE,WAAW;SAC5B;KACF,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,0BAA0B,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IACtF,CAAC;AACH,CAAC,CAAC;AAUF;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,EAAE,MAAiB,EAAE,KAAsB,EAAmB,EAAE;IAC7F,MAAM,MAAM,GAAG,uBAAuB,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC3D,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IAErC,iCAAiC;IACjC,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1E,MAAM,WAAW,GAAG,8BAA8B,CAAC,GAAG,EAAE,UAAU,CAAC,EAAE,QAAQ,IAAI,0BAA0B,CAAC;IAE5G,iBAAiB;IACjB,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,MAAM,kBAAkB,CAAC,MAAM,EAAE;QAClE,MAAM;QACN,IAAI,EAAE;YACJ,QAAQ;YACR,WAAW;YACX,IAAI,EAAE,QAAQ,CAAC,MAAM;SACtB;KACF,CAAC,CAAC;IAEH,4BAA4B;IAC5B,MAAM,qBAAqB,CAAC,SAAS,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;IAE9D,OAAO,WAAW,CAAC;AACrB,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Returns true if the given string is a valid URL, false otherwise.
3
+ * Uses the same semantics as the URL constructor (no throw).
4
+ */
5
+ export declare function validateUrl(url: string): boolean;
6
+ export declare function makeUrl(host: string, path: string, query?: Record<string, string | number | boolean | undefined>): URL;
7
+ //# sourceMappingURL=url.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url.d.ts","sources":["../../src/lib/url.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAQhD;AACD,wBAAgB,OAAO,CACrB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,GAC5D,GAAG,CAYL"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Returns true if the given string is a valid URL, false otherwise.
3
+ * Uses the same semantics as the URL constructor (no throw).
4
+ */
5
+ export function validateUrl(url) {
6
+ try {
7
+ // oxlint-disable-next-line no-new
8
+ new URL(url);
9
+ return true;
10
+ }
11
+ catch {
12
+ return false;
13
+ }
14
+ }
15
+ export function makeUrl(host, path, query) {
16
+ const url = new URL(path, host);
17
+ if (query) {
18
+ for (const [key, value] of Object.entries(query)) {
19
+ if (value !== undefined) {
20
+ url.searchParams.append(key, value.toString());
21
+ }
22
+ }
23
+ }
24
+ return url;
25
+ }
26
+ //# sourceMappingURL=url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url.js","sources":["../../src/lib/url.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,IAAI,CAAC;QACH,kCAAkC;QAClC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QACb,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AACD,MAAM,UAAU,OAAO,CACrB,IAAY,EACZ,IAAY,EACZ,KAA6D;IAE7D,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAEhC,IAAI,KAAK,EAAE,CAAC;QACV,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACjD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;YACjD,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC"}