@tulip-systems/drive 0.8.1 → 0.8.2

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 (236) hide show
  1. package/dist/client.d.mts +5 -0
  2. package/dist/client.mjs +6 -0
  3. package/dist/components/content.d.mts +14 -0
  4. package/dist/components/content.d.mts.map +1 -0
  5. package/dist/components/content.mjs +18 -0
  6. package/dist/components/content.mjs.map +1 -0
  7. package/dist/components/context.client.d.mts +14 -0
  8. package/dist/components/context.client.d.mts.map +1 -0
  9. package/dist/components/dnd.client.d.mts +17 -0
  10. package/dist/components/dnd.client.d.mts.map +1 -0
  11. package/dist/components/dnd.client.mjs +30 -0
  12. package/dist/components/dnd.client.mjs.map +1 -0
  13. package/dist/components/grid-card.client.d.mts +43 -0
  14. package/dist/components/grid-card.client.d.mts.map +1 -0
  15. package/dist/components/grid-card.client.mjs +173 -0
  16. package/dist/components/grid-card.client.mjs.map +1 -0
  17. package/dist/components/grid.client.d.mts +54 -0
  18. package/dist/components/grid.client.d.mts.map +1 -0
  19. package/dist/components/grid.client.mjs +54 -0
  20. package/dist/components/grid.client.mjs.map +1 -0
  21. package/dist/components/navigation/breadcrumbs.client.d.mts +26 -0
  22. package/dist/components/navigation/breadcrumbs.client.d.mts.map +1 -0
  23. package/dist/components/navigation/breadcrumbs.client.mjs +52 -0
  24. package/dist/components/navigation/breadcrumbs.client.mjs.map +1 -0
  25. package/dist/components/navigation/header.client.d.mts +28 -0
  26. package/dist/components/navigation/header.client.d.mts.map +1 -0
  27. package/dist/components/navigation/header.client.mjs +41 -0
  28. package/dist/components/navigation/header.client.mjs.map +1 -0
  29. package/dist/components/navigation/toolbar.client.d.mts +24 -0
  30. package/dist/components/navigation/toolbar.client.d.mts.map +1 -0
  31. package/dist/components/navigation/toolbar.client.mjs +35 -0
  32. package/dist/components/navigation/toolbar.client.mjs.map +1 -0
  33. package/dist/components/navigation/view-switcher.client.d.mts +10 -0
  34. package/dist/components/navigation/view-switcher.client.d.mts.map +1 -0
  35. package/dist/components/navigation/view-switcher.client.mjs +36 -0
  36. package/dist/components/navigation/view-switcher.client.mjs.map +1 -0
  37. package/dist/components/selection.client.d.mts +28 -0
  38. package/dist/components/selection.client.d.mts.map +1 -0
  39. package/dist/components/selection.client.mjs +39 -0
  40. package/dist/components/selection.client.mjs.map +1 -0
  41. package/dist/components/view.client.d.mts +26 -0
  42. package/dist/components/view.client.d.mts.map +1 -0
  43. package/dist/components/view.client.mjs +44 -0
  44. package/dist/components/view.client.mjs.map +1 -0
  45. package/dist/config/filters.mjs +15 -0
  46. package/dist/config/filters.mjs.map +1 -0
  47. package/dist/config/types.mjs +61 -0
  48. package/dist/config/types.mjs.map +1 -0
  49. package/dist/google/client.d.mts +8 -0
  50. package/dist/google/client.mjs +9 -0
  51. package/dist/google/server.d.mts +3 -0
  52. package/dist/google/server.mjs +4 -0
  53. package/dist/google.d.mts +6 -0
  54. package/dist/google.mjs +7 -0
  55. package/dist/index.d.mts +7 -0
  56. package/dist/index.mjs +7 -0
  57. package/dist/lib/constants.d.mts +12 -0
  58. package/dist/lib/constants.d.mts.map +1 -0
  59. package/dist/lib/constants.mjs +21 -0
  60. package/dist/lib/constants.mjs.map +1 -0
  61. package/dist/lib/contracts.d.mts +101 -0
  62. package/dist/lib/contracts.d.mts.map +1 -0
  63. package/dist/lib/dto.d.mts +118 -0
  64. package/dist/lib/dto.d.mts.map +1 -0
  65. package/dist/lib/dto.mjs +58 -0
  66. package/dist/lib/dto.mjs.map +1 -0
  67. package/dist/lib/helpers.d.mts +18 -0
  68. package/dist/lib/helpers.d.mts.map +1 -0
  69. package/dist/lib/helpers.mjs +37 -0
  70. package/dist/lib/helpers.mjs.map +1 -0
  71. package/dist/lib/helpers.server.d.mts +14 -0
  72. package/dist/lib/helpers.server.d.mts.map +1 -0
  73. package/dist/lib/helpers.server.mjs +16 -0
  74. package/dist/lib/helpers.server.mjs.map +1 -0
  75. package/dist/lib/search-params.d.mts +9 -0
  76. package/dist/lib/search-params.d.mts.map +1 -0
  77. package/dist/lib/search-params.mjs +8 -0
  78. package/dist/lib/search-params.mjs.map +1 -0
  79. package/dist/lib/validators.d.mts +158 -0
  80. package/dist/lib/validators.d.mts.map +1 -0
  81. package/dist/lib/validators.mjs +66 -0
  82. package/dist/lib/validators.mjs.map +1 -0
  83. package/dist/local/client.d.mts +13 -0
  84. package/dist/local/client.mjs +13 -0
  85. package/dist/local/server.d.mts +4 -0
  86. package/dist/local/server.mjs +5 -0
  87. package/dist/local.d.mts +8 -0
  88. package/dist/local.mjs +9 -0
  89. package/dist/providers/google/components/command-file-update.d.mts +22 -0
  90. package/dist/providers/google/components/command-file-update.d.mts.map +1 -0
  91. package/dist/providers/google/components/command-file-update.mjs +52 -0
  92. package/dist/providers/google/components/command-file-update.mjs.map +1 -0
  93. package/dist/providers/google/components/command-folder-create.d.mts +22 -0
  94. package/dist/providers/google/components/command-folder-create.d.mts.map +1 -0
  95. package/dist/providers/google/components/command-folder-create.mjs +59 -0
  96. package/dist/providers/google/components/command-folder-create.mjs.map +1 -0
  97. package/dist/providers/google/components/command-folder-update.d.mts +22 -0
  98. package/dist/providers/google/components/command-folder-update.d.mts.map +1 -0
  99. package/dist/providers/google/components/command-folder-update.mjs +52 -0
  100. package/dist/providers/google/components/command-folder-update.mjs.map +1 -0
  101. package/dist/providers/google/components/content.client.d.mts +10 -0
  102. package/dist/providers/google/components/content.client.d.mts.map +1 -0
  103. package/dist/providers/google/components/content.client.mjs +11 -0
  104. package/dist/providers/google/components/content.client.mjs.map +1 -0
  105. package/dist/providers/google/components/navigation.client.d.mts +16 -0
  106. package/dist/providers/google/components/navigation.client.d.mts.map +1 -0
  107. package/dist/providers/google/components/navigation.client.mjs +18 -0
  108. package/dist/providers/google/components/navigation.client.mjs.map +1 -0
  109. package/dist/providers/google/components/provider.client.d.mts +33 -0
  110. package/dist/providers/google/components/provider.client.d.mts.map +1 -0
  111. package/dist/providers/google/components/provider.client.mjs +43 -0
  112. package/dist/providers/google/components/provider.client.mjs.map +1 -0
  113. package/dist/providers/google/components/view.client.d.mts +41 -0
  114. package/dist/providers/google/components/view.client.d.mts.map +1 -0
  115. package/dist/providers/google/components/view.client.mjs +98 -0
  116. package/dist/providers/google/components/view.client.mjs.map +1 -0
  117. package/dist/providers/google/config/columns-data.d.mts +8 -0
  118. package/dist/providers/google/config/columns-data.d.mts.map +1 -0
  119. package/dist/providers/google/config/columns-data.mjs +70 -0
  120. package/dist/providers/google/config/columns-data.mjs.map +1 -0
  121. package/dist/providers/google/config/filters.d.mts +16 -0
  122. package/dist/providers/google/config/filters.d.mts.map +1 -0
  123. package/dist/providers/google/config/filters.mjs +8 -0
  124. package/dist/providers/google/config/filters.mjs.map +1 -0
  125. package/dist/providers/google/lib/constants.mjs +13 -0
  126. package/dist/providers/google/lib/constants.mjs.map +1 -0
  127. package/dist/providers/google/lib/dto.d.mts +39 -0
  128. package/dist/providers/google/lib/dto.d.mts.map +1 -0
  129. package/dist/providers/google/lib/dto.mjs +66 -0
  130. package/dist/providers/google/lib/dto.mjs.map +1 -0
  131. package/dist/providers/google/lib/helpers.mjs +46 -0
  132. package/dist/providers/google/lib/helpers.mjs.map +1 -0
  133. package/dist/providers/google/lib/router.server.d.mts +612 -0
  134. package/dist/providers/google/lib/router.server.d.mts.map +1 -0
  135. package/dist/providers/google/lib/router.server.mjs +40 -0
  136. package/dist/providers/google/lib/router.server.mjs.map +1 -0
  137. package/dist/providers/google/lib/search-params.d.mts +15 -0
  138. package/dist/providers/google/lib/search-params.d.mts.map +1 -0
  139. package/dist/providers/google/lib/search-params.mjs +12 -0
  140. package/dist/providers/google/lib/search-params.mjs.map +1 -0
  141. package/dist/providers/google/lib/service.server.d.mts +186 -0
  142. package/dist/providers/google/lib/service.server.d.mts.map +1 -0
  143. package/dist/providers/google/lib/service.server.mjs +613 -0
  144. package/dist/providers/google/lib/service.server.mjs.map +1 -0
  145. package/dist/providers/google/lib/validators.d.mts +303 -0
  146. package/dist/providers/google/lib/validators.d.mts.map +1 -0
  147. package/dist/providers/google/lib/validators.mjs +59 -0
  148. package/dist/providers/google/lib/validators.mjs.map +1 -0
  149. package/dist/providers/local/components/command-file-update.d.mts +18 -0
  150. package/dist/providers/local/components/command-file-update.d.mts.map +1 -0
  151. package/dist/providers/local/components/command-file-update.mjs +48 -0
  152. package/dist/providers/local/components/command-file-update.mjs.map +1 -0
  153. package/dist/providers/local/components/command-file-upload.d.mts +11 -0
  154. package/dist/providers/local/components/command-file-upload.d.mts.map +1 -0
  155. package/dist/providers/local/components/command-file-upload.mjs +35 -0
  156. package/dist/providers/local/components/command-file-upload.mjs.map +1 -0
  157. package/dist/providers/local/components/command-folder-create.d.mts +18 -0
  158. package/dist/providers/local/components/command-folder-create.d.mts.map +1 -0
  159. package/dist/providers/local/components/command-folder-create.mjs +55 -0
  160. package/dist/providers/local/components/command-folder-create.mjs.map +1 -0
  161. package/dist/providers/local/components/command-folder-update.d.mts +18 -0
  162. package/dist/providers/local/components/command-folder-update.d.mts.map +1 -0
  163. package/dist/providers/local/components/command-folder-update.mjs +48 -0
  164. package/dist/providers/local/components/command-folder-update.mjs.map +1 -0
  165. package/dist/providers/local/components/content.client.d.mts +7 -0
  166. package/dist/providers/local/components/content.client.d.mts.map +1 -0
  167. package/dist/providers/local/components/content.client.mjs +8 -0
  168. package/dist/providers/local/components/content.client.mjs.map +1 -0
  169. package/dist/providers/local/components/navigation.client.d.mts +16 -0
  170. package/dist/providers/local/components/navigation.client.d.mts.map +1 -0
  171. package/dist/providers/local/components/navigation.client.mjs +18 -0
  172. package/dist/providers/local/components/navigation.client.mjs.map +1 -0
  173. package/dist/providers/local/components/provider.client.d.mts +40 -0
  174. package/dist/providers/local/components/provider.client.d.mts.map +1 -0
  175. package/dist/providers/local/components/provider.client.mjs +61 -0
  176. package/dist/providers/local/components/provider.client.mjs.map +1 -0
  177. package/dist/providers/local/components/upload-zone-context.client.d.mts +38 -0
  178. package/dist/providers/local/components/upload-zone-context.client.d.mts.map +1 -0
  179. package/dist/providers/local/components/upload-zone-context.client.mjs +23 -0
  180. package/dist/providers/local/components/upload-zone-context.client.mjs.map +1 -0
  181. package/dist/providers/local/components/upload-zone.client.d.mts +30 -0
  182. package/dist/providers/local/components/upload-zone.client.d.mts.map +1 -0
  183. package/dist/providers/local/components/upload-zone.client.mjs +147 -0
  184. package/dist/providers/local/components/upload-zone.client.mjs.map +1 -0
  185. package/dist/providers/local/components/view.client.d.mts +32 -0
  186. package/dist/providers/local/components/view.client.d.mts.map +1 -0
  187. package/dist/providers/local/components/view.client.mjs +91 -0
  188. package/dist/providers/local/components/view.client.mjs.map +1 -0
  189. package/dist/providers/local/config/columns-data.d.mts +8 -0
  190. package/dist/providers/local/config/columns-data.d.mts.map +1 -0
  191. package/dist/providers/local/config/columns-data.mjs +70 -0
  192. package/dist/providers/local/config/columns-data.mjs.map +1 -0
  193. package/dist/providers/local/config/filters.d.mts +26 -0
  194. package/dist/providers/local/config/filters.d.mts.map +1 -0
  195. package/dist/providers/local/config/filters.mjs +15 -0
  196. package/dist/providers/local/config/filters.mjs.map +1 -0
  197. package/dist/providers/local/lib/constants.d.mts +12 -0
  198. package/dist/providers/local/lib/constants.d.mts.map +1 -0
  199. package/dist/providers/local/lib/constants.mjs +29 -0
  200. package/dist/providers/local/lib/constants.mjs.map +1 -0
  201. package/dist/providers/local/lib/helpers.d.mts +45 -0
  202. package/dist/providers/local/lib/helpers.d.mts.map +1 -0
  203. package/dist/providers/local/lib/helpers.mjs +110 -0
  204. package/dist/providers/local/lib/helpers.mjs.map +1 -0
  205. package/dist/providers/local/lib/route-handler.server.d.mts +34 -0
  206. package/dist/providers/local/lib/route-handler.server.d.mts.map +1 -0
  207. package/dist/providers/local/lib/route-handler.server.mjs +114 -0
  208. package/dist/providers/local/lib/route-handler.server.mjs.map +1 -0
  209. package/dist/providers/local/lib/router.server.d.mts +41648 -0
  210. package/dist/providers/local/lib/router.server.d.mts.map +1 -0
  211. package/dist/providers/local/lib/router.server.mjs +52 -0
  212. package/dist/providers/local/lib/router.server.mjs.map +1 -0
  213. package/dist/providers/local/lib/schema.d.mts +1113 -0
  214. package/dist/providers/local/lib/schema.d.mts.map +1 -0
  215. package/dist/providers/local/lib/schema.mjs +71 -0
  216. package/dist/providers/local/lib/schema.mjs.map +1 -0
  217. package/dist/providers/local/lib/search-params.d.mts +14 -0
  218. package/dist/providers/local/lib/search-params.d.mts.map +1 -0
  219. package/dist/providers/local/lib/search-params.mjs +9 -0
  220. package/dist/providers/local/lib/search-params.mjs.map +1 -0
  221. package/dist/providers/local/lib/service.server.d.mts +489 -0
  222. package/dist/providers/local/lib/service.server.d.mts.map +1 -0
  223. package/dist/providers/local/lib/service.server.mjs +668 -0
  224. package/dist/providers/local/lib/service.server.mjs.map +1 -0
  225. package/dist/providers/local/lib/upload.client.d.mts +62 -0
  226. package/dist/providers/local/lib/upload.client.d.mts.map +1 -0
  227. package/dist/providers/local/lib/upload.client.mjs +100 -0
  228. package/dist/providers/local/lib/upload.client.mjs.map +1 -0
  229. package/dist/providers/local/lib/validators.d.mts +454 -0
  230. package/dist/providers/local/lib/validators.d.mts.map +1 -0
  231. package/dist/providers/local/lib/validators.mjs +96 -0
  232. package/dist/providers/local/lib/validators.mjs.map +1 -0
  233. package/dist/server.d.mts +2 -0
  234. package/dist/server.mjs +3 -0
  235. package/package.json +3 -2
  236. package/src/providers/local/lib/helpers.ts +0 -1
