@indexeddb-orm/idb-orm 0.0.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.
Files changed (216) hide show
  1. package/.vscode/extensions.json +5 -0
  2. package/README.md +1280 -0
  3. package/angular-demo-app/README.md +84 -0
  4. package/angular-demo-app/angular.json +109 -0
  5. package/angular-demo-app/package-lock.json +14215 -0
  6. package/angular-demo-app/package.json +41 -0
  7. package/angular-demo-app/src/app/app.component.ts +481 -0
  8. package/angular-demo-app/src/app/app.routes.ts +8 -0
  9. package/angular-demo-app/src/app/components/actions.component.ts +202 -0
  10. package/angular-demo-app/src/app/components/cloud-sync-demo.component.ts +296 -0
  11. package/angular-demo-app/src/app/components/live-query-demo.component.ts +307 -0
  12. package/angular-demo-app/src/app/components/main-info.component.ts +148 -0
  13. package/angular-demo-app/src/app/components/posts-live-query-demo.component.ts +336 -0
  14. package/angular-demo-app/src/app/components/typescript-demo.component.ts +268 -0
  15. package/angular-demo-app/src/entities/post-tag.entity.ts +25 -0
  16. package/angular-demo-app/src/entities/post.entity.ts +49 -0
  17. package/angular-demo-app/src/entities/profile.entity.ts +42 -0
  18. package/angular-demo-app/src/entities/tag.entity.ts +36 -0
  19. package/angular-demo-app/src/entities/user.entity.ts +59 -0
  20. package/angular-demo-app/src/favicon.ico +1 -0
  21. package/angular-demo-app/src/index.html +16 -0
  22. package/angular-demo-app/src/main.ts +13 -0
  23. package/angular-demo-app/src/services/app-logic.service.ts +449 -0
  24. package/angular-demo-app/src/services/cloud-sync.service.ts +95 -0
  25. package/angular-demo-app/src/services/database.service.ts +26 -0
  26. package/angular-demo-app/src/services/live-query.service.ts +63 -0
  27. package/angular-demo-app/src/services/posts-live-query.service.ts +86 -0
  28. package/angular-demo-app/src/services/typescript-demo.service.ts +59 -0
  29. package/angular-demo-app/src/styles.scss +50 -0
  30. package/angular-demo-app/tsconfig.app.json +13 -0
  31. package/angular-demo-app/tsconfig.json +34 -0
  32. package/angular-demo-app/tsconfig.spec.json +13 -0
  33. package/dist/Database.d.ts +206 -0
  34. package/dist/Database.js +288 -0
  35. package/dist/decorators/Column.d.ts +79 -0
  36. package/dist/decorators/Column.js +236 -0
  37. package/dist/decorators/Entity.d.ts +32 -0
  38. package/dist/decorators/Entity.js +44 -0
  39. package/dist/decorators/Relation.d.ts +70 -0
  40. package/dist/decorators/Relation.js +120 -0
  41. package/dist/decorators/index.d.ts +3 -0
  42. package/dist/decorators/index.js +3 -0
  43. package/dist/errors/ValidationError.d.ts +4 -0
  44. package/dist/errors/ValidationError.js +8 -0
  45. package/dist/index.d.ts +8 -0
  46. package/dist/index.js +7 -0
  47. package/dist/metadata/Column.d.ts +8 -0
  48. package/dist/metadata/Column.js +44 -0
  49. package/dist/metadata/Entity.d.ts +11 -0
  50. package/dist/metadata/Entity.js +21 -0
  51. package/dist/metadata/Relation.d.ts +20 -0
  52. package/dist/metadata/Relation.js +74 -0
  53. package/dist/metadata/index.d.ts +3 -0
  54. package/dist/metadata/index.js +3 -0
  55. package/dist/services/AggregationService.d.ts +38 -0
  56. package/dist/services/AggregationService.js +229 -0
  57. package/dist/services/BaseEntity.d.ts +32 -0
  58. package/dist/services/BaseEntity.js +62 -0
  59. package/dist/services/CloudSyncService.d.ts +100 -0
  60. package/dist/services/CloudSyncService.js +196 -0
  61. package/dist/services/DecoratorUtils.d.ts +12 -0
  62. package/dist/services/DecoratorUtils.js +10 -0
  63. package/dist/services/EntityFactory.d.ts +25 -0
  64. package/dist/services/EntityFactory.js +27 -0
  65. package/dist/services/EntityRegistry.d.ts +61 -0
  66. package/dist/services/EntityRegistry.js +56 -0
  67. package/dist/services/EntitySchema.d.ts +56 -0
  68. package/dist/services/EntitySchema.js +125 -0
  69. package/dist/services/MigrationManager.d.ts +70 -0
  70. package/dist/services/MigrationManager.js +181 -0
  71. package/dist/services/RelationLoader.d.ts +66 -0
  72. package/dist/services/RelationLoader.js +310 -0
  73. package/dist/services/SchemaBuilder.d.ts +68 -0
  74. package/dist/services/SchemaBuilder.js +191 -0
  75. package/dist/services/index.d.ts +7 -0
  76. package/dist/services/index.js +7 -0
  77. package/dist/types.d.ts +152 -0
  78. package/dist/types.js +1 -0
  79. package/dist/utils/logger.d.ts +12 -0
  80. package/dist/utils/logger.js +16 -0
  81. package/eslint.config.js +49 -0
  82. package/homepage/favicon.svg +36 -0
  83. package/homepage/index.html +1725 -0
  84. package/package.json +78 -0
  85. package/react-demo-app/README.md +61 -0
  86. package/react-demo-app/eslint.config.js +60 -0
  87. package/react-demo-app/index.html +13 -0
  88. package/react-demo-app/package-lock.json +4955 -0
  89. package/react-demo-app/package.json +39 -0
  90. package/react-demo-app/src/App.tsx +172 -0
  91. package/react-demo-app/src/assets/react.svg +1 -0
  92. package/react-demo-app/src/components/Actions.tsx +171 -0
  93. package/react-demo-app/src/components/CloudSyncDemo.tsx +191 -0
  94. package/react-demo-app/src/components/LiveQueryDemo.tsx +122 -0
  95. package/react-demo-app/src/components/MainInfo.tsx +75 -0
  96. package/react-demo-app/src/components/PostsLiveQueryDemo.tsx +185 -0
  97. package/react-demo-app/src/components/TypeScriptDemo.tsx +190 -0
  98. package/react-demo-app/src/database/Database.ts +30 -0
  99. package/react-demo-app/src/entities/Post.ts +48 -0
  100. package/react-demo-app/src/entities/PostTag.ts +26 -0
  101. package/react-demo-app/src/entities/Profile.ts +41 -0
  102. package/react-demo-app/src/entities/Tag.ts +35 -0
  103. package/react-demo-app/src/entities/User.ts +61 -0
  104. package/react-demo-app/src/hooks/useAppLogic.ts +565 -0
  105. package/react-demo-app/src/hooks/useCloudSyncDemo.ts +84 -0
  106. package/react-demo-app/src/hooks/useLiveQueryDemo.ts +68 -0
  107. package/react-demo-app/src/hooks/usePostsLiveQueryDemo.ts +64 -0
  108. package/react-demo-app/src/hooks/useTypeScriptDemo.ts +43 -0
  109. package/react-demo-app/src/index.css +26 -0
  110. package/react-demo-app/src/main.tsx +18 -0
  111. package/react-demo-app/src/migrations/001-add-user-email-index.ts +17 -0
  112. package/react-demo-app/src/migrations/002-add-post-category.ts +37 -0
  113. package/react-demo-app/src/migrations/index.ts +8 -0
  114. package/react-demo-app/src/vite-env.d.ts +1 -0
  115. package/react-demo-app/tsconfig.app.json +22 -0
  116. package/react-demo-app/tsconfig.json +6 -0
  117. package/react-demo-app/vite.config.ts +10 -0
  118. package/src/Database.ts +405 -0
  119. package/src/errors/ValidationError.ts +9 -0
  120. package/src/index.ts +13 -0
  121. package/src/metadata/Column.ts +74 -0
  122. package/src/metadata/Entity.ts +42 -0
  123. package/src/metadata/Relation.ts +121 -0
  124. package/src/metadata/index.ts +5 -0
  125. package/src/services/AggregationService.ts +348 -0
  126. package/src/services/BaseEntity.ts +77 -0
  127. package/src/services/CloudSyncService.ts +248 -0
  128. package/src/services/EntityFactory.ts +35 -0
  129. package/src/services/EntityRegistry.ts +109 -0
  130. package/src/services/EntitySchema.ts +154 -0
  131. package/src/services/MigrationManager.ts +276 -0
  132. package/src/services/RelationLoader.ts +532 -0
  133. package/src/services/SchemaBuilder.ts +237 -0
  134. package/src/services/index.ts +7 -0
  135. package/src/types.d.ts +1 -0
  136. package/src/types.ts +169 -0
  137. package/src/utils/logger.ts +40 -0
  138. package/svelte-demo-app/README.md +61 -0
  139. package/svelte-demo-app/package-lock.json +3000 -0
  140. package/svelte-demo-app/package.json +30 -0
  141. package/svelte-demo-app/src/app.d.ts +12 -0
  142. package/svelte-demo-app/src/app.html +13 -0
  143. package/svelte-demo-app/src/components/Actions.svelte +121 -0
  144. package/svelte-demo-app/src/components/CloudSyncDemo.svelte +333 -0
  145. package/svelte-demo-app/src/components/LiveQueryDemo.svelte +191 -0
  146. package/svelte-demo-app/src/components/MainInfo.svelte +133 -0
  147. package/svelte-demo-app/src/components/PostsLiveQueryDemo.svelte +330 -0
  148. package/svelte-demo-app/src/components/TypeScriptDemo.svelte +251 -0
  149. package/svelte-demo-app/src/database/Database.ts +29 -0
  150. package/svelte-demo-app/src/entities/Post.ts +46 -0
  151. package/svelte-demo-app/src/entities/PostTag.ts +22 -0
  152. package/svelte-demo-app/src/entities/Profile.ts +39 -0
  153. package/svelte-demo-app/src/entities/Tag.ts +33 -0
  154. package/svelte-demo-app/src/entities/User.ts +62 -0
  155. package/svelte-demo-app/src/lib/database/Database.ts +30 -0
  156. package/svelte-demo-app/src/lib/entities/Post.ts +47 -0
  157. package/svelte-demo-app/src/lib/entities/PostTag.ts +23 -0
  158. package/svelte-demo-app/src/lib/entities/Profile.ts +40 -0
  159. package/svelte-demo-app/src/lib/entities/Tag.ts +34 -0
  160. package/svelte-demo-app/src/lib/entities/User.ts +59 -0
  161. package/svelte-demo-app/src/lib/index.ts +7 -0
  162. package/svelte-demo-app/src/lib/migrations/001-add-user-email-index.ts +17 -0
  163. package/svelte-demo-app/src/lib/migrations/002-add-post-category.ts +37 -0
  164. package/svelte-demo-app/src/lib/migrations/index.ts +8 -0
  165. package/svelte-demo-app/src/migrations/001-add-user-email-index.ts +17 -0
  166. package/svelte-demo-app/src/migrations/002-add-post-category.ts +37 -0
  167. package/svelte-demo-app/src/migrations/index.ts +8 -0
  168. package/svelte-demo-app/src/routes/+layout.js +3 -0
  169. package/svelte-demo-app/src/routes/+layout.svelte +228 -0
  170. package/svelte-demo-app/src/routes/+page.js +3 -0
  171. package/svelte-demo-app/src/routes/+page.svelte +1305 -0
  172. package/svelte-demo-app/src/stores/appStore.js +603 -0
  173. package/svelte-demo-app/svelte.config.js +18 -0
  174. package/svelte-demo-app/tsconfig.json +14 -0
  175. package/svelte-demo-app/vite.config.ts +6 -0
  176. package/tests/aggregation.e2e.test.ts +87 -0
  177. package/tests/base-entity.e2e.test.ts +47 -0
  178. package/tests/database-api.e2e.test.ts +177 -0
  179. package/tests/decorators.e2e.test.ts +40 -0
  180. package/tests/entity-schema.e2e.test.ts +58 -0
  181. package/tests/relation-loader-table-names.test.ts +192 -0
  182. package/tests/relations.e2e.test.ts +178 -0
  183. package/tests/zod-runtime.e2e.test.ts +69 -0
  184. package/tsconfig.json +21 -0
  185. package/vitest.config.ts +21 -0
  186. package/vitest.setup.ts +27 -0
  187. package/vue-demo-app/README.md +61 -0
  188. package/vue-demo-app/index.html +13 -0
  189. package/vue-demo-app/package-lock.json +1537 -0
  190. package/vue-demo-app/package.json +27 -0
  191. package/vue-demo-app/src/App.vue +100 -0
  192. package/vue-demo-app/src/components/Actions.vue +135 -0
  193. package/vue-demo-app/src/components/CloudSyncDemo.vue +139 -0
  194. package/vue-demo-app/src/components/LiveQueryDemo.vue +122 -0
  195. package/vue-demo-app/src/components/MainInfo.vue +80 -0
  196. package/vue-demo-app/src/components/PostsLiveQueryDemo.vue +136 -0
  197. package/vue-demo-app/src/components/TypeScriptDemo.vue +133 -0
  198. package/vue-demo-app/src/database/Database.ts +29 -0
  199. package/vue-demo-app/src/entities/Post.ts +48 -0
  200. package/vue-demo-app/src/entities/PostTag.ts +24 -0
  201. package/vue-demo-app/src/entities/Profile.ts +41 -0
  202. package/vue-demo-app/src/entities/Tag.ts +35 -0
  203. package/vue-demo-app/src/entities/User.ts +61 -0
  204. package/vue-demo-app/src/main.ts +29 -0
  205. package/vue-demo-app/src/migrations/001-add-user-email-index.ts +23 -0
  206. package/vue-demo-app/src/migrations/002-add-post-category.ts +46 -0
  207. package/vue-demo-app/src/migrations/index.ts +14 -0
  208. package/vue-demo-app/src/services/useAppLogic.ts +565 -0
  209. package/vue-demo-app/src/services/useCloudSyncDemo.ts +84 -0
  210. package/vue-demo-app/src/services/useLiveQueryDemo.ts +82 -0
  211. package/vue-demo-app/src/services/usePostsLiveQueryDemo.ts +77 -0
  212. package/vue-demo-app/src/services/useTypeScriptDemo.ts +56 -0
  213. package/vue-demo-app/src/vite-env.d.ts +1 -0
  214. package/vue-demo-app/tsconfig.json +25 -0
  215. package/vue-demo-app/tsconfig.node.json +10 -0
  216. package/vue-demo-app/vite.config.ts +16 -0
