@tulip-systems/drive 0.8.1 → 0.8.3

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 (141) hide show
  1. package/dist/client.d.mts +5 -0
  2. package/dist/client.mjs +6 -0
  3. package/dist/components/content.d.mts +13 -0
  4. package/dist/components/content.mjs +17 -0
  5. package/dist/components/context.client.d.mts +13 -0
  6. package/dist/components/dnd.client.d.mts +16 -0
  7. package/dist/components/dnd.client.mjs +29 -0
  8. package/dist/components/grid-card.client.d.mts +46 -0
  9. package/dist/components/grid-card.client.mjs +173 -0
  10. package/dist/components/grid.client.d.mts +53 -0
  11. package/dist/components/grid.client.mjs +53 -0
  12. package/dist/components/navigation/breadcrumbs.client.d.mts +25 -0
  13. package/dist/components/navigation/breadcrumbs.client.mjs +51 -0
  14. package/dist/components/navigation/header.client.d.mts +27 -0
  15. package/dist/components/navigation/header.client.mjs +40 -0
  16. package/dist/components/navigation/toolbar.client.d.mts +23 -0
  17. package/dist/components/navigation/toolbar.client.mjs +34 -0
  18. package/dist/components/navigation/view-switcher.client.d.mts +9 -0
  19. package/dist/components/navigation/view-switcher.client.mjs +35 -0
  20. package/dist/components/selection.client.d.mts +27 -0
  21. package/dist/components/selection.client.mjs +36 -0
  22. package/dist/components/view.client.d.mts +25 -0
  23. package/dist/components/view.client.mjs +43 -0
  24. package/dist/config/filters.mjs +14 -0
  25. package/dist/config/types.mjs +60 -0
  26. package/dist/google/client.d.mts +8 -0
  27. package/dist/google/client.mjs +9 -0
  28. package/dist/google/server.d.mts +3 -0
  29. package/dist/google/server.mjs +4 -0
  30. package/dist/google.d.mts +6 -0
  31. package/dist/google.mjs +7 -0
  32. package/dist/index.d.mts +7 -0
  33. package/dist/index.mjs +7 -0
  34. package/dist/lib/constants.d.mts +11 -0
  35. package/dist/lib/constants.mjs +20 -0
  36. package/dist/lib/contracts.d.mts +100 -0
  37. package/dist/lib/dto.d.mts +117 -0
  38. package/dist/lib/dto.mjs +57 -0
  39. package/dist/lib/helpers.d.mts +17 -0
  40. package/dist/lib/helpers.mjs +36 -0
  41. package/dist/lib/helpers.server.d.mts +13 -0
  42. package/dist/lib/helpers.server.mjs +15 -0
  43. package/dist/lib/search-params.d.mts +8 -0
  44. package/dist/lib/search-params.mjs +7 -0
  45. package/dist/lib/validators.d.mts +157 -0
  46. package/dist/lib/validators.mjs +65 -0
  47. package/dist/local/client.d.mts +13 -0
  48. package/dist/local/client.mjs +13 -0
  49. package/dist/local/server.d.mts +4 -0
  50. package/dist/local/server.mjs +5 -0
  51. package/dist/local.d.mts +8 -0
  52. package/dist/local.mjs +9 -0
  53. package/dist/providers/google/components/command-file-update.d.mts +21 -0
  54. package/dist/providers/google/components/command-file-update.mjs +51 -0
  55. package/dist/providers/google/components/command-folder-create.d.mts +21 -0
  56. package/dist/providers/google/components/command-folder-create.mjs +58 -0
  57. package/dist/providers/google/components/command-folder-update.d.mts +21 -0
  58. package/dist/providers/google/components/command-folder-update.mjs +51 -0
  59. package/dist/providers/google/components/content.client.d.mts +9 -0
  60. package/dist/providers/google/components/content.client.mjs +10 -0
  61. package/dist/providers/google/components/navigation.client.d.mts +15 -0
  62. package/dist/providers/google/components/navigation.client.mjs +17 -0
  63. package/dist/providers/google/components/provider.client.d.mts +32 -0
  64. package/dist/providers/google/components/provider.client.mjs +42 -0
  65. package/dist/providers/google/components/view.client.d.mts +40 -0
  66. package/dist/providers/google/components/view.client.mjs +96 -0
  67. package/dist/providers/google/config/columns-data.d.mts +7 -0
  68. package/dist/providers/google/config/columns-data.mjs +69 -0
  69. package/dist/providers/google/config/filters.d.mts +15 -0
  70. package/dist/providers/google/config/filters.mjs +7 -0
  71. package/dist/providers/google/lib/constants.mjs +12 -0
  72. package/dist/providers/google/lib/dto.d.mts +38 -0
  73. package/dist/providers/google/lib/dto.mjs +65 -0
  74. package/dist/providers/google/lib/helpers.mjs +38 -0
  75. package/dist/providers/google/lib/router.server.d.mts +611 -0
  76. package/dist/providers/google/lib/router.server.mjs +39 -0
  77. package/dist/providers/google/lib/search-params.d.mts +14 -0
  78. package/dist/providers/google/lib/search-params.mjs +11 -0
  79. package/dist/providers/google/lib/service.server.d.mts +185 -0
  80. package/dist/providers/google/lib/service.server.mjs +610 -0
  81. package/dist/providers/google/lib/validators.d.mts +302 -0
  82. package/dist/providers/google/lib/validators.mjs +58 -0
  83. package/dist/providers/local/components/command-file-update.d.mts +17 -0
  84. package/dist/providers/local/components/command-file-update.mjs +47 -0
  85. package/dist/providers/local/components/command-file-upload.d.mts +10 -0
  86. package/dist/providers/local/components/command-file-upload.mjs +34 -0
  87. package/dist/providers/local/components/command-folder-create.d.mts +17 -0
  88. package/dist/providers/local/components/command-folder-create.mjs +54 -0
  89. package/dist/providers/local/components/command-folder-update.d.mts +17 -0
  90. package/dist/providers/local/components/command-folder-update.mjs +47 -0
  91. package/dist/providers/local/components/content.client.d.mts +6 -0
  92. package/dist/providers/local/components/content.client.mjs +7 -0
  93. package/dist/providers/local/components/navigation.client.d.mts +15 -0
  94. package/dist/providers/local/components/navigation.client.mjs +17 -0
  95. package/dist/providers/local/components/provider.client.d.mts +39 -0
  96. package/dist/providers/local/components/provider.client.mjs +60 -0
  97. package/dist/providers/local/components/upload-zone-context.client.d.mts +37 -0
  98. package/dist/providers/local/components/upload-zone-context.client.mjs +22 -0
  99. package/dist/providers/local/components/upload-zone.client.d.mts +29 -0
  100. package/dist/providers/local/components/upload-zone.client.mjs +146 -0
  101. package/dist/providers/local/components/view.client.d.mts +31 -0
  102. package/dist/providers/local/components/view.client.mjs +90 -0
  103. package/dist/providers/local/config/columns-data.d.mts +7 -0
  104. package/dist/providers/local/config/columns-data.mjs +69 -0
  105. package/dist/providers/local/config/filters.d.mts +25 -0
  106. package/dist/providers/local/config/filters.mjs +14 -0
  107. package/dist/providers/local/lib/constants.d.mts +11 -0
  108. package/dist/providers/local/lib/constants.mjs +28 -0
  109. package/dist/providers/local/lib/helpers.d.mts +44 -0
  110. package/dist/providers/local/lib/helpers.mjs +109 -0
  111. package/dist/providers/local/lib/route-handler.server.d.mts +33 -0
  112. package/dist/providers/local/lib/route-handler.server.mjs +113 -0
  113. package/dist/providers/local/lib/router.server.d.mts +41647 -0
  114. package/dist/providers/local/lib/router.server.mjs +51 -0
  115. package/dist/providers/local/lib/schema.d.mts +1112 -0
  116. package/dist/providers/local/lib/schema.mjs +70 -0
  117. package/dist/providers/local/lib/search-params.d.mts +13 -0
  118. package/dist/providers/local/lib/search-params.mjs +8 -0
  119. package/dist/providers/local/lib/service.server.d.mts +488 -0
  120. package/dist/providers/local/lib/service.server.mjs +667 -0
  121. package/dist/providers/local/lib/upload.client.d.mts +61 -0
  122. package/dist/providers/local/lib/upload.client.mjs +99 -0
  123. package/dist/providers/local/lib/validators.d.mts +453 -0
  124. package/dist/providers/local/lib/validators.mjs +95 -0
  125. package/dist/server.d.mts +2 -0
  126. package/dist/server.mjs +3 -0
  127. package/package.json +45 -46
  128. package/src/components/grid-card.client.tsx +17 -12
  129. package/src/components/selection.client.tsx +1 -2
  130. package/src/config/types.tsx +1 -1
  131. package/src/providers/google/components/command-file-update.tsx +2 -2
  132. package/src/providers/google/components/command-folder-create.tsx +2 -2
  133. package/src/providers/google/components/command-folder-update.tsx +2 -2
  134. package/src/providers/google/components/view.client.tsx +1 -7
  135. package/src/providers/google/lib/helpers.ts +0 -9
  136. package/src/providers/google/lib/service.server.ts +1 -3
  137. package/src/providers/local/components/command-file-update.tsx +2 -2
  138. package/src/providers/local/components/command-folder-create.tsx +2 -2
  139. package/src/providers/local/components/command-folder-update.tsx +2 -2
  140. package/src/providers/local/components/upload-zone.client.tsx +1 -1
  141. package/src/providers/local/lib/helpers.ts +0 -1
