@edgebasejs/adapter-d1 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 (109) hide show
  1. package/dist/adapter-d1/src/d1-adapter.d.ts +29 -0
  2. package/dist/adapter-d1/src/d1-adapter.d.ts.map +1 -0
  3. package/dist/adapter-d1/src/d1-adapter.js +36 -0
  4. package/dist/adapter-d1/src/d1-adapter.js.map +1 -0
  5. package/dist/adapter-d1/src/index.d.ts +3 -0
  6. package/dist/adapter-d1/src/index.d.ts.map +1 -0
  7. package/dist/adapter-d1/src/index.js +3 -0
  8. package/dist/adapter-d1/src/index.js.map +1 -0
  9. package/dist/adapter-d1/src/schema-to-sql.d.ts +18 -0
  10. package/dist/adapter-d1/src/schema-to-sql.d.ts.map +1 -0
  11. package/dist/adapter-d1/src/schema-to-sql.js +304 -0
  12. package/dist/adapter-d1/src/schema-to-sql.js.map +1 -0
  13. package/dist/core/src/access-rules/column-security.d.ts +80 -0
  14. package/dist/core/src/access-rules/column-security.d.ts.map +1 -0
  15. package/dist/core/src/access-rules/column-security.js +191 -0
  16. package/dist/core/src/access-rules/column-security.js.map +1 -0
  17. package/dist/core/src/access-rules/engine.d.ts +26 -0
  18. package/dist/core/src/access-rules/engine.d.ts.map +1 -0
  19. package/dist/core/src/access-rules/engine.js +76 -0
  20. package/dist/core/src/access-rules/engine.js.map +1 -0
  21. package/dist/core/src/access-rules/index.d.ts +3 -0
  22. package/dist/core/src/access-rules/index.d.ts.map +1 -0
  23. package/dist/core/src/access-rules/index.js +3 -0
  24. package/dist/core/src/access-rules/index.js.map +1 -0
  25. package/dist/core/src/audit/audit-manager.d.ts +108 -0
  26. package/dist/core/src/audit/audit-manager.d.ts.map +1 -0
  27. package/dist/core/src/audit/audit-manager.js +265 -0
  28. package/dist/core/src/audit/audit-manager.js.map +1 -0
  29. package/dist/core/src/auth/auth-service.d.ts +71 -0
  30. package/dist/core/src/auth/auth-service.d.ts.map +1 -0
  31. package/dist/core/src/auth/auth-service.js +177 -0
  32. package/dist/core/src/auth/auth-service.js.map +1 -0
  33. package/dist/core/src/auth/index.d.ts +4 -0
  34. package/dist/core/src/auth/index.d.ts.map +1 -0
  35. package/dist/core/src/auth/index.js +4 -0
  36. package/dist/core/src/auth/index.js.map +1 -0
  37. package/dist/core/src/encryption/encryption-manager.d.ts +97 -0
  38. package/dist/core/src/encryption/encryption-manager.d.ts.map +1 -0
  39. package/dist/core/src/encryption/encryption-manager.js +224 -0
  40. package/dist/core/src/encryption/encryption-manager.js.map +1 -0
  41. package/dist/core/src/index.d.ts +16 -0
  42. package/dist/core/src/index.d.ts.map +1 -0
  43. package/dist/core/src/index.js +16 -0
  44. package/dist/core/src/index.js.map +1 -0
  45. package/dist/core/src/realtime/change-notifier.d.ts +50 -0
  46. package/dist/core/src/realtime/change-notifier.d.ts.map +1 -0
  47. package/dist/core/src/realtime/change-notifier.js +145 -0
  48. package/dist/core/src/realtime/change-notifier.js.map +1 -0
  49. package/dist/core/src/realtime/message-types.d.ts +39 -0
  50. package/dist/core/src/realtime/message-types.d.ts.map +1 -0
  51. package/dist/core/src/realtime/message-types.js +5 -0
  52. package/dist/core/src/realtime/message-types.js.map +1 -0
  53. package/dist/core/src/realtime/subscription-manager.d.ts +67 -0
  54. package/dist/core/src/realtime/subscription-manager.d.ts.map +1 -0
  55. package/dist/core/src/realtime/subscription-manager.js +229 -0
  56. package/dist/core/src/realtime/subscription-manager.js.map +1 -0
  57. package/dist/core/src/search/search-manager.d.ts +93 -0
  58. package/dist/core/src/search/search-manager.d.ts.map +1 -0
  59. package/dist/core/src/search/search-manager.js +258 -0
  60. package/dist/core/src/search/search-manager.js.map +1 -0
  61. package/dist/core/src/storage/file-manager.d.ts +138 -0
  62. package/dist/core/src/storage/file-manager.d.ts.map +1 -0
  63. package/dist/core/src/storage/file-manager.js +224 -0
  64. package/dist/core/src/storage/file-manager.js.map +1 -0
  65. package/dist/core/src/sync/batch-processor.d.ts +97 -0
  66. package/dist/core/src/sync/batch-processor.d.ts.map +1 -0
  67. package/dist/core/src/sync/batch-processor.js +313 -0
  68. package/dist/core/src/sync/batch-processor.js.map +1 -0
  69. package/dist/core/src/sync/csv-processor.d.ts +66 -0
  70. package/dist/core/src/sync/csv-processor.d.ts.map +1 -0
  71. package/dist/core/src/sync/csv-processor.js +223 -0
  72. package/dist/core/src/sync/csv-processor.js.map +1 -0
  73. package/dist/core/src/sync/index.d.ts +3 -0
  74. package/dist/core/src/sync/index.d.ts.map +1 -0
  75. package/dist/core/src/sync/index.js +3 -0
  76. package/dist/core/src/sync/index.js.map +1 -0
  77. package/dist/core/src/sync/sync-engine.d.ts +68 -0
  78. package/dist/core/src/sync/sync-engine.d.ts.map +1 -0
  79. package/dist/core/src/sync/sync-engine.js +317 -0
  80. package/dist/core/src/sync/sync-engine.js.map +1 -0
  81. package/dist/core/src/sync/transaction-manager.d.ts +83 -0
  82. package/dist/core/src/sync/transaction-manager.d.ts.map +1 -0
  83. package/dist/core/src/sync/transaction-manager.js +227 -0
  84. package/dist/core/src/sync/transaction-manager.js.map +1 -0
  85. package/dist/core/src/webhooks/webhook-manager.d.ts +137 -0
  86. package/dist/core/src/webhooks/webhook-manager.d.ts.map +1 -0
  87. package/dist/core/src/webhooks/webhook-manager.js +334 -0
  88. package/dist/core/src/webhooks/webhook-manager.js.map +1 -0
  89. package/dist/shared-types/src/admin.d.ts +101 -0
  90. package/dist/shared-types/src/admin.d.ts.map +1 -0
  91. package/dist/shared-types/src/admin.js +3 -0
  92. package/dist/shared-types/src/admin.js.map +1 -0
  93. package/dist/shared-types/src/auth.d.ts +27 -0
  94. package/dist/shared-types/src/auth.d.ts.map +1 -0
  95. package/dist/shared-types/src/auth.js +2 -0
  96. package/dist/shared-types/src/auth.js.map +1 -0
  97. package/dist/shared-types/src/index.d.ts +5 -0
  98. package/dist/shared-types/src/index.d.ts.map +1 -0
  99. package/dist/shared-types/src/index.js +5 -0
  100. package/dist/shared-types/src/index.js.map +1 -0
  101. package/dist/shared-types/src/schema.d.ts +34 -0
  102. package/dist/shared-types/src/schema.d.ts.map +1 -0
  103. package/dist/shared-types/src/schema.js +2 -0
  104. package/dist/shared-types/src/schema.js.map +1 -0
  105. package/dist/shared-types/src/sync.d.ts +37 -0
  106. package/dist/shared-types/src/sync.d.ts.map +1 -0
  107. package/dist/shared-types/src/sync.js +2 -0
  108. package/dist/shared-types/src/sync.js.map +1 -0
  109. package/package.json +25 -0
