@databricks/appkit 0.0.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 (166) hide show
  1. package/CLAUDE.md +3 -0
  2. package/DCO +25 -0
  3. package/LICENSE +203 -0
  4. package/NOTICE.md +73 -0
  5. package/README.md +35 -0
  6. package/bin/setup-claude.js +190 -0
  7. package/dist/_virtual/rolldown_runtime.js +39 -0
  8. package/dist/analytics/analytics.d.ts +31 -0
  9. package/dist/analytics/analytics.d.ts.map +1 -0
  10. package/dist/analytics/analytics.js +149 -0
  11. package/dist/analytics/analytics.js.map +1 -0
  12. package/dist/analytics/defaults.js +17 -0
  13. package/dist/analytics/defaults.js.map +1 -0
  14. package/dist/analytics/index.js +3 -0
  15. package/dist/analytics/query.js +50 -0
  16. package/dist/analytics/query.js.map +1 -0
  17. package/dist/analytics/types.d.ts +9 -0
  18. package/dist/analytics/types.d.ts.map +1 -0
  19. package/dist/app/index.d.ts +23 -0
  20. package/dist/app/index.d.ts.map +1 -0
  21. package/dist/app/index.js +49 -0
  22. package/dist/app/index.js.map +1 -0
  23. package/dist/appkit/package.js +7 -0
  24. package/dist/appkit/package.js.map +1 -0
  25. package/dist/cache/defaults.js +14 -0
  26. package/dist/cache/defaults.js.map +1 -0
  27. package/dist/cache/index.d.ts +119 -0
  28. package/dist/cache/index.d.ts.map +1 -0
  29. package/dist/cache/index.js +307 -0
  30. package/dist/cache/index.js.map +1 -0
  31. package/dist/cache/storage/defaults.js +16 -0
  32. package/dist/cache/storage/defaults.js.map +1 -0
  33. package/dist/cache/storage/index.js +4 -0
  34. package/dist/cache/storage/memory.js +87 -0
  35. package/dist/cache/storage/memory.js.map +1 -0
  36. package/dist/cache/storage/persistent.js +211 -0
  37. package/dist/cache/storage/persistent.js.map +1 -0
  38. package/dist/connectors/index.js +6 -0
  39. package/dist/connectors/lakebase/client.js +348 -0
  40. package/dist/connectors/lakebase/client.js.map +1 -0
  41. package/dist/connectors/lakebase/defaults.js +13 -0
  42. package/dist/connectors/lakebase/defaults.js.map +1 -0
  43. package/dist/connectors/lakebase/index.js +3 -0
  44. package/dist/connectors/sql-warehouse/client.js +284 -0
  45. package/dist/connectors/sql-warehouse/client.js.map +1 -0
  46. package/dist/connectors/sql-warehouse/defaults.js +12 -0
  47. package/dist/connectors/sql-warehouse/defaults.js.map +1 -0
  48. package/dist/connectors/sql-warehouse/index.js +3 -0
  49. package/dist/core/appkit.d.ts +14 -0
  50. package/dist/core/appkit.d.ts.map +1 -0
  51. package/dist/core/appkit.js +66 -0
  52. package/dist/core/appkit.js.map +1 -0
  53. package/dist/core/index.js +3 -0
  54. package/dist/index.d.ts +15 -0
  55. package/dist/index.js +21 -0
  56. package/dist/index.js.map +1 -0
  57. package/dist/plugin/dev-reader.d.ts +20 -0
  58. package/dist/plugin/dev-reader.d.ts.map +1 -0
  59. package/dist/plugin/dev-reader.js +63 -0
  60. package/dist/plugin/dev-reader.js.map +1 -0
  61. package/dist/plugin/index.js +4 -0
  62. package/dist/plugin/interceptors/cache.js +15 -0
  63. package/dist/plugin/interceptors/cache.js.map +1 -0
  64. package/dist/plugin/interceptors/retry.js +32 -0
  65. package/dist/plugin/interceptors/retry.js.map +1 -0
  66. package/dist/plugin/interceptors/telemetry.js +33 -0
  67. package/dist/plugin/interceptors/telemetry.js.map +1 -0
  68. package/dist/plugin/interceptors/timeout.js +35 -0
  69. package/dist/plugin/interceptors/timeout.js.map +1 -0
  70. package/dist/plugin/plugin.d.ts +43 -0
  71. package/dist/plugin/plugin.d.ts.map +1 -0
  72. package/dist/plugin/plugin.js +119 -0
  73. package/dist/plugin/plugin.js.map +1 -0
  74. package/dist/plugin/to-plugin.d.ts +7 -0
  75. package/dist/plugin/to-plugin.d.ts.map +1 -0
  76. package/dist/plugin/to-plugin.js +12 -0
  77. package/dist/plugin/to-plugin.js.map +1 -0
  78. package/dist/server/base-server.js +24 -0
  79. package/dist/server/base-server.js.map +1 -0
  80. package/dist/server/index.d.ts +100 -0
  81. package/dist/server/index.d.ts.map +1 -0
  82. package/dist/server/index.js +224 -0
  83. package/dist/server/index.js.map +1 -0
  84. package/dist/server/remote-tunnel/denied.html +68 -0
  85. package/dist/server/remote-tunnel/gate.js +51 -0
  86. package/dist/server/remote-tunnel/gate.js.map +1 -0
  87. package/dist/server/remote-tunnel/index.html +165 -0
  88. package/dist/server/remote-tunnel/remote-tunnel-controller.js +100 -0
  89. package/dist/server/remote-tunnel/remote-tunnel-controller.js.map +1 -0
  90. package/dist/server/remote-tunnel/remote-tunnel-manager.js +320 -0
  91. package/dist/server/remote-tunnel/remote-tunnel-manager.js.map +1 -0
  92. package/dist/server/remote-tunnel/wait.html +158 -0
  93. package/dist/server/static-server.js +47 -0
  94. package/dist/server/static-server.js.map +1 -0
  95. package/dist/server/types.d.ts +14 -0
  96. package/dist/server/types.d.ts.map +1 -0
  97. package/dist/server/utils.js +70 -0
  98. package/dist/server/utils.js.map +1 -0
  99. package/dist/server/vite-dev-server.js +103 -0
  100. package/dist/server/vite-dev-server.js.map +1 -0
  101. package/dist/shared/src/cache.d.ts +62 -0
  102. package/dist/shared/src/cache.d.ts.map +1 -0
  103. package/dist/shared/src/execute.d.ts +46 -0
  104. package/dist/shared/src/execute.d.ts.map +1 -0
  105. package/dist/shared/src/plugin.d.ts +50 -0
  106. package/dist/shared/src/plugin.d.ts.map +1 -0
  107. package/dist/shared/src/sql/helpers.d.ts +160 -0
  108. package/dist/shared/src/sql/helpers.d.ts.map +1 -0
  109. package/dist/shared/src/sql/helpers.js +103 -0
  110. package/dist/shared/src/sql/helpers.js.map +1 -0
  111. package/dist/shared/src/sql/types.d.ts +34 -0
  112. package/dist/shared/src/sql/types.d.ts.map +1 -0
  113. package/dist/shared/src/tunnel.d.ts +30 -0
  114. package/dist/shared/src/tunnel.d.ts.map +1 -0
  115. package/dist/stream/arrow-stream-processor.js +154 -0
  116. package/dist/stream/arrow-stream-processor.js.map +1 -0
  117. package/dist/stream/buffers.js +88 -0
  118. package/dist/stream/buffers.js.map +1 -0
  119. package/dist/stream/defaults.js +14 -0
  120. package/dist/stream/defaults.js.map +1 -0
  121. package/dist/stream/index.js +6 -0
  122. package/dist/stream/sse-writer.js +61 -0
  123. package/dist/stream/sse-writer.js.map +1 -0
  124. package/dist/stream/stream-manager.d.ts +27 -0
  125. package/dist/stream/stream-manager.d.ts.map +1 -0
  126. package/dist/stream/stream-manager.js +191 -0
  127. package/dist/stream/stream-manager.js.map +1 -0
  128. package/dist/stream/stream-registry.js +54 -0
  129. package/dist/stream/stream-registry.js.map +1 -0
  130. package/dist/stream/types.js +14 -0
  131. package/dist/stream/types.js.map +1 -0
  132. package/dist/stream/validator.js +25 -0
  133. package/dist/stream/validator.js.map +1 -0
  134. package/dist/telemetry/config.js +20 -0
  135. package/dist/telemetry/config.js.map +1 -0
  136. package/dist/telemetry/index.d.ts +4 -0
  137. package/dist/telemetry/index.js +8 -0
  138. package/dist/telemetry/instrumentations.js +38 -0
  139. package/dist/telemetry/instrumentations.js.map +1 -0
  140. package/dist/telemetry/noop.js +54 -0
  141. package/dist/telemetry/noop.js.map +1 -0
  142. package/dist/telemetry/telemetry-manager.js +113 -0
  143. package/dist/telemetry/telemetry-manager.js.map +1 -0
  144. package/dist/telemetry/telemetry-provider.js +82 -0
  145. package/dist/telemetry/telemetry-provider.js.map +1 -0
  146. package/dist/telemetry/types.d.ts +74 -0
  147. package/dist/telemetry/types.d.ts.map +1 -0
  148. package/dist/type-generator/vite-plugin.d.ts +22 -0
  149. package/dist/type-generator/vite-plugin.d.ts.map +1 -0
  150. package/dist/type-generator/vite-plugin.js +49 -0
  151. package/dist/type-generator/vite-plugin.js.map +1 -0
  152. package/dist/utils/databricks-client-middleware.d.ts +17 -0
  153. package/dist/utils/databricks-client-middleware.d.ts.map +1 -0
  154. package/dist/utils/databricks-client-middleware.js +117 -0
  155. package/dist/utils/databricks-client-middleware.js.map +1 -0
  156. package/dist/utils/env-validator.js +14 -0
  157. package/dist/utils/env-validator.js.map +1 -0
  158. package/dist/utils/index.js +26 -0
  159. package/dist/utils/index.js.map +1 -0
  160. package/dist/utils/merge.js +25 -0
  161. package/dist/utils/merge.js.map +1 -0
  162. package/dist/utils/vite-config-merge.js +22 -0
  163. package/dist/utils/vite-config-merge.js.map +1 -0
  164. package/llms.txt +193 -0
  165. package/package.json +70 -0
  166. package/scripts/postinstall.js +6 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","names":["cookies: Record<string, string>","routes: Array<{ path: string; methods: string[] }>","path"],"sources":["../../src/server/utils.ts"],"sourcesContent":["import crypto from \"node:crypto\";\nimport fs from \"node:fs\";\nimport type http from \"node:http\";\nimport path from \"node:path\";\n\nexport function parseCookies(\n req: http.IncomingMessage,\n): Record<string, string> {\n const cookieHeader = req.headers.cookie;\n if (!cookieHeader) return {};\n\n // Fast path: if there's no semicolon, there's only one cookie\n const semicolonIndex = cookieHeader.indexOf(\";\");\n if (semicolonIndex === -1) {\n const eqIndex = cookieHeader.indexOf(\"=\");\n if (eqIndex === -1) return {};\n return {\n [cookieHeader.slice(0, eqIndex).trim()]: cookieHeader.slice(eqIndex + 1),\n };\n }\n\n // Multiple cookies: parse them all\n const cookies: Record<string, string> = {};\n const parts = cookieHeader.split(\";\");\n for (let i = 0; i < parts.length; i++) {\n const eqIndex = parts[i].indexOf(\"=\");\n if (eqIndex !== -1) {\n const key = parts[i].slice(0, eqIndex).trim();\n const value = parts[i].slice(eqIndex + 1);\n cookies[key] = value;\n }\n }\n return cookies;\n}\n\nexport function generateTunnelIdFromEmail(email?: string): string | undefined {\n if (!email) return undefined;\n\n const tunnelId = crypto\n .createHash(\"sha256\")\n .update(email)\n .digest(\"base64url\")\n .slice(0, 8);\n\n return tunnelId;\n}\n\nexport function getRoutes(stack: unknown[], basePath = \"\") {\n const routes: Array<{ path: string; methods: string[] }> = [];\n\n stack.forEach((layer: any) => {\n if (layer.route) {\n // normal route\n const path = basePath + layer.route.path;\n const methods = Object.keys(layer.route.methods).map((m) =>\n m.toUpperCase(),\n );\n routes.push({ path, methods });\n } else if (layer.name === \"router\" && layer.handle.stack) {\n // nested router\n const nestedBase =\n basePath +\n layer.regexp.source\n .replace(\"^\\\\\", \"\")\n .replace(\"\\\\/?(?=\\\\/|$)\", \"\")\n .replace(/\\\\\\//g, \"/\") // convert escaped slashes\n .replace(/\\$$/, \"\") || \"\";\n routes.push(...getRoutes(layer.handle.stack, nestedBase));\n }\n });\n\n return routes;\n}\n\nexport function getQueries(configFolder: string) {\n const queriesFolder = path.join(configFolder, \"queries\");\n\n if (!fs.existsSync(queriesFolder)) {\n return {};\n }\n\n return Object.fromEntries(\n fs\n .readdirSync(queriesFolder)\n .filter((f) => path.extname(f) === \".sql\")\n .map((f) => [path.basename(f, \".sql\"), path.basename(f, \".sql\")]),\n );\n}\n\nimport type { PluginEndpoints } from \"shared\";\n\nexport type { PluginEndpoints };\n\nexport interface RuntimeConfig {\n appName: string;\n queries: Record<string, string>;\n endpoints: PluginEndpoints;\n}\n\nexport function getRuntimeConfig(\n endpoints: PluginEndpoints = {},\n): RuntimeConfig {\n const configFolder = path.join(process.cwd(), \"config\");\n\n return {\n appName: process.env.DATABRICKS_APP_NAME || \"\",\n queries: getQueries(configFolder),\n endpoints,\n };\n}\n\nexport function getConfigScript(endpoints: PluginEndpoints = {}): string {\n const config = getRuntimeConfig(endpoints);\n\n return `\n <script>\n window.__CONFIG__ = ${JSON.stringify(config)};\n </script>\n `;\n}\n"],"mappings":";;;;;AAKA,SAAgB,aACd,KACwB;CACxB,MAAM,eAAe,IAAI,QAAQ;AACjC,KAAI,CAAC,aAAc,QAAO,EAAE;AAI5B,KADuB,aAAa,QAAQ,IAAI,KACzB,IAAI;EACzB,MAAM,UAAU,aAAa,QAAQ,IAAI;AACzC,MAAI,YAAY,GAAI,QAAO,EAAE;AAC7B,SAAO,GACJ,aAAa,MAAM,GAAG,QAAQ,CAAC,MAAM,GAAG,aAAa,MAAM,UAAU,EAAE,EACzE;;CAIH,MAAMA,UAAkC,EAAE;CAC1C,MAAM,QAAQ,aAAa,MAAM,IAAI;AACrC,MAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;EACrC,MAAM,UAAU,MAAM,GAAG,QAAQ,IAAI;AACrC,MAAI,YAAY,IAAI;GAClB,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC,MAAM;AAE7C,WAAQ,OADM,MAAM,GAAG,MAAM,UAAU,EAAE;;;AAI7C,QAAO;;AAGT,SAAgB,0BAA0B,OAAoC;AAC5E,KAAI,CAAC,MAAO,QAAO;AAQnB,QANiB,OACd,WAAW,SAAS,CACpB,OAAO,MAAM,CACb,OAAO,YAAY,CACnB,MAAM,GAAG,EAAE;;AAKhB,SAAgB,UAAU,OAAkB,WAAW,IAAI;CACzD,MAAMC,SAAqD,EAAE;AAE7D,OAAM,SAAS,UAAe;AAC5B,MAAI,MAAM,OAAO;GAEf,MAAMC,SAAO,WAAW,MAAM,MAAM;GACpC,MAAM,UAAU,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC,KAAK,MACpD,EAAE,aAAa,CAChB;AACD,UAAO,KAAK;IAAE;IAAM;IAAS,CAAC;aACrB,MAAM,SAAS,YAAY,MAAM,OAAO,OAAO;GAExD,MAAM,aACJ,WACE,MAAM,OAAO,OACV,QAAQ,OAAO,GAAG,CAClB,QAAQ,iBAAiB,GAAG,CAC5B,QAAQ,SAAS,IAAI,CACrB,QAAQ,OAAO,GAAG,IAAI;AAC7B,UAAO,KAAK,GAAG,UAAU,MAAM,OAAO,OAAO,WAAW,CAAC;;GAE3D;AAEF,QAAO;;AAGT,SAAgB,WAAW,cAAsB;CAC/C,MAAM,gBAAgB,KAAK,KAAK,cAAc,UAAU;AAExD,KAAI,CAAC,GAAG,WAAW,cAAc,CAC/B,QAAO,EAAE;AAGX,QAAO,OAAO,YACZ,GACG,YAAY,cAAc,CAC1B,QAAQ,MAAM,KAAK,QAAQ,EAAE,KAAK,OAAO,CACzC,KAAK,MAAM,CAAC,KAAK,SAAS,GAAG,OAAO,EAAE,KAAK,SAAS,GAAG,OAAO,CAAC,CAAC,CACpE;;AAaH,SAAgB,iBACd,YAA6B,EAAE,EAChB;CACf,MAAM,eAAe,KAAK,KAAK,QAAQ,KAAK,EAAE,SAAS;AAEvD,QAAO;EACL,SAAS,QAAQ,IAAI,uBAAuB;EAC5C,SAAS,WAAW,aAAa;EACjC;EACD;;AAGH,SAAgB,gBAAgB,YAA6B,EAAE,EAAU;CACvE,MAAM,SAAS,iBAAiB,UAAU;AAE1C,QAAO;;4BAEmB,KAAK,UAAU,OAAO,CAAC"}
