@cipherstash/stack 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/LICENSE.md +21 -0
  3. package/README.md +670 -0
  4. package/dist/bin/stash.js +5049 -0
  5. package/dist/bin/stash.js.map +1 -0
  6. package/dist/chunk-2GZMIJFO.js +2400 -0
  7. package/dist/chunk-2GZMIJFO.js.map +1 -0
  8. package/dist/chunk-5DCT6YU2.js +138 -0
  9. package/dist/chunk-5DCT6YU2.js.map +1 -0
  10. package/dist/chunk-7XRPN2KX.js +336 -0
  11. package/dist/chunk-7XRPN2KX.js.map +1 -0
  12. package/dist/chunk-SJ7JO4ME.js +28 -0
  13. package/dist/chunk-SJ7JO4ME.js.map +1 -0
  14. package/dist/chunk-SUYMGQBY.js +67 -0
  15. package/dist/chunk-SUYMGQBY.js.map +1 -0
  16. package/dist/client-BxJG56Ey.d.cts +647 -0
  17. package/dist/client-DtGq9dJp.d.ts +647 -0
  18. package/dist/client.cjs +347 -0
  19. package/dist/client.cjs.map +1 -0
  20. package/dist/client.d.cts +7 -0
  21. package/dist/client.d.ts +7 -0
  22. package/dist/client.js +11 -0
  23. package/dist/client.js.map +1 -0
  24. package/dist/drizzle/index.cjs +1528 -0
  25. package/dist/drizzle/index.cjs.map +1 -0
  26. package/dist/drizzle/index.d.cts +350 -0
  27. package/dist/drizzle/index.d.ts +350 -0
  28. package/dist/drizzle/index.js +1212 -0
  29. package/dist/drizzle/index.js.map +1 -0
  30. package/dist/dynamodb/index.cjs +382 -0
  31. package/dist/dynamodb/index.cjs.map +1 -0
  32. package/dist/dynamodb/index.d.cts +125 -0
  33. package/dist/dynamodb/index.d.ts +125 -0
  34. package/dist/dynamodb/index.js +355 -0
  35. package/dist/dynamodb/index.js.map +1 -0
  36. package/dist/identity/index.cjs +271 -0
  37. package/dist/identity/index.cjs.map +1 -0
  38. package/dist/identity/index.d.cts +3 -0
  39. package/dist/identity/index.d.ts +3 -0
  40. package/dist/identity/index.js +117 -0
  41. package/dist/identity/index.js.map +1 -0
  42. package/dist/index-9-Ya3fDK.d.cts +169 -0
  43. package/dist/index-9-Ya3fDK.d.ts +169 -0
  44. package/dist/index.cjs +2915 -0
  45. package/dist/index.cjs.map +1 -0
  46. package/dist/index.d.cts +22 -0
  47. package/dist/index.d.ts +22 -0
  48. package/dist/index.js +23 -0
  49. package/dist/index.js.map +1 -0
  50. package/dist/schema/index.cjs +368 -0
  51. package/dist/schema/index.cjs.map +1 -0
  52. package/dist/schema/index.d.cts +4 -0
  53. package/dist/schema/index.d.ts +4 -0
  54. package/dist/schema/index.js +23 -0
  55. package/dist/schema/index.js.map +1 -0
  56. package/dist/secrets/index.cjs +3207 -0
  57. package/dist/secrets/index.cjs.map +1 -0
  58. package/dist/secrets/index.d.cts +227 -0
  59. package/dist/secrets/index.d.ts +227 -0
  60. package/dist/secrets/index.js +323 -0
  61. package/dist/secrets/index.js.map +1 -0
  62. package/dist/supabase/index.cjs +1113 -0
  63. package/dist/supabase/index.cjs.map +1 -0
  64. package/dist/supabase/index.d.cts +144 -0
  65. package/dist/supabase/index.d.ts +144 -0
  66. package/dist/supabase/index.js +864 -0
  67. package/dist/supabase/index.js.map +1 -0
  68. package/dist/types-public-BCj1L4fi.d.cts +1013 -0
  69. package/dist/types-public-BCj1L4fi.d.ts +1013 -0
  70. package/dist/types-public.cjs +40 -0
  71. package/dist/types-public.cjs.map +1 -0
  72. package/dist/types-public.d.cts +4 -0
  73. package/dist/types-public.d.ts +4 -0
  74. package/dist/types-public.js +7 -0
  75. package/dist/types-public.js.map +1 -0
  76. package/package.json +202 -0
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/types-public.ts
21
+ var types_public_exports = {};
22
+ __export(types_public_exports, {
23
+ queryTypes: () => queryTypes
24
+ });
25
+ module.exports = __toCommonJS(types_public_exports);
26
+
27
+ // src/types.ts
28
+ var queryTypes = {
29
+ orderAndRange: "orderAndRange",
30
+ freeTextSearch: "freeTextSearch",
31
+ equality: "equality",
32
+ steVecSelector: "steVecSelector",
33
+ steVecTerm: "steVecTerm",
34
+ searchableJson: "searchableJson"
35
+ };
36
+ // Annotate the CommonJS export names for ESM import in node:
37
+ 0 && (module.exports = {
38
+ queryTypes
39
+ });
40
+ //# sourceMappingURL=types-public.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/types-public.ts","../src/types.ts"],"sourcesContent":["/**\n * Public type re-exports for `@cipherstash/stack/types`.\n *\n * This module exposes only the public types from the internal types module.\n * Internal helpers (`queryTypeToFfi`, `queryTypeToQueryOp`, `FfiIndexTypeName`,\n * `QueryTermBase`) are excluded.\n */\n\n// Core types\nexport type {\n Client,\n EncryptedValue,\n Encrypted,\n EncryptPayload,\n} from '@/types'\n\n// Client configuration\nexport type {\n KeysetIdentifier,\n ClientConfig,\n EncryptionClientConfig,\n} from '@/types'\n\n// Encrypt / decrypt operation options and results\nexport type {\n EncryptOptions,\n EncryptedReturnType,\n SearchTerm,\n EncryptedSearchTerm,\n EncryptedQueryResult,\n} from '@/types'\n\n// Model field types\nexport type {\n EncryptedFields,\n OtherFields,\n DecryptedFields,\n Decrypted,\n} from '@/types'\n\n// Bulk operations\nexport type {\n BulkEncryptPayload,\n BulkEncryptedData,\n BulkDecryptPayload,\n BulkDecryptedData,\n DecryptionResult,\n} from '@/types'\n\n// Query types (public only)\nexport type {\n QueryTypeName,\n EncryptQueryOptions,\n ScalarQueryTerm,\n} from '@/types'\n\n// Logging\nexport type { LoggingConfig } from '@/utils/logger'\n\n// Runtime values\nexport { queryTypes } from '@/types'\n","import type {\n ProtectColumn,\n ProtectTable,\n ProtectTableColumn,\n ProtectValue,\n} from '@/schema'\nimport type { LoggingConfig } from '@/utils/logger'\nimport type {\n Encrypted as CipherStashEncrypted,\n JsPlaintext,\n QueryOpName,\n newClient,\n} from '@cipherstash/protect-ffi'\n\n// ---------------------------------------------------------------------------\n// Branded type utilities\n// ---------------------------------------------------------------------------\n\n/** Brand symbol for nominal typing */\ndeclare const __brand: unique symbol\n\n/** Creates a branded type that is structurally incompatible with the base type */\ntype Brand<T, B extends string> = T & { readonly [__brand]: B }\n\n// ---------------------------------------------------------------------------\n// Core types\n// ---------------------------------------------------------------------------\n\nexport type Client = Awaited<ReturnType<typeof newClient>> | undefined\n\n/** A branded type representing encrypted data. Cannot be accidentally used as plaintext. */\nexport type EncryptedValue = Brand<CipherStashEncrypted, 'encrypted'> | null\n\n/** Structural type representing encrypted data. See also `EncryptedValue` for branded nominal typing. */\nexport type Encrypted = CipherStashEncrypted | null\n\nexport type EncryptPayload = JsPlaintext | null\n\n// ---------------------------------------------------------------------------\n// Client configuration\n// ---------------------------------------------------------------------------\n\nexport type KeysetIdentifier = { name: string } | { id: string }\n\nexport type ClientConfig = {\n /**\n * The CipherStash workspace CRN (Cloud Resource Name).\n * Format: `crn:<region>.aws:<workspace-id>`.\n * Can also be set via the `CS_WORKSPACE_CRN` environment variable.\n * If omitted, the SDK reads from the environment or TOML config files.\n */\n workspaceCrn?: string\n\n /**\n * The API access key used for authenticating with the CipherStash API.\n * Can also be set via the `CS_CLIENT_ACCESS_KEY` environment variable.\n * Obtain this from the CipherStash dashboard after creating a workspace.\n */\n accessKey?: string\n\n /**\n * The client identifier used to authenticate with CipherStash services.\n * Can also be set via the `CS_CLIENT_ID` environment variable.\n * Generated during workspace onboarding in the CipherStash dashboard.\n */\n clientId?: string\n\n /**\n * The client key material used in combination with ZeroKMS for encryption operations.\n * Can also be set via the `CS_CLIENT_KEY` environment variable.\n * Generated during workspace onboarding in the CipherStash dashboard.\n */\n clientKey?: string\n\n /**\n * An optional keyset identifier for multi-tenant encryption.\n * Each keyset provides cryptographic isolation, giving each tenant its own keyspace.\n * Specify by name (`{ name: \"tenant-a\" }`) or UUID (`{ id: \"...\" }`).\n * Keysets are created and managed in the CipherStash dashboard.\n */\n keyset?: KeysetIdentifier\n}\n\ntype AtLeastOneCsTable<T> = [T, ...T[]]\n\nexport type EncryptionClientConfig = {\n schemas: AtLeastOneCsTable<ProtectTable<ProtectTableColumn>>\n config?: ClientConfig\n logging?: LoggingConfig\n}\n\n// ---------------------------------------------------------------------------\n// Encrypt / decrypt operation options and results\n// ---------------------------------------------------------------------------\n\nexport type EncryptOptions = {\n column: ProtectColumn | ProtectValue\n table: ProtectTable<ProtectTableColumn>\n}\n\n/** Format for encrypted query/search term return values */\nexport type EncryptedReturnType =\n | 'eql'\n | 'composite-literal'\n | 'escaped-composite-literal'\n\nexport type SearchTerm = {\n value: JsPlaintext\n column: ProtectColumn\n table: ProtectTable<ProtectTableColumn>\n returnType?: EncryptedReturnType\n}\n\n/** Encrypted search term result: EQL object or composite literal string */\nexport type EncryptedSearchTerm = Encrypted | string\n\n/** Result of encryptQuery (single or batch): EQL, composite literal string, or null */\nexport type EncryptedQueryResult = Encrypted | string | null\n\n// ---------------------------------------------------------------------------\n// Model field types (encrypted vs decrypted views)\n// ---------------------------------------------------------------------------\n\nexport type EncryptedFields<T> = {\n [K in keyof T as T[K] extends Encrypted ? K : never]: T[K]\n}\n\nexport type OtherFields<T> = {\n [K in keyof T as T[K] extends Encrypted ? never : K]: T[K]\n}\n\nexport type DecryptedFields<T> = {\n [K in keyof T as T[K] extends Encrypted ? K : never]: string\n}\n\n/** Model with encrypted fields replaced by plaintext (decrypted) values */\nexport type Decrypted<T> = OtherFields<T> & DecryptedFields<T>\n\n// ---------------------------------------------------------------------------\n// Bulk operations\n// ---------------------------------------------------------------------------\n\nexport type BulkEncryptPayload = Array<{\n id?: string\n plaintext: JsPlaintext | null\n}>\n\nexport type BulkEncryptedData = Array<{ id?: string; data: Encrypted }>\nexport type BulkDecryptPayload = Array<{ id?: string; data: Encrypted }>\nexport type BulkDecryptedData = Array<DecryptionResult<JsPlaintext | null>>\n\ntype DecryptionSuccess<T> = { error?: never; data: T; id?: string }\ntype DecryptionError<T> = { error: T; id?: string; data?: never }\n\n/**\n * Result type for individual items in bulk decrypt operations.\n * Uses `error`/`data` fields (not `failure`/`data`) since bulk operations\n * can have per-item failures.\n */\nexport type DecryptionResult<T> = DecryptionSuccess<T> | DecryptionError<T>\n\n// ---------------------------------------------------------------------------\n// Query types (for searchable encryption / encryptQuery)\n// ---------------------------------------------------------------------------\n\n/**\n * User-facing query type names for encrypting query values.\n *\n * - `'equality'`: Exact match. [Exact Queries](https://cipherstash.com/docs/platform/searchable-encryption/supported-queries/exact)\n * - `'freeTextSearch'`: Text search. [Match Queries](https://cipherstash.com/docs/platform/searchable-encryption/supported-queries/match)\n * - `'orderAndRange'`: Comparison and range. [Range Queries](https://cipherstash.com/docs/platform/searchable-encryption/supported-queries/range)\n * - `'steVecSelector'`: JSONPath selector (e.g. `'$.user.email'`)\n * - `'steVecTerm'`: Containment (e.g. `{ role: 'admin' }`)\n * - `'searchableJson'`: Auto-infers selector or term from plaintext type (recommended)\n */\nexport type QueryTypeName =\n | 'orderAndRange'\n | 'freeTextSearch'\n | 'equality'\n | 'steVecSelector'\n | 'steVecTerm'\n | 'searchableJson'\n\n/** @internal */\nexport type FfiIndexTypeName = 'ore' | 'match' | 'unique' | 'ste_vec'\n\nexport const queryTypes = {\n orderAndRange: 'orderAndRange',\n freeTextSearch: 'freeTextSearch',\n equality: 'equality',\n steVecSelector: 'steVecSelector',\n steVecTerm: 'steVecTerm',\n searchableJson: 'searchableJson',\n} as const satisfies Record<string, QueryTypeName>\n\n/** @internal */\nexport const queryTypeToFfi: Record<QueryTypeName, FfiIndexTypeName> = {\n orderAndRange: 'ore',\n freeTextSearch: 'match',\n equality: 'unique',\n steVecSelector: 'ste_vec',\n steVecTerm: 'ste_vec',\n searchableJson: 'ste_vec',\n}\n\n/** @internal */\nexport const queryTypeToQueryOp: Partial<Record<QueryTypeName, QueryOpName>> = {\n steVecSelector: 'ste_vec_selector',\n steVecTerm: 'ste_vec_term',\n}\n\n/** @internal */\nexport type QueryTermBase = {\n column: ProtectColumn\n table: ProtectTable<ProtectTableColumn>\n queryType?: QueryTypeName\n returnType?: EncryptedReturnType\n}\n\nexport type EncryptQueryOptions = QueryTermBase\n\nexport type ScalarQueryTerm = QueryTermBase & {\n value: JsPlaintext | null\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AC0LO,IAAM,aAAa;AAAA,EACxB,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,UAAU;AAAA,EACV,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,gBAAgB;AAClB;","names":[]}
@@ -0,0 +1,4 @@
1
+ export { l as BulkDecryptPayload, B as BulkDecryptedData, n as BulkEncryptPayload, m as BulkEncryptedData, k as Client, y as ClientConfig, D as Decrypted, H as DecryptedFields, J as DecryptionResult, o as EncryptOptions, x as EncryptPayload, p as EncryptQueryOptions, h as Encrypted, F as EncryptedFields, j as EncryptedQueryResult, q as EncryptedReturnType, A as EncryptedSearchTerm, i as EncryptedValue, E as EncryptionClientConfig, K as KeysetIdentifier, L as LoggingConfig, G as OtherFields, Q as QueryTypeName, S as ScalarQueryTerm, z as SearchTerm, N as queryTypes } from './types-public-BCj1L4fi.cjs';
2
+ import 'zod';
3
+ import 'evlog';
4
+ import '@cipherstash/protect-ffi';
@@ -0,0 +1,4 @@
1
+ export { l as BulkDecryptPayload, B as BulkDecryptedData, n as BulkEncryptPayload, m as BulkEncryptedData, k as Client, y as ClientConfig, D as Decrypted, H as DecryptedFields, J as DecryptionResult, o as EncryptOptions, x as EncryptPayload, p as EncryptQueryOptions, h as Encrypted, F as EncryptedFields, j as EncryptedQueryResult, q as EncryptedReturnType, A as EncryptedSearchTerm, i as EncryptedValue, E as EncryptionClientConfig, K as KeysetIdentifier, L as LoggingConfig, G as OtherFields, Q as QueryTypeName, S as ScalarQueryTerm, z as SearchTerm, N as queryTypes } from './types-public-BCj1L4fi.js';
2
+ import 'zod';
3
+ import 'evlog';
4
+ import '@cipherstash/protect-ffi';
@@ -0,0 +1,7 @@
1
+ import {
2
+ queryTypes
3
+ } from "./chunk-SJ7JO4ME.js";
4
+ export {
5
+ queryTypes
6
+ };
7
+ //# sourceMappingURL=types-public.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
package/package.json ADDED
@@ -0,0 +1,202 @@
1
+ {
2
+ "name": "@cipherstash/stack",
3
+ "version": "0.1.0",
4
+ "description": "CipherStash Stack for TypeScript and JavaScript",
5
+ "keywords": [
6
+ "encrypted",
7
+ "searchable",
8
+ "language",
9
+ "typescript",
10
+ "ts",
11
+ "stack"
12
+ ],
13
+ "bugs": {
14
+ "url": "https://github.com/cipherstash/protectjs/issues"
15
+ },
16
+ "repository": {
17
+ "type": "git",
18
+ "url": "git+https://github.com/cipherstash/protectjs.git",
19
+ "directory": "packages/stack"
20
+ },
21
+ "license": "MIT",
22
+ "author": "CipherStash <hello@cipherstash.com>",
23
+ "files": [
24
+ "dist",
25
+ "README.md",
26
+ "LICENSE",
27
+ "CHANGELOG.md"
28
+ ],
29
+ "type": "module",
30
+ "bin": {
31
+ "stash": "./dist/bin/stash.js"
32
+ },
33
+ "main": "./dist/index.cjs",
34
+ "module": "./dist/index.js",
35
+ "sideEffects": false,
36
+ "types": "./dist/index.d.ts",
37
+ "typesVersions": {
38
+ "*": {
39
+ "client": [
40
+ "./dist/client.d.ts"
41
+ ],
42
+ "identity": [
43
+ "./dist/identity/index.d.ts"
44
+ ],
45
+ "secrets": [
46
+ "./dist/secrets/index.d.ts"
47
+ ],
48
+ "schema": [
49
+ "./dist/schema/index.d.ts"
50
+ ],
51
+ "types": [
52
+ "./dist/types-public.d.ts"
53
+ ],
54
+ "drizzle": [
55
+ "./dist/drizzle/index.d.ts"
56
+ ],
57
+ "dynamodb": [
58
+ "./dist/dynamodb/index.d.ts"
59
+ ],
60
+ "supabase": [
61
+ "./dist/supabase/index.d.ts"
62
+ ]
63
+ }
64
+ },
65
+ "exports": {
66
+ ".": {
67
+ "import": {
68
+ "types": "./dist/index.d.ts",
69
+ "default": "./dist/index.js"
70
+ },
71
+ "require": {
72
+ "types": "./dist/index.d.cts",
73
+ "default": "./dist/index.cjs"
74
+ }
75
+ },
76
+ "./client": {
77
+ "import": {
78
+ "types": "./dist/client.d.ts",
79
+ "default": "./dist/client.js"
80
+ },
81
+ "require": {
82
+ "types": "./dist/client.d.cts",
83
+ "default": "./dist/client.cjs"
84
+ }
85
+ },
86
+ "./identity": {
87
+ "import": {
88
+ "types": "./dist/identity/index.d.ts",
89
+ "default": "./dist/identity/index.js"
90
+ },
91
+ "require": {
92
+ "types": "./dist/identity/index.d.cts",
93
+ "default": "./dist/identity/index.cjs"
94
+ }
95
+ },
96
+ "./secrets": {
97
+ "import": {
98
+ "types": "./dist/secrets/index.d.ts",
99
+ "default": "./dist/secrets/index.js"
100
+ },
101
+ "require": {
102
+ "types": "./dist/secrets/index.d.cts",
103
+ "default": "./dist/secrets/index.cjs"
104
+ }
105
+ },
106
+ "./schema": {
107
+ "import": {
108
+ "types": "./dist/schema/index.d.ts",
109
+ "default": "./dist/schema/index.js"
110
+ },
111
+ "require": {
112
+ "types": "./dist/schema/index.d.cts",
113
+ "default": "./dist/schema/index.cjs"
114
+ }
115
+ },
116
+ "./types": {
117
+ "import": {
118
+ "types": "./dist/types-public.d.ts",
119
+ "default": "./dist/types-public.js"
120
+ },
121
+ "require": {
122
+ "types": "./dist/types-public.d.cts",
123
+ "default": "./dist/types-public.cjs"
124
+ }
125
+ },
126
+ "./drizzle": {
127
+ "import": {
128
+ "types": "./dist/drizzle/index.d.ts",
129
+ "default": "./dist/drizzle/index.js"
130
+ },
131
+ "require": {
132
+ "types": "./dist/drizzle/index.d.cts",
133
+ "default": "./dist/drizzle/index.cjs"
134
+ }
135
+ },
136
+ "./dynamodb": {
137
+ "import": {
138
+ "types": "./dist/dynamodb/index.d.ts",
139
+ "default": "./dist/dynamodb/index.js"
140
+ },
141
+ "require": {
142
+ "types": "./dist/dynamodb/index.d.cts",
143
+ "default": "./dist/dynamodb/index.cjs"
144
+ }
145
+ },
146
+ "./supabase": {
147
+ "import": {
148
+ "types": "./dist/supabase/index.d.ts",
149
+ "default": "./dist/supabase/index.js"
150
+ },
151
+ "require": {
152
+ "types": "./dist/supabase/index.d.cts",
153
+ "default": "./dist/supabase/index.cjs"
154
+ }
155
+ },
156
+ "./package.json": "./package.json"
157
+ },
158
+ "devDependencies": {
159
+ "@clack/prompts": "^0.10.1",
160
+ "@supabase/supabase-js": "^2.47.10",
161
+ "dotenv": "16.4.7",
162
+ "drizzle-orm": ">=0.33",
163
+ "execa": "^9.5.2",
164
+ "json-schema-to-typescript": "^15.0.2",
165
+ "postgres": "^3.4.8",
166
+ "tsup": "8.4.0",
167
+ "tsx": "4.19.3",
168
+ "typescript": "5.6.3",
169
+ "vitest": "3.1.3"
170
+ },
171
+ "publishConfig": {
172
+ "access": "public"
173
+ },
174
+ "dependencies": {
175
+ "@byteslice/result": "^0.2.0",
176
+ "@cipherstash/protect-ffi": "0.20.1",
177
+ "evlog": "^1.9.0",
178
+ "zod": "3.24.2"
179
+ },
180
+ "peerDependencies": {
181
+ "@supabase/supabase-js": ">=2",
182
+ "drizzle-orm": ">=0.33"
183
+ },
184
+ "peerDependenciesMeta": {
185
+ "drizzle-orm": {
186
+ "optional": true
187
+ },
188
+ "@supabase/supabase-js": {
189
+ "optional": true
190
+ }
191
+ },
192
+ "engines": {
193
+ "node": ">=18"
194
+ },
195
+ "scripts": {
196
+ "build": "tsup",
197
+ "postbuild": "chmod +x ./dist/bin/stash.js",
198
+ "dev": "tsup --watch",
199
+ "test": "vitest run",
200
+ "release": "tsup"
201
+ }
202
+ }