@muhgholy/next-drive 4.23.8 → 4.23.10

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 (36) hide show
  1. package/README.md +152 -1
  2. package/dist/{chunk-OU5TKLHV.cjs → chunk-V75PCJHT.cjs} +116 -24
  3. package/dist/chunk-V75PCJHT.cjs.map +1 -0
  4. package/dist/{chunk-RBSFEEJJ.js → chunk-XUPDNN2U.js} +115 -25
  5. package/dist/chunk-XUPDNN2U.js.map +1 -0
  6. package/dist/client/file-chooser.d.ts +1 -0
  7. package/dist/client/file-chooser.d.ts.map +1 -1
  8. package/dist/client/hooks/use-upload.d.ts +1 -1
  9. package/dist/client/hooks/use-upload.d.ts.map +1 -1
  10. package/dist/client/index.cjs +88 -42
  11. package/dist/client/index.cjs.map +1 -1
  12. package/dist/client/index.js +87 -41
  13. package/dist/client/index.js.map +1 -1
  14. package/dist/server/actions/drive.d.ts.map +1 -1
  15. package/dist/server/config.d.ts.map +1 -1
  16. package/dist/server/controllers/drive.d.ts +26 -0
  17. package/dist/server/controllers/drive.d.ts.map +1 -1
  18. package/dist/server/database/mongoose/schema/drive.d.ts +1 -0
  19. package/dist/server/database/mongoose/schema/drive.d.ts.map +1 -1
  20. package/dist/server/express.cjs +11 -11
  21. package/dist/server/express.js +2 -2
  22. package/dist/server/hono.cjs +11 -11
  23. package/dist/server/hono.js +2 -2
  24. package/dist/server/index.cjs +24 -16
  25. package/dist/server/index.d.ts +1 -1
  26. package/dist/server/index.d.ts.map +1 -1
  27. package/dist/server/index.js +1 -1
  28. package/dist/server/zod/schemas.d.ts +5 -0
  29. package/dist/server/zod/schemas.d.ts.map +1 -1
  30. package/dist/types/lib/database/drive.d.ts +1 -0
  31. package/dist/types/lib/database/drive.d.ts.map +1 -1
  32. package/dist/types/server/config.d.ts +17 -0
  33. package/dist/types/server/config.d.ts.map +1 -1
  34. package/package.json +2 -1
  35. package/dist/chunk-OU5TKLHV.cjs.map +0 -1
  36. package/dist/chunk-RBSFEEJJ.js.map +0 -1
@@ -10,5 +10,6 @@ export declare const DriveFileChooser: (props: Readonly<{
10
10
  disabled?: boolean;
11
11
  error?: boolean;
12
12
  helperText?: string;
13
+ allowUnauthenticated?: boolean;
13
14
  }>) => React.JSX.Element;
14
15
  //# sourceMappingURL=file-chooser.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"file-chooser.d.ts","sourceRoot":"","sources":["../../src/client/file-chooser.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAoD,MAAM,OAAO,CAAC;AACzE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAwWjD,eAAO,MAAM,gBAAgB,GAAI,OAAO,QAAQ,CAAC;IAC7C,KAAK,CAAC,EAAE,UAAU,GAAG,UAAU,EAAE,GAAG,IAAI,CAAC;IACzC,QAAQ,EAAE,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,EAAE,GAAG,IAAI,KAAK,IAAI,CAAC;IAC5D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC,sBA0LD,CAAC"}