@@ -0,0 +1,103 @@
1
+ import { mergeConfigDedup } from "../utils/vite-config-merge.js";
2
+ import { init_utils } from "../utils/index.js";
3
+ import { BaseServer } from "./base-server.js";
4
+ import { appKitTypesPlugin } from "../type-generator/vite-plugin.js";
5
+ import path from "node:path";
6
+ import fs from "node:fs";
7
+
8
+ //#region src/server/vite-dev-server.ts
9
+ init_utils();
10
+ /**
11
+ * Vite dev server for the AppKit.
12
+ *
13
+ * This class is responsible for serving the Vite dev server for the development server.
14
+ * It also handles the index.html file for the development server.
15
+ *
16
+ * @example
17
+ * ```ts
18
+ * const viteDevServer = new ViteDevServer(app, endpoints);
19
+ * await viteDevServer.setup();
20
+ * ```
21
+ */
22
+ var ViteDevServer = class extends BaseServer {
23
+ constructor(app, endpoints = {}) {
24
+ super(app, endpoints);
25
+ this.vite = null;
26
+ }
27
+ /**
28
+ * Setup the Vite dev server.
29
+ *
30
+ * This method sets up the Vite dev server and the index.html file for the development server.
31
+ *
32
+ * @returns
33
+ */
34
+ async setup() {
35
+ const { createServer: createViteServer, loadConfigFromFile, mergeConfig } = await import("vite");
36
+ const react = await import("@vitejs/plugin-react");
37
+ const clientRoot = this.findClientRoot();
38
+ this.vite = await createViteServer(mergeConfigDedup((await loadConfigFromFile({
39
+ mode: "development",
40
+ command: "serve"
41
+ }, void 0, clientRoot))?.config ?? {}, {
42
+ configFile: false,
43
+ root: clientRoot,
44
+ server: {
45
+ middlewareMode: true,
46
+ watch: {
47
+ useFsEvents: true,
48
+ ignored: ["**/node_modules/**", "!**/node_modules/@databricks/**"]
49
+ }
50
+ },
51
+ plugins: [react.default(), appKitTypesPlugin()],
52
+ appType: "custom"
53
+ }, mergeConfig));
54
+ this.app.use(this.vite.middlewares);
55
+ this.app.use("*", async (req, res, next) => {
56
+ if (req.originalUrl.startsWith("/api") || req.originalUrl.startsWith("/query")) return next();
57
+ const vite = this.vite;
58
+ this.validateVite(vite);
59
+ try {
60
+ const indexPath = path.resolve(clientRoot, "index.html");
61
+ let html = fs.readFileSync(indexPath, "utf-8");
62
+ html = html.replace("<body>", `<body>${this.getConfigScript()}`);
63
+ html = await vite.transformIndexHtml(req.originalUrl, html);
64
+ res.status(200).set({ "Content-Type": "text/html" }).end(html);
65
+ } catch (e) {
66
+ vite.ssrFixStacktrace(e);
67
+ next(e);
68
+ }
69
+ });
70
+ }
71
+ /** Close the Vite dev server. */
72
+ async close() {
73
+ await this.vite?.close();
74
+ }
75
+ /** Find the client root. */
76
+ findClientRoot() {
77
+ const cwd = process.cwd();
78
+ const candidates = [
79
+ "client",
80
+ "src",
81
+ "app",
82
+ "frontend",
83
+ "."
84
+ ];
85
+ for (const dir of candidates) {
86
+ const fullPath = path.resolve(cwd, dir);
87
+ const hasViteConfig = fs.existsSync(path.join(fullPath, "vite.config.ts")) || fs.existsSync(path.join(fullPath, "vite.config.js"));
88
+ const hasIndexHtml = fs.existsSync(path.join(fullPath, "index.html"));
89
+ if (hasViteConfig && hasIndexHtml) {
90
+ console.log(`Vite dev server: using client root ${fullPath}`);
91
+ return fullPath;
92
+ }
93
+ }
94
+ throw new Error(`Could not find client directory. Searched for vite.config.ts/js + index.html in: ${candidates.join(", ")}`);
95
+ }
96
+ validateVite(vite) {
97
+ if (!vite) throw new Error("Vite dev server not initialized");
98
+ }
99
+ };
100
+
101
+ //#endregion
102
+ export { ViteDevServer };
103
+ //# sourceMappingURL=vite-dev-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vite-dev-server.js","names":[],"sources":["../../src/server/vite-dev-server.ts"],"sourcesContent":["import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type express from \"express\";\nimport type { ViteDevServer as ViteDevServerType } from \"vite\";\nimport { mergeConfigDedup } from \"@/utils\";\nimport { BaseServer } from \"./base-server\";\nimport type { PluginEndpoints } from \"./utils\";\nimport { appKitTypesPlugin } from \"../type-generator/vite-plugin\";\n\n/**\n * Vite dev server for the AppKit.\n *\n * This class is responsible for serving the Vite dev server for the development server.\n * It also handles the index.html file for the development server.\n *\n * @example\n * ```ts\n * const viteDevServer = new ViteDevServer(app, endpoints);\n * await viteDevServer.setup();\n * ```\n */\nexport class ViteDevServer extends BaseServer {\n private vite: ViteDevServerType | null;\n\n constructor(app: express.Application, endpoints: PluginEndpoints = {}) {\n super(app, endpoints);\n this.vite = null;\n }\n\n /**\n * Setup the Vite dev server.\n *\n * This method sets up the Vite dev server and the index.html file for the development server.\n *\n * @returns\n */\n async setup() {\n const {\n createServer: createViteServer,\n loadConfigFromFile,\n mergeConfig,\n } = await import(\"vite\");\n const react = await import(\"@vitejs/plugin-react\");\n\n const clientRoot = this.findClientRoot();\n\n const loadedConfig = await loadConfigFromFile(\n {\n mode: \"development\",\n command: \"serve\",\n },\n undefined,\n clientRoot,\n );\n\n const userConfig = loadedConfig?.config ?? {};\n const coreConfig = {\n configFile: false,\n root: clientRoot,\n server: {\n middlewareMode: true,\n watch: {\n useFsEvents: true,\n ignored: [\"**/node_modules/**\", \"!**/node_modules/@databricks/**\"],\n },\n },\n plugins: [react.default(), appKitTypesPlugin()],\n appType: \"custom\",\n };\n\n const mergedConfigs = mergeConfigDedup(userConfig, coreConfig, mergeConfig);\n this.vite = await createViteServer(mergedConfigs);\n\n this.app.use(this.vite.middlewares);\n\n this.app.use(\"*\", async (req, res, next) => {\n if (\n req.originalUrl.startsWith(\"/api\") ||\n req.originalUrl.startsWith(\"/query\")\n ) {\n return next();\n }\n const vite = this.vite;\n this.validateVite(vite);\n\n try {\n const indexPath = path.resolve(clientRoot, \"index.html\");\n let html = fs.readFileSync(indexPath, \"utf-8\");\n html = html.replace(\"<body>\", `<body>${this.getConfigScript()}`);\n html = await vite.transformIndexHtml(req.originalUrl, html);\n res.status(200).set({ \"Content-Type\": \"text/html\" }).end(html);\n } catch (e) {\n vite.ssrFixStacktrace(e as Error);\n next(e);\n }\n });\n }\n\n /** Close the Vite dev server. */\n async close() {\n await this.vite?.close();\n }\n\n /** Find the client root. */\n private findClientRoot(): string {\n const cwd = process.cwd();\n const candidates = [\"client\", \"src\", \"app\", \"frontend\", \".\"];\n\n for (const dir of candidates) {\n const fullPath = path.resolve(cwd, dir);\n const hasViteConfig =\n fs.existsSync(path.join(fullPath, \"vite.config.ts\")) ||\n fs.existsSync(path.join(fullPath, \"vite.config.js\"));\n const hasIndexHtml = fs.existsSync(path.join(fullPath, \"index.html\"));\n\n if (hasViteConfig && hasIndexHtml) {\n console.log(`Vite dev server: using client root ${fullPath}`);\n return fullPath;\n }\n }\n\n throw new Error(\n `Could not find client directory. Searched for vite.config.ts/js + index.html in: ${candidates.join(\", \")}`,\n );\n }\n\n // type assertion to ensure vite is not null\n private validateVite(\n vite: ViteDevServerType | null,\n ): asserts vite is ViteDevServerType {\n if (!vite) {\n throw new Error(\"Vite dev server not initialized\");\n }\n }\n}\n"],"mappings":";;;;;;;;YAI2C;;;;;;;;;;;;;AAiB3C,IAAa,gBAAb,cAAmC,WAAW;CAG5C,YAAY,KAA0B,YAA6B,EAAE,EAAE;AACrE,QAAM,KAAK,UAAU;AACrB,OAAK,OAAO;;;;;;;;;CAUd,MAAM,QAAQ;EACZ,MAAM,EACJ,cAAc,kBACd,oBACA,gBACE,MAAM,OAAO;EACjB,MAAM,QAAQ,MAAM,OAAO;EAE3B,MAAM,aAAa,KAAK,gBAAgB;AA2BxC,OAAK,OAAO,MAAM,iBADI,kBAxBD,MAAM,mBACzB;GACE,MAAM;GACN,SAAS;GACV,EACD,QACA,WACD,GAEgC,UAAU,EAAE,EAC1B;GACjB,YAAY;GACZ,MAAM;GACN,QAAQ;IACN,gBAAgB;IAChB,OAAO;KACL,aAAa;KACb,SAAS,CAAC,sBAAsB,kCAAkC;KACnE;IACF;GACD,SAAS,CAAC,MAAM,SAAS,EAAE,mBAAmB,CAAC;GAC/C,SAAS;GACV,EAE8D,YAAY,CAC1B;AAEjD,OAAK,IAAI,IAAI,KAAK,KAAK,YAAY;AAEnC,OAAK,IAAI,IAAI,KAAK,OAAO,KAAK,KAAK,SAAS;AAC1C,OACE,IAAI,YAAY,WAAW,OAAO,IAClC,IAAI,YAAY,WAAW,SAAS,CAEpC,QAAO,MAAM;GAEf,MAAM,OAAO,KAAK;AAClB,QAAK,aAAa,KAAK;AAEvB,OAAI;IACF,MAAM,YAAY,KAAK,QAAQ,YAAY,aAAa;IACxD,IAAI,OAAO,GAAG,aAAa,WAAW,QAAQ;AAC9C,WAAO,KAAK,QAAQ,UAAU,SAAS,KAAK,iBAAiB,GAAG;AAChE,WAAO,MAAM,KAAK,mBAAmB,IAAI,aAAa,KAAK;AAC3D,QAAI,OAAO,IAAI,CAAC,IAAI,EAAE,gBAAgB,aAAa,CAAC,CAAC,IAAI,KAAK;YACvD,GAAG;AACV,SAAK,iBAAiB,EAAW;AACjC,SAAK,EAAE;;IAET;;;CAIJ,MAAM,QAAQ;AACZ,QAAM,KAAK,MAAM,OAAO;;;CAI1B,AAAQ,iBAAyB;EAC/B,MAAM,MAAM,QAAQ,KAAK;EACzB,MAAM,aAAa;GAAC;GAAU;GAAO;GAAO;GAAY;GAAI;AAE5D,OAAK,MAAM,OAAO,YAAY;GAC5B,MAAM,WAAW,KAAK,QAAQ,KAAK,IAAI;GACvC,MAAM,gBACJ,GAAG,WAAW,KAAK,KAAK,UAAU,iBAAiB,CAAC,IACpD,GAAG,WAAW,KAAK,KAAK,UAAU,iBAAiB,CAAC;GACtD,MAAM,eAAe,GAAG,WAAW,KAAK,KAAK,UAAU,aAAa,CAAC;AAErE,OAAI,iBAAiB,cAAc;AACjC,YAAQ,IAAI,sCAAsC,WAAW;AAC7D,WAAO;;;AAIX,QAAM,IAAI,MACR,oFAAoF,WAAW,KAAK,KAAK,GAC1G;;CAIH,AAAQ,aACN,MACmC;AACnC,MAAI,CAAC,KACH,OAAM,IAAI,MAAM,kCAAkC"}
@@ -0,0 +1,62 @@
1
+ import { TelemetryOptions } from "./plugin.js";
2
+
3
+ //#region ../shared/src/cache.d.ts
4
+ /** Cache entry interface */
5
+ interface CacheEntry<T = any> {
6
+ value: T;
7
+ expiry: number;
8
+ }
9
+ /**
10
+ * Cache storage interface for custom implementations
11
+ * - InMemoryStorage
12
+ * - PersistentStorage (Lakebase)
13
+ */
14
+ interface CacheStorage {
15
+ /** Get a cached value from the storage */
16
+ get<T>(key: string): Promise<CacheEntry<T> | null>;
17
+ /** Set a value in the storage */
18
+ set<T>(key: string, entry: CacheEntry<T>): Promise<void>;
19
+ /** Delete a value from the storage */
20
+ delete(key: string): Promise<void>;
21
+ /** Clear the storage */
22
+ clear(): Promise<void>;
23
+ /** Check if a value exists in the storage */
24
+ has(key: string): Promise<boolean>;
25
+ /** Get the size of the storage */
26
+ size(): Promise<number>;
27
+ /** Check if the storage is persistent */
28
+ isPersistent(): boolean;
29
+ /** Check if the storage is healthy */
30
+ healthCheck(): Promise<boolean>;
31
+ /** Close the storage */
32
+ close(): Promise<void>;
33
+ }
34
+ /** Configuration for caching */
35
+ interface CacheConfig {
36
+ /** Whether caching is enabled */
37
+ enabled?: boolean;
38
+ /** Time to live in seconds */
39
+ ttl?: number;
40
+ /** Maximum number of bytes in the cache */
41
+ maxBytes?: number;
42
+ /** Maximum number of entries in the cache */
43
+ maxSize?: number;
44
+ /** Cache key */
45
+ cacheKey?: (string | number | object)[];
46
+ /** Cache Storage provider instance */
47
+ storage?: CacheStorage;
48
+ /** Whether to enforce strict persistence */
49
+ strictPersistence?: boolean;
50
+ /** Telemetry configuration */
51
+ telemetry?: TelemetryOptions;
52
+ /** Probability (0-1) of triggering cleanup on each get operation */
53
+ cleanupProbability?: number;
54
+ /** Probability (0-1) of checking total bytes on each write operation */
55
+ evictionCheckProbability?: number;
56
+ /** Maximum number of bytes per entry in the cache */
57
+ maxEntryBytes?: number;
58
+ [key: string]: unknown;
59
+ }
60
+ //#endregion
61
+ export { CacheConfig };
62
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","names":[],"sources":["../../../../shared/src/cache.ts"],"sourcesContent":[],"mappings":";;;;UAGiB;EAAA,KAAA,EACR,CADQ;EAUA,MAAA,EAAA,MAAA;;;;;;;AAI4B,UAJ5B,YAAA,CAI4B;;KAIlC,CAAA,CAAA,CAAA,CAAA,GAAA,EAAA,MAAA,CAAA,EANY,OAMZ,CANoB,UAMpB,CAN+B,CAM/B,CAAA,GAAA,IAAA,CAAA;;KAID,CAAA,CAAA,CAAA,CAAA,GAAA,EAAA,MAAA,EAAA,KAAA,EARmB,UAQnB,CAR8B,CAQ9B,CAAA,CAAA,EARmC,OAQnC,CAAA,IAAA,CAAA;;QAMC,CAAA,GAAA,EAAA,MAAA,CAAA,EAZY,OAYZ,CAAA,IAAA,CAAA;EAAO;EAID,KAAA,EAAA,EAdN,OAciB,CAAA,IAAA,CAAA;EAAA;KAYhB,CAAA,GAAA,EAAA,MAAA,CAAA,EAxBQ,OAwBR,CAAA,OAAA,CAAA;;EAIkB,IAAA,EAAA,EA1BpB,OA0BoB,CAAA,MAAA,CAAA;;;;iBAtBb;;WAEN;;;UAIM,WAAA;;;;;;;;;;;;YAYL;;;;cAIE"}
@@ -0,0 +1,46 @@
1
+ import { CacheConfig } from "./cache.js";
2
+
3
+ //#region ../shared/src/execute.d.ts
4
+ interface StreamConfig {
5
+ userSignal?: AbortSignal;
6
+ streamId?: string;
7
+ bufferSize?: number;
8
+ maxEventSize?: number;
9
+ bufferTTL?: number;
10
+ cleanupInterval?: number;
11
+ maxPersistentBuffers?: number;
12
+ heartbeatInterval?: number;
13
+ maxActiveStreams?: number;
14
+ }
15
+ interface RetryConfig {
16
+ enabled?: boolean;
17
+ attempts?: number;
18
+ initialDelay?: number;
19
+ maxDelay?: number;
20
+ }
21
+ interface TelemetryConfig {
22
+ enabled?: boolean;
23
+ spanName?: string;
24
+ attributes?: Record<string, any>;
25
+ }
26
+ interface PluginExecuteConfig {
27
+ cache?: CacheConfig;
28
+ retry?: RetryConfig;
29
+ telemetryInterceptor?: TelemetryConfig;
30
+ abort?: AbortSignal;
31
+ timeout?: number;
32
+ [key: string]: unknown;
33
+ }
34
+ interface PluginExecutionSettings {
35
+ default: PluginExecuteConfig;
36
+ user?: PluginExecuteConfig;
37
+ }
38
+ type StreamExecuteHandler<T> = ((signal?: AbortSignal) => Promise<T>) | ((signal?: AbortSignal) => AsyncGenerator<T, void, unknown>);
39
+ interface StreamExecutionSettings {
40
+ default: PluginExecuteConfig;
41
+ user?: PluginExecuteConfig;
42
+ stream?: StreamConfig;
43
+ }
44
+ //#endregion
45
+ export { PluginExecutionSettings, StreamConfig, StreamExecuteHandler, StreamExecutionSettings };
46
+ //# sourceMappingURL=execute.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execute.d.ts","names":[],"sources":["../../../../shared/src/execute.ts"],"sourcesContent":[],"mappings":";;;UAEiB,YAAA;eACF;EADE,QAAA,CAAA,EAAA,MAAY;EAYZ,UAAA,CAAA,EAAA,MAAW;EAOX,YAAA,CAAA,EAAA,MAAe;EAMf,SAAA,CAAA,EAAA,MAAA;EAAmB,eAAA,CAAA,EAAA,MAAA;sBAC1B,CAAA,EAAA,MAAA;mBACA,CAAA,EAAA,MAAA;kBAEe,CAAA,EAAA,MAAA;;AACJ,UAlBJ,WAAA,CAkBI;EAKJ,OAAA,CAAA,EAAA,OAAA;EAAuB,QAAA,CAAA,EAAA,MAAA;cAC7B,CAAA,EAAA,MAAA;UACF,CAAA,EAAA,MAAA;;AAIG,UAtBK,eAAA,CAsBe;EAAA,OAAA,CAAA,EAAA,OAAA;UACjB,CAAA,EAAA,MAAA;YAAwB,CAAA,EApBxB,MAoBwB,CAAA,MAAA,EAAA,GAAA,CAAA;;AACxB,UAlBE,mBAAA,CAkBF;OAA+B,CAAA,EAjBpC,WAiBoC;OAAf,CAAA,EAhBrB,WAgBqB;EAAc,oBAAA,CAAA,EAdpB,eAcoB;EAE5B,KAAA,CAAA,EAfP,WAeO;EAAuB,OAAA,CAAA,EAAA,MAAA;MAC7B,EAAA,MAAA,CAAA,EAAA,OAAA;;AAEA,UAbM,uBAAA,CAaN;EAAY,OAAA,EAZZ,mBAYY;SAXd;;KAIG,qCACG,gBAAgB,QAAQ,iBACxB,gBAAgB,eAAe;UAE7B,uBAAA;WACN;SACF;WACE"}
@@ -0,0 +1,50 @@
1
+ import express from "express";
2
+
3
+ //#region ../shared/src/plugin.d.ts
4
+ interface BasePlugin {
5
+ name: string;
6
+ abortActiveOperations?(): void;
7
+ validateEnv(): void;
8
+ setup(): Promise<void>;
9
+ injectRoutes(router: express.Router): void;
10
+ getEndpoints(): PluginEndpointMap;
11
+ }
12
+ interface BasePluginConfig {
13
+ name?: string;
14
+ host?: string;
15
+ [key: string]: unknown;
16
+ telemetry?: TelemetryOptions;
17
+ }
18
+ type TelemetryOptions = boolean | {
19
+ traces?: boolean;
20
+ metrics?: boolean;
21
+ logs?: boolean;
22
+ };
23
+ type PluginPhase = "core" | "normal" | "deferred";
24
+ type PluginConstructor<C = BasePluginConfig, I extends BasePlugin = BasePlugin> = (new (config: C) => I) & {
25
+ DEFAULT_CONFIG?: Record<string, unknown>;
26
+ phase?: PluginPhase;
27
+ };
28
+ type PluginMap<U extends readonly PluginData<PluginConstructor, unknown, string>[]> = { [P in U[number] as P["name"]]: InstanceType<P["plugin"]> };
29
+ type PluginData<T, U, N> = {
30
+ plugin: T;
31
+ config: U;
32
+ name: N;
33
+ };
34
+ type ToPlugin<T, U, N extends string> = (config?: U) => PluginData<T, U, N>;
35
+ type IAppRouter = express.Router;
36
+ type IAppResponse = express.Response;
37
+ type IAppRequest = express.Request;
38
+ type HttpMethod = "get" | "post" | "put" | "delete" | "patch" | "head";
39
+ type RouteConfig = {
40
+ /** Unique name for this endpoint (used for frontend access) */
41
+ name: string;
42
+ method: HttpMethod;
43
+ path: string;
44
+ handler: (req: IAppRequest, res: IAppResponse) => Promise<void>;
45
+ };
46
+ /** Map of endpoint names to their full paths for a plugin */
47
+ type PluginEndpointMap = Record<string, string>;
48
+ //#endregion
49
+ export { BasePlugin, BasePluginConfig, IAppResponse, IAppRouter, PluginConstructor, PluginData, PluginEndpointMap, PluginMap, PluginPhase, RouteConfig, TelemetryOptions, ToPlugin };
50
+ //# sourceMappingURL=plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.d.ts","names":[],"sources":["../../../../shared/src/plugin.ts"],"sourcesContent":[],"mappings":";;;UAEiB,UAAA;;EAAA,qBAAU,GAAA,EAAA,IAAA;EAAA,WAAA,EAAA,EAAA,IAAA;OAOhB,EAAA,EAAA,OAAA,CAAA,IAAA,CAAA;cAEoB,CAAA,MAAA,EAAR,OAAA,CAAQ,MAAA,CAAA,EAAA,IAAA;cAEb,EAAA,EAAA,iBAAA;;AAGD,UAAA,gBAAA,CAUH;EAGF,IAAA,CAAA,EAAA,MAAA;EAaA,IAAA,CAAA,EAAA,MAAA;EAEA,CAAA,GAAA,EAAA,MAAA,CAAA,EAAA,OAAiB;EAAA,SAAA,CAAA,EAlBf,gBAkBe;;AAEjB,KAjBA,gBAAA,GAiBA,OAAA,GAAA;QAAa,CAAA,EAAA,OAAA;SAEf,CAAA,EAAA,OAAA;MACL,CAAA,EAAA,OAAA;;AAkC2B,KAzCpB,WAAA,GAyCoB,MAAA,GAAA,QAAA,GAAA,UAAA;AAAX,KAvCT,iBAuCS,CAAA,IAtCf,gBAsCe,EAAA,UArCT,UAqCS,GArCI,UAqCJ,CAAA,GAAA,CAAA,KAAA,MAAA,EAnCX,CAmCW,EAAA,GAlChB,CAkCgB,CAAA,GAAA;gBAEb,CAAA,EAnCW,MAmCX,CAAA,MAAA,EAAA,OAAA,CAAA;OAAa,CAAA,EAlCX,WAkCW;;AAST,KAZA,SAYY,CAAA,UAAG,SAXN,UAWsB,CAXX,iBAWW,EAAA,OAAA,EAAA,MAAA,CAAA,EAAA,CAAA,GAAA,QATnC,CAUI,CAAA,MAAW,CAAA,IAVF,CAUE,CAAA,MAAG,CAAA,GAVO,YAUQ,CAVK,CAUL,CAAA,QAAA,CAAA,CAAA,EAEzC;AAEY,KAXA,UAWW,CAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA,GAAA;EAAA,MAAA,EAXqB,CAWrB;QAGb,EAd6C,CAc7C;MAEO,EAhB+C,CAgB/C;;AAAmC,KAfxC,QAewC,CAAA,CAAA,EAAA,CAAA,EAAA,UAAA,MAAA,CAAA,GAAA,CAAA,MAAA,CAAA,EAdzC,CAcyC,EAAA,GAb/C,UAa+C,CAbpC,CAaoC,EAbjC,CAaiC,EAb9B,CAa8B,CAAA;AAAO,KAX/C,UAAA,GAAa,OAAA,CAAQ,MAW0B;AAI/C,KAdA,YAAA,GAAe,OAAA,CAAQ,QAcG;KAb1B,WAAA,GAAc,OAAA,CAAQ;KAEtB,UAAA;KAEA,WAAA;;;UAGF;;iBAEO,kBAAkB,iBAAiB;;;KAIxC,iBAAA,GAAoB"}
@@ -0,0 +1,160 @@
1
+ import { SQLBinaryMarker, SQLBooleanMarker, SQLDateMarker, SQLNumberMarker, SQLStringMarker, SQLTimestampMarker, SQLTypeMarker } from "./types.js";
2
+
3
+ //#region ../shared/src/sql/helpers.d.ts
4
+
5
+ /**
6
+ * SQL helper namespace
7
+ */
8
+ declare const sql: {
9
+ /**
10
+ * Creates a DATE type parameter
11
+ * Accepts Date objects or ISO date strings (YYYY-MM-DD format)
12
+ * @param value - Date object or ISO date string
13
+ * @returns Marker object for DATE type parameter
14
+ * @example
15
+ * ```typescript
16
+ * const params = { startDate: sql.date(new Date("2024-01-01")) };
17
+ * params = { startDate: "2024-01-01" }
18
+ * ```
19
+ * @example
20
+ * ```typescript
21
+ * const params = { startDate: sql.date("2024-01-01") };
22
+ * params = { startDate: "2024-01-01" }
23
+ * ```
24
+ */
25
+ date(value: Date | string): SQLDateMarker;
26
+ /**
27
+ * Creates a TIMESTAMP type parameter
28
+ * Accepts Date objects, ISO timestamp strings, or Unix timestamp numbers
29
+ * @param value - Date object, ISO timestamp string, or Unix timestamp number
30
+ * @returns Marker object for TIMESTAMP type parameter
31
+ * @example
32
+ * ```typescript
33
+ * const params = { createdTime: sql.timestamp(new Date("2024-01-01T12:00:00Z")) };
34
+ * params = { createdTime: "2024-01-01T12:00:00Z" }
35
+ * ```
36
+ * @example
37
+ * ```typescript
38
+ * const params = { createdTime: sql.timestamp("2024-01-01T12:00:00Z") };
39
+ * params = { createdTime: "2024-01-01T12:00:00Z" }
40
+ * ```
41
+ * @example
42
+ * ```typescript
43
+ * const params = { createdTime: sql.timestamp(1704110400000) };
44
+ * params = { createdTime: "2024-01-01T12:00:00Z" }
45
+ * ```
46
+ */
47
+ timestamp(value: Date | string | number): SQLTimestampMarker;
48
+ /**
49
+ * Creates a NUMERIC type parameter
50
+ * Accepts numbers or numeric strings
51
+ * @param value - Number or numeric string
52
+ * @returns Marker object for NUMERIC type parameter
53
+ * @example
54
+ * ```typescript
55
+ * const params = { userId: sql.number(123) };
56
+ * params = { userId: "123" }
57
+ * ```
58
+ * @example
59
+ * ```typescript
60
+ * const params = { userId: sql.number("123") };
61
+ * params = { userId: "123" }
62
+ * ```
63
+ */
64
+ number(value: number | string): SQLNumberMarker;
65
+ /**
66
+ * Creates a STRING type parameter
67
+ * Accepts strings, numbers, or booleans
68
+ * @param value - String, number, or boolean
69
+ * @returns Marker object for STRING type parameter
70
+ * @example
71
+ * ```typescript
72
+ * const params = { name: sql.string("John") };
73
+ * params = { name: "John" }
74
+ * ```
75
+ * @example
76
+ * ```typescript
77
+ * const params = { name: sql.string(123) };
78
+ * params = { name: "123" }
79
+ * ```
80
+ * @example
81
+ * ```typescript
82
+ * const params = { name: sql.string(true) };
83
+ * params = { name: "true" }
84
+ * ```
85
+ */
86
+ string(value: string | number | boolean): SQLStringMarker;
87
+ /**
88
+ * Create a BOOLEAN type parameter
89
+ * Accepts booleans, strings, or numbers
90
+ * @param value - Boolean, string, or number
91
+ * @returns Marker object for BOOLEAN type parameter
92
+ * @example
93
+ * ```typescript
94
+ * const params = { isActive: sql.boolean(true) };
95
+ * params = { isActive: "true" }
96
+ * ```
97
+ * @example
98
+ * ```typescript
99
+ * const params = { isActive: sql.boolean("true") };
100
+ * params = { isActive: "true" }
101
+ * ```
102
+ * @example
103
+ * ```typescript
104
+ * const params = { isActive: sql.boolean(1) };
105
+ * params = { isActive: "true" }
106
+ * ```
107
+ * @example
108
+ * ```typescript
109
+ * const params = { isActive: sql.boolean("false") };
110
+ * params = { isActive: "false" }
111
+ * ```
112
+ * @example
113
+ * ```typescript
114
+ * const params = { isActive: sql.boolean(0) };
115
+ * params = { isActive: "false" }
116
+ * ```
117
+ * @returns
118
+ */
119
+ boolean(value: boolean | string | number): SQLBooleanMarker;
120
+ /**
121
+ * Creates a BINARY parameter as hex-encoded STRING
122
+ * Accepts Uint8Array, ArrayBuffer, or hex string
123
+ * Note: Databricks SQL Warehouse doesn't support BINARY as parameter type,
124
+ * so this helper returns a STRING with hex encoding. Use UNHEX(:param) in your SQL.
125
+ * @param value - Uint8Array, ArrayBuffer, or hex string
126
+ * @returns Marker object with STRING type and hex-encoded value
127
+ * @example
128
+ * ```typescript
129
+ * // From Uint8Array:
130
+ * const params = { data: sql.binary(new Uint8Array([0x53, 0x70, 0x61, 0x72, 0x6b])) };
131
+ * // Returns: { __sql_type: "STRING", value: "537061726B" }
132
+ * // SQL: SELECT UNHEX(:data) as binary_value
133
+ * ```
134
+ * @example
135
+ * ```typescript
136
+ * // From hex string:
137
+ * const params = { data: sql.binary("537061726B") };
138
+ * // Returns: { __sql_type: "STRING", value: "537061726B" }
139
+ * ```
140
+ */
141
+ binary(value: Uint8Array | ArrayBuffer | string): SQLBinaryMarker;
142
+ };
143
+ /**
144
+ * Type guard to check if a value is a SQL type marker
145
+ * @param value - Value to check
146
+ * @returns True if the value is a SQL type marker, false otherwise
147
+ * @example
148
+ * ```typescript
149
+ * const value = {
150
+ * __sql_type: "DATE",
151
+ * value: "2024-01-01",
152
+ * };
153
+ * const isSQLTypeMarker = isSQLTypeMarker(value);
154
+ * console.log(isSQLTypeMarker); // true
155
+ * ```
156
+ */
157
+ declare function isSQLTypeMarker(value: any): value is SQLTypeMarker;
158
+ //#endregion
159
+ export { isSQLTypeMarker, sql };
160
+ //# sourceMappingURL=helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.d.ts","names":[],"sources":["../../../../../shared/src/sql/helpers.ts"],"sourcesContent":[],"mappings":";;;;;;AAaA;AA0TC,cA1TY,GA0TZ,EAAA;;;;;;;;;;;;AAgBD;;;;;cAzTc,gBAAgB;;;;;;;;;;;;;;;;;;;;;;mBAmDX,yBAAyB;;;;;;;;;;;;;;;;;kCA6CV;;;;;;;;;;;;;;;;;;;;;;4CAkDU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6CAyDC;;;;;;;;;;;;;;;;;;;;;;gBA8D7B,aAAa,uBAAuB;;;;;;;;;;;;;;;;iBAgDpC,eAAA,uBAAsC"}
@@ -0,0 +1,103 @@
1
+ //#region ../shared/src/sql/helpers.ts
2
+ /**
3
+ * SQL helper namespace
4
+ */
5
+ const sql = {
6
+ date(value) {
7
+ let dateValue = "";
8
+ if (value instanceof Date) dateValue = value.toISOString().split("T")[0];
9
+ else if (typeof value === "string") {
10
+ if (!/^\d{4}-\d{2}-\d{2}$/.test(value)) throw new Error(`sql.date() expects Date or ISO date string (YYYY-MM-DD format), got: ${value}`);
11
+ dateValue = value;
12
+ } else throw new Error(`sql.date() expects Date or ISO date string (YYYY-MM-DD format), got: ${typeof value}`);
13
+ return {
14
+ __sql_type: "DATE",
15
+ value: dateValue
16
+ };
17
+ },
18
+ timestamp(value) {
19
+ let timestampValue = "";
20
+ if (value instanceof Date) timestampValue = value.toISOString().replace(/\.000(Z|[+-])/, "$1");
21
+ else if (typeof value === "string") {
22
+ if (!/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d{1,9})?(Z|[+-]\d{2}:\d{2})?$/.test(value)) throw new Error(`sql.timestamp() expects ISO timestamp string (YYYY-MM-DDTHH:MM:SS.mmmZ or YYYY-MM-DDTHH:MM:SS.mmm+HH:MM), got: ${value}`);
23
+ timestampValue = value;
24
+ } else if (typeof value === "number") timestampValue = new Date(value > 0xe8d4a51000 ? value : value * 1e3).toISOString().replace(/\.000(Z|[+-])/, "$1");
25
+ else throw new Error(`sql.timestamp() expects Date, ISO timestamp string, or Unix timestamp number, got: ${typeof value}`);
26
+ return {
27
+ __sql_type: "TIMESTAMP",
28
+ value: timestampValue
29
+ };
30
+ },
31
+ number(value) {
32
+ let numValue = "";
33
+ if (typeof value === "number") numValue = value.toString();
34
+ else if (typeof value === "string") {
35
+ if (value === "" || Number.isNaN(Number(value))) throw new Error(`sql.number() expects number or numeric string, got: ${value === "" ? "empty string" : value}`);
36
+ numValue = value;
37
+ } else throw new Error(`sql.number() expects number or numeric string, got: ${typeof value}`);
38
+ return {
39
+ __sql_type: "NUMERIC",
40
+ value: numValue
41
+ };
42
+ },
43
+ string(value) {
44
+ if (typeof value !== "string" && typeof value !== "number" && typeof value !== "boolean") throw new Error(`sql.string() expects string or number or boolean, got: ${typeof value}`);
45
+ let stringValue = "";
46
+ if (typeof value === "string") stringValue = value;
47
+ else stringValue = value.toString();
48
+ return {
49
+ __sql_type: "STRING",
50
+ value: stringValue
51
+ };
52
+ },
53
+ boolean(value) {
54
+ if (typeof value !== "boolean" && typeof value !== "string" && typeof value !== "number") throw new Error(`sql.boolean() expects boolean or string (true or false) or number (1 or 0), got: ${typeof value}`);
55
+ let booleanValue = "";
56
+ if (typeof value === "boolean") booleanValue = value.toString();
57
+ else if (typeof value === "number") {
58
+ if (value !== 1 && value !== 0) throw new Error(`sql.boolean() expects boolean or string (true or false) or number (1 or 0), got: ${value}`);
59
+ booleanValue = value === 1 ? "true" : "false";
60
+ } else if (typeof value === "string") {
61
+ if (value !== "true" && value !== "false") throw new Error(`sql.boolean() expects boolean or string (true or false) or number (1 or 0), got: ${value}`);
62
+ booleanValue = value;
63
+ }
64
+ return {
65
+ __sql_type: "BOOLEAN",
66
+ value: booleanValue
67
+ };
68
+ },
69
+ binary(value) {
70
+ let hexValue = "";
71
+ if (value instanceof Uint8Array) hexValue = Array.from(value).map((b) => b.toString(16).padStart(2, "0").toUpperCase()).join("");
72
+ else if (value instanceof ArrayBuffer) hexValue = Array.from(new Uint8Array(value)).map((b) => b.toString(16).padStart(2, "0").toUpperCase()).join("");
73
+ else if (typeof value === "string") {
74
+ if (!/^[0-9A-Fa-f]*$/.test(value)) throw new Error(`sql.binary() expects Uint8Array, ArrayBuffer, or hex string, got invalid hex: ${value}`);
75
+ hexValue = value.toUpperCase();
76
+ } else throw new Error(`sql.binary() expects Uint8Array, ArrayBuffer, or hex string, got: ${typeof value}`);
77
+ return {
78
+ __sql_type: "STRING",
79
+ value: hexValue
80
+ };
81
+ }
82
+ };
83
+ /**
84
+ * Type guard to check if a value is a SQL type marker
85
+ * @param value - Value to check
86
+ * @returns True if the value is a SQL type marker, false otherwise
87
+ * @example
88
+ * ```typescript
89
+ * const value = {
90
+ * __sql_type: "DATE",
91
+ * value: "2024-01-01",
92
+ * };
93
+ * const isSQLTypeMarker = isSQLTypeMarker(value);
94
+ * console.log(isSQLTypeMarker); // true
95
+ * ```
96
+ */
97
+ function isSQLTypeMarker(value) {
98
+ return value !== null && typeof value === "object" && "__sql_type" in value && "value" in value && typeof value.__sql_type === "string" && typeof value.value === "string";
99
+ }
100
+
101
+ //#endregion
102
+ export { isSQLTypeMarker, sql };
103
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","names":["dateValue: string","timestampValue: string","numValue: string","stringValue: string","booleanValue: string","hexValue: string"],"sources":["../../../../../shared/src/sql/helpers.ts"],"sourcesContent":["import type {\n SQLBinaryMarker,\n SQLBooleanMarker,\n SQLDateMarker,\n SQLNumberMarker,\n SQLStringMarker,\n SQLTimestampMarker,\n SQLTypeMarker,\n} from \"./types\";\n\n/**\n * SQL helper namespace\n */\nexport const sql = {\n /**\n * Creates a DATE type parameter\n * Accepts Date objects or ISO date strings (YYYY-MM-DD format)\n * @param value - Date object or ISO date string\n * @returns Marker object for DATE type parameter\n * @example\n * ```typescript\n * const params = { startDate: sql.date(new Date(\"2024-01-01\")) };\n * params = { startDate: \"2024-01-01\" }\n * ```\n * @example\n * ```typescript\n * const params = { startDate: sql.date(\"2024-01-01\") };\n * params = { startDate: \"2024-01-01\" }\n * ```\n */\n date(value: Date | string): SQLDateMarker {\n let dateValue: string = \"\";\n\n // check if value is a Date object\n if (value instanceof Date) {\n dateValue = value.toISOString().split(\"T\")[0];\n }\n // check if value is a string\n else if (typeof value === \"string\") {\n // validate format\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(value)) {\n throw new Error(\n `sql.date() expects Date or ISO date string (YYYY-MM-DD format), got: ${value}`,\n );\n }\n dateValue = value;\n }\n // if value is not a Date object or string, throw an error\n else {\n throw new Error(\n `sql.date() expects Date or ISO date string (YYYY-MM-DD format), got: ${typeof value}`,\n );\n }\n\n return {\n __sql_type: \"DATE\",\n value: dateValue,\n };\n },\n\n /**\n * Creates a TIMESTAMP type parameter\n * Accepts Date objects, ISO timestamp strings, or Unix timestamp numbers\n * @param value - Date object, ISO timestamp string, or Unix timestamp number\n * @returns Marker object for TIMESTAMP type parameter\n * @example\n * ```typescript\n * const params = { createdTime: sql.timestamp(new Date(\"2024-01-01T12:00:00Z\")) };\n * params = { createdTime: \"2024-01-01T12:00:00Z\" }\n * ```\n * @example\n * ```typescript\n * const params = { createdTime: sql.timestamp(\"2024-01-01T12:00:00Z\") };\n * params = { createdTime: \"2024-01-01T12:00:00Z\" }\n * ```\n * @example\n * ```typescript\n * const params = { createdTime: sql.timestamp(1704110400000) };\n * params = { createdTime: \"2024-01-01T12:00:00Z\" }\n * ```\n */\n timestamp(value: Date | string | number): SQLTimestampMarker {\n let timestampValue: string = \"\";\n\n if (value instanceof Date) {\n timestampValue = value.toISOString().replace(/\\.000(Z|[+-])/, \"$1\");\n } else if (typeof value === \"string\") {\n const isoRegex =\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d{1,9})?(Z|[+-]\\d{2}:\\d{2})?$/;\n if (!isoRegex.test(value)) {\n throw new Error(\n `sql.timestamp() expects ISO timestamp string (YYYY-MM-DDTHH:MM:SS.mmmZ or YYYY-MM-DDTHH:MM:SS.mmm+HH:MM), got: ${value}`,\n );\n }\n timestampValue = value;\n } else if (typeof value === \"number\") {\n const date = new Date(value > 1e12 ? value : value * 1000);\n timestampValue = date.toISOString().replace(/\\.000(Z|[+-])/, \"$1\");\n } else {\n throw new Error(\n `sql.timestamp() expects Date, ISO timestamp string, or Unix timestamp number, got: ${typeof value}`,\n );\n }\n\n return {\n __sql_type: \"TIMESTAMP\",\n value: timestampValue,\n };\n },\n\n /**\n * Creates a NUMERIC type parameter\n * Accepts numbers or numeric strings\n * @param value - Number or numeric string\n * @returns Marker object for NUMERIC type parameter\n * @example\n * ```typescript\n * const params = { userId: sql.number(123) };\n * params = { userId: \"123\" }\n * ```\n * @example\n * ```typescript\n * const params = { userId: sql.number(\"123\") };\n * params = { userId: \"123\" }\n * ```\n */\n number(value: number | string): SQLNumberMarker {\n let numValue: string = \"\";\n\n // check if value is a number\n if (typeof value === \"number\") {\n numValue = value.toString();\n }\n // check if value is a string\n else if (typeof value === \"string\") {\n if (value === \"\" || Number.isNaN(Number(value))) {\n throw new Error(\n `sql.number() expects number or numeric string, got: ${value === \"\" ? \"empty string\" : value}`,\n );\n }\n numValue = value;\n }\n // if value is not a number or string, throw an error\n else {\n throw new Error(\n `sql.number() expects number or numeric string, got: ${typeof value}`,\n );\n }\n\n return {\n __sql_type: \"NUMERIC\",\n value: numValue,\n };\n },\n\n /**\n * Creates a STRING type parameter\n * Accepts strings, numbers, or booleans\n * @param value - String, number, or boolean\n * @returns Marker object for STRING type parameter\n * @example\n * ```typescript\n * const params = { name: sql.string(\"John\") };\n * params = { name: \"John\" }\n * ```\n * @example\n * ```typescript\n * const params = { name: sql.string(123) };\n * params = { name: \"123\" }\n * ```\n * @example\n * ```typescript\n * const params = { name: sql.string(true) };\n * params = { name: \"true\" }\n * ```\n */\n string(value: string | number | boolean): SQLStringMarker {\n if (\n typeof value !== \"string\" &&\n typeof value !== \"number\" &&\n typeof value !== \"boolean\"\n ) {\n throw new Error(\n `sql.string() expects string or number or boolean, got: ${typeof value}`,\n );\n }\n\n let stringValue: string = \"\";\n\n if (typeof value === \"string\") {\n stringValue = value;\n } else {\n stringValue = value.toString();\n }\n\n return {\n __sql_type: \"STRING\",\n value: stringValue,\n };\n },\n\n /**\n * Create a BOOLEAN type parameter\n * Accepts booleans, strings, or numbers\n * @param value - Boolean, string, or number\n * @returns Marker object for BOOLEAN type parameter\n * @example\n * ```typescript\n * const params = { isActive: sql.boolean(true) };\n * params = { isActive: \"true\" }\n * ```\n * @example\n * ```typescript\n * const params = { isActive: sql.boolean(\"true\") };\n * params = { isActive: \"true\" }\n * ```\n * @example\n * ```typescript\n * const params = { isActive: sql.boolean(1) };\n * params = { isActive: \"true\" }\n * ```\n * @example\n * ```typescript\n * const params = { isActive: sql.boolean(\"false\") };\n * params = { isActive: \"false\" }\n * ```\n * @example\n * ```typescript\n * const params = { isActive: sql.boolean(0) };\n * params = { isActive: \"false\" }\n * ```\n * @returns\n */\n boolean(value: boolean | string | number): SQLBooleanMarker {\n if (\n typeof value !== \"boolean\" &&\n typeof value !== \"string\" &&\n typeof value !== \"number\"\n ) {\n throw new Error(\n `sql.boolean() expects boolean or string (true or false) or number (1 or 0), got: ${typeof value}`,\n );\n }\n\n let booleanValue: string = \"\";\n\n if (typeof value === \"boolean\") {\n booleanValue = value.toString();\n }\n // check if value is a number\n else if (typeof value === \"number\") {\n if (value !== 1 && value !== 0) {\n throw new Error(\n `sql.boolean() expects boolean or string (true or false) or number (1 or 0), got: ${value}`,\n );\n }\n booleanValue = value === 1 ? \"true\" : \"false\";\n }\n // check if value is a string\n else if (typeof value === \"string\") {\n if (value !== \"true\" && value !== \"false\") {\n throw new Error(\n `sql.boolean() expects boolean or string (true or false) or number (1 or 0), got: ${value}`,\n );\n }\n booleanValue = value;\n }\n\n return {\n __sql_type: \"BOOLEAN\",\n value: booleanValue,\n };\n },\n\n /**\n * Creates a BINARY parameter as hex-encoded STRING\n * Accepts Uint8Array, ArrayBuffer, or hex string\n * Note: Databricks SQL Warehouse doesn't support BINARY as parameter type,\n * so this helper returns a STRING with hex encoding. Use UNHEX(:param) in your SQL.\n * @param value - Uint8Array, ArrayBuffer, or hex string\n * @returns Marker object with STRING type and hex-encoded value\n * @example\n * ```typescript\n * // From Uint8Array:\n * const params = { data: sql.binary(new Uint8Array([0x53, 0x70, 0x61, 0x72, 0x6b])) };\n * // Returns: { __sql_type: \"STRING\", value: \"537061726B\" }\n * // SQL: SELECT UNHEX(:data) as binary_value\n * ```\n * @example\n * ```typescript\n * // From hex string:\n * const params = { data: sql.binary(\"537061726B\") };\n * // Returns: { __sql_type: \"STRING\", value: \"537061726B\" }\n * ```\n */\n binary(value: Uint8Array | ArrayBuffer | string): SQLBinaryMarker {\n let hexValue: string = \"\";\n\n if (value instanceof Uint8Array) {\n // if value is a Uint8Array, convert it to a hex string\n hexValue = Array.from(value)\n .map((b) => b.toString(16).padStart(2, \"0\").toUpperCase())\n .join(\"\");\n } else if (value instanceof ArrayBuffer) {\n // if value is an ArrayBuffer, convert it to a hex string\n hexValue = Array.from(new Uint8Array(value))\n .map((b) => b.toString(16).padStart(2, \"0\").toUpperCase())\n .join(\"\");\n } else if (typeof value === \"string\") {\n // validate hex string\n if (!/^[0-9A-Fa-f]*$/.test(value)) {\n throw new Error(\n `sql.binary() expects Uint8Array, ArrayBuffer, or hex string, got invalid hex: ${value}`,\n );\n }\n hexValue = value.toUpperCase();\n } else {\n throw new Error(\n `sql.binary() expects Uint8Array, ArrayBuffer, or hex string, got: ${typeof value}`,\n );\n }\n\n return {\n __sql_type: \"STRING\",\n value: hexValue,\n };\n },\n};\n\n/**\n * Type guard to check if a value is a SQL type marker\n * @param value - Value to check\n * @returns True if the value is a SQL type marker, false otherwise\n * @example\n * ```typescript\n * const value = {\n * __sql_type: \"DATE\",\n * value: \"2024-01-01\",\n * };\n * const isSQLTypeMarker = isSQLTypeMarker(value);\n * console.log(isSQLTypeMarker); // true\n * ```\n */\nexport function isSQLTypeMarker(value: any): value is SQLTypeMarker {\n return (\n value !== null &&\n typeof value === \"object\" &&\n \"__sql_type\" in value &&\n \"value\" in value &&\n typeof value.__sql_type === \"string\" &&\n typeof value.value === \"string\"\n );\n}\n"],"mappings":";;;;AAaA,MAAa,MAAM;CAiBjB,KAAK,OAAqC;EACxC,IAAIA,YAAoB;AAGxB,MAAI,iBAAiB,KACnB,aAAY,MAAM,aAAa,CAAC,MAAM,IAAI,CAAC;WAGpC,OAAO,UAAU,UAAU;AAElC,OAAI,CAAC,sBAAsB,KAAK,MAAM,CACpC,OAAM,IAAI,MACR,wEAAwE,QACzE;AAEH,eAAY;QAIZ,OAAM,IAAI,MACR,wEAAwE,OAAO,QAChF;AAGH,SAAO;GACL,YAAY;GACZ,OAAO;GACR;;CAwBH,UAAU,OAAmD;EAC3D,IAAIC,iBAAyB;AAE7B,MAAI,iBAAiB,KACnB,kBAAiB,MAAM,aAAa,CAAC,QAAQ,iBAAiB,KAAK;WAC1D,OAAO,UAAU,UAAU;AAGpC,OAAI,CADF,wEACY,KAAK,MAAM,CACvB,OAAM,IAAI,MACR,kHAAkH,QACnH;AAEH,oBAAiB;aACR,OAAO,UAAU,SAE1B,kBADa,IAAI,KAAK,QAAQ,eAAO,QAAQ,QAAQ,IAAK,CACpC,aAAa,CAAC,QAAQ,iBAAiB,KAAK;MAElE,OAAM,IAAI,MACR,sFAAsF,OAAO,QAC9F;AAGH,SAAO;GACL,YAAY;GACZ,OAAO;GACR;;CAmBH,OAAO,OAAyC;EAC9C,IAAIC,WAAmB;AAGvB,MAAI,OAAO,UAAU,SACnB,YAAW,MAAM,UAAU;WAGpB,OAAO,UAAU,UAAU;AAClC,OAAI,UAAU,MAAM,OAAO,MAAM,OAAO,MAAM,CAAC,CAC7C,OAAM,IAAI,MACR,uDAAuD,UAAU,KAAK,iBAAiB,QACxF;AAEH,cAAW;QAIX,OAAM,IAAI,MACR,uDAAuD,OAAO,QAC/D;AAGH,SAAO;GACL,YAAY;GACZ,OAAO;GACR;;CAwBH,OAAO,OAAmD;AACxD,MACE,OAAO,UAAU,YACjB,OAAO,UAAU,YACjB,OAAO,UAAU,UAEjB,OAAM,IAAI,MACR,0DAA0D,OAAO,QAClE;EAGH,IAAIC,cAAsB;AAE1B,MAAI,OAAO,UAAU,SACnB,eAAc;MAEd,eAAc,MAAM,UAAU;AAGhC,SAAO;GACL,YAAY;GACZ,OAAO;GACR;;CAmCH,QAAQ,OAAoD;AAC1D,MACE,OAAO,UAAU,aACjB,OAAO,UAAU,YACjB,OAAO,UAAU,SAEjB,OAAM,IAAI,MACR,oFAAoF,OAAO,QAC5F;EAGH,IAAIC,eAAuB;AAE3B,MAAI,OAAO,UAAU,UACnB,gBAAe,MAAM,UAAU;WAGxB,OAAO,UAAU,UAAU;AAClC,OAAI,UAAU,KAAK,UAAU,EAC3B,OAAM,IAAI,MACR,oFAAoF,QACrF;AAEH,kBAAe,UAAU,IAAI,SAAS;aAG/B,OAAO,UAAU,UAAU;AAClC,OAAI,UAAU,UAAU,UAAU,QAChC,OAAM,IAAI,MACR,oFAAoF,QACrF;AAEH,kBAAe;;AAGjB,SAAO;GACL,YAAY;GACZ,OAAO;GACR;;CAwBH,OAAO,OAA2D;EAChE,IAAIC,WAAmB;AAEvB,MAAI,iBAAiB,WAEnB,YAAW,MAAM,KAAK,MAAM,CACzB,KAAK,MAAM,EAAE,SAAS,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,CACzD,KAAK,GAAG;WACF,iBAAiB,YAE1B,YAAW,MAAM,KAAK,IAAI,WAAW,MAAM,CAAC,CACzC,KAAK,MAAM,EAAE,SAAS,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,CACzD,KAAK,GAAG;WACF,OAAO,UAAU,UAAU;AAEpC,OAAI,CAAC,iBAAiB,KAAK,MAAM,CAC/B,OAAM,IAAI,MACR,iFAAiF,QAClF;AAEH,cAAW,MAAM,aAAa;QAE9B,OAAM,IAAI,MACR,qEAAqE,OAAO,QAC7E;AAGH,SAAO;GACL,YAAY;GACZ,OAAO;GACR;;CAEJ;;;;;;;;;;;;;;;AAgBD,SAAgB,gBAAgB,OAAoC;AAClE,QACE,UAAU,QACV,OAAO,UAAU,YACjB,gBAAgB,SAChB,WAAW,SACX,OAAO,MAAM,eAAe,YAC5B,OAAO,MAAM,UAAU"}
@@ -0,0 +1,34 @@
1
+ //#region ../shared/src/sql/types.d.ts
2
+ interface SQLStringMarker {
3
+ __sql_type: "STRING";
4
+ value: string;
5
+ }
6
+ interface SQLNumberMarker {
7
+ __sql_type: "NUMERIC";
8
+ value: string;
9
+ }
10
+ interface SQLBooleanMarker {
11
+ __sql_type: "BOOLEAN";
12
+ value: string;
13
+ }
14
+ /** SQL Binary marker is a STRING with hex encoding */
15
+ interface SQLBinaryMarker {
16
+ __sql_type: "STRING";
17
+ value: string;
18
+ }
19
+ interface SQLDateMarker {
20
+ __sql_type: "DATE";
21
+ value: string;
22
+ }
23
+ interface SQLTimestampMarker {
24
+ __sql_type: "TIMESTAMP";
25
+ value: string;
26
+ }
27
+ /**
28
+ * Object that identifies a typed SQL parameter.
29
+ * Created using sql.date(), sql.string(), sql.number(), sql.boolean(), sql.timestamp(), sql.binary(), or sql.interval().
30
+ */
31
+ type SQLTypeMarker = SQLStringMarker | SQLNumberMarker | SQLBooleanMarker | SQLBinaryMarker | SQLDateMarker | SQLTimestampMarker;
32
+ //#endregion
33
+ export { SQLBinaryMarker, SQLBooleanMarker, SQLDateMarker, SQLNumberMarker, SQLStringMarker, SQLTimestampMarker, SQLTypeMarker };
34
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","names":[],"sources":["../../../../../shared/src/sql/types.ts"],"sourcesContent":[],"mappings":";UAAiB,eAAA;EAAA,UAAA,EAAA,QAAe;EAKf,KAAA,EAAA,MAAA;AAKjB;AAMiB,UAXA,eAAA,CAWe;EAKf,UAAA,EAAA,SAAa;EAKb,KAAA,EAAA,MAAA;AASjB;AAAyB,UAzBR,gBAAA,CAyBQ;YACrB,EAAA,SAAA;OACA,EAAA,MAAA;;;AAGA,UAxBa,eAAA,CAwBb;YACA,EAAA,QAAA;EAAkB,KAAA,EAAA,MAAA;;UApBL,aAAA;;;;UAKA,kBAAA;;;;;;;;KASL,aAAA,GACR,kBACA,kBACA,mBACA,kBACA,gBACA"}