@@ -0,0 +1,307 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import {
3
+ Component, Input,
4
+ } from '@angular/core';
5
+ import { MatCardModule } from '@angular/material/card';
6
+ import { MatIconModule } from '@angular/material/icon';
7
+ import { PostEntity } from 'src/entities/post.entity';
8
+
9
+ import { ProfileEntity } from '../../entities/profile.entity';
10
+ import { UserEntity } from '../../entities/user.entity';
11
+
12
+ @Component({
13
+ selector: 'app-live-query-demo',
14
+ standalone: true,
15
+ imports: [CommonModule, MatCardModule, MatIconModule],
16
+ template: `
17
+ <div class="live-query-paper">
18
+ <div class="demo-grid">
19
+ <div class="demo-section">
20
+ <div class="section-paper">
21
+ <h3 class="section-title">
22
+ <mat-icon color="primary" class="section-icon">bar_chart</mat-icon>
23
+ Statistics (number | undefined)
24
+ </h3>
25
+ <div class="stats-content">
26
+ <p>
27
+ <strong>
28
+ Total users:</strong> {{ userStats.totalUsers ?? 'Loading...' }}</p>
29
+ <p>
30
+ <strong>
31
+ Adult users:</strong> {{ userStats.adultUsers ?? 'Loading...' }}</p>
32
+ <p>
33
+ <strong>First user:</strong> {{ userStats.firstUser ?? 'None' }}</p>
34
+ <p>
35
+ <strong>
36
+ All users (live):</strong> {{ allUsers?.length ?? 'Loading...' }}</p>
37
+ <p><strong>Posts:</strong> {{ allPosts?.length ?? 'Loading...' }}</p>
38
+ <p>
39
+ <strong>
40
+ Profiles:</strong> {{ allProfiles?.length ?? 'Loading...' }}</p>
41
+ </div>
42
+ </div>
43
+ </div>
44
+
45
+ <div class="demo-section">
46
+ <div class="section-paper">
47
+ <h3 class="section-title">
48
+ <mat-icon color="primary" class="section-icon">people</mat-icon>
49
+ Users with profiles (UserEntity with profile)
50
+ </h3>
51
+ <div
52
+ class="users-content"
53
+ *ngIf="usersWithProfiles && usersWithProfiles.length > 0"
54
+ >
55
+ <div *ngFor="let user of usersWithProfiles" class="user-card">
56
+ <div class="user-name">{{ user.name }}</div>
57
+ <div class="user-email">{{ user.email }}</div>
58
+ <div
59
+ class="user-profile"
60
+ *ngIf="user.profile">{{ user.profile.bio }}
61
+ </div>
62
+ </div>
63
+ </div>
64
+ </div>
65
+ </div>
66
+
67
+ <div class="demo-section">
68
+ <div class="section-paper">
69
+ <h3 class="section-title">
70
+ <mat-icon color="primary" class="section-icon">person</mat-icon>
71
+ All users (live)
72
+ </h3>
73
+ <div class="users-content" *ngIf="allUsers && allUsers.length > 0">
74
+ <div *ngFor="let user of allUsers" class="user-simple">
75
+ <strong>{{ user.name }}</strong> — {{ user.email }}
76
+ </div>
77
+ </div>
78
+ </div>
79
+ </div>
80
+ </div>
81
+
82
+ <div class="posts-section" *ngIf="allPosts && allPosts.length > 0">
83
+ <h3 class="posts-title">
84
+ <mat-icon class="section-icon">article</mat-icon>
85
+ Posts (PostEntity[])
86
+ </h3>
87
+ <div class="posts-content">
88
+ <div *ngFor="let post of allPosts" class="post-item">
89
+ <div class="post-title">{{ post.title }}</div>
90
+ <div class="post-meta">
91
+ <mat-icon
92
+ *ngIf="post.published"
93
+ color="success" class="post-icon">check_circle
94
+ </mat-icon>
95
+ <mat-icon *ngIf="!post.published" class="post-icon">article</mat-icon>
96
+ <mat-icon color="error" class="post-icon">favorite</mat-icon>
97
+ {{ post.likes }}
98
+ </div>
99
+ </div>
100
+ </div>
101
+ </div>
102
+
103
+ <div class="typing-test-section">
104
+ <div class="typing-test-content">
105
+ <p><strong>
106
+ Typing test:
107
+ </strong> All variables are fully typed with TypeScript!</p>
108
+ <p><strong>
109
+ Reactivity:
110
+ </strong> Data updates automatically when you add/remove records!</p>
111
+ <p><strong>
112
+ Compatibility:
113
+ </strong> Your library works perfectly with useLiveQuery!</p>
114
+ </div>
115
+ </div>
116
+ </div>
117
+ `,
118
+ styles: [`
119
+ .live-query-paper {
120
+ padding: 24px;
121
+ margin: 24px 0;
122
+ border: 1px solid rgba(0, 0, 0, 0.23);
123
+ border-radius: 4px;
124
+ background-color: #fff;
125
+ }
126
+
127
+ .demo-grid {
128
+ display: grid;
129
+ grid-template-columns: 1fr;
130
+ gap: 16px;
131
+ align-items: stretch;
132
+ }
133
+
134
+ @media (min-width: 960px) {
135
+ .demo-grid {
136
+ grid-template-columns: repeat(3, 1fr);
137
+ grid-template-rows: 1fr;
138
+ }
139
+ }
140
+
141
+ .demo-section {
142
+ display: flex;
143
+ flex-direction: column;
144
+ height: 100%;
145
+ }
146
+
147
+ .section-paper {
148
+ padding: 16px;
149
+ border: 1px solid rgba(0, 0, 0, 0.23);
150
+ border-radius: 4px;
151
+ background-color: #fff;
152
+ flex: 1;
153
+ display: flex;
154
+ flex-direction: column;
155
+ }
156
+
157
+ .section-title {
158
+ display: flex;
159
+ align-items: center;
160
+ gap: 8px;
161
+ margin: 0 0 16px 0;
162
+ font-size: 1.1rem;
163
+ font-weight: 500;
164
+ color: rgba(0, 0, 0, 0.87);
165
+ }
166
+
167
+ .section-icon {
168
+ font-size: 20px;
169
+ width: 20px;
170
+ height: 20px;
171
+ }
172
+
173
+ .stats-content {
174
+ flex: 1;
175
+ display: flex;
176
+ flex-direction: column;
177
+ gap: 4px;
178
+ }
179
+
180
+ .stats-content p {
181
+ margin: 0;
182
+ font-size: 0.875rem;
183
+ line-height: 1.5;
184
+ }
185
+
186
+ .users-content {
187
+ flex: 1;
188
+ display: flex;
189
+ flex-direction: column;
190
+ gap: 8px;
191
+ max-height: 200px;
192
+ overflow-y: auto;
193
+ }
194
+
195
+ .user-card {
196
+ padding: 12px;
197
+ border: 1px solid rgba(0, 0, 0, 0.23);
198
+ border-radius: 4px;
199
+ background-color: #fff;
200
+ }
201
+
202
+ .user-name {
203
+ font-weight: 600;
204
+ font-size: 0.875rem;
205
+ margin-bottom: 4px;
206
+ }
207
+
208
+ .user-email {
209
+ font-size: 0.875rem;
210
+ color: rgba(0, 0, 0, 0.6);
211
+ margin-bottom: 4px;
212
+ }
213
+
214
+ .user-profile {
215
+ font-size: 0.875rem;
216
+ color: rgba(0, 0, 0, 0.6);
217
+ }
218
+
219
+ .user-simple {
220
+ font-size: 0.875rem;
221
+ line-height: 1.5;
222
+ }
223
+
224
+ .posts-section {
225
+ margin-top: 24px;
226
+ }
227
+
228
+ .posts-title {
229
+ display: flex;
230
+ align-items: center;
231
+ gap: 8px;
232
+ margin: 0 0 16px 0;
233
+ font-size: 1.1rem;
234
+ font-weight: 500;
235
+ color: rgba(0, 0, 0, 0.87);
236
+ }
237
+
238
+ .posts-content {
239
+ padding: 16px;
240
+ border: 1px solid rgba(0, 0, 0, 0.23);
241
+ border-radius: 4px;
242
+ background-color: #fff;
243
+ max-height: 180px;
244
+ overflow-y: auto;
245
+ }
246
+
247
+ .post-item {
248
+ padding-bottom: 8px;
249
+ border-bottom: 1px solid #eee;
250
+ }
251
+
252
+ .post-item:last-child {
253
+ border-bottom: none;
254
+ }
255
+
256
+ .post-title {
257
+ font-weight: 600;
258
+ font-size: 0.875rem;
259
+ margin-bottom: 4px;
260
+ }
261
+
262
+ .post-meta {
263
+ display: flex;
264
+ align-items: center;
265
+ gap: 4px;
266
+ font-size: 0.875rem;
267
+ color: rgba(0, 0, 0, 0.6);
268
+ }
269
+
270
+ .post-icon {
271
+ font-size: 16px;
272
+ width: 16px;
273
+ height: 16px;
274
+ }
275
+
276
+ .typing-test-section {
277
+ margin-top: 16px;
278
+ }
279
+
280
+ .typing-test-content {
281
+ padding: 16px;
282
+ background-color: #e8f5e8;
283
+ border-radius: 4px;
284
+ }
285
+
286
+ .typing-test-content p {
287
+ margin: 0 0 8px 0;
288
+ font-size: 0.875rem;
289
+ line-height: 1.5;
290
+ }
291
+
292
+ .typing-test-content p:last-child {
293
+ margin-bottom: 0;
294
+ }
295
+ `],
296
+ })
297
+ export class LiveQueryDemoComponent {
298
+ @Input() usersWithProfiles: (UserEntity & { profile?: ProfileEntity })[] = [];
299
+ @Input() allUsers: UserEntity[] = [];
300
+ @Input() allPosts: PostEntity[] = [];
301
+ @Input() allProfiles: ProfileEntity[] = [];
302
+ @Input() userStats: {
303
+ totalUsers: number;
304
+ adultUsers: number;
305
+ firstUser: string;
306
+ } = { totalUsers: 0, adultUsers: 0, firstUser: '' };
307
+ }
@@ -0,0 +1,148 @@
1
+ import { Component } from '@angular/core';
2
+ import { MatButtonModule } from '@angular/material/button';
3
+ import { MatCardModule } from '@angular/material/card';
4
+ import { MatIconModule } from '@angular/material/icon';
5
+
6
+ @Component({
7
+ selector: 'app-main-info',
8
+ standalone: true,
9
+ imports: [MatCardModule, MatButtonModule, MatIconModule],
10
+ template: `
11
+ <div class="overview-paper">
12
+ <div class="paper-header">
13
+ <h2 class="paper-title">
14
+ <mat-icon color="primary">autorenew</mat-icon>
15
+ Dexie ORM for IndexedDB — Overview
16
+ </h2>
17
+ <p class="paper-subtitle">
18
+ TypeScript ORM
19
+ built on the latest Dexie 4 with first-class type safety
20
+ and Zod runtime validation.
21
+ </p>
22
+ </div>
23
+
24
+ <div class="features-grid">
25
+ <div class="feature-item">
26
+ <mat-icon color="primary" class="feature-icon">code</mat-icon>
27
+ <span><strong>Entity config</strong> via defineEntity()</span>
28
+ </div>
29
+ <div class="feature-item">
30
+ <mat-icon color="primary" class="feature-icon">storage</mat-icon>
31
+ <span><strong>Automatic schema</strong> with PK, indexes, unique</span>
32
+ </div>
33
+ <div class="feature-item">
34
+ <mat-icon color="primary" class="feature-icon">people</mat-icon>
35
+ <span><strong>Relations</strong> with helpers</span>
36
+ </div>
37
+ <div class="feature-item">
38
+ <mat-icon color="primary" class="feature-icon">science</mat-icon>
39
+ <span><strong>Zod validation</strong> at runtime</span>
40
+ </div>
41
+ <div class="feature-item">
42
+ <mat-icon color="primary" class="feature-icon">assessment</mat-icon>
43
+ <span><strong>Aggregations</strong> (count, avg, sum)</span>
44
+ </div>
45
+ <div class="feature-item">
46
+ <mat-icon color="primary" class="feature-icon">bar_chart</mat-icon>
47
+ <span><strong>Live queries</strong> with useLiveQuery()</span>
48
+ </div>
49
+ <div class="feature-item">
50
+ <mat-icon color="primary" class="feature-icon">code</mat-icon>
51
+ <span><strong>TypeScript</strong> full type safety</span>
52
+ </div>
53
+ <div class="feature-item">
54
+ <mat-icon color="primary" class="feature-icon">cloud_sync</mat-icon>
55
+ <span><strong>Cloud sync</strong> with Dexie Cloud</span>
56
+ </div>
57
+ </div>
58
+
59
+ <div class="documentation-section">
60
+ <button mat-stroked-button
61
+ (click)="openDocumentation()"
62
+ class="doc-button">
63
+ <mat-icon>open_in_new</mat-icon>
64
+ View full documentation
65
+ </button>
66
+ </div>
67
+ </div>
68
+ `,
69
+ styles: [`
70
+ .overview-paper {
71
+ padding: 16px;
72
+ margin-bottom: 16px;
73
+ border: 1px solid rgba(0, 0, 0, 0.23);
74
+ border-radius: 4px;
75
+ background-color: #fff;
76
+ }
77
+
78
+ .paper-header {
79
+ margin-bottom: 16px;
80
+ }
81
+
82
+ .paper-title {
83
+ font-size: 1.25rem;
84
+ font-weight: 500;
85
+ margin: 0 0 8px 0;
86
+ display: flex;
87
+ align-items: center;
88
+ gap: 8px;
89
+ color: rgba(0, 0, 0, 0.87);
90
+ }
91
+
92
+ .paper-subtitle {
93
+ font-size: 0.875rem;
94
+ color: rgba(0, 0, 0, 0.6);
95
+ margin: 0 0 16px 0;
96
+ line-height: 1.5;
97
+ }
98
+
99
+ .features-grid {
100
+ display: grid;
101
+ grid-template-columns: 1fr 1fr;
102
+ gap: 10px;
103
+ margin-bottom: 16px;
104
+ }
105
+
106
+ @media (max-width: 600px) {
107
+ .features-grid {
108
+ grid-template-columns: 1fr;
109
+ }
110
+ }
111
+
112
+ .feature-item {
113
+ display: flex;
114
+ align-items: center;
115
+ gap: 8px;
116
+ }
117
+
118
+ .feature-icon {
119
+ font-size: 20px;
120
+ width: 20px;
121
+ height: 20px;
122
+ }
123
+
124
+ .documentation-section {
125
+ margin-top: 16px;
126
+ padding-top: 16px;
127
+ border-top: 1px solid rgba(0, 0, 0, 0.12);
128
+ }
129
+
130
+ .doc-button {
131
+ text-transform: none !important;
132
+ font-size: 0.875rem;
133
+ padding: 8px 16px;
134
+ border: 1px solid rgba(0, 0, 0, 0.23);
135
+ background-color: transparent;
136
+ color: rgba(0, 0, 0, 0.87);
137
+ }
138
+
139
+ .doc-button:hover {
140
+ background-color: rgba(0, 0, 0, 0.04);
141
+ }
142
+ `],
143
+ })
144
+ export class MainInfoComponent {
145
+ openDocumentation(): void {
146
+ window.open('https://github.com/radommaciej/indexed-db-orm/blob/main/README.md', '_blank');
147
+ }
148
+ }