1
+ {"version":3,"file":"file-chooser.d.ts","sourceRoot":"","sources":["../../src/client/file-chooser.tsx"],"names":[],"mappings":"AAGA,OAAO,KAA4D,MAAM,OAAO,CAAC;AACjF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AA0WjD,eAAO,MAAM,gBAAgB,GAAI,OAAO,QAAQ,CAAC;IAC5C,KAAK,CAAC,EAAE,UAAU,GAAG,UAAU,EAAE,GAAG,IAAI,CAAC;IACzC,QAAQ,EAAE,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,EAAE,GAAG,IAAI,KAAK,IAAI,CAAC;IAC5D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oBAAoB,CAAC,EAAE,OAAO,CAAC;CACnC,CAAC,sBAiQD,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import type { TDriveUploadState } from '../../types/client';
2
- export declare const useUpload: (apiEndpoint: string, activeAccountId: string | null, withCredentials?: boolean, onUploadComplete?: (item: unknown) => void) => {
2
+ export declare const useUpload: (apiEndpoint: string, activeAccountId: string | null, withCredentials?: boolean, onUploadComplete?: (item: unknown) => void, unauthenticated?: boolean) => {
3
3
  uploads: TDriveUploadState[];
4
4
  uploadFiles: (files: File[], folderId: string | null) => Promise<void>;
5
5
  cancelUpload: (id: string) => Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"use-upload.d.ts","sourceRoot":"","sources":["../../../src/client/hooks/use-upload.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAYxD,eAAO,MAAM,SAAS,GAAI,aAAa,MAAM,EAAE,iBAAiB,MAAM,GAAG,IAAI,EAAE,kBAAiB,OAAe,EAAE,mBAAmB,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI;;yBAkKzG,IAAI,EAAE,YAAY,MAAM,GAAG,IAAI;uBAuB9D,MAAM;;CA+CxB,CAAC"}
1
+ {"version":3,"file":"use-upload.d.ts","sourceRoot":"","sources":["../../../src/client/hooks/use-upload.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAYxD,eAAO,MAAM,SAAS,GAAI,aAAa,MAAM,EAAE,iBAAiB,MAAM,GAAG,IAAI,EAAE,kBAAiB,OAAe,EAAE,mBAAmB,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,EAAE,kBAAiB,OAAe;;yBAmK3I,IAAI,EAAE,YAAY,MAAM,GAAG,IAAI;uBAuB9D,MAAM;;CA+CxB,CAAC"}
@@ -6,6 +6,7 @@ var React3 = require('react');
6
6
  var jsxRuntime = require('react/jsx-runtime');
7
7
  var reactSlot = require('@radix-ui/react-slot');
8
8
  var classVarianceAuthority = require('class-variance-authority');
9
+ var ProgressPrimitive = require('@radix-ui/react-progress');
9
10
  var SheetPrimitive = require('@radix-ui/react-dialog');
10
11
  var lucideReact = require('lucide-react');
11
12
  var DropdownMenuPrimitive = require('@radix-ui/react-dropdown-menu');
@@ -13,7 +14,6 @@ var LabelPrimitive = require('@radix-ui/react-label');
13
14
  var reactHookForm = require('react-hook-form');
14
15
  var core = require('@dnd-kit/core');
15
16
  var sortable = require('@dnd-kit/sortable');
16
- var ProgressPrimitive = require('@radix-ui/react-progress');
17
17
  var dateFns = require('date-fns');
18
18
  var ContextMenuPrimitive = require('@radix-ui/react-context-menu');
19
19
  var utilities = require('@dnd-kit/utilities');
@@ -37,10 +37,10 @@ function _interopNamespace(e) {
37
37
  }
38
38
 
39
39
  var React3__namespace = /*#__PURE__*/_interopNamespace(React3);
40
+ var ProgressPrimitive__namespace = /*#__PURE__*/_interopNamespace(ProgressPrimitive);
40
41
  var SheetPrimitive__namespace = /*#__PURE__*/_interopNamespace(SheetPrimitive);
41
42
  var DropdownMenuPrimitive__namespace = /*#__PURE__*/_interopNamespace(DropdownMenuPrimitive);
42
43
  var LabelPrimitive__namespace = /*#__PURE__*/_interopNamespace(LabelPrimitive);
43
- var ProgressPrimitive__namespace = /*#__PURE__*/_interopNamespace(ProgressPrimitive);
44
44
  var ContextMenuPrimitive__namespace = /*#__PURE__*/_interopNamespace(ContextMenuPrimitive);
45
45
 
46
46
  var DriveContext = React3.createContext(null);
@@ -322,7 +322,7 @@ var getChunkSize = (fileSize) => {
322
322
  if (fileSize < 1024 * 1024 * 1024) return 8 * 1024 * 1024;
323
323
  return 16 * 1024 * 1024;
324
324
  };
325
- var useUpload = (apiEndpoint, activeAccountId, withCredentials = false, onUploadComplete) => {
325
+ var useUpload = (apiEndpoint, activeAccountId, withCredentials = false, onUploadComplete, unauthenticated = false) => {
326
326
  const [uploads, setUploads] = React3.useState([]);
327
327
  const abortControllers = React3.useRef(/* @__PURE__ */ new Map());
328
328
  const filesRef = React3.useRef(/* @__PURE__ */ new Map());
@@ -406,6 +406,7 @@ var useUpload = (apiEndpoint, activeAccountId, withCredentials = false, onUpload
406
406
  formData.append("fileType", file.type);
407
407
  formData.append("folderId", folderId || "root");
408
408
  if (driveId) formData.append("driveId", driveId);
409
+ if (unauthenticated) formData.append("unauthenticated", "true");
409
410
  let attempts = 0;
410
411
  let success = false;
411
412
  while (!success && attempts < 3 && !controller.signal.aborted) {
@@ -565,6 +566,39 @@ function Button({
565
566
  }
566
567
  );
567
568
  }
569
+ function Progress({
570
+ className,
571
+ value,
572
+ indicatorClassName,
573
+ indeterminate = false,
574
+ ...props
575
+ }) {
576
+ const isIndeterminate = indeterminate || value === void 0;
577
+ return /* @__PURE__ */ jsxRuntime.jsx(
578
+ ProgressPrimitive__namespace.Root,
579
+ {
580
+ "data-slot": "progress",
581
+ className: chunkHQTC3554_cjs.cn(
582
+ "nd:bg-primary/20 nd:relative nd:h-2 nd:w-full nd:overflow-hidden nd:rounded-full",
583
+ className
584
+ ),
585
+ ...props,
586
+ children: /* @__PURE__ */ jsxRuntime.jsx(
587
+ ProgressPrimitive__namespace.Indicator,
588
+ {
589
+ "data-slot": "progress-indicator",
590
+ className: chunkHQTC3554_cjs.cn(
591
+ "nd:bg-primary nd:h-full nd:flex-1 nd:transition-all",
592
+ isIndeterminate && "nd:w-1/3 nd:animate-[indeterminate_1.5s_ease-in-out_infinite]",
593
+ !isIndeterminate && "nd:w-full",
594
+ indicatorClassName
595
+ ),
596
+ style: isIndeterminate ? void 0 : { transform: `translateX(-${100 - (value || 0)}%)` }
597
+ }
598
+ )
599
+ }
600
+ );
601
+ }
568
602
  function Dialog2({ ...props }) {
569
603
  return /* @__PURE__ */ jsxRuntime.jsx(SheetPrimitive__namespace.Root, { "data-slot": "dialog2", ...props });
570
604
  }
@@ -1388,39 +1422,6 @@ var DriveDndProvider = (props) => {
1388
1422
  }
1389
1423
  ) : children });
1390
1424
  };
1391
- function Progress({
1392
- className,
1393
- value,
1394
- indicatorClassName,
1395
- indeterminate = false,
1396
- ...props
1397
- }) {
1398
- const isIndeterminate = indeterminate || value === void 0;
1399
- return /* @__PURE__ */ jsxRuntime.jsx(
1400
- ProgressPrimitive__namespace.Root,
1401
- {
1402
- "data-slot": "progress",
1403
- className: chunkHQTC3554_cjs.cn(
1404
- "nd:bg-primary/20 nd:relative nd:h-2 nd:w-full nd:overflow-hidden nd:rounded-full",
1405
- className
1406
- ),
1407
- ...props,
1408
- children: /* @__PURE__ */ jsxRuntime.jsx(
1409
- ProgressPrimitive__namespace.Indicator,
1410
- {
1411
- "data-slot": "progress-indicator",
1412
- className: chunkHQTC3554_cjs.cn(
1413
- "nd:bg-primary nd:h-full nd:flex-1 nd:transition-all",
1414
- isIndeterminate && "nd:w-1/3 nd:animate-[indeterminate_1.5s_ease-in-out_infinite]",
1415
- !isIndeterminate && "nd:w-full",
1416
- indicatorClassName
1417
- ),
1418
- style: isIndeterminate ? void 0 : { transform: `translateX(-${100 - (value || 0)}%)` }
1419
- }
1420
- )
1421
- }
1422
- );
1423
- }
1424
1425
  var ContextMenu = ContextMenuPrimitive__namespace.Root;
1425
1426
  var ContextMenuTrigger = ContextMenuPrimitive__namespace.Trigger;
1426
1427
  var ContextMenuSubTrigger = React3__namespace.forwardRef(({ className, inset, children, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsxs(
@@ -3126,11 +3127,46 @@ var DriveFileChooser = (props) => {
3126
3127
  className,
3127
3128
  disabled = false,
3128
3129
  error,
3129
- helperText
3130
+ helperText,
3131
+ allowUnauthenticated = false
3130
3132
  } = props;
3131
- const { items, selectedFileIds, setSelectedFileIds, createUrl, triggerFetch } = useDrive();
3133
+ const { items, selectedFileIds, setSelectedFileIds, createUrl, triggerFetch, apiEndpoint, activeAccountId, withCredentials, callAPI } = useDrive();
3132
3134
  useStyleInjector();
3133
3135
  const [isOpen, setIsOpen] = React3.useState(false);
3136
+ const fileInputRef = React3.useRef(null);
3137
+ const valueRef = React3.useRef(value);
3138
+ valueRef.current = value;
3139
+ const [authed, setAuthed] = React3.useState(allowUnauthenticated ? null : true);
3140
+ React3.useEffect(() => {
3141
+ if (!allowUnauthenticated) return;
3142
+ callAPI("information").then((res) => setAuthed(res.status === 200 ? !!res.data?.authenticated : false));
3143
+ }, [allowUnauthenticated, callAPI]);
3144
+ const unauthenticatedMode = allowUnauthenticated && authed === false;
3145
+ const handleUploaded = React3.useCallback((item) => {
3146
+ const isFile = item?.information?.type === "FILE";
3147
+ const uploaded = {
3148
+ id: item.id,
3149
+ file: { name: item.name, mime: isFile ? item.information.mime : "", size: isFile ? item.information.sizeInBytes : 0 }
3150
+ };
3151
+ const current = valueRef.current;
3152
+ if (multiple) {
3153
+ const arr = Array.isArray(current) ? current : current ? [current] : [];
3154
+ onChange([...arr, uploaded]);
3155
+ } else {
3156
+ onChange(uploaded);
3157
+ }
3158
+ }, [multiple, onChange]);
3159
+ const { uploads, uploadFiles } = useUpload(apiEndpoint, activeAccountId, withCredentials, handleUploaded, unauthenticatedMode);
3160
+ const openPicker = React3.useCallback(() => {
3161
+ if (unauthenticatedMode) fileInputRef.current?.click();
3162
+ else setIsOpen(true);
3163
+ }, [unauthenticatedMode]);
3164
+ const handleFilePick = React3.useCallback((e) => {
3165
+ const picked = Array.from(e.target.files ?? []);
3166
+ if (picked.length) uploadFiles(multiple ? picked : [picked[0]], null);
3167
+ e.target.value = "";
3168
+ }, [uploadFiles, multiple]);
3169
+ const activeUploads = unauthenticatedMode ? uploads.filter((u) => ["queued", "uploading", "error"].includes(u.status)) : [];
3134
3170
  React3.useEffect(() => {
3135
3171
  if (isOpen) {
3136
3172
  triggerFetch();
@@ -3164,8 +3200,8 @@ var DriveFileChooser = (props) => {
3164
3200
  {
3165
3201
  type: "button",
3166
3202
  variant: "outline",
3167
- onClick: () => setIsOpen(true),
3168
- disabled,
3203
+ onClick: openPicker,
3204
+ disabled: disabled || allowUnauthenticated && authed === null,
3169
3205
  className: chunkHQTC3554_cjs.cn(
3170
3206
  "nd:w-full nd:h-auto nd:justify-start nd:gap-3 nd:px-3 nd:py-2.5 nd:border-dashed",
3171
3207
  error && "nd:border-destructive"
@@ -3194,7 +3230,7 @@ var DriveFileChooser = (props) => {
3194
3230
  ] })
3195
3231
  ] }),
3196
3232
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "nd:flex nd:items-center nd:gap-1 nd:shrink-0", children: [
3197
- /* @__PURE__ */ jsxRuntime.jsx(Button, { type: "button", variant: "ghost", size: "sm", onClick: () => setIsOpen(true), disabled, children: "Change" }),
3233
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { type: "button", variant: "ghost", size: "sm", onClick: openPicker, disabled, children: "Change" }),
3198
3234
  !disabled && /* @__PURE__ */ jsxRuntime.jsx(Button, { type: "button", variant: "ghost", size: "icon", className: "nd:size-8", onClick: () => handleRemove(displayFiles[0].id), children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { className: "nd:size-4" }) })
3199
3235
  ] })
3200
3236
  ] }),
@@ -3207,7 +3243,7 @@ var DriveFileChooser = (props) => {
3207
3243
  " selected"
3208
3244
  ] }),
