@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.
- package/.vscode/extensions.json +5 -0
- package/README.md +1280 -0
- package/angular-demo-app/README.md +84 -0
- package/angular-demo-app/angular.json +109 -0
- package/angular-demo-app/package-lock.json +14215 -0
- package/angular-demo-app/package.json +41 -0
- package/angular-demo-app/src/app/app.component.ts +481 -0
- package/angular-demo-app/src/app/app.routes.ts +8 -0
- package/angular-demo-app/src/app/components/actions.component.ts +202 -0
- package/angular-demo-app/src/app/components/cloud-sync-demo.component.ts +296 -0
- package/angular-demo-app/src/app/components/live-query-demo.component.ts +307 -0
- package/angular-demo-app/src/app/components/main-info.component.ts +148 -0
- package/angular-demo-app/src/app/components/posts-live-query-demo.component.ts +336 -0
- package/angular-demo-app/src/app/components/typescript-demo.component.ts +268 -0
- package/angular-demo-app/src/entities/post-tag.entity.ts +25 -0
- package/angular-demo-app/src/entities/post.entity.ts +49 -0
- package/angular-demo-app/src/entities/profile.entity.ts +42 -0
- package/angular-demo-app/src/entities/tag.entity.ts +36 -0
- package/angular-demo-app/src/entities/user.entity.ts +59 -0
- package/angular-demo-app/src/favicon.ico +1 -0
- package/angular-demo-app/src/index.html +16 -0
- package/angular-demo-app/src/main.ts +13 -0
- package/angular-demo-app/src/services/app-logic.service.ts +449 -0
- package/angular-demo-app/src/services/cloud-sync.service.ts +95 -0
- package/angular-demo-app/src/services/database.service.ts +26 -0
- package/angular-demo-app/src/services/live-query.service.ts +63 -0
- package/angular-demo-app/src/services/posts-live-query.service.ts +86 -0
- package/angular-demo-app/src/services/typescript-demo.service.ts +59 -0
- package/angular-demo-app/src/styles.scss +50 -0
- package/angular-demo-app/tsconfig.app.json +13 -0
- package/angular-demo-app/tsconfig.json +34 -0
- package/angular-demo-app/tsconfig.spec.json +13 -0
- package/dist/Database.d.ts +206 -0
- package/dist/Database.js +288 -0
- package/dist/decorators/Column.d.ts +79 -0
- package/dist/decorators/Column.js +236 -0
- package/dist/decorators/Entity.d.ts +32 -0
- package/dist/decorators/Entity.js +44 -0
- package/dist/decorators/Relation.d.ts +70 -0
- package/dist/decorators/Relation.js +120 -0
- package/dist/decorators/index.d.ts +3 -0
- package/dist/decorators/index.js +3 -0
- package/dist/errors/ValidationError.d.ts +4 -0
- package/dist/errors/ValidationError.js +8 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +7 -0
- package/dist/metadata/Column.d.ts +8 -0
- package/dist/metadata/Column.js +44 -0
- package/dist/metadata/Entity.d.ts +11 -0
- package/dist/metadata/Entity.js +21 -0
- package/dist/metadata/Relation.d.ts +20 -0
- package/dist/metadata/Relation.js +74 -0
- package/dist/metadata/index.d.ts +3 -0
- package/dist/metadata/index.js +3 -0
- package/dist/services/AggregationService.d.ts +38 -0
- package/dist/services/AggregationService.js +229 -0
- package/dist/services/BaseEntity.d.ts +32 -0
- package/dist/services/BaseEntity.js +62 -0
- package/dist/services/CloudSyncService.d.ts +100 -0
- package/dist/services/CloudSyncService.js +196 -0
- package/dist/services/DecoratorUtils.d.ts +12 -0
- package/dist/services/DecoratorUtils.js +10 -0
- package/dist/services/EntityFactory.d.ts +25 -0
- package/dist/services/EntityFactory.js +27 -0
- package/dist/services/EntityRegistry.d.ts +61 -0
- package/dist/services/EntityRegistry.js +56 -0
- package/dist/services/EntitySchema.d.ts +56 -0
- package/dist/services/EntitySchema.js +125 -0
- package/dist/services/MigrationManager.d.ts +70 -0
- package/dist/services/MigrationManager.js +181 -0
- package/dist/services/RelationLoader.d.ts +66 -0
- package/dist/services/RelationLoader.js +310 -0
- package/dist/services/SchemaBuilder.d.ts +68 -0
- package/dist/services/SchemaBuilder.js +191 -0
- package/dist/services/index.d.ts +7 -0
- package/dist/services/index.js +7 -0
- package/dist/types.d.ts +152 -0
- package/dist/types.js +1 -0
- package/dist/utils/logger.d.ts +12 -0
- package/dist/utils/logger.js +16 -0
- package/eslint.config.js +49 -0
- package/homepage/favicon.svg +36 -0
- package/homepage/index.html +1725 -0
- package/package.json +78 -0
- package/react-demo-app/README.md +61 -0
- package/react-demo-app/eslint.config.js +60 -0
- package/react-demo-app/index.html +13 -0
- package/react-demo-app/package-lock.json +4955 -0
- package/react-demo-app/package.json +39 -0
- package/react-demo-app/src/App.tsx +172 -0
- package/react-demo-app/src/assets/react.svg +1 -0
- package/react-demo-app/src/components/Actions.tsx +171 -0
- package/react-demo-app/src/components/CloudSyncDemo.tsx +191 -0
- package/react-demo-app/src/components/LiveQueryDemo.tsx +122 -0
- package/react-demo-app/src/components/MainInfo.tsx +75 -0
- package/react-demo-app/src/components/PostsLiveQueryDemo.tsx +185 -0
- package/react-demo-app/src/components/TypeScriptDemo.tsx +190 -0
- package/react-demo-app/src/database/Database.ts +30 -0
- package/react-demo-app/src/entities/Post.ts +48 -0
- package/react-demo-app/src/entities/PostTag.ts +26 -0
- package/react-demo-app/src/entities/Profile.ts +41 -0
- package/react-demo-app/src/entities/Tag.ts +35 -0
- package/react-demo-app/src/entities/User.ts +61 -0
- package/react-demo-app/src/hooks/useAppLogic.ts +565 -0
- package/react-demo-app/src/hooks/useCloudSyncDemo.ts +84 -0
- package/react-demo-app/src/hooks/useLiveQueryDemo.ts +68 -0
- package/react-demo-app/src/hooks/usePostsLiveQueryDemo.ts +64 -0
- package/react-demo-app/src/hooks/useTypeScriptDemo.ts +43 -0
- package/react-demo-app/src/index.css +26 -0
- package/react-demo-app/src/main.tsx +18 -0
- package/react-demo-app/src/migrations/001-add-user-email-index.ts +17 -0
- package/react-demo-app/src/migrations/002-add-post-category.ts +37 -0
- package/react-demo-app/src/migrations/index.ts +8 -0
- package/react-demo-app/src/vite-env.d.ts +1 -0
- package/react-demo-app/tsconfig.app.json +22 -0
- package/react-demo-app/tsconfig.json +6 -0
- package/react-demo-app/vite.config.ts +10 -0
- package/src/Database.ts +405 -0
- package/src/errors/ValidationError.ts +9 -0
- package/src/index.ts +13 -0
- package/src/metadata/Column.ts +74 -0
- package/src/metadata/Entity.ts +42 -0
- package/src/metadata/Relation.ts +121 -0
- package/src/metadata/index.ts +5 -0
- package/src/services/AggregationService.ts +348 -0
- package/src/services/BaseEntity.ts +77 -0
- package/src/services/CloudSyncService.ts +248 -0
- package/src/services/EntityFactory.ts +35 -0
- package/src/services/EntityRegistry.ts +109 -0
- package/src/services/EntitySchema.ts +154 -0
- package/src/services/MigrationManager.ts +276 -0
- package/src/services/RelationLoader.ts +532 -0
- package/src/services/SchemaBuilder.ts +237 -0
- package/src/services/index.ts +7 -0
- package/src/types.d.ts +1 -0
- package/src/types.ts +169 -0
- package/src/utils/logger.ts +40 -0
- package/svelte-demo-app/README.md +61 -0
- package/svelte-demo-app/package-lock.json +3000 -0
- package/svelte-demo-app/package.json +30 -0
- package/svelte-demo-app/src/app.d.ts +12 -0
- package/svelte-demo-app/src/app.html +13 -0
- package/svelte-demo-app/src/components/Actions.svelte +121 -0
- package/svelte-demo-app/src/components/CloudSyncDemo.svelte +333 -0
- package/svelte-demo-app/src/components/LiveQueryDemo.svelte +191 -0
- package/svelte-demo-app/src/components/MainInfo.svelte +133 -0
- package/svelte-demo-app/src/components/PostsLiveQueryDemo.svelte +330 -0
- package/svelte-demo-app/src/components/TypeScriptDemo.svelte +251 -0
- package/svelte-demo-app/src/database/Database.ts +29 -0
- package/svelte-demo-app/src/entities/Post.ts +46 -0
- package/svelte-demo-app/src/entities/PostTag.ts +22 -0
- package/svelte-demo-app/src/entities/Profile.ts +39 -0
- package/svelte-demo-app/src/entities/Tag.ts +33 -0
- package/svelte-demo-app/src/entities/User.ts +62 -0
- package/svelte-demo-app/src/lib/database/Database.ts +30 -0
- package/svelte-demo-app/src/lib/entities/Post.ts +47 -0
- package/svelte-demo-app/src/lib/entities/PostTag.ts +23 -0
- package/svelte-demo-app/src/lib/entities/Profile.ts +40 -0
- package/svelte-demo-app/src/lib/entities/Tag.ts +34 -0
- package/svelte-demo-app/src/lib/entities/User.ts +59 -0
- package/svelte-demo-app/src/lib/index.ts +7 -0
- package/svelte-demo-app/src/lib/migrations/001-add-user-email-index.ts +17 -0
- package/svelte-demo-app/src/lib/migrations/002-add-post-category.ts +37 -0
- package/svelte-demo-app/src/lib/migrations/index.ts +8 -0
- package/svelte-demo-app/src/migrations/001-add-user-email-index.ts +17 -0
- package/svelte-demo-app/src/migrations/002-add-post-category.ts +37 -0
- package/svelte-demo-app/src/migrations/index.ts +8 -0
- package/svelte-demo-app/src/routes/+layout.js +3 -0
- package/svelte-demo-app/src/routes/+layout.svelte +228 -0
- package/svelte-demo-app/src/routes/+page.js +3 -0
- package/svelte-demo-app/src/routes/+page.svelte +1305 -0
- package/svelte-demo-app/src/stores/appStore.js +603 -0
- package/svelte-demo-app/svelte.config.js +18 -0
- package/svelte-demo-app/tsconfig.json +14 -0
- package/svelte-demo-app/vite.config.ts +6 -0
- package/tests/aggregation.e2e.test.ts +87 -0
- package/tests/base-entity.e2e.test.ts +47 -0
- package/tests/database-api.e2e.test.ts +177 -0
- package/tests/decorators.e2e.test.ts +40 -0
- package/tests/entity-schema.e2e.test.ts +58 -0
- package/tests/relation-loader-table-names.test.ts +192 -0
- package/tests/relations.e2e.test.ts +178 -0
- package/tests/zod-runtime.e2e.test.ts +69 -0
- package/tsconfig.json +21 -0
- package/vitest.config.ts +21 -0
- package/vitest.setup.ts +27 -0
- package/vue-demo-app/README.md +61 -0
- package/vue-demo-app/index.html +13 -0
- package/vue-demo-app/package-lock.json +1537 -0
- package/vue-demo-app/package.json +27 -0
- package/vue-demo-app/src/App.vue +100 -0
- package/vue-demo-app/src/components/Actions.vue +135 -0
- package/vue-demo-app/src/components/CloudSyncDemo.vue +139 -0
- package/vue-demo-app/src/components/LiveQueryDemo.vue +122 -0
- package/vue-demo-app/src/components/MainInfo.vue +80 -0
- package/vue-demo-app/src/components/PostsLiveQueryDemo.vue +136 -0
- package/vue-demo-app/src/components/TypeScriptDemo.vue +133 -0
- package/vue-demo-app/src/database/Database.ts +29 -0
- package/vue-demo-app/src/entities/Post.ts +48 -0
- package/vue-demo-app/src/entities/PostTag.ts +24 -0
- package/vue-demo-app/src/entities/Profile.ts +41 -0
- package/vue-demo-app/src/entities/Tag.ts +35 -0
- package/vue-demo-app/src/entities/User.ts +61 -0
- package/vue-demo-app/src/main.ts +29 -0
- package/vue-demo-app/src/migrations/001-add-user-email-index.ts +23 -0
- package/vue-demo-app/src/migrations/002-add-post-category.ts +46 -0
- package/vue-demo-app/src/migrations/index.ts +14 -0
- package/vue-demo-app/src/services/useAppLogic.ts +565 -0
- package/vue-demo-app/src/services/useCloudSyncDemo.ts +84 -0
- package/vue-demo-app/src/services/useLiveQueryDemo.ts +82 -0
- package/vue-demo-app/src/services/usePostsLiveQueryDemo.ts +77 -0
- package/vue-demo-app/src/services/useTypeScriptDemo.ts +56 -0
- package/vue-demo-app/src/vite-env.d.ts +1 -0
- package/vue-demo-app/tsconfig.json +25 -0
- package/vue-demo-app/tsconfig.node.json +10 -0
- 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>
|