@opensaas/stack-core 0.1.0 → 0.1.1
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.
- package/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +9 -0
- package/CLAUDE.md +264 -0
- package/LICENSE +21 -0
- package/dist/access/engine.d.ts +1 -1
- package/dist/access/engine.d.ts.map +1 -1
- package/dist/access/engine.js +22 -5
- package/dist/access/engine.js.map +1 -1
- package/dist/access/index.d.ts +1 -1
- package/dist/access/index.d.ts.map +1 -1
- package/dist/access/index.js.map +1 -1
- package/dist/access/types.d.ts +33 -0
- package/dist/access/types.d.ts.map +1 -1
- package/dist/config/index.d.ts +2 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js.map +1 -1
- package/dist/config/types.d.ts +236 -1
- package/dist/config/types.d.ts.map +1 -1
- package/dist/context/index.d.ts +4 -2
- package/dist/context/index.d.ts.map +1 -1
- package/dist/context/index.js +32 -54
- package/dist/context/index.js.map +1 -1
- package/dist/context/nested-operations.d.ts.map +1 -1
- package/dist/context/nested-operations.js +45 -2
- package/dist/context/nested-operations.js.map +1 -1
- package/dist/fields/index.d.ts +45 -1
- package/dist/fields/index.d.ts.map +1 -1
- package/dist/fields/index.js +81 -0
- package/dist/fields/index.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +2 -1
- package/src/access/engine.ts +34 -2
- package/src/access/index.ts +1 -0
- package/src/access/types.ts +47 -0
- package/src/config/index.ts +9 -0
- package/src/config/types.ts +246 -0
- package/src/context/index.ts +46 -63
- package/src/context/nested-operations.ts +70 -2
- package/src/fields/index.ts +85 -0
- package/src/index.ts +4 -0
- package/tests/nested-access-and-hooks.test.ts +903 -0
- package/tsconfig.tsbuildinfo +1 -1
- package/vitest.config.ts +1 -1
package/.turbo/turbo-build.log
CHANGED
package/CHANGELOG.md
ADDED
package/CLAUDE.md
ADDED
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
# @opensaas/stack-core
|
|
2
|
+
|
|
3
|
+
Core stack providing config system, access control engine, hooks, field types, and generators.
|
|
4
|
+
|
|
5
|
+
## Purpose
|
|
6
|
+
|
|
7
|
+
The foundation of OpenSaas Stack. Defines the config DSL, executes access control, runs hooks, and generates Prisma schema and TypeScript types from config.
|
|
8
|
+
|
|
9
|
+
## Key Files & Exports
|
|
10
|
+
|
|
11
|
+
### Config (`src/config/`)
|
|
12
|
+
|
|
13
|
+
- `types.ts` - Core type definitions (`OpenSaasConfig`, `ListConfig`, `FieldConfig`, etc.)
|
|
14
|
+
- `index.ts` - Builder functions (`config()`, `list()`)
|
|
15
|
+
- `schema.ts` - Zod schemas for validation
|
|
16
|
+
|
|
17
|
+
### Fields (`src/fields/index.ts`)
|
|
18
|
+
|
|
19
|
+
Field builder functions, each returning object with:
|
|
20
|
+
|
|
21
|
+
- `getZodSchema(fieldName, operation)` - Validation schema
|
|
22
|
+
- `getPrismaType(fieldName)` - Prisma type and modifiers
|
|
23
|
+
- `getTypeScriptType()` - TypeScript type and optionality
|
|
24
|
+
|
|
25
|
+
Built-in fields:
|
|
26
|
+
|
|
27
|
+
- `text({ validation, ui, hooks })` - String field
|
|
28
|
+
- `integer({ validation, ui, hooks })` - Number field
|
|
29
|
+
- `checkbox({ defaultValue, ui, hooks })` - Boolean field
|
|
30
|
+
- `timestamp({ defaultValue, ui, hooks })` - DateTime field
|
|
31
|
+
- `password({ validation, ui, hooks })` - Hashed password (excluded from reads)
|
|
32
|
+
- `select({ options, validation, ui, hooks })` - Enum field
|
|
33
|
+
- `relationship({ ref, many, ui })` - Foreign key relationship
|
|
34
|
+
|
|
35
|
+
### Access Control (`src/access/`)
|
|
36
|
+
|
|
37
|
+
- `engine.ts` - Core execution logic (`applyAccessControl()`)
|
|
38
|
+
- `types.ts` - Type definitions (`AccessControl`, `OperationAccessControl`, etc.)
|
|
39
|
+
|
|
40
|
+
Access control functions receive `{ session, context, item, operation }` and return:
|
|
41
|
+
|
|
42
|
+
- `boolean` - Allow/deny
|
|
43
|
+
- `Prisma filter object` - Scope access to matching records
|
|
44
|
+
|
|
45
|
+
### Hooks (`src/hooks/`)
|
|
46
|
+
|
|
47
|
+
- `index.ts` - Hook execution logic
|
|
48
|
+
- Types in `config/types.ts`
|
|
49
|
+
|
|
50
|
+
Hook types:
|
|
51
|
+
|
|
52
|
+
- `resolveInput` - Transform input data
|
|
53
|
+
- `resolveOutput` - Transform output data
|
|
54
|
+
- `validateInput` - Custom validation
|
|
55
|
+
- `beforeOperation` - Side effects before DB operation
|
|
56
|
+
- `afterOperation` - Side effects after DB operation
|
|
57
|
+
|
|
58
|
+
### Context (`src/context/index.ts`)
|
|
59
|
+
|
|
60
|
+
- `createContext(config, prisma, session?)` - Creates context wrapper
|
|
61
|
+
- Returns `{ db, session }` where `db` is Prisma client with access control
|
|
62
|
+
|
|
63
|
+
### Generators (`src/generator/`)
|
|
64
|
+
|
|
65
|
+
- `prisma.ts` - Generates `prisma/schema.prisma` from config
|
|
66
|
+
- `types.ts` - Generates `.opensaas/types.ts` TypeScript definitions
|
|
67
|
+
- `context.ts` - Generates `.opensaas/context.ts` context factory
|
|
68
|
+
|
|
69
|
+
Run via CLI: `pnpm generate`
|
|
70
|
+
|
|
71
|
+
### Utilities (`src/utils.ts`)
|
|
72
|
+
|
|
73
|
+
- `getDbKey(listKey)` - PascalCase → camelCase (e.g., `BlogPost` → `blogPost`)
|
|
74
|
+
- `getUrlKey(listKey)` - PascalCase → kebab-case (e.g., `BlogPost` → `blog-post`)
|
|
75
|
+
- `getListKeyFromUrl(urlKey)` - kebab-case → PascalCase (e.g., `blog-post` → `BlogPost`)
|
|
76
|
+
|
|
77
|
+
## Architecture Patterns
|
|
78
|
+
|
|
79
|
+
### Field Self-Containment
|
|
80
|
+
|
|
81
|
+
Fields are fully self-contained. No switch statements in core:
|
|
82
|
+
|
|
83
|
+
```typescript
|
|
84
|
+
// Field defines its own behavior
|
|
85
|
+
export function text(options) {
|
|
86
|
+
return {
|
|
87
|
+
type: 'text',
|
|
88
|
+
...options,
|
|
89
|
+
getPrismaType: () => ({ type: 'String', modifiers: '?' }),
|
|
90
|
+
getTypeScriptType: () => ({ type: 'string', optional: true }),
|
|
91
|
+
getZodSchema: (fieldName, operation) => z.string().optional(),
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Generator delegates to field
|
|
96
|
+
const prismaType = field.getPrismaType(fieldName)
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### Access Control Execution Flow
|
|
100
|
+
|
|
101
|
+
1. User calls `context.db.post.update({ where, data })`
|
|
102
|
+
2. Context wrapper intercepts call
|
|
103
|
+
3. Check operation-level access → returns boolean or filter
|
|
104
|
+
4. Merge filter with user's `where` clause
|
|
105
|
+
5. Execute Prisma operation
|
|
106
|
+
6. Apply field-level read access (filter readable fields)
|
|
107
|
+
7. Return result or `null`/`[]` on access denial
|
|
108
|
+
|
|
109
|
+
### Hook Execution Order (Write)
|
|
110
|
+
|
|
111
|
+
1. List `resolveInput`
|
|
112
|
+
2. Field `resolveInput` (e.g., hash password)
|
|
113
|
+
3. List `validateInput`
|
|
114
|
+
4. Field validation (isRequired, length, min/max)
|
|
115
|
+
5. Field-level access control (filter writable fields)
|
|
116
|
+
6. Field `beforeOperation`
|
|
117
|
+
7. List `beforeOperation`
|
|
118
|
+
8. **Database operation**
|
|
119
|
+
9. List `afterOperation`
|
|
120
|
+
10. Field `afterOperation`
|
|
121
|
+
|
|
122
|
+
### Hook Execution Order (Read)
|
|
123
|
+
|
|
124
|
+
1. **Database operation**
|
|
125
|
+
2. Field-level access control (filter readable fields)
|
|
126
|
+
3. Field `resolveOutput`
|
|
127
|
+
4. Field `afterOperation`
|
|
128
|
+
|
|
129
|
+
### Context Type Safety
|
|
130
|
+
|
|
131
|
+
Context uses generic typing to preserve Prisma types:
|
|
132
|
+
|
|
133
|
+
```typescript
|
|
134
|
+
const context = createContext<typeof prisma>(config, prisma, session)
|
|
135
|
+
// context.db.post.findMany() is fully typed
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
## Integration Points
|
|
139
|
+
|
|
140
|
+
### With @opensaas/stack-ui
|
|
141
|
+
|
|
142
|
+
- UI reads config to generate admin interface
|
|
143
|
+
- Field `ui` options pass through to components
|
|
144
|
+
- Component registry pattern for field rendering
|
|
145
|
+
|
|
146
|
+
### With @opensaas/stack-auth
|
|
147
|
+
|
|
148
|
+
- Auth merges lists into config
|
|
149
|
+
- Session flows through context to access control
|
|
150
|
+
- Generator creates auth tables in Prisma schema
|
|
151
|
+
|
|
152
|
+
### With @opensaas/stack-mcp
|
|
153
|
+
|
|
154
|
+
- MCP reads config to generate tools
|
|
155
|
+
- Uses context for all operations (access control enforced)
|
|
156
|
+
- Zod schemas from fields validate tool inputs
|
|
157
|
+
|
|
158
|
+
### With Third-Party Field Packages
|
|
159
|
+
|
|
160
|
+
- Packages export field builders implementing `BaseFieldConfig`
|
|
161
|
+
- No changes needed to core - fields are self-contained
|
|
162
|
+
- Example: `@opensaas/stack-tiptap` provides `richText()` field
|
|
163
|
+
|
|
164
|
+
## Common Patterns
|
|
165
|
+
|
|
166
|
+
### Basic Config
|
|
167
|
+
|
|
168
|
+
```typescript
|
|
169
|
+
import { config, list } from '@opensaas/stack-core'
|
|
170
|
+
import { text, integer, relationship } from '@opensaas/stack-core/fields'
|
|
171
|
+
|
|
172
|
+
export default config({
|
|
173
|
+
db: {
|
|
174
|
+
provider: 'sqlite',
|
|
175
|
+
url: process.env.DATABASE_URL || 'file:./dev.db',
|
|
176
|
+
},
|
|
177
|
+
lists: {
|
|
178
|
+
Post: list({
|
|
179
|
+
fields: {
|
|
180
|
+
title: text({ validation: { isRequired: true } }),
|
|
181
|
+
views: integer({ defaultValue: 0 }),
|
|
182
|
+
author: relationship({ ref: 'User.posts' }),
|
|
183
|
+
},
|
|
184
|
+
access: {
|
|
185
|
+
operation: {
|
|
186
|
+
query: () => true,
|
|
187
|
+
create: ({ session }) => !!session,
|
|
188
|
+
update: ({ session, item }) => session?.userId === item.authorId,
|
|
189
|
+
},
|
|
190
|
+
},
|
|
191
|
+
}),
|
|
192
|
+
},
|
|
193
|
+
})
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
### Silent Failures
|
|
197
|
+
|
|
198
|
+
Access-controlled operations return `null` or `[]` instead of throwing:
|
|
199
|
+
|
|
200
|
+
```typescript
|
|
201
|
+
const post = await context.db.post.update({ where: { id }, data })
|
|
202
|
+
if (!post) {
|
|
203
|
+
// Either doesn't exist OR access denied
|
|
204
|
+
return { error: 'Access denied or not found' }
|
|
205
|
+
}
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
### Field-Level Hooks
|
|
209
|
+
|
|
210
|
+
```typescript
|
|
211
|
+
password: password({
|
|
212
|
+
hooks: {
|
|
213
|
+
resolveInput: async ({ value }) => {
|
|
214
|
+
if (value) return await bcrypt.hash(value, 10)
|
|
215
|
+
return value
|
|
216
|
+
},
|
|
217
|
+
resolveOutput: ({ value }) => {
|
|
218
|
+
return new HashedPassword(value) // Wrap for security
|
|
219
|
+
},
|
|
220
|
+
},
|
|
221
|
+
})
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
### Custom Prisma Client Constructor
|
|
225
|
+
|
|
226
|
+
```typescript
|
|
227
|
+
config({
|
|
228
|
+
db: {
|
|
229
|
+
provider: 'postgresql',
|
|
230
|
+
url: process.env.DATABASE_URL,
|
|
231
|
+
prismaClientConstructor: (PrismaClient) => {
|
|
232
|
+
const adapter = new PrismaNeon({ connectionString: process.env.DATABASE_URL })
|
|
233
|
+
return new PrismaClient({ adapter })
|
|
234
|
+
},
|
|
235
|
+
},
|
|
236
|
+
})
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
### Relationship Patterns
|
|
240
|
+
|
|
241
|
+
```typescript
|
|
242
|
+
// One-to-many
|
|
243
|
+
User: list({
|
|
244
|
+
fields: {
|
|
245
|
+
posts: relationship({ ref: 'Post.author', many: true }),
|
|
246
|
+
},
|
|
247
|
+
})
|
|
248
|
+
|
|
249
|
+
// Many-to-one (other side)
|
|
250
|
+
Post: list({
|
|
251
|
+
fields: {
|
|
252
|
+
author: relationship({ ref: 'User.posts' }),
|
|
253
|
+
},
|
|
254
|
+
})
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
## Type Safety
|
|
258
|
+
|
|
259
|
+
All types are strongly typed with TypeScript:
|
|
260
|
+
|
|
261
|
+
- Config is validated via Zod schemas
|
|
262
|
+
- Context provides full Prisma type inference
|
|
263
|
+
- Access control functions are typed with proper generics
|
|
264
|
+
- Avoid `any` and `unknown` in external APIs (internal use only where necessary)
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 OpenSaas Stack Contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/dist/access/engine.d.ts
CHANGED
|
@@ -59,7 +59,7 @@ export declare function buildIncludeWithAccessControl(fieldConfigs: Record<strin
|
|
|
59
59
|
export declare function filterReadableFields<T extends Record<string, unknown>>(item: T, fieldConfigs: Record<string, FieldConfig>, args: {
|
|
60
60
|
session: Session;
|
|
61
61
|
context: AccessContext;
|
|
62
|
-
}, config?: OpenSaasConfig, depth?: number): Promise<Partial<T>>;
|
|
62
|
+
}, config?: OpenSaasConfig, depth?: number, listKey?: string): Promise<Partial<T>>;
|
|
63
63
|
/**
|
|
64
64
|
* Filter fields from input data based on write access (create/update)
|
|
65
65
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/access/engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AACrF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAC7C,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/access/engine.ts"],"names":[],"mappings":"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"}
|
package/dist/access/engine.js
CHANGED
|
@@ -169,7 +169,7 @@ export async function buildIncludeWithAccessControl(fieldConfigs, args, config,
|
|
|
169
169
|
* Filter fields from an object based on read access
|
|
170
170
|
* Recursively applies access control to nested relationships
|
|
171
171
|
*/
|
|
172
|
-
export async function filterReadableFields(item, fieldConfigs, args, config, depth = 0) {
|
|
172
|
+
export async function filterReadableFields(item, fieldConfigs, args, config, depth = 0, listKey) {
|
|
173
173
|
const filtered = {};
|
|
174
174
|
const MAX_DEPTH = 5; // Prevent infinite recursion
|
|
175
175
|
for (const [fieldName, value] of Object.entries(item)) {
|
|
@@ -200,12 +200,14 @@ export async function filterReadableFields(item, fieldConfigs, args, config, dep
|
|
|
200
200
|
const relatedConfig = getRelatedListConfig(fieldConfig.ref, config);
|
|
201
201
|
if (relatedConfig) {
|
|
202
202
|
// For many relationships (arrays) - recursively filter fields in each item
|
|
203
|
+
// The recursive call already handles applying resolveOutput hooks
|
|
203
204
|
if (Array.isArray(value)) {
|
|
204
|
-
filtered[fieldName] = await Promise.all(value.map((relatedItem) => filterReadableFields(relatedItem, relatedConfig.listConfig.fields, args, config, depth + 1)));
|
|
205
|
+
filtered[fieldName] = await Promise.all(value.map((relatedItem) => filterReadableFields(relatedItem, relatedConfig.listConfig.fields, args, config, depth + 1, relatedConfig.listName)));
|
|
205
206
|
}
|
|
206
207
|
// For single relationships (objects) - recursively filter fields
|
|
208
|
+
// The recursive call already handles applying resolveOutput hooks
|
|
207
209
|
else if (typeof value === 'object') {
|
|
208
|
-
filtered[fieldName] = await filterReadableFields(value, relatedConfig.listConfig.fields, args, config, depth + 1);
|
|
210
|
+
filtered[fieldName] = await filterReadableFields(value, relatedConfig.listConfig.fields, args, config, depth + 1, relatedConfig.listName);
|
|
209
211
|
}
|
|
210
212
|
}
|
|
211
213
|
else {
|
|
@@ -214,8 +216,23 @@ export async function filterReadableFields(item, fieldConfigs, args, config, dep
|
|
|
214
216
|
}
|
|
215
217
|
}
|
|
216
218
|
else {
|
|
217
|
-
// Non-relationship field or no config provided
|
|
218
|
-
|
|
219
|
+
// Non-relationship field or no config provided - apply resolveOutput hook if present
|
|
220
|
+
if (fieldConfig?.hooks?.resolveOutput && listKey) {
|
|
221
|
+
// Cast to runtime type for generic execution
|
|
222
|
+
// At runtime, the hook will receive the correct value type for the field
|
|
223
|
+
const hook = fieldConfig.hooks.resolveOutput;
|
|
224
|
+
filtered[fieldName] = hook({
|
|
225
|
+
value,
|
|
226
|
+
operation: 'query',
|
|
227
|
+
fieldName,
|
|
228
|
+
listKey,
|
|
229
|
+
item,
|
|
230
|
+
context: args.context,
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
else {
|
|
234
|
+
filtered[fieldName] = value;
|
|
235
|
+
}
|
|
219
236
|
}
|
|
220
237
|
}
|
|
221
238
|
return filtered;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/access/engine.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/access/engine.ts"],"names":[],"mappings":"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"}
|
package/dist/access/index.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export type { AccessControl, FieldAccess, Session, AccessContext, PrismaFilter, AccessControlledDB, PrismaClientLike, } from './types.js';
|
|
1
|
+
export type { AccessControl, FieldAccess, Session, AccessContext, PrismaFilter, AccessControlledDB, PrismaClientLike, StorageUtils, } from './types.js';
|
|
2
2
|
export { checkAccess, mergeFilters, checkFieldAccess, filterReadableFields, filterWritableFields, isBoolean, isPrismaFilter, getRelatedListConfig, buildIncludeWithAccessControl, } from './engine.js';
|
|
3
3
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/access/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,aAAa,EACb,WAAW,EACX,OAAO,EACP,aAAa,EACb,YAAY,EACZ,kBAAkB,EAClB,gBAAgB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/access/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,aAAa,EACb,WAAW,EACX,OAAO,EACP,aAAa,EACb,YAAY,EACZ,kBAAkB,EAClB,gBAAgB,EAChB,YAAY,GACb,MAAM,YAAY,CAAA;AACnB,OAAO,EACL,WAAW,EACX,YAAY,EACZ,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,EACpB,SAAS,EACT,cAAc,EACd,oBAAoB,EACpB,6BAA6B,GAC9B,MAAM,aAAa,CAAA"}
|
package/dist/access/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/access/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/access/index.ts"],"names":[],"mappings":"AAUA,OAAO,EACL,WAAW,EACX,YAAY,EACZ,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,EACpB,SAAS,EACT,cAAc,EACd,oBAAoB,EACpB,6BAA6B,GAC9B,MAAM,aAAa,CAAA"}
|
package/dist/access/types.d.ts
CHANGED
|
@@ -47,6 +47,38 @@ export type AccessControlledDB<TPrisma extends PrismaClientLike> = {
|
|
|
47
47
|
} & {
|
|
48
48
|
[key: string]: any;
|
|
49
49
|
};
|
|
50
|
+
/**
|
|
51
|
+
* Storage utilities for file/image uploads
|
|
52
|
+
*/
|
|
53
|
+
export type StorageUtils = {
|
|
54
|
+
/**
|
|
55
|
+
* Upload a file to storage
|
|
56
|
+
* @param providerName - Name of storage provider from config
|
|
57
|
+
* @param file - File object
|
|
58
|
+
* @param buffer - File contents as Buffer
|
|
59
|
+
* @param options - Upload options (validation, metadata)
|
|
60
|
+
*/
|
|
61
|
+
uploadFile: (providerName: string, file: File, buffer: Buffer, options?: unknown) => Promise<unknown>;
|
|
62
|
+
/**
|
|
63
|
+
* Upload an image with transformations
|
|
64
|
+
* @param providerName - Name of storage provider from config
|
|
65
|
+
* @param file - File object
|
|
66
|
+
* @param buffer - File contents as Buffer
|
|
67
|
+
* @param options - Upload options (validation, transformations, metadata)
|
|
68
|
+
*/
|
|
69
|
+
uploadImage: (providerName: string, file: File, buffer: Buffer, options?: unknown) => Promise<unknown>;
|
|
70
|
+
/**
|
|
71
|
+
* Delete a file from storage
|
|
72
|
+
* @param providerName - Name of storage provider from config
|
|
73
|
+
* @param filename - Name of file to delete
|
|
74
|
+
*/
|
|
75
|
+
deleteFile: (providerName: string, filename: string) => Promise<void>;
|
|
76
|
+
/**
|
|
77
|
+
* Delete an image and all its transformations
|
|
78
|
+
* @param metadata - Image metadata containing storage provider and filename
|
|
79
|
+
*/
|
|
80
|
+
deleteImage: (metadata: unknown) => Promise<void>;
|
|
81
|
+
};
|
|
50
82
|
/**
|
|
51
83
|
* Context type (simplified for access control)
|
|
52
84
|
*/
|
|
@@ -54,6 +86,7 @@ export type AccessContext<TPrisma extends PrismaClientLike = PrismaClientLike> =
|
|
|
54
86
|
session: Session;
|
|
55
87
|
prisma: TPrisma;
|
|
56
88
|
db: AccessControlledDB<TPrisma>;
|
|
89
|
+
storage: StorageUtils;
|
|
57
90
|
[key: string]: unknown;
|
|
58
91
|
};
|
|
59
92
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/access/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/access/types.ts"],"names":[],"mappings":"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"}
|
package/dist/config/index.d.ts
CHANGED
|
@@ -34,6 +34,7 @@ export declare function list<T = any>(config: {
|
|
|
34
34
|
operation?: OperationAccess<T>;
|
|
35
35
|
};
|
|
36
36
|
hooks?: Hooks<T>;
|
|
37
|
+
mcp?: import('./types.js').ListMcpConfig;
|
|
37
38
|
}): ListConfig<T>;
|
|
38
|
-
export type { OpenSaasConfig, ListConfig, FieldConfig, BaseFieldConfig, TextField, IntegerField, CheckboxField, TimestampField, PasswordField, SelectField, RelationshipField, OperationAccess, Hooks, FieldHooks, FieldsWithItemType, DatabaseConfig, SessionConfig, UIConfig, ThemeConfig, ThemePreset, ThemeColors, } from './types.js';
|
|
39
|
+
export type { OpenSaasConfig, ListConfig, FieldConfig, BaseFieldConfig, TextField, IntegerField, CheckboxField, TimestampField, PasswordField, SelectField, RelationshipField, OperationAccess, Hooks, FieldHooks, FieldsWithItemType, DatabaseConfig, SessionConfig, UIConfig, ThemeConfig, ThemePreset, ThemeColors, McpConfig, McpToolsConfig, McpAuthConfig, ListMcpConfig, McpCustomTool, FileMetadata, ImageMetadata, ImageTransformationResult, } from './types.js';
|
|
39
40
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAEjG;;GAEG;AACH,wBAAgB,MAAM,CAAC,MAAM,EAAE,cAAc,GAAG,cAAc,CAE7D;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,wBAAgB,IAAI,CAAC,CAAC,GAAG,GAAG,EAAE,MAAM,EAAE;IACpC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;IACnC,MAAM,CAAC,EAAE;QACP,SAAS,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC,CAAA;KAC/B,CAAA;IACD,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAEjG;;GAEG;AACH,wBAAgB,MAAM,CAAC,MAAM,EAAE,cAAc,GAAG,cAAc,CAE7D;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,wBAAgB,IAAI,CAAC,CAAC,GAAG,GAAG,EAAE,MAAM,EAAE;IACpC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;IACnC,MAAM,CAAC,EAAE;QACP,SAAS,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC,CAAA;KAC/B,CAAA;IACD,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAA;IAChB,GAAG,CAAC,EAAE,OAAO,YAAY,EAAE,aAAa,CAAA;CACzC,GAAG,UAAU,CAAC,CAAC,CAAC,CAIhB;AAGD,YAAY,EACV,cAAc,EACd,UAAU,EACV,WAAW,EACX,eAAe,EACf,SAAS,EACT,YAAY,EACZ,aAAa,EACb,cAAc,EACd,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,eAAe,EACf,KAAK,EACL,UAAU,EACV,kBAAkB,EAClB,cAAc,EACd,aAAa,EACb,QAAQ,EACR,WAAW,EACX,WAAW,EACX,WAAW,EACX,SAAS,EACT,cAAc,EACd,aAAa,EACb,aAAa,EACb,aAAa,EACb,YAAY,EACZ,aAAa,EACb,yBAAyB,GAC1B,MAAM,YAAY,CAAA"}
|
package/dist/config/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,UAAU,MAAM,CAAC,MAAsB;IAC3C,OAAO,MAAM,CAAA;AACf,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,8DAA8D;AAC9D,MAAM,UAAU,IAAI,CAAU,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,UAAU,MAAM,CAAC,MAAsB;IAC3C,OAAO,MAAM,CAAA;AACf,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,8DAA8D;AAC9D,MAAM,UAAU,IAAI,CAAU,MAO7B;IACC,0CAA0C;IAC1C,kEAAkE;IAClE,OAAO,MAAuB,CAAA;AAChC,CAAC"}
|