3209
3245
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "nd:flex nd:items-center nd:gap-1", children: [
3210
- /* @__PURE__ */ jsxRuntime.jsx(Button, { type: "button", variant: "ghost", size: "sm", className: "nd:h-7 nd:text-xs", onClick: () => setIsOpen(true), disabled, children: "Add more" }),
3246
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { type: "button", variant: "ghost", size: "sm", className: "nd:h-7 nd:text-xs", onClick: openPicker, disabled, children: "Add more" }),
3211
3247
  !disabled && /* @__PURE__ */ jsxRuntime.jsx(Button, { type: "button", variant: "ghost", size: "sm", className: "nd:h-7 nd:text-xs nd:text-muted-foreground", onClick: () => onChange([]), children: "Clear" })
3212
3248
  ] })
3213
3249
  ] }),
@@ -3226,6 +3262,16 @@ var DriveFileChooser = (props) => {
3226
3262
  ] })
3227
3263
  ),
3228
3264
  error && helperText && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "nd:text-xs nd:text-destructive nd:mt-1.5", children: helperText }),
3265
+ unauthenticatedMode && /* @__PURE__ */ jsxRuntime.jsx("input", { ref: fileInputRef, type: "file", accept, multiple, className: "nd:hidden", onChange: handleFilePick }),
3266
+ activeUploads.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "nd:mt-2 nd:space-y-2", children: activeUploads.map((u) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "nd:rounded-lg nd:border nd:px-3 nd:py-2", children: [
3267
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "nd:flex nd:items-center nd:gap-2", children: [
3268
+ u.status === "error" ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { className: "nd:size-4 nd:text-destructive nd:shrink-0" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2, { className: "nd:size-4 nd:animate-spin nd:text-muted-foreground nd:shrink-0" }),
3269
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "nd:text-sm nd:truncate nd:flex-1", children: u.name }),
3270
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "nd:text-xs nd:text-muted-foreground nd:shrink-0", children: u.status === "error" ? "Failed" : `${Math.round(u.currentChunk / Math.max(1, u.totalChunks) * 100)}%` })
3271
+ ] }),
3272
+ u.status !== "error" && /* @__PURE__ */ jsxRuntime.jsx(Progress, { value: Math.round(u.currentChunk / Math.max(1, u.totalChunks) * 100), className: "nd:mt-1.5" }),
3273
+ u.status === "error" && u.error && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "nd:text-xs nd:text-destructive nd:mt-1", children: u.error })
3274
+ ] }, u.id)) }),
3229
3275
  /* @__PURE__ */ jsxRuntime.jsx(Dialog2, { open: isOpen, onOpenChange: setIsOpen, children: /* @__PURE__ */ jsxRuntime.jsxs(Dialog2Content, { showCloseButton: false, className: "nd-drive-root", children: [
3230
3276
  /* @__PURE__ */ jsxRuntime.jsxs(Dialog2Header, { className: "nd:gap-2", children: [
3231
3277
  /* @__PURE__ */ jsxRuntime.jsx(MobileSidebarSheet, {}),