@@ -0,0 +1,109 @@
1
+ //#region src/providers/local/lib/helpers.ts
2
+ /**
3
+ * Convert a LocalNode to LocalDriveNode by adding provider and links
4
+ * @param node The LocalNode to convert
5
+ * @returns The converted LocalDriveNode
6
+ */
7
+ function toLocalDriveNode(node) {
8
+ return {
9
+ ...node,
10
+ type: node.type,
11
+ readonly: node.readonly ?? false,
12
+ hidden: node.hidden ?? false,
13
+ provider: "local",
14
+ links: {
15
+ view: node.type === "file" ? getLocalDriveFileUrl(node.id, { disposition: "inline" }) : null,
16
+ download: node.type === "file" ? getLocalDriveFileUrl(node.id, { disposition: "attachment" }) : null,
17
+ preview: node.type === "file" ? getLocalDriveFileUrl(node.id) : null,
18
+ thumbnail: node.type === "file" ? getLocalDriveFileUrl(node.id, { variant: "preview-256" }) : null
19
+ },
20
+ availability: "ready"
21
+ };
22
+ }
23
+ /**
24
+ * Check if the node is a file
25
+ */
26
+ function isLocalDriveFile(node) {
27
+ return node.type === "file";
28
+ }
29
+ /**
30
+ * Check if the node is a folder
31
+ */
32
+ function isLocalDriveFolder(node) {
33
+ return node.type === "folder";
34
+ }
35
+ /**
36
+ * Get file url
37
+ */
38
+ function getLocalDriveFileUrl(id, options = {}) {
39
+ const searchParams = new URLSearchParams();
40
+ if (options?.variant) searchParams.set("variant", options.variant);
41
+ if (options?.disposition) searchParams.set("disposition", options.disposition);
42
+ const queryString = searchParams.toString();
43
+ return `/api/drive/files/${id}${queryString ? `?${queryString}` : ""}`;
44
+ }
45
+ /**
46
+ * Image loader
47
+ */
48
+ function localDriveImageLoader({ src, width }) {
49
+ const url = new URL(src, window.location.origin);
50
+ url.searchParams.set("variant", `preview-${width}`);
51
+ return url.toString();
52
+ }
53
+ function inferLocalDriveNodeSubtype({ name, contentType }) {
54
+ if (contentType?.startsWith("image/")) return "image";
55
+ if (contentType === "application/pdf") return "document";
56
+ if (contentType?.includes("spreadsheet")) return "spreadsheet";
57
+ if (contentType?.startsWith("video/")) return "video";
58
+ if (contentType?.startsWith("audio/")) return "audio";
59
+ if (contentType?.includes("zip") || contentType?.includes("archive")) return "archive";
60
+ const ext = name?.split(".").pop()?.toLowerCase();
61
+ if ([
62
+ "jpg",
63
+ "jpeg",
64
+ "png",
65
+ "gif",
66
+ "bmp",
67
+ "webp"
68
+ ].includes(ext ?? "")) return "image";
69
+ if ([
70
+ "pdf",
71
+ "doc",
72
+ "docx",
73
+ "txt"
74
+ ].includes(ext ?? "")) return "document";
75
+ if ([
76
+ "xls",
77
+ "xlsx",
78
+ "ods"
79
+ ].includes(ext ?? "")) return "spreadsheet";
80
+ if ([
81
+ "zip",
82
+ "rar",
83
+ "7z"
84
+ ].includes(ext ?? "")) return "archive";
85
+ return "other";
86
+ }
87
+ /**
88
+ * Render bytes
89
+ */
90
+ function renderBytes(bytes) {
91
+ const units = [
92
+ "B",
93
+ "KB",
94
+ "MB",
95
+ "GB",
96
+ "TB",
97
+ "PB"
98
+ ];
99
+ let size = bytes;
100
+ let unitIndex = 0;
101
+ while (size >= 1024 && unitIndex < units.length - 1) {
102
+ size /= 1024;
103
+ unitIndex++;
104
+ }
105
+ return `${size.toFixed(2)}${units[unitIndex]}`;
106
+ }
107
+
108
+ //#endregion
109
+ export { getLocalDriveFileUrl, inferLocalDriveNodeSubtype, isLocalDriveFile, isLocalDriveFolder, localDriveImageLoader, renderBytes, toLocalDriveNode };
@@ -0,0 +1,33 @@
1
+ import { LocalDrive } from "./service.server.mjs";
2
+ import { TDatabaseSchema, TulipContext } from "@tulip-systems/core/config";
3
+ import { NextRequest } from "next/server";
4
+
5
+ //#region src/providers/local/lib/route-handler.server.d.ts
6
+ type RouteCtx = {
7
+ params: Promise<{
8
+ rest?: string[];
9
+ }>;
10
+ };
11
+ type CreateLocalDriveRouteHandlerProps<TSchema extends TDatabaseSchema> = Pick<TulipContext<TSchema>, "auth"> & {
12
+ drive: LocalDrive<TSchema>;
13
+ };
14
+ /**
15
+ * Creates a catch-all drive route handler for `/api/drive/[[...rest]]`.
16
+ *
17
+ * Current support:
18
+ * - `GET /api/drive/files/:id?variant=:variant&disposition=:disposition`
19
+ * resolves a drive node, checks access for private local assets, and redirects
20
+ * to a short-lived file URL for the requested node variant.
21
+ *
22
+ * @param props - Route handler dependencies.
23
+ * @returns Next.js route handlers for GET, POST, PUT, PATCH, and DELETE.
24
+ */
25
+ declare function createLocalDriveRouteHandler<TSchema extends TDatabaseSchema>(context: CreateLocalDriveRouteHandlerProps<TSchema>): {
26
+ GET: (request: NextRequest, ctx: RouteCtx) => Promise<Response>;
27
+ POST: () => Promise<Response>;
28
+ PUT: () => Promise<Response>;
29
+ PATCH: () => Promise<Response>;
30
+ DELETE: () => Promise<Response>;
31
+ };
32
+ //#endregion
33
+ export { createLocalDriveRouteHandler };
@@ -0,0 +1,113 @@
1
+ import { getLocalFileURLSchema } from "./validators.mjs";
2
+ import z$1 from "zod";
3
+ import { getSession } from "@tulip-systems/core/auth/server";
4
+ import { ServerError } from "@tulip-systems/core/router/server";
5
+ import { connection } from "next/server";
6
+
7
+ //#region src/providers/local/lib/route-handler.server.ts
8
+ /**
9
+ * Creates a catch-all drive route handler for `/api/drive/[[...rest]]`.
10
+ *
11
+ * Current support:
12
+ * - `GET /api/drive/files/:id?variant=:variant&disposition=:disposition`
13
+ * resolves a drive node, checks access for private local assets, and redirects
14
+ * to a short-lived file URL for the requested node variant.
15
+ *
16
+ * @param props - Route handler dependencies.
17
+ * @returns Next.js route handlers for GET, POST, PUT, PATCH, and DELETE.
18
+ */
19
+ function createLocalDriveRouteHandler(context) {
20
+ /**
21
+ * GET /api/drive/[[...rest]]
22
+ *
23
+ * Current route support:
24
+ * - /api/drive/files/:id?variant=:variant&disposition=:disposition
25
+ */
26
+ async function GET(request, ctx) {
27
+ const { rest = [] } = await ctx.params;
28
+ if (rest[0] === "files") {
29
+ const id = rest[1];
30
+ if (!id) return Response.json({ error: {
31
+ code: "BAD_REQUEST",
32
+ message: "Missing file id"
33
+ } }, { status: 400 });
34
+ const searchParams = request.nextUrl.searchParams;
35
+ const variant = searchParams.get("variant") ?? void 0;
36
+ const disposition = searchParams.get("disposition") ?? void 0;
37
+ try {
38
+ const node = await context.drive.getNodeById(id);
39
+ if (!node) return Response.json({ error: {
40
+ code: "NOT_FOUND",
41
+ message: "Node not found"
42
+ } }, { status: 404 });
43
+ if (node.assetId) {
44
+ const asset = await context.drive.storage.getAssetById(node.assetId);
45
+ if (!asset) return Response.json({ error: {
46
+ code: "NOT_FOUND",
47
+ message: "Asset not found"
48
+ } }, { status: 404 });
49
+ if (asset.visibility === "private") {
50
+ if (!await getSession(context)) return Response.json({ error: {
51
+ code: "UNAUTHORIZED",
52
+ message: "Unauthorized"
53
+ } }, { status: 401 });
54
+ }
55
+ }
56
+ const options = getLocalFileURLSchema.parse({
57
+ variant,
58
+ disposition
59
+ });
60
+ const url = await context.drive.getURL(node, options);
61
+ return Response.redirect(url, 307);
62
+ } catch (error) {
63
+ if (error instanceof z$1.ZodError) return Response.json({ error: {
64
+ code: "BAD_REQUEST",
65
+ message: "Invalid request input"
66
+ } }, { status: 400 });
67
+ if (error instanceof ServerError) {
68
+ if (error.code === "BAD_REQUEST") return Response.json({ error: {
69
+ code: "BAD_REQUEST",
70
+ message: error.message
71
+ } }, { status: 400 });
72
+ if (error.code === "NOT_FOUND") return Response.json({ error: {
73
+ code: "NOT_FOUND",
74
+ message: error.message
75
+ } }, { status: 404 });
76
+ if (error.code === "UNAUTHORIZED") return Response.json({ error: {
77
+ code: "UNAUTHORIZED",
78
+ message: error.message
79
+ } }, { status: 401 });
80
+ }
81
+ console.error("Drive route error", error);
82
+ return Response.json({ error: {
83
+ code: "INTERNAL_SERVER_ERROR",
84
+ message: "Something went wrong"
85
+ } }, { status: 500 });
86
+ }
87
+ }
88
+ return Response.json({ error: {
89
+ code: "NOT_FOUND",
90
+ message: "Route not found"
91
+ } }, { status: 404 });
92
+ }
93
+ /**
94
+ * POST, PUT, PATCH, DELETE /api/drive/[[...rest]]
95
+ */
96
+ async function POST() {
97
+ await connection();
98
+ return Response.json({ error: {
99
+ code: "NOT_FOUND",
100
+ message: "Route not found"
101
+ } }, { status: 404 });
102
+ }
103
+ return {
104
+ GET,
105
+ POST,
106
+ PUT: POST,
107
+ PATCH: POST,
108
+ DELETE: POST
109
+ };
110
+ }
111
+
112
+ //#endregion
113
+ export { createLocalDriveRouteHandler };