@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,27 @@
1
+ {
2
+ "name": "indexeddb-orm-vue-demo-app",
3
+ "private": true,
4
+ "version": "0.0.1",
5
+ "type": "module",
6
+ "scripts": {
7
+ "dev": "vite",
8
+ "build": "vue-tsc && vite build",
9
+ "preview": "vite preview",
10
+ "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix --ignore-path .gitignore"
11
+ },
12
+ "dependencies": {
13
+ "@mdi/font": "^7.4.47",
14
+ "idb-orm": "^0.0.1",
15
+ "vue": "^3.4.0",
16
+ "vuetify": "^3.5.0",
17
+ "zod": "^4.1.5"
18
+ },
19
+ "devDependencies": {
20
+ "@types/node": "^20.0.0",
21
+ "@vitejs/plugin-vue": "^5.0.0",
22
+ "typescript": "~5.8.3",
23
+ "vite": "^5.4.0",
24
+ "vite-plugin-vuetify": "^2.0.0",
25
+ "vue-tsc": "^2.0.0"
26
+ }
27
+ }
@@ -0,0 +1,100 @@
1
+ <template>
2
+ <v-app>
3
+ <v-app-bar color="primary" dark>
4
+ <v-app-bar-nav-icon
5
+ v-if="!display.mdAndUp.value"
6
+ @click="handleDrawerToggle"
7
+ />
8
+ <v-toolbar-title>Dexie ORM Demo</v-toolbar-title>
9
+ </v-app-bar>
10
+
11
+ <v-navigation-drawer
12
+ v-model="drawerOpen"
13
+ :permanent="display.mdAndUp.value"
14
+ :temporary="!display.mdAndUp.value"
15
+ width="240"
16
+ >
17
+ <v-list>
18
+ <v-list-item
19
+ v-for="(tab, index) in tabs"
20
+ :key="tab.key"
21
+ :active="tabIndex === index"
22
+ @click="setTabIndex(index); if (!display.mdAndUp.value) handleDrawerToggle()"
23
+ >
24
+ <v-list-item-title>{{ tab.label }}</v-list-item-title>
25
+ </v-list-item>
26
+ </v-list>
27
+ </v-navigation-drawer>
28
+
29
+ <v-main>
30
+ <v-container fluid class="pa-3">
31
+ <div v-if="tabIndex === 0">
32
+ <MainInfo />
33
+ <Actions
34
+ :users="users"
35
+ :add-user="addUser"
36
+ :test-zod-validation="testZodValidation"
37
+ :test-schema-migration="testSchemaMigration"
38
+ :toggle-auto-reset="toggleAutoReset"
39
+ :test-relations="testRelations"
40
+ :test-transactions="testTransactions"
41
+ :test-compound-indexes="testCompoundIndexes"
42
+ :test-aggregations="testAggregations"
43
+ :clear-all="clearAll"
44
+ />
45
+ <v-spacer class="mt-3" />
46
+ <LiveQueryDemo />
47
+ <v-spacer class="mt-3" />
48
+ <TypeScriptDemo />
49
+ <v-spacer class="mt-3" />
50
+ <PostsLiveQueryDemo />
51
+ </div>
52
+ <div v-if="tabIndex === 1">
53
+ <CloudSyncDemo />
54
+ </div>
55
+ </v-container>
56
+ </v-main>
57
+ </v-app>
58
+ </template>
59
+
60
+ <script setup lang="ts">
61
+ import { computed } from 'vue';
62
+ import { useDisplay } from 'vuetify';
63
+ import { useAppLogic } from './services/useAppLogic';
64
+ import MainInfo from './components/MainInfo.vue';
65
+ import Actions from './components/Actions.vue';
66
+ import LiveQueryDemo from './components/LiveQueryDemo.vue';
67
+ import TypeScriptDemo from './components/TypeScriptDemo.vue';
68
+ import PostsLiveQueryDemo from './components/PostsLiveQueryDemo.vue';
69
+ import CloudSyncDemo from './components/CloudSyncDemo.vue';
70
+
71
+ const display = useDisplay();
72
+
73
+ const {
74
+ users,
75
+ tabIndex,
76
+ setTabIndex,
77
+ mobileOpen,
78
+ tabs,
79
+ addUser,
80
+ testZodValidation,
81
+ testSchemaMigration,
82
+ toggleAutoReset,
83
+ testRelations,
84
+ testTransactions,
85
+ testCompoundIndexes,
86
+ testAggregations,
87
+ clearAll,
88
+ handleDrawerToggle,
89
+ } = useAppLogic();
90
+
91
+ // Computed property for drawer state
92
+ const drawerOpen = computed({
93
+ get: () => display.mdAndUp.value ? true : mobileOpen.value,
94
+ set: (value: boolean) => {
95
+ if (!display.mdAndUp.value) {
96
+ mobileOpen.value = value;
97
+ }
98
+ }
99
+ });
100
+ </script>
@@ -0,0 +1,135 @@
1
+ <template>
2
+ <div>
3
+ <h2 class="text-h5 mb-4">Admin Actions</h2>
4
+ <v-row class="mb-4">
5
+ <v-col cols="6" sm="4" md="3" lg="2">
6
+ <v-btn
7
+ variant="outlined"
8
+ block
9
+ prepend-icon="mdi-account"
10
+ @click="addUser"
11
+ >
12
+ Add User
13
+ </v-btn>
14
+ </v-col>
15
+ <v-col cols="6" sm="4" md="3" lg="2">
16
+ <v-btn
17
+ variant="outlined"
18
+ block
19
+ prepend-icon="mdi-flask"
20
+ @click="testZodValidation"
21
+ >
22
+ Test Zod
23
+ </v-btn>
24
+ </v-col>
25
+ <v-col cols="6" sm="4" md="3" lg="2">
26
+ <v-btn
27
+ variant="outlined"
28
+ block
29
+ prepend-icon="mdi-database"
30
+ @click="testSchemaMigration"
31
+ >
32
+ Schema
33
+ </v-btn>
34
+ </v-col>
35
+ <v-col cols="6" sm="4" md="3" lg="2">
36
+ <v-btn
37
+ variant="outlined"
38
+ block
39
+ prepend-icon="mdi-cog"
40
+ @click="toggleAutoReset"
41
+ >
42
+ Auto-Reset
43
+ </v-btn>
44
+ </v-col>
45
+ <v-col cols="6" sm="4" md="3" lg="2">
46
+ <v-btn
47
+ variant="outlined"
48
+ block
49
+ prepend-icon="mdi-link"
50
+ @click="testRelations"
51
+ >
52
+ Relations
53
+ </v-btn>
54
+ </v-col>
55
+ <v-col cols="6" sm="4" md="3" lg="2">
56
+ <v-btn
57
+ variant="outlined"
58
+ block
59
+ prepend-icon="mdi-speedometer"
60
+ @click="testTransactions"
61
+ >
62
+ Transactions
63
+ </v-btn>
64
+ </v-col>
65
+ <v-col cols="6" sm="4" md="3" lg="2">
66
+ <v-btn
67
+ variant="outlined"
68
+ block
69
+ prepend-icon="mdi-magnify"
70
+ @click="testCompoundIndexes"
71
+ >
72
+ Indexes
73
+ </v-btn>
74
+ </v-col>
75
+ <v-col cols="6" sm="4" md="3" lg="2">
76
+ <v-btn
77
+ variant="outlined"
78
+ block
79
+ prepend-icon="mdi-chart-line"
80
+ @click="testAggregations"
81
+ >
82
+ Aggregations
83
+ </v-btn>
84
+ </v-col>
85
+ <v-col cols="6" sm="4" md="3" lg="2">
86
+ <v-btn
87
+ variant="outlined"
88
+ block
89
+ prepend-icon="mdi-delete-sweep"
90
+ @click="clearAll"
91
+ >
92
+ Clear All
93
+ </v-btn>
94
+ </v-col>
95
+ </v-row>
96
+
97
+ <h3 class="text-h6 mb-2">Users ({{ users.length }})</h3>
98
+ <v-row>
99
+ <v-col
100
+ v-for="(user, index) in users"
101
+ :key="index"
102
+ cols="12"
103
+ sm="6"
104
+ md="4"
105
+ lg="3"
106
+ >
107
+ <v-card variant="outlined">
108
+ <v-card-text>
109
+ <strong>{{ user.name }}</strong> ({{ user.email }})<br />
110
+ Age: {{ user.age }}, Tags: {{ user.tags?.join(', ') || 'none' }}
111
+ </v-card-text>
112
+ </v-card>
113
+ </v-col>
114
+ </v-row>
115
+ </div>
116
+ </template>
117
+
118
+ <script setup lang="ts">
119
+ import type { UserEntity } from '../entities/User';
120
+
121
+ interface Props {
122
+ users: UserEntity[];
123
+ addUser: () => void;
124
+ testZodValidation: () => void;
125
+ testSchemaMigration: () => void;
126
+ toggleAutoReset: () => void;
127
+ testRelations: () => void;
128
+ testTransactions: () => void;
129
+ testCompoundIndexes: () => void;
130
+ testAggregations: () => void;
131
+ clearAll: () => void;
132
+ }
133
+
134
+ defineProps<Props>();
135
+ </script>
@@ -0,0 +1,139 @@
1
+ <template>
2
+ <v-card
3
+ variant="outlined"
4
+ class="my-4"
5
+ style="border: 2px solid #2196f3; background-color: #e3f2fd;"
6
+ >
7
+ <v-card-title>Cloud Sync Demo</v-card-title>
8
+ <v-card-text>
9
+ <p class="text-body-2 text-medium-emphasis mb-4">
10
+ <strong>Dexie Cloud Addon Integration:</strong> Cloud synchronization demo
11
+ </p>
12
+
13
+ <v-row>
14
+ <v-col cols="12" md="6">
15
+ <v-card variant="outlined">
16
+ <v-card-title class="d-flex align-center">
17
+ <v-icon class="mr-2" color="primary">mdi-cloud-sync</v-icon>
18
+ Sync status
19
+ </v-card-title>
20
+ <v-card-text>
21
+ <p><strong>Enabled:</strong> {{ syncStatus.enabled ? 'Yes' : 'No' }}</p>
22
+ <p>
23
+ <strong>Online:</strong>
24
+ {{ syncStatus.isOnline !== undefined
25
+ ? syncStatus.isOnline ? 'Yes' : 'No'
26
+ : 'Unknown' }}
27
+ </p>
28
+ <p>
29
+ <strong>Last sync:</strong>
30
+ {{ syncStatus.lastSync ? syncStatus.lastSync.toLocaleString() : 'Never' }}
31
+ </p>
32
+ </v-card-text>
33
+ </v-card>
34
+ </v-col>
35
+
36
+ <v-col cols="12" md="6">
37
+ <v-card variant="outlined">
38
+ <v-card-title class="d-flex align-center">
39
+ <v-icon class="mr-2" color="primary">mdi-cog</v-icon>
40
+ Sync controls
41
+ </v-card-title>
42
+ <v-card-text>
43
+ <v-btn
44
+ :disabled="!syncStatus.enabled || isLoading"
45
+ :color="syncStatus.enabled ? 'success' : 'grey'"
46
+ @click="handleManualSync"
47
+ class="mb-2"
48
+ block
49
+ >
50
+ {{ isLoading ? 'Syncing...' : 'Sync manually' }}
51
+ </v-btn>
52
+
53
+ <v-btn
54
+ :disabled="!syncStatus.enabled || isLoading"
55
+ :color="syncStatus.enabled ? 'warning' : 'grey'"
56
+ @click="handleSyncTables"
57
+ class="mb-2"
58
+ block
59
+ >
60
+ Sync tables (users, posts)
61
+ </v-btn>
62
+
63
+ <v-btn
64
+ v-if="!syncStatus.enabled"
65
+ color="primary"
66
+ :disabled="isLoading"
67
+ @click="handleEnableCloudSync"
68
+ block
69
+ >
70
+ Enable cloud sync
71
+ </v-btn>
72
+
73
+ <v-btn
74
+ v-else
75
+ color="error"
76
+ :disabled="isLoading"
77
+ @click="handleDisableCloudSync"
78
+ block
79
+ >
80
+ Disable cloud sync
81
+ </v-btn>
82
+ </v-card-text>
83
+ </v-card>
84
+ </v-col>
85
+ </v-row>
86
+
87
+ <v-card variant="outlined" class="mt-4" color="warning">
88
+ <v-card-title class="d-flex align-center">
89
+ <v-icon class="mr-2" color="primary">mdi-information</v-icon>
90
+ Instructions:
91
+ </v-card-title>
92
+ <v-card-text>
93
+ <ol class="ml-4">
94
+ <li>
95
+ <strong>Install dexie-cloud-addon:</strong> <code>npm install dexie-cloud-addon</code>
96
+ </li>
97
+ <li>
98
+ <strong>Configure database URL</strong> in <code>demo-app/src/database/Database.ts</code>
99
+ </li>
100
+ <li>
101
+ <strong>Enable cloud sync</strong> using the button above
102
+ </li>
103
+ <li>
104
+ <strong>Test sync</strong> – add data and verify it synchronizes
105
+ </li>
106
+ </ol>
107
+ </v-card-text>
108
+ </v-card>
109
+
110
+ <v-card variant="outlined" class="mt-4" color="success">
111
+ <v-card-text>
112
+ <div class="text-caption text-medium-emphasis">
113
+ <div class="font-weight-bold">Configuration:</div>
114
+ Cloud sync is configured in Database.ts with automatic sync every 30 seconds.
115
+ <br />
116
+ <div class="font-weight-bold">Offline Support:</div>
117
+ The app works offline and syncs when connection is restored.
118
+ <br />
119
+ <div class="font-weight-bold">Reactivity:</div>
120
+ All changes are automatically synchronized with the cloud!
121
+ </div>
122
+ </v-card-text>
123
+ </v-card>
124
+ </v-card-text>
125
+ </v-card>
126
+ </template>
127
+
128
+ <script setup lang="ts">
129
+ import { useCloudSyncDemo } from '../services/useCloudSyncDemo';
130
+
131
+ const {
132
+ syncStatus,
133
+ isLoading,
134
+ handleManualSync,
135
+ handleEnableCloudSync,
136
+ handleDisableCloudSync,
137
+ handleSyncTables,
138
+ } = useCloudSyncDemo();
139
+ </script>
@@ -0,0 +1,122 @@
1
+ <template>
2
+ <v-card variant="outlined" class="my-4">
3
+ <v-card-text>
4
+ <v-row>
5
+ <v-col cols="12" md="4">
6
+ <v-card variant="outlined" class="h-100">
7
+ <v-card-title class="d-flex align-center">
8
+ <v-icon class="mr-2" color="primary">mdi-chart-bar</v-icon>
9
+ Statistics (number | undefined)
10
+ </v-card-title>
11
+ <v-card-text>
12
+ <div class="mb-2">
13
+ <strong>Total users:</strong> {{ userCount ?? 'Loading...' }}
14
+ </div>
15
+ <div class="mb-2">
16
+ <strong>Adult users:</strong> {{ adultUsers?.length ?? 'Loading...' }}
17
+ </div>
18
+ <div class="mb-2">
19
+ <strong>First user:</strong> {{ firstUser?.name ?? 'None' }}
20
+ </div>
21
+ <div class="mb-2">
22
+ <strong>All users (live):</strong> {{ allUsers?.length ?? 'Loading...' }}
23
+ </div>
24
+ <div class="mb-2">
25
+ <strong>Posts:</strong> {{ allPosts?.length ?? 'Loading...' }}
26
+ </div>
27
+ <div class="mb-2">
28
+ <strong>Profiles:</strong> {{ allProfiles?.length ?? 'Loading...' }}
29
+ </div>
30
+ </v-card-text>
31
+ </v-card>
32
+ </v-col>
33
+
34
+ <v-col cols="12" md="4">
35
+ <v-card variant="outlined" class="h-100">
36
+ <v-card-title class="d-flex align-center">
37
+ <v-icon class="mr-2" color="primary">mdi-account-group</v-icon>
38
+ Users with profiles (UserEntity with profile)
39
+ </v-card-title>
40
+ <v-card-text>
41
+ <div v-if="usersWithProfiles && usersWithProfiles.length > 0" class="overflow-y-auto" style="max-height: 200px;">
42
+ <v-card
43
+ v-for="user in usersWithProfiles"
44
+ :key="user.id"
45
+ variant="outlined"
46
+ class="mb-2 pa-2"
47
+ >
48
+ <div class="font-weight-bold">{{ user.name }}</div>
49
+ <div class="text-caption text-medium-emphasis">{{ user.email }}</div>
50
+ <div v-if="user.profile" class="text-caption text-medium-emphasis">
51
+ {{ user.profile.bio }}
52
+ </div>
53
+ </v-card>
54
+ </div>
55
+ </v-card-text>
56
+ </v-card>
57
+ </v-col>
58
+
59
+ <v-col cols="12" md="4">
60
+ <v-card variant="outlined" class="h-100">
61
+ <v-card-title class="d-flex align-center">
62
+ <v-icon class="mr-2" color="primary">mdi-account</v-icon>
63
+ All users (live)
64
+ </v-card-title>
65
+ <v-card-text>
66
+ <div v-if="allUsers && allUsers.length > 0" class="overflow-y-auto" style="max-height: 200px;">
67
+ <div v-for="user in allUsers" :key="user.id" class="mb-1">
68
+ <strong>{{ user.name }}</strong> — {{ user.email }}
69
+ </div>
70
+ </div>
71
+ </v-card-text>
72
+ </v-card>
73
+ </v-col>
74
+ </v-row>
75
+
76
+ <div class="mt-4">
77
+ <h3 class="d-flex align-center mb-2">
78
+ <v-icon class="mr-2">mdi-file-document</v-icon>
79
+ Posts (PostEntity[])
80
+ </h3>
81
+ <v-card v-if="allPosts && allPosts.length > 0" variant="outlined" class="overflow-y-auto" style="max-height: 180px;">
82
+ <v-card-text>
83
+ <div v-for="post in allPosts" :key="post.id" class="pb-2 border-b">
84
+ <div class="font-weight-bold">{{ post.title }}</div>
85
+ <div class="d-flex align-center text-caption text-medium-emphasis">
86
+ <v-icon v-if="post.published" color="success" size="small" class="mr-1">mdi-check-circle</v-icon>
87
+ <v-icon v-else size="small" class="mr-1">mdi-file-document</v-icon>
88
+ <v-icon color="error" size="small" class="mr-1">mdi-heart</v-icon>
89
+ {{ post.likes }}
90
+ </div>
91
+ </div>
92
+ </v-card-text>
93
+ </v-card>
94
+ </div>
95
+
96
+ <v-card variant="outlined" class="mt-4" color="success">
97
+ <v-card-text>
98
+ <div class="font-weight-bold">Typing test:</div>
99
+ <div>All variables are fully typed with TypeScript!</div>
100
+ <div class="font-weight-bold">Reactivity:</div>
101
+ <div>Data updates automatically when you add/remove records!</div>
102
+ <div class="font-weight-bold">Compatibility:</div>
103
+ <div>Your library works perfectly with Vue's reactivity system!</div>
104
+ </v-card-text>
105
+ </v-card>
106
+ </v-card-text>
107
+ </v-card>
108
+ </template>
109
+
110
+ <script setup lang="ts">
111
+ import { useLiveQueryDemo } from '../services/useLiveQueryDemo';
112
+
113
+ const {
114
+ allUsers,
115
+ adultUsers,
116
+ userCount,
117
+ firstUser,
118
+ usersWithProfiles,
119
+ allPosts,
120
+ allProfiles,
121
+ } = useLiveQueryDemo();
122
+ </script>
@@ -0,0 +1,80 @@
1
+ <template>
2
+ <v-card variant="outlined" class="mb-4">
3
+ <v-card-title class="d-flex align-center">
4
+ <v-icon class="mr-2" color="primary">mdi-autorenew</v-icon>
5
+ Dexie ORM for IndexedDB — Overview
6
+ </v-card-title>
7
+ <v-card-text>
8
+ <p class="text-body-2 text-medium-emphasis mb-4">
9
+ TypeScript ORM built on the latest Dexie 4 with first-class type safety and Zod runtime validation.
10
+ </p>
11
+ <v-row>
12
+ <v-col cols="12" sm="6" md="3">
13
+ <div class="d-flex align-center">
14
+ <v-icon class="mr-2" color="primary" size="small">mdi-code-tags</v-icon>
15
+ <span class="text-body-2"><strong>Entity config</strong> via defineEntity()</span>
16
+ </div>
17
+ </v-col>
18
+ <v-col cols="12" sm="6" md="3">
19
+ <div class="d-flex align-center">
20
+ <v-icon class="mr-2" color="primary" size="small">mdi-database</v-icon>
21
+ <span class="text-body-2"><strong>Automatic schema</strong> with PK, indexes, unique</span>
22
+ </div>
23
+ </v-col>
24
+ <v-col cols="12" sm="6" md="3">
25
+ <div class="d-flex align-center">
26
+ <v-icon class="mr-2" color="primary" size="small">mdi-account-group</v-icon>
27
+ <span class="text-body-2"><strong>Relations</strong> with helpers</span>
28
+ </div>
29
+ </v-col>
30
+ <v-col cols="12" sm="6" md="3">
31
+ <div class="d-flex align-center">
32
+ <v-icon class="mr-2" color="primary" size="small">mdi-flask</v-icon>
33
+ <span class="text-body-2"><strong>Zod validation</strong> at runtime</span>
34
+ </div>
35
+ </v-col>
36
+ <v-col cols="12" sm="6" md="3">
37
+ <div class="d-flex align-center">
38
+ <v-icon class="mr-2" color="primary" size="small">mdi-chart-line</v-icon>
39
+ <span class="text-body-2"><strong>Aggregations</strong> (count, avg, sum)</span>
40
+ </div>
41
+ </v-col>
42
+ <v-col cols="12" sm="6" md="3">
43
+ <div class="d-flex align-center">
44
+ <v-icon class="mr-2" color="primary" size="small">mdi-chart-bar</v-icon>
45
+ <span class="text-body-2"><strong>Live queries</strong> with useLiveQuery()</span>
46
+ </div>
47
+ </v-col>
48
+ <v-col cols="12" sm="6" md="3">
49
+ <div class="d-flex align-center">
50
+ <v-icon class="mr-2" color="primary" size="small">mdi-language-typescript</v-icon>
51
+ <span class="text-body-2"><strong>TypeScript</strong> full type safety</span>
52
+ </div>
53
+ </v-col>
54
+ <v-col cols="12" sm="6" md="3">
55
+ <div class="d-flex align-center">
56
+ <v-icon class="mr-2" color="primary" size="small">mdi-cloud-sync</v-icon>
57
+ <span class="text-body-2"><strong>Cloud sync</strong> with Dexie Cloud</span>
58
+ </div>
59
+ </v-col>
60
+ </v-row>
61
+
62
+ <v-divider class="my-4" />
63
+
64
+ <v-btn
65
+ variant="outlined"
66
+ size="small"
67
+ prepend-icon="mdi-open-in-new"
68
+ href="https://github.com/radommaciej/indexed-db-orm/blob/main/README.md"
69
+ target="_blank"
70
+ rel="noopener noreferrer"
71
+ >
72
+ View full documentation
73
+ </v-btn>
74
+ </v-card-text>
75
+ </v-card>
76
+ </template>
77
+
78
+ <script setup lang="ts">
79
+ // No additional logic needed for this component
80
+ </script>