@@ -0,0 +1,98 @@
1
+ "use client";
2
+
3
+ import { useDriveSelectionContext } from "../../../components/selection.client.mjs";
4
+ import { DriveGridCard, DriveGridCardSkeleton } from "../../../components/grid-card.client.mjs";
5
+ import { DriveGrid, DriveGridBottombar, DriveGridEmpty, DriveGridLoading } from "../../../components/grid.client.mjs";
6
+ import { useDriveViewContext } from "../../../components/view.client.mjs";
7
+ import { googleDriveColumns } from "../config/columns-data.mjs";
8
+ import { googleDriveImageLoader } from "../lib/helpers.mjs";
9
+ import { useGoogleDriveContext } from "./provider.client.mjs";
10
+ import { TableLayout, TableSkeleton } from "@tulip-systems/core/data-tables";
11
+ import { useMemo } from "react";
12
+ import { FloatingCommandMenu } from "@tulip-systems/core/commands/client";
13
+ import { jsx, jsxs } from "react/jsx-runtime";
14
+ import { DataTable, TableConfigProvider, createTableConfig, useTableConfigContext } from "@tulip-systems/core/data-tables/client";
15
+
16
+ //#region src/providers/google/components/view.client.tsx
17
+ function GoogleDriveViewProvider({ queryData, columns = googleDriveColumns, strategy, commands, columnVisibility, children, ...props }) {
18
+ const { meta } = useGoogleDriveContext();
19
+ const { selection } = useDriveSelectionContext();
20
+ return /* @__PURE__ */ jsx(TableConfigProvider, {
21
+ config: createTableConfig({
22
+ queryData,
23
+ columns,
24
+ strategy,
25
+ commands,
26
+ meta,
27
+ columnVisibility,
28
+ selection
29
+ }),
30
+ children: /* @__PURE__ */ jsx(TableLayout, {
31
+ ...props,
32
+ children
33
+ })
34
+ });
35
+ }
36
+ /**
37
+ * GoogleDriveView
38
+ */
39
+ function GoogleDriveView() {
40
+ const { view } = useDriveViewContext();
41
+ if (view === "grid") return /* @__PURE__ */ jsx(GoogleDriveGrid, {});
42
+ if (view === "list") return /* @__PURE__ */ jsx(GoogleDriveList, {});
43
+ return null;
44
+ }
45
+ /**
46
+ * GoogleDriveGrid
47
+ */
48
+ function GoogleDriveGrid(props) {
49
+ const { queryData, strategy, commands, selection, meta } = useTableConfigContext();
50
+ const { rowCount, paginationState } = strategy;
51
+ const { isFetching, isFetchingNextPage, fetchNextPage } = strategy.meta;
52
+ const hasNextPage = rowCount == null ? false : queryData.length < rowCount;
53
+ const selectedData = useMemo(() => queryData.filter((node) => selection?.rowSelection?.[node.id] === true), [queryData, selection?.rowSelection]);
54
+ return /* @__PURE__ */ jsxs(DriveGrid, {
55
+ ...props,
56
+ children: [
57
+ queryData.length > 0 ? queryData.map((node) => /* @__PURE__ */ jsx(DriveGridCard, {
58
+ node,
59
+ commands,
60
+ imageLoader: googleDriveImageLoader
61
+ }, node.id)) : /* @__PURE__ */ jsx(DriveGridEmpty, { title: "Geen resultaten gevonden" }),
62
+ isFetchingNextPage && Array.from({ length: paginationState?.pageSize ?? 0 }).map((_, index) => /* @__PURE__ */ jsx(DriveGridCardSkeleton, {}, index)),
63
+ /* @__PURE__ */ jsx(DriveGridBottombar, {
64
+ hasNextPage,
65
+ fetchNextPage,
66
+ isFetching,
67
+ isFetchingNextPage
68
+ }),
69
+ commands && commands.length > 0 && /* @__PURE__ */ jsx(FloatingCommandMenu, {
70
+ data: selectedData,
71
+ commands,
72
+ meta,
73
+ state: selectedData.length > 0 ? "open" : "closed",
74
+ onSuccess: () => selection?.setRowSelection?.({})
75
+ })
76
+ ]
77
+ });
78
+ }
79
+ /**
80
+ * GoogleDriveList
81
+ */
82
+ function GoogleDriveList(props) {
83
+ return /* @__PURE__ */ jsx(DataTable, { ...props });
84
+ }
85
+ /**
86
+ * GoogleDriveViewLoading
87
+ */
88
+ function GoogleDriveViewLoading({ ...props }) {
89
+ const { view } = useDriveViewContext();
90
+ return /* @__PURE__ */ jsxs("div", {
91
+ ...props,
92
+ children: [view === "grid" && /* @__PURE__ */ jsx(DriveGridLoading, { ...props }), view === "list" && /* @__PURE__ */ jsx(TableSkeleton, { ...props })]
93
+ });
94
+ }
95
+
96
+ //#endregion
97
+ export { GoogleDriveView, GoogleDriveViewLoading, GoogleDriveViewProvider };
98
+ //# sourceMappingURL=view.client.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view.client.mjs","names":[],"sources":["../../../../src/providers/google/components/view.client.tsx"],"sourcesContent":["\"use client\";\n\nimport type { VisibilityState } from \"@tanstack/react-table\";\nimport type { CommandDef } from \"@tulip-systems/core/commands\";\nimport { FloatingCommandMenu } from \"@tulip-systems/core/commands/client\";\nimport { type TableColumnDef, TableLayout, TableSkeleton } from \"@tulip-systems/core/data-tables\";\nimport {\n createTableConfig,\n DataTable,\n type InfiniteStrategyMeta,\n TableConfigProvider,\n type useInfiniteStrategy,\n useTableConfigContext,\n} from \"@tulip-systems/core/data-tables/client\";\nimport { type ComponentProps, useMemo } from \"react\";\nimport {\n DriveGrid,\n DriveGridBottombar,\n DriveGridEmpty,\n DriveGridLoading,\n} from \"@/components/grid.client\";\nimport { DriveGridCard, DriveGridCardSkeleton } from \"@/components/grid-card.client\";\nimport { useDriveSelectionContext } from \"@/components/selection.client\";\nimport { useDriveViewContext } from \"@/components/view.client\";\nimport { googleDriveColumns } from \"../config/columns-data\";\nimport { googleDriveImageLoader } from \"../lib/helpers\";\nimport type { GoogleDriveNode } from \"../lib/validators\";\nimport { useGoogleDriveContext } from \"./provider.client\";\n\n/**\n * GoogleDriveContent\n */\ntype GoogleDriveViewProviderProps<TData extends GoogleDriveNode = GoogleDriveNode> =\n ComponentProps<\"div\"> & {\n queryData: TData[];\n columns?: TableColumnDef<TData>[];\n strategy: ReturnType<typeof useInfiniteStrategy>;\n commands?: CommandDef<TData>[];\n columnVisibility?: VisibilityState;\n };\n\nexport function GoogleDriveViewProvider<TData extends GoogleDriveNode = GoogleDriveNode>({\n queryData,\n columns = googleDriveColumns as TableColumnDef<TData>[],\n strategy,\n commands,\n columnVisibility,\n children,\n ...props\n}: GoogleDriveViewProviderProps<TData>) {\n const { meta } = useGoogleDriveContext();\n const { selection } = useDriveSelectionContext();\n\n /**\n * Table\n */\n const config = createTableConfig<TData>({\n queryData,\n columns,\n strategy,\n commands,\n meta,\n columnVisibility,\n selection,\n });\n\n return (\n <TableConfigProvider config={config}>\n <TableLayout {...props}>{children}</TableLayout>\n </TableConfigProvider>\n );\n}\n\n/**\n * GoogleDriveView\n */\nexport function GoogleDriveView() {\n const { view } = useDriveViewContext();\n\n if (view === \"grid\") {\n return <GoogleDriveGrid />;\n }\n\n if (view === \"list\") {\n return <GoogleDriveList />;\n }\n\n return null;\n}\n\n/**\n * GoogleDriveGrid\n */\nfunction GoogleDriveGrid(props: ComponentProps<\"div\">) {\n const { queryData, strategy, commands, selection, meta } =\n useTableConfigContext<GoogleDriveNode>();\n const { rowCount, paginationState } = strategy;\n const { isFetching, isFetchingNextPage, fetchNextPage } = strategy.meta as InfiniteStrategyMeta;\n\n const hasNextPage = rowCount == null ? false : queryData.length < rowCount;\n\n const selectedData = useMemo(\n () => queryData.filter((node) => selection?.rowSelection?.[node.id] === true),\n [queryData, selection?.rowSelection],\n );\n\n return (\n <DriveGrid {...props}>\n {queryData.length > 0 ? (\n queryData.map((node) => (\n <DriveGridCard\n key={node.id}\n node={node}\n commands={commands}\n imageLoader={googleDriveImageLoader}\n />\n ))\n ) : (\n <DriveGridEmpty title=\"Geen resultaten gevonden\" />\n )}\n\n {isFetchingNextPage &&\n Array.from({ length: paginationState?.pageSize ?? 0 }).map((_, index) => (\n <DriveGridCardSkeleton key={index} />\n ))}\n\n <DriveGridBottombar\n hasNextPage={hasNextPage}\n fetchNextPage={fetchNextPage}\n isFetching={isFetching}\n isFetchingNextPage={isFetchingNextPage}\n />\n\n {commands && commands.length > 0 && (\n <FloatingCommandMenu\n data={selectedData as never}\n commands={commands as never}\n meta={meta}\n state={selectedData.length > 0 ? \"open\" : \"closed\"}\n onSuccess={() => selection?.setRowSelection?.({})}\n />\n )}\n </DriveGrid>\n );\n}\n\n/**\n * GoogleDriveList\n */\nfunction GoogleDriveList(props: ComponentProps<typeof DataTable>) {\n return <DataTable {...props} />;\n}\n\n/**\n * GoogleDriveViewLoading\n */\nexport function GoogleDriveViewLoading({ ...props }: ComponentProps<\"div\">) {\n const { view } = useDriveViewContext();\n\n return (\n <div {...props}>\n {view === \"grid\" && <DriveGridLoading {...props} />}\n {view === \"list\" && <TableSkeleton {...props} />}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAyCA,SAAgB,wBAAyE,EACvF,WACA,UAAU,oBACV,UACA,UACA,kBACA,UACA,GAAG,SACmC;CACtC,MAAM,EAAE,SAAS,uBAAuB;CACxC,MAAM,EAAE,cAAc,0BAA0B;AAehD,QACE,oBAAC;EAAoB,QAXR,kBAAyB;GACtC;GACA;GACA;GACA;GACA;GACA;GACA;GACD,CAAC;YAIE,oBAAC;GAAY,GAAI;GAAQ;IAAuB;GAC5B;;;;;AAO1B,SAAgB,kBAAkB;CAChC,MAAM,EAAE,SAAS,qBAAqB;AAEtC,KAAI,SAAS,OACX,QAAO,oBAAC,oBAAkB;AAG5B,KAAI,SAAS,OACX,QAAO,oBAAC,oBAAkB;AAG5B,QAAO;;;;;AAMT,SAAS,gBAAgB,OAA8B;CACrD,MAAM,EAAE,WAAW,UAAU,UAAU,WAAW,SAChD,uBAAwC;CAC1C,MAAM,EAAE,UAAU,oBAAoB;CACtC,MAAM,EAAE,YAAY,oBAAoB,kBAAkB,SAAS;CAEnE,MAAM,cAAc,YAAY,OAAO,QAAQ,UAAU,SAAS;CAElE,MAAM,eAAe,cACb,UAAU,QAAQ,SAAS,WAAW,eAAe,KAAK,QAAQ,KAAK,EAC7E,CAAC,WAAW,WAAW,aAAa,CACrC;AAED,QACE,qBAAC;EAAU,GAAI;;GACZ,UAAU,SAAS,IAClB,UAAU,KAAK,SACb,oBAAC;IAEO;IACI;IACV,aAAa;MAHR,KAAK,GAIV,CACF,GAEF,oBAAC,kBAAe,OAAM,6BAA6B;GAGpD,sBACC,MAAM,KAAK,EAAE,QAAQ,iBAAiB,YAAY,GAAG,CAAC,CAAC,KAAK,GAAG,UAC7D,oBAAC,2BAA2B,MAAS,CACrC;GAEJ,oBAAC;IACc;IACE;IACH;IACQ;KACpB;GAED,YAAY,SAAS,SAAS,KAC7B,oBAAC;IACC,MAAM;IACI;IACJ;IACN,OAAO,aAAa,SAAS,IAAI,SAAS;IAC1C,iBAAiB,WAAW,kBAAkB,EAAE,CAAC;KACjD;;GAEM;;;;;AAOhB,SAAS,gBAAgB,OAAyC;AAChE,QAAO,oBAAC,aAAU,GAAI,QAAS;;;;;AAMjC,SAAgB,uBAAuB,EAAE,GAAG,SAAgC;CAC1E,MAAM,EAAE,SAAS,qBAAqB;AAEtC,QACE,qBAAC;EAAI,GAAI;aACN,SAAS,UAAU,oBAAC,oBAAiB,GAAI,QAAS,EAClD,SAAS,UAAU,oBAAC,iBAAc,GAAI,QAAS;GAC5C"}
@@ -0,0 +1,8 @@
1
+ import { GoogleDriveNode } from "../lib/validators.mjs";
2
+ import { TableColumnDef } from "@tulip-systems/core/data-tables";
3
+
4
+ //#region src/providers/google/config/columns-data.d.ts
5
+ declare const googleDriveColumns: TableColumnDef<GoogleDriveNode>[];
6
+ //#endregion
7
+ export { googleDriveColumns };
8
+ //# sourceMappingURL=columns-data.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"columns-data.d.mts","names":[],"sources":["../../../../src/providers/google/config/columns-data.tsx"],"mappings":";;;;cAaa,kBAAA,EAAoB,cAAA,CAAe,eAAA"}
@@ -0,0 +1,70 @@
1
+ "use client";
2
+
3
+ import { driveTreeSearchParams } from "../../../lib/search-params.mjs";
4
+ import { nodeSubtypeConfig, nodeSubtypeVariants } from "../../../config/types.mjs";
5
+ import { TableColumnHeader } from "@tulip-systems/core/data-tables";
6
+ import { findStatus } from "@tulip-systems/core/components";
7
+ import { FolderIcon } from "lucide-react";
8
+ import { jsx, jsxs } from "react/jsx-runtime";
9
+ import { Tooltip, TooltipContent, TooltipTrigger } from "@tulip-systems/core/components/client";
10
+ import { TableTextCell, createTableSelectCell } from "@tulip-systems/core/data-tables/client";
11
+ import Link from "next/link";
12
+ import { createSerializer, useQueryStates } from "nuqs";
13
+
14
+ //#region src/providers/google/config/columns-data.tsx
15
+ const googleDriveColumns = [
16
+ createTableSelectCell(),
17
+ {
18
+ id: "icon",
19
+ accessorKey: "icon",
20
+ header: () => null,
21
+ cell: ({ row }) => {
22
+ if (row.original.type === "file") {
23
+ const subtype = findStatus(nodeSubtypeConfig, row.original.subtype);
24
+ if (!subtype) return null;
25
+ return /* @__PURE__ */ jsx(TableTextCell, {
26
+ className: "w-4",
27
+ children: /* @__PURE__ */ jsxs(Tooltip, { children: [/* @__PURE__ */ jsx(TooltipTrigger, { children: /* @__PURE__ */ jsx(subtype.icon, { className: nodeSubtypeVariants({
28
+ status: row.original.subtype,
29
+ className: "size-4"
30
+ }) }) }), /* @__PURE__ */ jsx(TooltipContent, { children: subtype.label })] })
31
+ });
32
+ }
33
+ if (row.original.type === "folder") return /* @__PURE__ */ jsx(TableTextCell, {
34
+ className: "w-4",
35
+ children: /* @__PURE__ */ jsx(FolderIcon, { className: "w-4 min-w-4" })
36
+ });
37
+ return null;
38
+ },
39
+ enableSorting: false
40
+ },
41
+ {
42
+ id: "name",
43
+ accessorKey: "name",
44
+ header: ({ column }) => /* @__PURE__ */ jsx(TableColumnHeader, {
45
+ column,
46
+ title: "Naam"
47
+ }),
48
+ cell: ({ row }) => {
49
+ const [query] = useQueryStates(driveTreeSearchParams);
50
+ const serialize = createSerializer(driveTreeSearchParams);
51
+ return /* @__PURE__ */ jsx(TableTextCell, {
52
+ className: "w-full min-w-64",
53
+ children: /* @__PURE__ */ jsx(Link, {
54
+ href: row.original.type === "file" ? row.original.links.view ?? "#" : serialize({
55
+ ...query,
56
+ parentId: row.original.id
57
+ }),
58
+ className: "truncate hover:underline",
59
+ target: row.original.type === "file" ? "_blank" : "_self",
60
+ children: row.getValue("name")
61
+ })
62
+ });
63
+ },
64
+ enableSorting: false
65
+ }
66
+ ];
67
+
68
+ //#endregion
69
+ export { googleDriveColumns };
70
+ //# sourceMappingURL=columns-data.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"columns-data.mjs","names":[],"sources":["../../../../src/providers/google/config/columns-data.tsx"],"sourcesContent":["\"use client\";\n\nimport { findStatus } from \"@tulip-systems/core/components\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"@tulip-systems/core/components/client\";\nimport { type TableColumnDef, TableColumnHeader } from \"@tulip-systems/core/data-tables\";\nimport { createTableSelectCell, TableTextCell } from \"@tulip-systems/core/data-tables/client\";\nimport { FolderIcon } from \"lucide-react\";\nimport Link from \"next/link\";\nimport { createSerializer, useQueryStates } from \"nuqs\";\nimport { nodeSubtypeConfig, nodeSubtypeVariants } from \"@/config/types\";\nimport { driveTreeSearchParams } from \"@/lib/search-params\";\nimport type { GoogleDriveNode } from \"../lib/validators\";\n\nexport const googleDriveColumns: TableColumnDef<GoogleDriveNode>[] = [\n createTableSelectCell(),\n {\n id: \"icon\",\n accessorKey: \"icon\",\n header: () => null,\n cell: ({ row }) => {\n if (row.original.type === \"file\") {\n const subtype = findStatus(nodeSubtypeConfig, row.original.subtype);\n if (!subtype) return null;\n\n return (\n <TableTextCell className=\"w-4\">\n <Tooltip>\n <TooltipTrigger>\n <subtype.icon\n className={nodeSubtypeVariants({\n status: row.original.subtype,\n className: \"size-4\",\n })}\n />\n </TooltipTrigger>\n\n <TooltipContent>{subtype.label}</TooltipContent>\n </Tooltip>\n </TableTextCell>\n );\n }\n\n if (row.original.type === \"folder\") {\n return (\n <TableTextCell className=\"w-4\">\n <FolderIcon className=\"w-4 min-w-4\" />\n </TableTextCell>\n );\n }\n\n return null;\n },\n enableSorting: false,\n },\n {\n id: \"name\",\n accessorKey: \"name\",\n header: ({ column }) => <TableColumnHeader column={column} title=\"Naam\" />,\n cell: ({ row }) => {\n const [query] = useQueryStates(driveTreeSearchParams);\n const serialize = createSerializer(driveTreeSearchParams);\n\n return (\n <TableTextCell className=\"w-full min-w-64\">\n <Link\n href={\n row.original.type === \"file\"\n ? ((row.original.links.view as string) ?? \"#\")\n : serialize({ ...query, parentId: row.original.id })\n }\n className=\"truncate hover:underline\"\n target={row.original.type === \"file\" ? \"_blank\" : \"_self\"}\n >\n {row.getValue(\"name\")}\n </Link>\n </TableTextCell>\n );\n },\n enableSorting: false,\n },\n];\n"],"mappings":";;;;;;;;;;;;;;AAaA,MAAa,qBAAwD;CACnE,uBAAuB;CACvB;EACE,IAAI;EACJ,aAAa;EACb,cAAc;EACd,OAAO,EAAE,UAAU;AACjB,OAAI,IAAI,SAAS,SAAS,QAAQ;IAChC,MAAM,UAAU,WAAW,mBAAmB,IAAI,SAAS,QAAQ;AACnE,QAAI,CAAC,QAAS,QAAO;AAErB,WACE,oBAAC;KAAc,WAAU;eACvB,qBAAC,sBACC,oBAAC,4BACC,oBAAC,QAAQ,QACP,WAAW,oBAAoB;MAC7B,QAAQ,IAAI,SAAS;MACrB,WAAW;MACZ,CAAC,GACF,GACa,EAEjB,oBAAC,4BAAgB,QAAQ,QAAuB,IACxC;MACI;;AAIpB,OAAI,IAAI,SAAS,SAAS,SACxB,QACE,oBAAC;IAAc,WAAU;cACvB,oBAAC,cAAW,WAAU,gBAAgB;KACxB;AAIpB,UAAO;;EAET,eAAe;EAChB;CACD;EACE,IAAI;EACJ,aAAa;EACb,SAAS,EAAE,aAAa,oBAAC;GAA0B;GAAQ,OAAM;IAAS;EAC1E,OAAO,EAAE,UAAU;GACjB,MAAM,CAAC,SAAS,eAAe,sBAAsB;GACrD,MAAM,YAAY,iBAAiB,sBAAsB;AAEzD,UACE,oBAAC;IAAc,WAAU;cACvB,oBAAC;KACC,MACE,IAAI,SAAS,SAAS,SAChB,IAAI,SAAS,MAAM,QAAmB,MACxC,UAAU;MAAE,GAAG;MAAO,UAAU,IAAI,SAAS;MAAI,CAAC;KAExD,WAAU;KACV,QAAQ,IAAI,SAAS,SAAS,SAAS,WAAW;eAEjD,IAAI,SAAS,OAAO;MAChB;KACO;;EAGpB,eAAe;EAChB;CACF"}
@@ -0,0 +1,16 @@
1
+ import * as zod from "zod";
2
+ import * as _tulip_systems_core_data_tables0 from "@tulip-systems/core/data-tables";
3
+
4
+ //#region src/providers/google/config/filters.d.ts
5
+ declare const googleDriveTreeFilters: {
6
+ types: _tulip_systems_core_data_tables0.ParseFilter<zod.ZodArray<zod.ZodEnum<{
7
+ file: "file";
8
+ folder: "folder";
9
+ }>>>;
10
+ contentTypes: _tulip_systems_core_data_tables0.ParseFilter<zod.ZodArray<zod.ZodString>>;
11
+ nodeIds: _tulip_systems_core_data_tables0.ParseFilter<zod.ZodArray<zod.ZodString>>;
12
+ isArchived: _tulip_systems_core_data_tables0.ParseFilter<zod.ZodBoolean>;
13
+ };
14
+ //#endregion
15
+ export { googleDriveTreeFilters };
16
+ //# sourceMappingURL=filters.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filters.d.mts","names":[],"sources":["../../../../src/providers/google/config/filters.ts"],"mappings":";;;;cAEa,sBAAA;mEAAyC,GAAA,CAAA,OAAA"}
@@ -0,0 +1,8 @@
1
+ import { driveTreeFilters } from "../../../config/filters.mjs";
2
+
3
+ //#region src/providers/google/config/filters.ts
4
+ const googleDriveTreeFilters = driveTreeFilters;
5
+
6
+ //#endregion
7
+ export { googleDriveTreeFilters };
8
+ //# sourceMappingURL=filters.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filters.mjs","names":[],"sources":["../../../../src/providers/google/config/filters.ts"],"sourcesContent":["import { driveTreeFilters } from \"@/config/filters\";\n\nexport const googleDriveTreeFilters = driveTreeFilters;\n"],"mappings":";;;AAEA,MAAa,yBAAyB"}
@@ -0,0 +1,13 @@
1
+ //#region src/providers/google/lib/constants.ts
2
+ const GOOGLE_DRIVE_FOLDER_MIME_TYPE = "application/vnd.google-apps.folder";
3
+ /**
4
+ * Minimal Google file fields needed to build a complete `GoogleDriveNode`.
5
+ *
6
+ * Keeping this list explicit prevents over-fetching large provider payloads and
7
+ * ensures every service method receives metadata with the same expected shape.
8
+ */
9
+ const GOOGLE_DRIVE_NODE_FIELDS = "id,name,mimeType,size,parents,driveId,createdTime,modifiedTime,trashed,trashedTime,webViewLink,webContentLink,thumbnailLink,contentRestrictions,capabilities";
10
+
11
+ //#endregion
12
+ export { GOOGLE_DRIVE_FOLDER_MIME_TYPE, GOOGLE_DRIVE_NODE_FIELDS };
13
+ //# sourceMappingURL=constants.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.mjs","names":[],"sources":["../../../../src/providers/google/lib/constants.ts"],"sourcesContent":["export const GOOGLE_DRIVE_FOLDER_MIME_TYPE = \"application/vnd.google-apps.folder\";\n\n/**\n * Minimal Google file fields needed to build a complete `GoogleDriveNode`.\n *\n * Keeping this list explicit prevents over-fetching large provider payloads and\n * ensures every service method receives metadata with the same expected shape.\n */\nexport const GOOGLE_DRIVE_NODE_FIELDS =\n \"id,name,mimeType,size,parents,driveId,createdTime,modifiedTime,trashed,trashedTime,webViewLink,webContentLink,thumbnailLink,contentRestrictions,capabilities\";\n"],"mappings":";AAAA,MAAa,gCAAgC;;;;;;;AAQ7C,MAAa,2BACX"}
@@ -0,0 +1,39 @@
1
+ import { GoogleDriveNode } from "./validators.mjs";
2
+ import { drive_v3 } from "googleapis";
3
+
4
+ //#region src/providers/google/lib/dto.d.ts
5
+ /**
6
+ * Input used by the DTO factory.
7
+ *
8
+ * `namespace` can be supplied by callers when Google metadata does not include
9
+ * enough drive context. Most service calls rely on `driveId` or the first parent
10
+ * from the Google response instead.
11
+ */
12
+ type GoogleDriveNodeDTOInput = {
13
+ file: drive_v3.Schema$File;
14
+ namespace?: string;
15
+ };
16
+ /**
17
+ * Factory for mapping Google Drive API file metadata to the provider-neutral node shape.
18
+ * This is the single source of truth for how Google Drive metadata maps to our shared
19
+ * `DriveNode` contract, ensuring consistent mapping across all service methods.
20
+ * The factory also handles missing or partial metadata from Google by applying sensible
21
+ * defaults and fallbacks, so the shared DTO always satisfies the base contract expected
22
+ * by the UI and other consumers.
23
+ */
24
+ declare const GoogleDriveNodeDTO: {
25
+ /**
26
+ * Maps raw Google Drive file metadata to the provider-neutral Drive node shape.
27
+ *
28
+ * Google models files and folders with the same `drive_v3.Schema$File` object.
29
+ * Folders are detected by their special MIME type, while every other MIME type
30
+ * is treated as a file and mapped to a provider-neutral subtype.
31
+ */
32
+ create({
33
+ file,
34
+ namespace
35
+ }: GoogleDriveNodeDTOInput): GoogleDriveNode;
36
+ };
37
+ //#endregion
38
+ export { GoogleDriveNodeDTO, GoogleDriveNodeDTOInput };
39
+ //# sourceMappingURL=dto.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dto.d.mts","names":[],"sources":["../../../../src/providers/google/lib/dto.ts"],"mappings":";;;;;;AAYA;;;;;KAAY,uBAAA;EACV,IAAA,EAAM,QAAA,CAAS,WAAA;EACf,SAAA;AAAA;;AAWF;;;;;;;cAAa,kBAAA;EAQ0D;;;;;;;;;;KAAzC,uBAAA,GAA0B,eAAA;AAAA"}
@@ -0,0 +1,66 @@
1
+ import { inferLocalDriveNodeSubtype } from "../../local/lib/helpers.mjs";
2
+ import { GOOGLE_DRIVE_FOLDER_MIME_TYPE } from "./constants.mjs";
3
+
4
+ //#region src/providers/google/lib/dto.ts
5
+ /**
6
+ * Factory for mapping Google Drive API file metadata to the provider-neutral node shape.
7
+ * This is the single source of truth for how Google Drive metadata maps to our shared
8
+ * `DriveNode` contract, ensuring consistent mapping across all service methods.
9
+ * The factory also handles missing or partial metadata from Google by applying sensible
10
+ * defaults and fallbacks, so the shared DTO always satisfies the base contract expected
11
+ * by the UI and other consumers.
12
+ */
13
+ const GoogleDriveNodeDTO = { create({ file, namespace }) {
14
+ if (!file.id) throw new Error("Google Drive file has no id");
15
+ const isFolder = file.mimeType === GOOGLE_DRIVE_FOLDER_MIME_TYPE;
16
+ const createdAt = file.createdTime ? new Date(file.createdTime) : /* @__PURE__ */ new Date();
17
+ const updatedAt = file.modifiedTime ? new Date(file.modifiedTime) : createdAt;
18
+ const trashedAt = file.trashedTime ? new Date(file.trashedTime) : null;
19
+ const archivedAt = file.trashed ? trashedAt ?? new Date(file.modifiedTime ?? Date.now()) : null;
20
+ const contentType = isFolder ? null : file.mimeType ?? null;
21
+ const name = file.name ?? "Untitled";
22
+ const googleParents = file.parents ?? [];
23
+ const [googleParentId] = googleParents;
24
+ const nodeNamespace = namespace ?? file.driveId ?? googleParentId;
25
+ if (!nodeNamespace) throw new Error("Google Drive file has no namespace");
26
+ const readonly = file.contentRestrictions?.some((restriction) => restriction.readOnly) ?? file.capabilities?.canEdit === false;
27
+ return {
28
+ id: file.id,
29
+ provider: "google",
30
+ createdAt,
31
+ updatedAt,
32
+ name,
33
+ namespace: nodeNamespace,
34
+ type: isFolder ? "folder" : "file",
35
+ subtype: isFolder ? "other" : inferLocalDriveNodeSubtype({
36
+ name,
37
+ contentType
38
+ }),
39
+ size: file.size ? Number(file.size) : null,
40
+ contentType,
41
+ readonly,
42
+ hidden: false,
43
+ archivedAt,
44
+ parentId: googleParentId && googleParentId !== nodeNamespace ? googleParentId : null,
45
+ links: {
46
+ view: file.webViewLink ?? file.webContentLink ?? null,
47
+ download: file.webContentLink ?? null,
48
+ preview: file.webViewLink ?? null,
49
+ thumbnail: file.thumbnailLink ?? null
50
+ },
51
+ availability: "ready",
52
+ googleDriveId: file.driveId ?? null,
53
+ mimeType: file.mimeType ?? null,
54
+ webViewLink: file.webViewLink ?? null,
55
+ webContentLink: file.webContentLink ?? null,
56
+ thumbnailLink: file.thumbnailLink ?? null,
57
+ trashed: file.trashed ?? false,
58
+ trashedAt,
59
+ googleParents,
60
+ canEdit: file.capabilities?.canEdit ?? null
61
+ };
62
+ } };
63
+
64
+ //#endregion
65
+ export { GoogleDriveNodeDTO };
66
+ //# sourceMappingURL=dto.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dto.mjs","names":[],"sources":["../../../../src/providers/google/lib/dto.ts"],"sourcesContent":["import type { drive_v3 } from \"googleapis\";\nimport { inferLocalDriveNodeSubtype } from \"../../local/entry\";\nimport { GOOGLE_DRIVE_FOLDER_MIME_TYPE } from \"./constants\";\nimport type { GoogleDriveNode } from \"./validators\";\n\n/**\n * Input used by the DTO factory.\n *\n * `namespace` can be supplied by callers when Google metadata does not include\n * enough drive context. Most service calls rely on `driveId` or the first parent\n * from the Google response instead.\n */\nexport type GoogleDriveNodeDTOInput = {\n file: drive_v3.Schema$File;\n namespace?: string;\n};\n\n/**\n * Factory for mapping Google Drive API file metadata to the provider-neutral node shape.\n * This is the single source of truth for how Google Drive metadata maps to our shared\n * `DriveNode` contract, ensuring consistent mapping across all service methods.\n * The factory also handles missing or partial metadata from Google by applying sensible\n * defaults and fallbacks, so the shared DTO always satisfies the base contract expected\n * by the UI and other consumers.\n */\nexport const GoogleDriveNodeDTO = {\n /**\n * Maps raw Google Drive file metadata to the provider-neutral Drive node shape.\n *\n * Google models files and folders with the same `drive_v3.Schema$File` object.\n * Folders are detected by their special MIME type, while every other MIME type\n * is treated as a file and mapped to a provider-neutral subtype.\n */\n create({ file, namespace }: GoogleDriveNodeDTOInput): GoogleDriveNode {\n if (!file.id) {\n throw new Error(\"Google Drive file has no id\");\n }\n\n // Google Drive folders are files with a special MIME type.\n const isFolder = file.mimeType === GOOGLE_DRIVE_FOLDER_MIME_TYPE;\n\n // Google can omit timestamps in partial responses. Fall back to stable dates\n // so the shared DTO always satisfies the base Drive node contract.\n const createdAt = file.createdTime ? new Date(file.createdTime) : new Date();\n const updatedAt = file.modifiedTime ? new Date(file.modifiedTime) : createdAt;\n\n // Google calls soft deletion `trashed`; the shared Drive contract exposes it\n // as `archivedAt` for consistency with local/object-storage providers.\n const trashedAt = file.trashedTime ? new Date(file.trashedTime) : null;\n const archivedAt = file.trashed\n ? (trashedAt ?? new Date(file.modifiedTime ?? Date.now()))\n : null;\n const contentType = isFolder ? null : (file.mimeType ?? null);\n const name = file.name ?? \"Untitled\";\n const googleParents = file.parents ?? [];\n const [googleParentId] = googleParents;\n\n // The shared `namespace` is the drive/root boundary used by the UI. Prefer\n // explicit caller context, then Google's shared drive id, then the first\n // parent as a last-resort root context for My Drive-like responses.\n const nodeNamespace = namespace ?? file.driveId ?? googleParentId;\n\n if (!nodeNamespace) {\n throw new Error(\"Google Drive file has no namespace\");\n }\n\n const readonly =\n file.contentRestrictions?.some((restriction) => restriction.readOnly) ??\n file.capabilities?.canEdit === false;\n\n return {\n id: file.id,\n provider: \"google\",\n createdAt,\n updatedAt,\n name,\n namespace: nodeNamespace,\n type: isFolder ? \"folder\" : \"file\",\n subtype: isFolder ? \"other\" : inferLocalDriveNodeSubtype({ name, contentType }),\n size: file.size ? Number(file.size) : null,\n contentType,\n readonly,\n hidden: false,\n archivedAt,\n parentId: googleParentId && googleParentId !== nodeNamespace ? googleParentId : null,\n links: {\n view: file.webViewLink ?? file.webContentLink ?? null,\n download: file.webContentLink ?? null,\n preview: file.webViewLink ?? null,\n thumbnail: file.thumbnailLink ?? null,\n },\n availability: \"ready\",\n googleDriveId: file.driveId ?? null,\n mimeType: file.mimeType ?? null,\n webViewLink: file.webViewLink ?? null,\n webContentLink: file.webContentLink ?? null,\n thumbnailLink: file.thumbnailLink ?? null,\n trashed: file.trashed ?? false,\n trashedAt,\n googleParents,\n canEdit: file.capabilities?.canEdit ?? null,\n } satisfies GoogleDriveNode;\n },\n};\n"],"mappings":";;;;;;;;;;;;AAyBA,MAAa,qBAAqB,EAQhC,OAAO,EAAE,MAAM,aAAuD;AACpE,KAAI,CAAC,KAAK,GACR,OAAM,IAAI,MAAM,8BAA8B;CAIhD,MAAM,WAAW,KAAK,aAAa;CAInC,MAAM,YAAY,KAAK,cAAc,IAAI,KAAK,KAAK,YAAY,mBAAG,IAAI,MAAM;CAC5E,MAAM,YAAY,KAAK,eAAe,IAAI,KAAK,KAAK,aAAa,GAAG;CAIpE,MAAM,YAAY,KAAK,cAAc,IAAI,KAAK,KAAK,YAAY,GAAG;CAClE,MAAM,aAAa,KAAK,UACnB,aAAa,IAAI,KAAK,KAAK,gBAAgB,KAAK,KAAK,CAAC,GACvD;CACJ,MAAM,cAAc,WAAW,OAAQ,KAAK,YAAY;CACxD,MAAM,OAAO,KAAK,QAAQ;CAC1B,MAAM,gBAAgB,KAAK,WAAW,EAAE;CACxC,MAAM,CAAC,kBAAkB;CAKzB,MAAM,gBAAgB,aAAa,KAAK,WAAW;AAEnD,KAAI,CAAC,cACH,OAAM,IAAI,MAAM,qCAAqC;CAGvD,MAAM,WACJ,KAAK,qBAAqB,MAAM,gBAAgB,YAAY,SAAS,IACrE,KAAK,cAAc,YAAY;AAEjC,QAAO;EACL,IAAI,KAAK;EACT,UAAU;EACV;EACA;EACA;EACA,WAAW;EACX,MAAM,WAAW,WAAW;EAC5B,SAAS,WAAW,UAAU,2BAA2B;GAAE;GAAM;GAAa,CAAC;EAC/E,MAAM,KAAK,OAAO,OAAO,KAAK,KAAK,GAAG;EACtC;EACA;EACA,QAAQ;EACR;EACA,UAAU,kBAAkB,mBAAmB,gBAAgB,iBAAiB;EAChF,OAAO;GACL,MAAM,KAAK,eAAe,KAAK,kBAAkB;GACjD,UAAU,KAAK,kBAAkB;GACjC,SAAS,KAAK,eAAe;GAC7B,WAAW,KAAK,iBAAiB;GAClC;EACD,cAAc;EACd,eAAe,KAAK,WAAW;EAC/B,UAAU,KAAK,YAAY;EAC3B,aAAa,KAAK,eAAe;EACjC,gBAAgB,KAAK,kBAAkB;EACvC,eAAe,KAAK,iBAAiB;EACrC,SAAS,KAAK,WAAW;EACzB;EACA;EACA,SAAS,KAAK,cAAc,WAAW;EACxC;GAEJ"}
@@ -0,0 +1,46 @@
1
+ import { Readable } from "node:stream";
2
+
3
+ //#region src/providers/google/lib/helpers.ts
4
+ /**
5
+ * Escapes dynamic values before interpolating them into Google Drive `q` strings.
6
+ *
7
+ * Drive query values are wrapped in single quotes. Backslashes and single quotes
8
+ * can otherwise break the query literal or change the meaning of the expression.
9
+ */
10
+ function escapeGoogleDriveQueryValue(value) {
11
+ return value.replace(/\\/g, "\\\\").replace(/'/g, "\\'");
12
+ }
13
+ /**
14
+ * Returns true when a Google API error represents a missing file/folder.
15
+ *
16
+ * The Google client throws rich error objects rather than typed exceptions, so
17
+ * the service checks the normalized `code` property and treats only 404 as a
18
+ * nullable not-found result. Permission, quota, and transport failures should
19
+ * keep bubbling up.
20
+ */
21
+ function isGoogleNotFound(error) {
22
+ return typeof error === "object" && error != null && "code" in error && error.code === 404;
23
+ }
24
+ /**
25
+ * Normalizes supported object body inputs into a readable stream for googleapis.
26
+ *
27
+ * The Drive client accepts a stream-like `media.body`. Local upload flows can
28
+ * provide strings, buffers, array-like chunks, or already-created streams, so we
29
+ * pass through streams and wrap everything else with `Readable.from`.
30
+ */
31
+ function toGoogleDriveReadable(body) {
32
+ if (body instanceof Readable) return body;
33
+ if (typeof body === "string") return Readable.from([body]);
34
+ return Readable.from([body]);
35
+ }
36
+ /**
37
+ * Use Google-provided thumbnail URLs directly instead of routing them through
38
+ * the Next.js optimizer.
39
+ */
40
+ function googleDriveImageLoader({ src }) {
41
+ return src;
42
+ }
43
+
44
+ //#endregion
45
+ export { escapeGoogleDriveQueryValue, googleDriveImageLoader, isGoogleNotFound, toGoogleDriveReadable };
46
+ //# sourceMappingURL=helpers.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.mjs","names":[],"sources":["../../../../src/providers/google/lib/helpers.ts"],"sourcesContent":["import { Readable } from \"node:stream\";\nimport type { ObjectBodyInput } from \"@tulip-systems/core/storage\";\nimport type { ImageLoaderProps } from \"next/image\";\n\n/**\n * Escapes dynamic values before interpolating them into Google Drive `q` strings.\n *\n * Drive query values are wrapped in single quotes. Backslashes and single quotes\n * can otherwise break the query literal or change the meaning of the expression.\n */\nexport function escapeGoogleDriveQueryValue(value: string) {\n return value.replace(/\\\\/g, \"\\\\\\\\\").replace(/'/g, \"\\\\'\");\n}\n\n/**\n * Returns true when a Google API error represents a missing file/folder.\n *\n * The Google client throws rich error objects rather than typed exceptions, so\n * the service checks the normalized `code` property and treats only 404 as a\n * nullable not-found result. Permission, quota, and transport failures should\n * keep bubbling up.\n */\nexport function isGoogleNotFound(error: unknown) {\n return typeof error === \"object\" && error != null && \"code\" in error && error.code === 404;\n}\n\n/**\n * Normalizes supported object body inputs into a readable stream for googleapis.\n *\n * The Drive client accepts a stream-like `media.body`. Local upload flows can\n * provide strings, buffers, array-like chunks, or already-created streams, so we\n * pass through streams and wrap everything else with `Readable.from`.\n */\nexport function toGoogleDriveReadable(body: ObjectBodyInput) {\n if (body instanceof Readable) return body;\n if (typeof body === \"string\") return Readable.from([body]);\n return Readable.from([body]);\n}\n\n/**\n * Use Google-provided thumbnail URLs directly instead of routing them through\n * the Next.js optimizer.\n */\nexport function googleDriveImageLoader({ src }: ImageLoaderProps) {\n return src;\n}\n"],"mappings":";;;;;;;;;AAUA,SAAgB,4BAA4B,OAAe;AACzD,QAAO,MAAM,QAAQ,OAAO,OAAO,CAAC,QAAQ,MAAM,MAAM;;;;;;;;;;AAW1D,SAAgB,iBAAiB,OAAgB;AAC/C,QAAO,OAAO,UAAU,YAAY,SAAS,QAAQ,UAAU,SAAS,MAAM,SAAS;;;;;;;;;AAUzF,SAAgB,sBAAsB,MAAuB;AAC3D,KAAI,gBAAgB,SAAU,QAAO;AACrC,KAAI,OAAO,SAAS,SAAU,QAAO,SAAS,KAAK,CAAC,KAAK,CAAC;AAC1D,QAAO,SAAS,KAAK,CAAC,KAAK,CAAC;;;;;;AAO9B,SAAgB,uBAAuB,EAAE,OAAyB;AAChE,QAAO"}