@@ -0,0 +1,29 @@
1
+ import type { SyncDatabase } from '@edgebasejs/core';
2
+ /**
3
+ * D1 database adapter that implements the SyncDatabase interface
4
+ * for use with Cloudflare Workers D1 database
5
+ */
6
+ export declare class D1SyncDatabase implements SyncDatabase {
7
+ private db;
8
+ constructor(db: D1Database);
9
+ /**
10
+ * Get a single row from the database
11
+ */
12
+ getOne(sql: string, params: any[]): Promise<any>;
13
+ /**
14
+ * Get all matching rows from the database
15
+ */
16
+ getAll(sql: string, params: any[]): Promise<any[]>;
17
+ /**
18
+ * Execute a SQL statement that doesn't return rows
19
+ */
20
+ run(sql: string, params: any[]): Promise<any>;
21
+ /**
22
+ * Execute multiple SQL statements in a batch transaction
23
+ */
24
+ batch(statements: Array<{
25
+ sql: string;
26
+ params?: any[];
27
+ }>): Promise<any[]>;
28
+ }
29
+ //# sourceMappingURL=d1-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"d1-adapter.d.ts","sourceRoot":"","sources":["../../../src/d1-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAErD;;;GAGG;AACH,qBAAa,cAAe,YAAW,YAAY;IACrC,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,UAAU;IAElC;;OAEG;IACG,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC;IAItD;;OAEG;IACG,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAKxD;;OAEG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC;IAInD;;OAEG;IACG,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAA;KAAE,CAAC,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;CAMhF"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * D1 database adapter that implements the SyncDatabase interface
3
+ * for use with Cloudflare Workers D1 database
4
+ */
5
+ export class D1SyncDatabase {
6
+ constructor(db) {
7
+ this.db = db;
8
+ }
9
+ /**
10
+ * Get a single row from the database
11
+ */
12
+ async getOne(sql, params) {
13
+ return this.db.prepare(sql).bind(...params).first();
14
+ }
15
+ /**
16
+ * Get all matching rows from the database
17
+ */
18
+ async getAll(sql, params) {
19
+ const result = await this.db.prepare(sql).bind(...params).all();
20
+ return result.results || [];
21
+ }
22
+ /**
23
+ * Execute a SQL statement that doesn't return rows
24
+ */
25
+ async run(sql, params) {
26
+ return this.db.prepare(sql).bind(...params).run();
27
+ }
28
+ /**
29
+ * Execute multiple SQL statements in a batch transaction
30
+ */
31
+ async batch(statements) {
32
+ const prepared = statements.map(stmt => this.db.prepare(stmt.sql).bind(...(stmt.params || [])));
33
+ return this.db.batch(prepared);
34
+ }
35
+ }
36
+ //# sourceMappingURL=d1-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"d1-adapter.js","sourceRoot":"","sources":["../../../src/d1-adapter.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,OAAO,cAAc;IACzB,YAAoB,EAAc;QAAd,OAAE,GAAF,EAAE,CAAY;IAAG,CAAC;IAEtC;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,GAAW,EAAE,MAAa;QACrC,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC;IACtD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,GAAW,EAAE,MAAa;QACrC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC;QAChE,OAAO,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,MAAa;QAClC,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC;IACpD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK,CAAC,UAAkD;QAC5D,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CACrC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CACvD,CAAC;QACF,OAAO,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACjC,CAAC;CACF"}
@@ -0,0 +1,3 @@
1
+ export { D1SyncDatabase } from './d1-adapter';
2
+ export { generateSystemTables, generateEntityTable, generateEntityIndexes, initializeDatabase } from './schema-to-sql';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,kBAAkB,EACnB,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { D1SyncDatabase } from './d1-adapter';
2
+ export { generateSystemTables, generateEntityTable, generateEntityIndexes, initializeDatabase } from './schema-to-sql';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,kBAAkB,EACnB,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { DatabaseSchema, EntitySchema } from '@edgebasejs/types';
2
+ /**
3
+ * Generate SQL for system tables (users, refresh_tokens, sync_metadata, subscriptions, subscription_filters)
4
+ */
5
+ export declare function generateSystemTables(): string[];
6
+ /**
7
+ * Generate CREATE TABLE SQL for an entity
8
+ */
9
+ export declare function generateEntityTable(entityName: string, entitySchema: EntitySchema): string;
10
+ /**
11
+ * Generate CREATE INDEX statements for an entity
12
+ */
13
+ export declare function generateEntityIndexes(entityName: string, entitySchema: EntitySchema): string[];
14
+ /**
15
+ * Initialize database with system tables and entity tables
16
+ */
17
+ export declare function initializeDatabase(db: D1Database, schema: DatabaseSchema): Promise<void>;
18
+ //# sourceMappingURL=schema-to-sql.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-to-sql.d.ts","sourceRoot":"","sources":["../../../src/schema-to-sql.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAa,MAAM,mBAAmB,CAAC;AAEjF;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,EAAE,CA8M/C;AA0BD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,GAAG,MAAM,CA4C1F;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,GAAG,MAAM,EAAE,CAW9F;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,EAAE,EAAE,UAAU,EACd,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,IAAI,CAAC,CAgBf"}
@@ -0,0 +1,304 @@
1
+ /**
2
+ * Generate SQL for system tables (users, refresh_tokens, sync_metadata, subscriptions, subscription_filters)
3
+ */
4
+ export function generateSystemTables() {
5
+ return [
6
+ `CREATE TABLE IF NOT EXISTS admins (
7
+ id TEXT PRIMARY KEY,
8
+ email TEXT NOT NULL UNIQUE,
9
+ password_hash TEXT NOT NULL,
10
+ role TEXT NOT NULL,
11
+ is_active INTEGER NOT NULL DEFAULT 1,
12
+ created_at INTEGER NOT NULL,
13
+ updated_at INTEGER NOT NULL
14
+ )`,
15
+ `CREATE TABLE IF NOT EXISTS admin_refresh_tokens (
16
+ id TEXT PRIMARY KEY,
17
+ admin_id TEXT NOT NULL,
18
+ token TEXT NOT NULL UNIQUE,
19
+ expires_at INTEGER NOT NULL,
20
+ created_at INTEGER NOT NULL,
21
+ FOREIGN KEY (admin_id) REFERENCES admins(id) ON DELETE CASCADE
22
+ )`,
23
+ `CREATE TABLE IF NOT EXISTS users (
24
+ id TEXT PRIMARY KEY,
25
+ email TEXT NOT NULL UNIQUE,
26
+ password_hash TEXT NOT NULL,
27
+ created_at INTEGER NOT NULL,
28
+ updated_at INTEGER NOT NULL
29
+ )`,
30
+ `CREATE TABLE IF NOT EXISTS refresh_tokens (
31
+ id TEXT PRIMARY KEY,
32
+ user_id TEXT NOT NULL,
33
+ token TEXT NOT NULL UNIQUE,
34
+ expires_at INTEGER NOT NULL,
35
+ created_at INTEGER NOT NULL,
36
+ FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
37
+ )`,
38
+ `CREATE TABLE IF NOT EXISTS sync_metadata (
39
+ entity TEXT NOT NULL,
40
+ record_id TEXT NOT NULL,
41
+ version INTEGER NOT NULL,
42
+ updated_at INTEGER NOT NULL,
43
+ deleted_at INTEGER,
44
+ PRIMARY KEY (entity, record_id)
45
+ )`,
46
+ `CREATE TABLE IF NOT EXISTS subscriptions (
47
+ id TEXT PRIMARY KEY,
48
+ user_id TEXT NOT NULL,
49
+ entity TEXT NOT NULL,
50
+ connection_id TEXT NOT NULL,
51
+ created_at INTEGER NOT NULL,
52
+ last_heartbeat INTEGER NOT NULL,
53
+ FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
54
+ )`,
55
+ `CREATE TABLE IF NOT EXISTS subscription_filters (
56
+ id TEXT PRIMARY KEY,
57
+ subscription_id TEXT NOT NULL,
58
+ filter_key TEXT NOT NULL,
59
+ filter_value TEXT NOT NULL,
60
+ created_at INTEGER NOT NULL,
61
+ FOREIGN KEY (subscription_id) REFERENCES subscriptions(id) ON DELETE CASCADE
62
+ )`,
63
+ `CREATE TABLE IF NOT EXISTS transactions (
64
+ id TEXT PRIMARY KEY,
65
+ user_id TEXT NOT NULL,
66
+ status TEXT NOT NULL,
67
+ isolation_level TEXT NOT NULL,
68
+ created_at INTEGER NOT NULL,
69
+ expires_at INTEGER NOT NULL,
70
+ completed_at INTEGER,
71
+ FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
72
+ )`,
73
+ `CREATE TABLE IF NOT EXISTS transaction_changes (
74
+ id TEXT PRIMARY KEY,
75
+ transaction_id TEXT NOT NULL,
76
+ entity TEXT NOT NULL,
77
+ record_id TEXT NOT NULL,
78
+ operation TEXT NOT NULL,
79
+ data TEXT NOT NULL,
80
+ version INTEGER,
81
+ created_at INTEGER NOT NULL,
82
+ FOREIGN KEY (transaction_id) REFERENCES transactions(id) ON DELETE CASCADE
83
+ )`,
84
+ `CREATE TABLE IF NOT EXISTS column_permissions (
85
+ id TEXT PRIMARY KEY,
86
+ entity TEXT NOT NULL,
87
+ column_name TEXT NOT NULL,
88
+ role TEXT,
89
+ visible INTEGER DEFAULT 1,
90
+ readable INTEGER DEFAULT 1,
91
+ writable INTEGER DEFAULT 1,
92
+ encrypted INTEGER DEFAULT 0,
93
+ mask_value TEXT,
94
+ created_at INTEGER NOT NULL,
95
+ updated_at INTEGER NOT NULL,
96
+ UNIQUE(entity, column_name, role)
97
+ )`,
98
+ `CREATE TABLE IF NOT EXISTS files (
99
+ id TEXT PRIMARY KEY,
100
+ key TEXT NOT NULL UNIQUE,
101
+ file_name TEXT NOT NULL,
102
+ mime_type TEXT NOT NULL,
103
+ size INTEGER NOT NULL,
104
+ user_id TEXT NOT NULL,
105
+ bucket TEXT NOT NULL,
106
+ entity_type TEXT,
107
+ entity_id TEXT,
108
+ is_public INTEGER DEFAULT 0,
109
+ uploaded_at INTEGER NOT NULL,
110
+ expires_at INTEGER,
111
+ checksum TEXT,
112
+ FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
113
+ )`,
114
+ `CREATE TABLE IF NOT EXISTS file_access_tokens (
115
+ token TEXT PRIMARY KEY,
116
+ file_id TEXT NOT NULL,
117
+ user_id TEXT NOT NULL,
118
+ expires_at INTEGER NOT NULL,
119
+ created_at INTEGER NOT NULL,
120
+ FOREIGN KEY (file_id) REFERENCES files(id) ON DELETE CASCADE,
121
+ FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
122
+ )`,
123
+ `CREATE TABLE IF NOT EXISTS webhooks (
124
+ id TEXT PRIMARY KEY,
125
+ user_id TEXT NOT NULL,
126
+ url TEXT NOT NULL,
127
+ events TEXT NOT NULL,
128
+ secret TEXT NOT NULL,
129
+ is_active INTEGER DEFAULT 1,
130
+ description TEXT,
131
+ headers TEXT,
132
+ created_at INTEGER NOT NULL,
133
+ updated_at INTEGER NOT NULL,
134
+ FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
135
+ )`,
136
+ `CREATE TABLE IF NOT EXISTS webhook_events (
137
+ id TEXT PRIMARY KEY,
138
+ webhook_id TEXT NOT NULL,
139
+ event_type TEXT NOT NULL,
140
+ payload TEXT NOT NULL,
141
+ signature TEXT NOT NULL,
142
+ attempts INTEGER DEFAULT 0,
143
+ max_attempts INTEGER DEFAULT 5,
144
+ next_retry_at INTEGER,
145
+ delivered_at INTEGER,
146
+ failed_at INTEGER,
147
+ error TEXT,
148
+ created_at INTEGER NOT NULL,
149
+ FOREIGN KEY (webhook_id) REFERENCES webhooks(id) ON DELETE CASCADE
150
+ )`,
151
+ `CREATE TABLE IF NOT EXISTS webhook_deliveries (
152
+ id TEXT PRIMARY KEY,
153
+ webhook_id TEXT NOT NULL,
154
+ event_id TEXT NOT NULL,
155
+ url TEXT NOT NULL,
156
+ event_type TEXT NOT NULL,
157
+ status_code INTEGER,
158
+ response_body TEXT,
159
+ error TEXT,
160
+ duration INTEGER NOT NULL,
161
+ created_at INTEGER NOT NULL,
162
+ FOREIGN KEY (webhook_id) REFERENCES webhooks(id) ON DELETE CASCADE,
163
+ FOREIGN KEY (event_id) REFERENCES webhook_events(id) ON DELETE CASCADE
164
+ )`,
165
+ `CREATE TABLE IF NOT EXISTS audit_logs (
166
+ id TEXT PRIMARY KEY,
167
+ user_id TEXT NOT NULL,
168
+ entity TEXT NOT NULL,
169
+ record_id TEXT NOT NULL,
170
+ operation TEXT NOT NULL,
171
+ before_data TEXT,
172
+ after_data TEXT,
173
+ changes TEXT,
174
+ metadata TEXT,
175
+ created_at INTEGER NOT NULL,
176
+ FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
177
+ )`,
178
+ `CREATE INDEX IF NOT EXISTS idx_sync_metadata_updated ON sync_metadata(entity, updated_at)`,
179
+ `CREATE INDEX IF NOT EXISTS idx_admin_refresh_tokens_admin ON admin_refresh_tokens(admin_id)`,
180
+ `CREATE INDEX IF NOT EXISTS idx_admin_refresh_tokens_token ON admin_refresh_tokens(token)`,
181
+ `CREATE INDEX IF NOT EXISTS idx_refresh_tokens_user ON refresh_tokens(user_id)`,
182
+ `CREATE INDEX IF NOT EXISTS idx_refresh_tokens_token ON refresh_tokens(token)`,
183
+ `CREATE INDEX IF NOT EXISTS idx_subscriptions_user ON subscriptions(user_id)`,
184
+ `CREATE INDEX IF NOT EXISTS idx_subscriptions_entity ON subscriptions(entity)`,
185
+ `CREATE INDEX IF NOT EXISTS idx_subscriptions_connection ON subscriptions(connection_id)`,
186
+ `CREATE INDEX IF NOT EXISTS idx_subscription_filters_subscription ON subscription_filters(subscription_id)`,
187
+ `CREATE INDEX IF NOT EXISTS idx_transactions_user ON transactions(user_id)`,
188
+ `CREATE INDEX IF NOT EXISTS idx_transactions_status ON transactions(status)`,
189
+ `CREATE INDEX IF NOT EXISTS idx_transaction_changes_transaction ON transaction_changes(transaction_id)`,
190
+ `CREATE INDEX IF NOT EXISTS idx_transaction_changes_entity ON transaction_changes(entity, record_id)`,
191
+ `CREATE INDEX IF NOT EXISTS idx_column_permissions_entity ON column_permissions(entity)`,
192
+ `CREATE INDEX IF NOT EXISTS idx_column_permissions_entity_column ON column_permissions(entity, column_name)`,
193
+ `CREATE INDEX IF NOT EXISTS idx_files_user ON files(user_id)`,
194
+ `CREATE INDEX IF NOT EXISTS idx_files_entity ON files(entity_type, entity_id)`,
195
+ `CREATE INDEX IF NOT EXISTS idx_files_expires ON files(expires_at)`,
196
+ `CREATE INDEX IF NOT EXISTS idx_file_access_tokens_file ON file_access_tokens(file_id)`,
197
+ `CREATE INDEX IF NOT EXISTS idx_file_access_tokens_expires ON file_access_tokens(expires_at)`,
198
+ `CREATE INDEX IF NOT EXISTS idx_webhooks_user ON webhooks(user_id)`,
199
+ `CREATE INDEX IF NOT EXISTS idx_webhooks_active ON webhooks(is_active)`,
200
+ `CREATE INDEX IF NOT EXISTS idx_webhook_events_webhook ON webhook_events(webhook_id)`,
201
+ `CREATE INDEX IF NOT EXISTS idx_webhook_events_status ON webhook_events(delivered_at, failed_at, next_retry_at)`,
202
+ `CREATE INDEX IF NOT EXISTS idx_webhook_deliveries_webhook ON webhook_deliveries(webhook_id)`,
203
+ `CREATE INDEX IF NOT EXISTS idx_webhook_deliveries_event ON webhook_deliveries(event_id)`,
204
+ `CREATE INDEX IF NOT EXISTS idx_audit_logs_user ON audit_logs(user_id)`,
205
+ `CREATE INDEX IF NOT EXISTS idx_audit_logs_entity ON audit_logs(entity)`,
206
+ `CREATE INDEX IF NOT EXISTS idx_audit_logs_record ON audit_logs(entity, record_id)`,
207
+ `CREATE INDEX IF NOT EXISTS idx_audit_logs_created ON audit_logs(created_at)`,
208
+ `CREATE INDEX IF NOT EXISTS idx_audit_logs_operation ON audit_logs(operation)`
209
+ ];
210
+ }
211
+ /**
212
+ * Map EdgeBase field types to SQLite types
213
+ */
214
+ function mapFieldTypeToSQL(fieldType) {
215
+ switch (fieldType.type) {
216
+ case 'string':
217
+ case 'text':
218
+ return 'TEXT';
219
+ case 'integer':
220
+ case 'timestamp':
221
+ return 'INTEGER';
222
+ case 'number':
223
+ return 'REAL';
224
+ case 'boolean':
225
+ return 'INTEGER'; // SQLite uses 0/1 for boolean
226
+ case 'json':
227
+ return 'TEXT'; // Store JSON as text
228
+ case 'reference':
229
+ return 'TEXT'; // Store references as text IDs
230
+ default:
231
+ return 'TEXT';
232
+ }
233
+ }
234
+ /**
235
+ * Generate CREATE TABLE SQL for an entity
236
+ */
237
+ export function generateEntityTable(entityName, entitySchema) {
238
+ const columns = [];
239
+ const constraints = [];
240
+ // Add fields from schema
241
+ for (const [fieldName, fieldType] of Object.entries(entitySchema.fields)) {
242
+ const sqlType = mapFieldTypeToSQL(fieldType);
243
+ const parts = [fieldName, sqlType];
244
+ // Primary key
245
+ if (fieldType.primary) {
246
+ parts.push('PRIMARY KEY');
247
+ }
248
+ // Required fields
249
+ if (fieldType.required && !fieldType.primary) {
250
+ parts.push('NOT NULL');
251
+ }
252
+ // Default values
253
+ if (fieldType.default !== undefined) {
254
+ if (typeof fieldType.default === 'string') {
255
+ parts.push(`DEFAULT '${fieldType.default}'`);
256
+ }
257
+ else {
258
+ parts.push(`DEFAULT ${fieldType.default}`);
259
+ }
260
+ }
261
+ columns.push(parts.join(' '));
262
+ // Foreign key constraints
263
+ if (fieldType.type === 'reference' && fieldType.reference) {
264
+ constraints.push(`FOREIGN KEY (${fieldName}) REFERENCES ${fieldType.reference}(id) ON DELETE CASCADE`);
265
+ }
266
+ }
267
+ // Combine columns and constraints
268
+ const allColumns = [...columns, ...constraints].join(',\n ');
269
+ return `CREATE TABLE IF NOT EXISTS ${entityName} (
270
+ ${allColumns}
271
+ )`;
272
+ }
273
+ /**
274
+ * Generate CREATE INDEX statements for an entity
275
+ */
276
+ export function generateEntityIndexes(entityName, entitySchema) {
277
+ if (!entitySchema.indexes || entitySchema.indexes.length === 0) {
278
+ return [];
279
+ }
280
+ return entitySchema.indexes.map((index, i) => {
281
+ const indexName = `idx_${entityName}_${index.fields.join('_')}`;
282
+ const unique = index.unique ? 'UNIQUE ' : '';
283
+ const fields = index.fields.join(', ');
284
+ return `CREATE ${unique}INDEX IF NOT EXISTS ${indexName} ON ${entityName}(${fields})`;
285
+ });
286
+ }
287
+ /**
288
+ * Initialize database with system tables and entity tables
289
+ */
290
+ export async function initializeDatabase(db, schema) {
291
+ const statements = [];
292
+ // Add system tables
293
+ statements.push(...generateSystemTables());
294
+ // Add entity tables
295
+ for (const [entityName, entitySchema] of Object.entries(schema.entities)) {
296
+ statements.push(generateEntityTable(entityName, entitySchema));
297
+ statements.push(...generateEntityIndexes(entityName, entitySchema));
298
+ }
299
+ // Execute all statements
300
+ for (const sql of statements) {
301
+ await db.prepare(sql).run();
302
+ }
303
+ }
304
+ //# sourceMappingURL=schema-to-sql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-to-sql.js","sourceRoot":"","sources":["../../../src/schema-to-sql.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Column-level security for field access control
3
+ * Supports role-based visibility and selective field encryption
4
+ */
5
+ import type { User } from '@edgebasejs/types';
6
+ export interface ColumnRule {
7
+ column: string;
8
+ visible?: boolean | ((context: ColumnAccessContext) => boolean | Promise<boolean>);
9
+ readable?: boolean | ((context: ColumnAccessContext) => boolean | Promise<boolean>);
10
+ writable?: boolean | ((context: ColumnAccessContext) => boolean | Promise<boolean>);
11
+ roles?: string[];
12
+ encrypted?: boolean;
13
+ maskValue?: any;
14
+ }
15
+ export interface ColumnAccessContext {
16
+ user: User;
17
+ operation: 'read' | 'write' | 'create' | 'update';
18
+ record?: Record<string, any>;
19
+ column: string;
20
+ value?: any;
21
+ }
22
+ export interface ColumnSecurityRules {
23
+ entity: string;
24
+ columns: Map<string, ColumnRule>;
25
+ defaultVisible?: boolean;
26
+ defaultReadable?: boolean;
27
+ defaultWritable?: boolean;
28
+ }
29
+ /**
30
+ * Column-level security manager
31
+ */
32
+ export declare class ColumnSecurityManager {
33
+ private rules;
34
+ /**
35
+ * Register column security rules for an entity
36
+ */
37
+ registerRules(entityName: string, rules: ColumnSecurityRules): void;
38
+ /**
39
+ * Get rules for an entity
40
+ */
41
+ getRules(entityName: string): ColumnSecurityRules | undefined;
42
+ /**
43
+ * Check if a user can read a specific column
44
+ */
45
+ canReadColumn(entityName: string, columnName: string, user: User, record?: Record<string, any>): Promise<boolean>;
46
+ /**
47
+ * Check if a user can write to a specific column
48
+ */
49
+ canWriteColumn(entityName: string, columnName: string, user: User, value?: any, record?: Record<string, any>): Promise<boolean>;
50
+ /**
51
+ * Filter record columns based on read permissions
52
+ * Returns a new record with only accessible columns
53
+ */
54
+ filterReadableColumns(entityName: string, record: Record<string, any>, user: User): Promise<Record<string, any>>;
55
+ /**
56
+ * Filter write data based on write permissions
57
+ * Returns a new object with only writable columns
58
+ */
59
+ filterWritableColumns(entityName: string, data: Record<string, any>, user: User, existingRecord?: Record<string, any>): Promise<{
60
+ filtered: Record<string, any>;
61
+ rejected: string[];
62
+ }>;
63
+ /**
64
+ * Get list of encrypted columns for an entity
65
+ */
66
+ getEncryptedColumns(entityName: string): string[];
67
+ /**
68
+ * Get all column rules for an entity
69
+ */
70
+ getAllColumnRules(entityName: string): Map<string, ColumnRule> | undefined;
71
+ /**
72
+ * Clear all rules
73
+ */
74
+ clear(): void;
75
+ }
76
+ /**
77
+ * Global column security manager instance
78
+ */
79
+ export declare const columnSecurityManager: ColumnSecurityManager;
80
+ //# sourceMappingURL=column-security.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"column-security.d.ts","sourceRoot":"","sources":["../../../../../core/src/access-rules/column-security.ts"],"names":[],"mappings":"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"}