diff --git a/assets/js/app/editor/index.js b/assets/js/app/editor/index.js
index 62330e7be9..10702276e2 100644
--- a/assets/js/app/editor/index.js
+++ b/assets/js/app/editor/index.js
@@ -1,8 +1,4 @@
import Vue from 'vue';
-/**
- * VueX Store
- */
-import store from './store';
/**
* Components
*/
@@ -52,7 +48,6 @@ const editorSelector = '#' + id;
if (document.getElementById(id)) {
new Vue({
- store,
el: editorSelector,
name: 'BoltEditor',
});
diff --git a/assets/js/app/editor/store/index.js b/assets/js/app/editor/store/index.js
deleted file mode 100644
index f6bf86fb29..0000000000
--- a/assets/js/app/editor/store/index.js
+++ /dev/null
@@ -1,11 +0,0 @@
-import Vue from 'vue';
-import Vuex from 'vuex';
-import general from './modules/general/';
-
-Vue.use(Vuex);
-
-export default new Vuex.Store({
- modules: {
- general,
- },
-});
diff --git a/assets/js/app/editor/store/modules/general/_actions.js b/assets/js/app/editor/store/modules/general/_actions.js
deleted file mode 100644
index ac57ae0a67..0000000000
--- a/assets/js/app/editor/store/modules/general/_actions.js
+++ /dev/null
@@ -1,7 +0,0 @@
-const actions = {
- slimSidebar({ commit }, arg) {
- commit('slimSidebar', arg);
- },
-};
-
-export default actions;
diff --git a/assets/js/app/editor/store/modules/general/_getters.js b/assets/js/app/editor/store/modules/general/_getters.js
deleted file mode 100644
index 6200410724..0000000000
--- a/assets/js/app/editor/store/modules/general/_getters.js
+++ /dev/null
@@ -1,5 +0,0 @@
-const getters = {
- slimSidebar: state => state.slimSidebar,
-};
-
-export default getters;
diff --git a/assets/js/app/editor/store/modules/general/_mutations.js b/assets/js/app/editor/store/modules/general/_mutations.js
deleted file mode 100644
index faa8f04445..0000000000
--- a/assets/js/app/editor/store/modules/general/_mutations.js
+++ /dev/null
@@ -1,7 +0,0 @@
-const mutations = {
- slimSidebar(state, arg) {
- state.slimSidebar = arg;
- },
-};
-
-export default mutations;
diff --git a/assets/js/app/editor/store/modules/general/_state.js b/assets/js/app/editor/store/modules/general/_state.js
deleted file mode 100644
index fee92b329c..0000000000
--- a/assets/js/app/editor/store/modules/general/_state.js
+++ /dev/null
@@ -1,5 +0,0 @@
-const state = {
- slimSidebar: false,
-};
-
-export default state;
diff --git a/assets/js/app/editor/store/modules/general/index.js b/assets/js/app/editor/store/modules/general/index.js
deleted file mode 100644
index 8f2132fec7..0000000000
--- a/assets/js/app/editor/store/modules/general/index.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import state from './_state';
-import actions from './_actions';
-import mutations from './_mutations';
-import getters from './_getters';
-
-export default {
- namespaced: true,
- state,
- getters,
- actions,
- mutations,
-};
diff --git a/assets/js/app/listing/Components/Filter.vue b/assets/js/app/listing/Components/Filter.vue
index fc3182d317..ce97172e7e 100644
--- a/assets/js/app/listing/Components/Filter.vue
+++ b/assets/js/app/listing/Components/Filter.vue
@@ -60,7 +60,9 @@
diff --git a/assets/js/app/listing/Components/SelectBox.vue b/assets/js/app/listing/Components/SelectBox.vue
index be90b8ef20..0fb0e098bd 100644
--- a/assets/js/app/listing/Components/SelectBox.vue
+++ b/assets/js/app/listing/Components/SelectBox.vue
@@ -47,7 +47,9 @@
diff --git a/assets/js/app/listing/Components/Table/Row/_Checkbox.vue b/assets/js/app/listing/Components/Table/Row/_Checkbox.vue
index 01651848f9..6b3e1f14ab 100644
--- a/assets/js/app/listing/Components/Table/Row/_Checkbox.vue
+++ b/assets/js/app/listing/Components/Table/Row/_Checkbox.vue
@@ -8,6 +8,9 @@
diff --git a/assets/js/app/listing/Components/Table/Row/index.vue b/assets/js/app/listing/Components/Table/Row/index.vue
index 11264a0177..f5ab6adb1b 100644
--- a/assets/js/app/listing/Components/Table/Row/index.vue
+++ b/assets/js/app/listing/Components/Table/Row/index.vue
@@ -45,7 +45,9 @@
diff --git a/assets/js/app/listing/index.js b/assets/js/app/listing/index.js
index 9bc140bff2..3b67d85dea 100644
--- a/assets/js/app/listing/index.js
+++ b/assets/js/app/listing/index.js
@@ -1,8 +1,8 @@
import Vue from 'vue';
/**
- * VueX Store
+ * Pinia
*/
-import store from './store';
+import { createPinia, PiniaVuePlugin } from 'pinia';
/**
* Components
*/
@@ -11,6 +11,8 @@ import Filter from './Components/Filter';
import Table from './Components/Table';
import SelectBox from './Components/SelectBox';
+Vue.use(PiniaVuePlugin);
+
/**
* Register Components
*/
@@ -18,7 +20,7 @@ const id = 'listing';
if (document.getElementById(id)) {
new Vue({
- store,
+ pinia: createPinia(),
el: '#' + id,
name: 'BoltListing',
components: {
diff --git a/assets/js/app/listing/mixins/type.js b/assets/js/app/listing/mixins/type.js
index 2bb5e96e23..5d06abca4c 100644
--- a/assets/js/app/listing/mixins/type.js
+++ b/assets/js/app/listing/mixins/type.js
@@ -1,7 +1,8 @@
+import { mapState } from 'pinia';
+import { useGeneralStore } from '../store';
+
export default {
computed: {
- type() {
- return this.$store.getters['general/getType'];
- },
+ ...mapState(useGeneralStore, ['type']),
},
};
diff --git a/assets/js/app/listing/store/index.js b/assets/js/app/listing/store/index.js
deleted file mode 100644
index fefb9d7312..0000000000
--- a/assets/js/app/listing/store/index.js
+++ /dev/null
@@ -1,18 +0,0 @@
-import Vue from 'vue';
-import Vuex from 'vuex';
-/**
- * modules
- */
-import general from './modules/general/';
-import listing from './modules/listing/';
-import selecting from './modules/selecting/';
-
-Vue.use(Vuex);
-
-export default new Vuex.Store({
- modules: {
- general,
- listing,
- selecting,
- },
-});
diff --git a/assets/js/app/listing/store/index.ts b/assets/js/app/listing/store/index.ts
new file mode 100644
index 0000000000..4c24b144c4
--- /dev/null
+++ b/assets/js/app/listing/store/index.ts
@@ -0,0 +1,52 @@
+import { defineStore } from 'pinia';
+import type { ListingRecord } from '../types';
+
+interface GeneralState {
+ type: string | null;
+ rowSize: string;
+ sorting: boolean;
+}
+
+export const useGeneralStore = defineStore('listing-general', {
+ state: (): GeneralState => ({
+ type: null,
+ rowSize: 'normal',
+ sorting: false,
+ }),
+});
+
+interface ListingState {
+ records: ListingRecord[];
+}
+
+export const useListingStore = defineStore('listing', {
+ state: (): ListingState => ({
+ records: [],
+ }),
+});
+
+interface SelectingState {
+ selectAll: boolean;
+ selected: number[];
+}
+
+export const useSelectingStore = defineStore('selecting', {
+ state: (): SelectingState => ({
+ selectAll: false,
+ selected: [],
+ }),
+ getters: {
+ selectedCount: state => state.selected.length,
+ },
+ actions: {
+ select(id: number) {
+ if (!this.selected.includes(id)) {
+ this.selected.push(id);
+ }
+ },
+ deSelect(id: number) {
+ const index = this.selected.indexOf(id);
+ if (index > -1) this.selected.splice(index, 1);
+ },
+ },
+});
diff --git a/assets/js/app/listing/store/modules/general/_actions.js b/assets/js/app/listing/store/modules/general/_actions.js
deleted file mode 100644
index b2e9bfaea7..0000000000
--- a/assets/js/app/listing/store/modules/general/_actions.js
+++ /dev/null
@@ -1,13 +0,0 @@
-const actions = {
- setType({ commit }, data) {
- commit('setType', data);
- },
- setRowSize({ commit }, data) {
- commit('setRowSize', data);
- },
- setSorting({ commit }, arg) {
- commit('setSorting', arg);
- },
-};
-
-export default actions;
diff --git a/assets/js/app/listing/store/modules/general/_getters.js b/assets/js/app/listing/store/modules/general/_getters.js
deleted file mode 100644
index 0c3a835f78..0000000000
--- a/assets/js/app/listing/store/modules/general/_getters.js
+++ /dev/null
@@ -1,7 +0,0 @@
-const getters = {
- getType: state => state.type,
- getRowSize: state => state.rowSize,
- getSorting: state => state.sorting,
-};
-
-export default getters;
diff --git a/assets/js/app/listing/store/modules/general/_mutations.js b/assets/js/app/listing/store/modules/general/_mutations.js
deleted file mode 100644
index 0c6650d8b7..0000000000
--- a/assets/js/app/listing/store/modules/general/_mutations.js
+++ /dev/null
@@ -1,13 +0,0 @@
-const mutations = {
- setType(state, data) {
- state.type = data;
- },
- setRowSize(state, data) {
- state.rowSize = data;
- },
- setSorting(state, arg) {
- state.sorting = arg;
- },
-};
-
-export default mutations;
diff --git a/assets/js/app/listing/store/modules/general/_state.js b/assets/js/app/listing/store/modules/general/_state.js
deleted file mode 100644
index 0a5536271b..0000000000
--- a/assets/js/app/listing/store/modules/general/_state.js
+++ /dev/null
@@ -1,7 +0,0 @@
-const state = {
- type: null,
- rowSize: 'normal',
- sorting: false,
-};
-
-export default state;
diff --git a/assets/js/app/listing/store/modules/general/index.js b/assets/js/app/listing/store/modules/general/index.js
deleted file mode 100644
index 8f2132fec7..0000000000
--- a/assets/js/app/listing/store/modules/general/index.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import state from './_state';
-import actions from './_actions';
-import mutations from './_mutations';
-import getters from './_getters';
-
-export default {
- namespaced: true,
- state,
- getters,
- actions,
- mutations,
-};
diff --git a/assets/js/app/listing/store/modules/listing/_actions.js b/assets/js/app/listing/store/modules/listing/_actions.js
deleted file mode 100644
index ade7fa96c3..0000000000
--- a/assets/js/app/listing/store/modules/listing/_actions.js
+++ /dev/null
@@ -1,7 +0,0 @@
-const actions = {
- setRecords({ commit }, data) {
- commit('setRecords', data);
- },
-};
-
-export default actions;
diff --git a/assets/js/app/listing/store/modules/listing/_getters.js b/assets/js/app/listing/store/modules/listing/_getters.js
deleted file mode 100644
index 0f8b04ba8f..0000000000
--- a/assets/js/app/listing/store/modules/listing/_getters.js
+++ /dev/null
@@ -1,10 +0,0 @@
-const getters = {
- getRecords: state => state.records,
- getOrder(state) {
- return state.records.map(record => {
- return record.id;
- });
- },
-};
-
-export default getters;
diff --git a/assets/js/app/listing/store/modules/listing/_mutations.js b/assets/js/app/listing/store/modules/listing/_mutations.js
deleted file mode 100644
index 6f43fad4f9..0000000000
--- a/assets/js/app/listing/store/modules/listing/_mutations.js
+++ /dev/null
@@ -1,7 +0,0 @@
-const mutations = {
- setRecords(state, data) {
- state.records = data;
- },
-};
-
-export default mutations;
diff --git a/assets/js/app/listing/store/modules/listing/_state.js b/assets/js/app/listing/store/modules/listing/_state.js
deleted file mode 100644
index 493859e792..0000000000
--- a/assets/js/app/listing/store/modules/listing/_state.js
+++ /dev/null
@@ -1,5 +0,0 @@
-const state = {
- records: [],
-};
-
-export default state;
diff --git a/assets/js/app/listing/store/modules/listing/index.js b/assets/js/app/listing/store/modules/listing/index.js
deleted file mode 100644
index 8f2132fec7..0000000000
--- a/assets/js/app/listing/store/modules/listing/index.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import state from './_state';
-import actions from './_actions';
-import mutations from './_mutations';
-import getters from './_getters';
-
-export default {
- namespaced: true,
- state,
- getters,
- actions,
- mutations,
-};
diff --git a/assets/js/app/listing/store/modules/selecting/_actions.js b/assets/js/app/listing/store/modules/selecting/_actions.js
deleted file mode 100644
index a9ca605829..0000000000
--- a/assets/js/app/listing/store/modules/selecting/_actions.js
+++ /dev/null
@@ -1,13 +0,0 @@
-const actions = {
- selectAll({ commit }, arg) {
- commit('selectAll', arg);
- },
- select({ commit }, id) {
- commit('select', id);
- },
- deSelect({ commit }, id) {
- commit('deSelect', id);
- },
-};
-
-export default actions;
diff --git a/assets/js/app/listing/store/modules/selecting/_getters.js b/assets/js/app/listing/store/modules/selecting/_getters.js
deleted file mode 100644
index 6389257de8..0000000000
--- a/assets/js/app/listing/store/modules/selecting/_getters.js
+++ /dev/null
@@ -1,7 +0,0 @@
-const getters = {
- selectAll: state => state.selectAll,
- selectedCount: state => state.selectedCount,
- selected: state => state.selected,
-};
-
-export default getters;
diff --git a/assets/js/app/listing/store/modules/selecting/_mutations.js b/assets/js/app/listing/store/modules/selecting/_mutations.js
deleted file mode 100644
index 6a55895240..0000000000
--- a/assets/js/app/listing/store/modules/selecting/_mutations.js
+++ /dev/null
@@ -1,16 +0,0 @@
-const mutations = {
- selectAll(state, arg) {
- state.selectAll = arg;
- },
- select(state, id) {
- state.selectedCount++;
- state.selected.push(id);
- },
- deSelect(state, id) {
- state.selectedCount--;
- let index = state.selected.indexOf(id);
- if (index > -1) state.selected.splice(index, 1);
- },
-};
-
-export default mutations;
diff --git a/assets/js/app/listing/store/modules/selecting/_state.js b/assets/js/app/listing/store/modules/selecting/_state.js
deleted file mode 100644
index 8a0405f032..0000000000
--- a/assets/js/app/listing/store/modules/selecting/_state.js
+++ /dev/null
@@ -1,7 +0,0 @@
-const state = {
- selectAll: false,
- selectedCount: 0,
- selected: [],
-};
-
-export default state;
diff --git a/assets/js/app/listing/store/modules/selecting/index.js b/assets/js/app/listing/store/modules/selecting/index.js
deleted file mode 100644
index 8f2132fec7..0000000000
--- a/assets/js/app/listing/store/modules/selecting/index.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import state from './_state';
-import actions from './_actions';
-import mutations from './_mutations';
-import getters from './_getters';
-
-export default {
- namespaced: true,
- state,
- getters,
- actions,
- mutations,
-};
diff --git a/assets/js/app/listing/store/modules/type/_actions.js b/assets/js/app/listing/store/modules/type/_actions.js
deleted file mode 100644
index 315235d44b..0000000000
--- a/assets/js/app/listing/store/modules/type/_actions.js
+++ /dev/null
@@ -1,7 +0,0 @@
-const actions = {
- setType({ commit }, data) {
- commit('setType', data);
- },
-};
-
-export default actions;
diff --git a/assets/js/app/listing/store/modules/type/_getters.js b/assets/js/app/listing/store/modules/type/_getters.js
deleted file mode 100644
index ad23700e62..0000000000
--- a/assets/js/app/listing/store/modules/type/_getters.js
+++ /dev/null
@@ -1,5 +0,0 @@
-const getters = {
- getType: state => state.type,
-};
-
-export default getters;
diff --git a/assets/js/app/listing/store/modules/type/_mutations.js b/assets/js/app/listing/store/modules/type/_mutations.js
deleted file mode 100644
index 7c2746f532..0000000000
--- a/assets/js/app/listing/store/modules/type/_mutations.js
+++ /dev/null
@@ -1,7 +0,0 @@
-const mutations = {
- setType(state, data) {
- state.type = data;
- },
-};
-
-export default mutations;
diff --git a/assets/js/app/listing/store/modules/type/_state.js b/assets/js/app/listing/store/modules/type/_state.js
deleted file mode 100644
index edec4327aa..0000000000
--- a/assets/js/app/listing/store/modules/type/_state.js
+++ /dev/null
@@ -1,5 +0,0 @@
-const state = {
- type: null,
-};
-
-export default state;
diff --git a/assets/js/app/listing/store/modules/type/index.js b/assets/js/app/listing/store/modules/type/index.js
deleted file mode 100644
index 8f2132fec7..0000000000
--- a/assets/js/app/listing/store/modules/type/index.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import state from './_state';
-import actions from './_actions';
-import mutations from './_mutations';
-import getters from './_getters';
-
-export default {
- namespaced: true,
- state,
- getters,
- actions,
- mutations,
-};
diff --git a/assets/js/app/listing/types.ts b/assets/js/app/listing/types.ts
new file mode 100644
index 0000000000..99677acc00
--- /dev/null
+++ b/assets/js/app/listing/types.ts
@@ -0,0 +1,33 @@
+export type LocalizedString = string | Record;
+
+export type ListingImage = {
+ thumbnail: string;
+ alt?: string | null;
+};
+
+export type ListingRecord = {
+ id?: number;
+ title?: string;
+ status?: string;
+ authorName?: string;
+ createdAt?: string | null;
+ publishedAt?: string | null;
+ modifiedAt?: string | null;
+ fieldValues?: {
+ slug?: LocalizedString | null;
+ };
+ extras?: {
+ editLink?: string;
+ title?: string;
+ feature?: string | null;
+ excerpt?: string;
+ image?: ListingImage | null;
+ icon?: string;
+ link?: string;
+ statusLink?: string;
+ duplicateLink?: string;
+ deleteLink?: string;
+ singular_name?: string;
+ contentTypeOverviewLink?: string;
+ };
+};
diff --git a/assets/js/app/sidebar/Components/Sidebar.vue b/assets/js/app/sidebar/Components/Sidebar.vue
index 4e2a5c1b96..f0c34e8138 100644
--- a/assets/js/app/sidebar/Components/Sidebar.vue
+++ b/assets/js/app/sidebar/Components/Sidebar.vue
@@ -11,6 +11,7 @@
diff --git a/assets/js/app/toolbar/index.js b/assets/js/app/toolbar/index.js
index ae690d9d95..fb90909443 100644
--- a/assets/js/app/toolbar/index.js
+++ b/assets/js/app/toolbar/index.js
@@ -1,13 +1,15 @@
import Vue from 'vue';
/**
- * VueX Store
+ * Pinia
*/
-import store from './store';
+import { createPinia, PiniaVuePlugin } from 'pinia';
/**
* Components
*/
import Toolbar from './Components/Toolbar.vue';
+Vue.use(PiniaVuePlugin);
+
/**
* Register Components
*/
@@ -15,7 +17,7 @@ const id = 'toolbar';
if (document.getElementById(id)) {
new Vue({
- store,
+ pinia: createPinia(),
el: '#' + id,
name: 'BoltToolbar',
components: {
diff --git a/assets/js/app/toolbar/store/index.js b/assets/js/app/toolbar/store/index.js
deleted file mode 100644
index f6bf86fb29..0000000000
--- a/assets/js/app/toolbar/store/index.js
+++ /dev/null
@@ -1,11 +0,0 @@
-import Vue from 'vue';
-import Vuex from 'vuex';
-import general from './modules/general/';
-
-Vue.use(Vuex);
-
-export default new Vuex.Store({
- modules: {
- general,
- },
-});
diff --git a/assets/js/app/toolbar/store/index.ts b/assets/js/app/toolbar/store/index.ts
new file mode 100644
index 0000000000..b0799bb102
--- /dev/null
+++ b/assets/js/app/toolbar/store/index.ts
@@ -0,0 +1,11 @@
+import { defineStore } from 'pinia';
+
+interface GeneralState {
+ toolbarColor: string;
+}
+
+export const useGeneralStore = defineStore('toolbar-general', {
+ state: (): GeneralState => ({
+ toolbarColor: '',
+ }),
+});
diff --git a/assets/js/app/toolbar/store/modules/general/_actions.js b/assets/js/app/toolbar/store/modules/general/_actions.js
deleted file mode 100644
index 1135f81f78..0000000000
--- a/assets/js/app/toolbar/store/modules/general/_actions.js
+++ /dev/null
@@ -1,7 +0,0 @@
-const actions = {
- toolbarColor({ commit }, data) {
- commit('toolbarColor', data);
- },
-};
-
-export default actions;
diff --git a/assets/js/app/toolbar/store/modules/general/_getters.js b/assets/js/app/toolbar/store/modules/general/_getters.js
deleted file mode 100644
index 4d001ba273..0000000000
--- a/assets/js/app/toolbar/store/modules/general/_getters.js
+++ /dev/null
@@ -1,5 +0,0 @@
-const getters = {
- toolbarColor: state => state.toolbarColor,
-};
-
-export default getters;
diff --git a/assets/js/app/toolbar/store/modules/general/_mutations.js b/assets/js/app/toolbar/store/modules/general/_mutations.js
deleted file mode 100644
index 26efe7ac28..0000000000
--- a/assets/js/app/toolbar/store/modules/general/_mutations.js
+++ /dev/null
@@ -1,7 +0,0 @@
-const mutations = {
- toolbarColor(state, data) {
- state.toolbarColor = data;
- },
-};
-
-export default mutations;
diff --git a/assets/js/app/toolbar/store/modules/general/_state.js b/assets/js/app/toolbar/store/modules/general/_state.js
deleted file mode 100644
index 20a7e0794f..0000000000
--- a/assets/js/app/toolbar/store/modules/general/_state.js
+++ /dev/null
@@ -1,5 +0,0 @@
-const state = {
- toolbarColor: null,
-};
-
-export default state;
diff --git a/assets/js/app/toolbar/store/modules/general/index.js b/assets/js/app/toolbar/store/modules/general/index.js
deleted file mode 100644
index 8f2132fec7..0000000000
--- a/assets/js/app/toolbar/store/modules/general/index.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import state from './_state';
-import actions from './_actions';
-import mutations from './_mutations';
-import getters from './_getters';
-
-export default {
- namespaced: true,
- state,
- getters,
- actions,
- mutations,
-};
diff --git a/package-lock.json b/package-lock.json
index 5a6cb22d23..822f7fe842 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -24,6 +24,7 @@
"luxon": "^1.28.1",
"no-scroll": "^2.1.1",
"node-vibrant": "^4.0.4",
+ "pinia": "^2.3.1",
"popper.js": "^1.16.1",
"register-service-worker": "^1.7.2",
"selectize": "^0.12.6",
@@ -35,7 +36,6 @@
"vue-multiselect": "^2.1.8",
"vue-trumbowyg": "^3.6.2",
"vuedraggable": "^2.24.3",
- "vuex": "^3.6.2",
"zxcvbn": "^4.4.2"
},
"devDependencies": {
@@ -5786,6 +5786,12 @@
"dev": true,
"license": "ISC"
},
+ "node_modules/@vue/devtools-api": {
+ "version": "6.6.4",
+ "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz",
+ "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==",
+ "license": "MIT"
+ },
"node_modules/@vue/test-utils": {
"version": "1.3.6",
"resolved": "https://registry.npmjs.org/@vue/test-utils/-/test-utils-1.3.6.tgz",
@@ -15017,6 +15023,54 @@
"node": ">=6"
}
},
+ "node_modules/pinia": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.3.1.tgz",
+ "integrity": "sha512-khUlZSwt9xXCaTbbxFYBKDc/bWAGWJjOgvxETwkTN7KRm66EeT1ZdZj6i2ceh9sP2Pzqsbc704r2yngBrxBVug==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/devtools-api": "^6.6.3",
+ "vue-demi": "^0.14.10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/posva"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.4.4",
+ "vue": "^2.7.0 || ^3.5.11"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/pinia/node_modules/vue-demi": {
+ "version": "0.14.10",
+ "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz",
+ "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "vue-demi-fix": "bin/vue-demi-fix.js",
+ "vue-demi-switch": "bin/vue-demi-switch.js"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "@vue/composition-api": "^1.0.0-rc.1",
+ "vue": "^3.0.0-0 || ^2.6.0"
+ },
+ "peerDependenciesMeta": {
+ "@vue/composition-api": {
+ "optional": true
+ }
+ }
+ },
"node_modules/pinkie": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
@@ -20207,7 +20261,7 @@
"version": "6.0.3",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz",
"integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==",
- "dev": true,
+ "devOptional": true,
"license": "Apache-2.0",
"bin": {
"tsc": "bin/tsc",
@@ -20949,15 +21003,6 @@
"sortablejs": "1.10.2"
}
},
- "node_modules/vuex": {
- "version": "3.6.2",
- "resolved": "https://registry.npmjs.org/vuex/-/vuex-3.6.2.tgz",
- "integrity": "sha512-ETW44IqCgBpVomy520DT5jf8n0zoCac+sxWnn+hMe/CzaSejb/eVw2YToiXYX+Ex/AuHHia28vWTq4goAexFbw==",
- "license": "MIT",
- "peerDependencies": {
- "vue": "^2.0.0"
- }
- },
"node_modules/w3c-xmlserializer": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz",
diff --git a/package.json b/package.json
index fb0653e72e..50fc60c881 100644
--- a/package.json
+++ b/package.json
@@ -49,6 +49,7 @@
"luxon": "^1.28.1",
"no-scroll": "^2.1.1",
"node-vibrant": "^4.0.4",
+ "pinia": "^2.3.1",
"popper.js": "^1.16.1",
"register-service-worker": "^1.7.2",
"selectize": "^0.12.6",
@@ -60,7 +61,6 @@
"vue-multiselect": "^2.1.8",
"vue-trumbowyg": "^3.6.2",
"vuedraggable": "^2.24.3",
- "vuex": "^3.6.2",
"zxcvbn": "^4.4.2"
},
"devDependencies": {
diff --git a/templates/pages/about.html.twig b/templates/pages/about.html.twig
index 1f62346b67..595a7f031d 100644
--- a/templates/pages/about.html.twig
+++ b/templates/pages/about.html.twig
@@ -72,7 +72,7 @@
Twig - flexible, fast, and secure template engine.
Bootstrap 4 and
Font Awesome.
- Vue and VueX.
+ Vue and Pinia.
CodeMirror.
Webpack and
Symfony Encore.
diff --git a/tests/unit/README.md b/tests/unit/README.md
index f0d4e7970a..a06f40ee1e 100644
--- a/tests/unit/README.md
+++ b/tests/unit/README.md
@@ -1,6 +1,6 @@
# Frontend unit tests
-Vitest + `@vue/test-utils` over the Vue 2.7 admin components, the Vuex stores,
+Vitest + `@vue/test-utils` over the Vue 2.7 admin components, the Pinia stores,
the filters and the app-level scripts. `npm run test:unit` to run,
`npm run test:unit:watch` while working, `npm run test:unit:coverage` for the
gate CI enforces.
@@ -31,8 +31,8 @@ regression baseline rather than a round of manual clicking.
mount against Twig-rendered markup. The specs under `app/` are the exception:
those scripts expect a whole page, so each lays out the markup it needs.
4. **Seed store state through `helpers/store.ts`**, then assert through the
- rendered DOM or the spied `dispatch`. The factories build a real store from
- the app's own modules, so real getters and mutations run.
+ rendered DOM or the recorded `writes()` and `calls()`. The factories build a
+ real Pinia from the app's own stores, so real getters and actions run.
5. **Vue warnings fail the test.** Two known defects are allowed for in
`helpers/warnings.ts`; a spec that deliberately provokes another declares it
with `expectVueWarning()`, which also asserts the warning happened.
@@ -50,7 +50,7 @@ regression baseline rather than a round of manual clicking.
setup.ts global setup: jQuery globals, jsdom gaps, per-test teardown
helpers/
- store.ts Vuex store factories over the real modules
+ store.ts Pinia factories over the real stores
stubs.ts third-party component stubs, keyed by template tag
dom.ts the Twig-rendered surroundings components query
warnings.ts Vue warning policy
@@ -69,9 +69,9 @@ layer, so the upgrade edits them. Most of it is mechanical:
| change | scope |
|---|---|
| `propsData:` → `props:` | every mount |
-| `stubs:` / `localVue` / `store:` → `global: { stubs, plugins }` | every mount that has them |
+| `stubs:` / `localVue` / `pinia:` → `global: { stubs, plugins }` | every mount that has them |
| `wrapper.destroy()` → `unmount()`, `findAll(...).at(i)` → `[i]` | mechanical |
-| Vuex → Pinia | `helpers/store.ts` and the specs that seed state |
+| pinia 2 → 3, `PiniaVuePlugin` → `app.use(pinia)` | `helpers/store.ts` and the boot files |
| `$root.$emit`/`$on` → the mitt bus | `helpers/bus.ts`, plus Text and Slug |
| vue-multiselect 2→3, vuedraggable 2→4, trumbowyg 3→4, easymde | `helpers/stubs.ts` |
| `flushPromises` | delete `helpers/async.ts`, import from test-utils |
@@ -81,6 +81,5 @@ is why rule 1 matters. Keeping assertions at the DOM means the specs survive
components becoming `