create-nuxt-base 0.1.23 → 0.2.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/.eslintignore +14 -0
- package/.eslintrc +3 -0
- package/.github/workflows/release.yml +1 -1
- package/.prettierignore +5 -0
- package/.prettierrc +6 -0
- package/.vscode/settings.json +10 -10
- package/CHANGELOG.md +22 -33
- package/README.md +1 -0
- package/index.js +30 -29
- package/nuxt-base-template/.env.example +8 -0
- package/nuxt-base-template/.eslintrc +1 -1
- package/nuxt-base-template/.vscode/settings.json +6 -16
- package/nuxt-base-template/e2e/init.spec.ts +18 -0
- package/nuxt-base-template/nuxt.config.ts +27 -12
- package/nuxt-base-template/package-lock.json +6050 -4606
- package/nuxt-base-template/package.json +47 -29
- package/nuxt-base-template/playwright.config.ts +77 -0
- package/nuxt-base-template/src/app.vue +4 -4
- package/nuxt-base-template/src/assets/css/tailwind.css +42 -33
- package/nuxt-base-template/src/components/SocialMediaBubble.vue +1 -1
- package/nuxt-base-template/src/components/base/BaseAccordion.vue +16 -13
- package/nuxt-base-template/src/components/base/BaseButton.vue +10 -13
- package/nuxt-base-template/src/components/base/BaseContainer.vue +1 -1
- package/nuxt-base-template/src/components/base/BaseContextMenuContainer.vue +61 -0
- package/nuxt-base-template/src/components/base/BaseInfinityList.vue +1 -1
- package/nuxt-base-template/src/components/base/BaseProgressbar.vue +28 -30
- package/nuxt-base-template/src/components/base/BaseToggle.vue +17 -10
- package/nuxt-base-template/src/components/form/FormInput.vue +34 -0
- package/nuxt-base-template/src/components/form/FormPassword.vue +47 -0
- package/nuxt-base-template/src/components/form/FormSelect.vue +40 -0
- package/nuxt-base-template/src/components/form/FormSubmit.vue +18 -0
- package/nuxt-base-template/src/components/form/FormTextarea.vue +36 -0
- package/nuxt-base-template/src/components/form/FormToggle.vue +27 -0
- package/nuxt-base-template/src/components/modal/Modal.vue +48 -0
- package/nuxt-base-template/src/components/modal/ModalConfirm.vue +38 -0
- package/nuxt-base-template/src/components/{base/BaseModalContainer.vue → modal/ModalContainer.vue} +1 -1
- package/nuxt-base-template/src/components/modal/ModalInfo.vue +22 -0
- package/nuxt-base-template/src/components/{ModalShare.vue → modal/ModalShare.vue} +7 -11
- package/nuxt-base-template/src/components/{base/BaseNotification.vue → notification/Notification.vue} +8 -7
- package/nuxt-base-template/src/components/{base/BaseNotificationContainer.vue → notification/NotificationContainer.vue} +11 -5
- package/nuxt-base-template/src/components/pwa/pwa-install-banner.vue +224 -0
- package/nuxt-base-template/src/components/transition/TransitionFade.vue +10 -7
- package/nuxt-base-template/src/components/transition/TransitionFadeScale.vue +10 -7
- package/nuxt-base-template/src/composables/use-auth-fetch.ts +22 -8
- package/nuxt-base-template/src/composables/use-context-menu.ts +19 -0
- package/nuxt-base-template/src/composables/use-file.ts +1 -2
- package/nuxt-base-template/src/composables/use-modal.ts +1 -1
- package/nuxt-base-template/src/composables/use-notification.ts +2 -2
- package/nuxt-base-template/src/composables/use-share.ts +3 -3
- package/nuxt-base-template/src/error.vue +10 -14
- package/nuxt-base-template/src/layouts/default.vue +13 -0
- package/nuxt-base-template/src/middleware/auth.global.ts +2 -2
- package/nuxt-base-template/src/pages/index.vue +31 -6
- package/nuxt-base-template/src/plugins/auth.server.ts +72 -0
- package/nuxt-base-template/src/plugins/form.plugin.ts +21 -0
- package/nuxt-base-template/src/plugins/pwa.plugin.ts +110 -0
- package/nuxt-base-template/src/tests/init.test.ts +1 -1
- package/nuxt-base-template/tailwind.config.js +33 -23
- package/nuxt-base-template/vitest.config.js +3 -3
- package/package.json +3 -1
- package/nuxt-base-template/formkit-theme.js +0 -137
- package/nuxt-base-template/formkit.config.js +0 -33
- package/nuxt-base-template/src/components/hello-world.vue +0 -10
- package/nuxt-base-template/src/composables/use-form-helper.ts +0 -100
- package/nuxt-base-template/src/composables/use-helper.ts +0 -52
- package/nuxt-base-template/src/forms/inputs/InputCheckbox.vue +0 -29
- package/nuxt-base-template/src/forms/inputs/InputFreeTags.vue +0 -98
- package/nuxt-base-template/src/forms/inputs/InputImage.vue +0 -65
- package/nuxt-base-template/src/forms/inputs/InputTags.vue +0 -112
- package/nuxt-base-template/src/forms/inputs/InputToggle.vue +0 -18
- package/nuxt-base-template/src/forms/plugins/asterisk-plugin.ts +0 -29
- package/nuxt-base-template/src/forms/plugins/scroll-error-plugin.ts +0 -36
- package/nuxt-base-template/src/forms/plugins/value-changes-plugin.ts +0 -13
- package/nuxt-base-template/src/plugins/4.auth.server.ts +0 -70
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
const isCheckboxAndRadioMultiple = (node: any) => (node.props.type === 'checkbox' || node.props.type === 'radio') && node.props.options;
|
|
2
|
-
|
|
3
|
-
export function addAsteriskPlugin(node: any) {
|
|
4
|
-
node.on('created', () => {
|
|
5
|
-
const isRequired = node.props.parsedRules.some((rule: any) => rule.name === 'required');
|
|
6
|
-
if (!isRequired) {
|
|
7
|
-
return;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
const isMultiOption = isCheckboxAndRadioMultiple(node);
|
|
11
|
-
|
|
12
|
-
// if we're going to modify the schema then we need
|
|
13
|
-
// to update the schemaMemoKey so we don't get an
|
|
14
|
-
// invalid cached schema.
|
|
15
|
-
node.props.definition.schemaMemoKey = `required_${isMultiOption ? 'multi_' : ''}${node.props.definition.schemaMemoKey}`;
|
|
16
|
-
|
|
17
|
-
const schemaFn = node.props.definition.schema;
|
|
18
|
-
node.props.definition.schema = (sectionsSchema: any = {}) => {
|
|
19
|
-
if (isRequired) {
|
|
20
|
-
if (!isMultiOption) {
|
|
21
|
-
sectionsSchema.label = {
|
|
22
|
-
children: ['$label', ' *'],
|
|
23
|
-
};
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
return schemaFn(sectionsSchema);
|
|
27
|
-
};
|
|
28
|
-
});
|
|
29
|
-
}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import type { FormKitNode } from '@formkit/core';
|
|
2
|
-
|
|
3
|
-
export function scrollToErrors(node: any) {
|
|
4
|
-
if (node.props.type === 'form') {
|
|
5
|
-
function scrollTo(node: FormKitNode) {
|
|
6
|
-
const el = document.getElementById(node.props.id);
|
|
7
|
-
if (el) {
|
|
8
|
-
el.scrollIntoView({ block: 'center', behavior: 'smooth' });
|
|
9
|
-
}
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
function scrollToErrors() {
|
|
13
|
-
node.walk((child: any) => {
|
|
14
|
-
// Check if this child has errors
|
|
15
|
-
if (child.ledger.value('blocking') || child.ledger.value('errors')) {
|
|
16
|
-
// We found an input with validation errors
|
|
17
|
-
scrollTo(child);
|
|
18
|
-
// Stop searching
|
|
19
|
-
return false;
|
|
20
|
-
}
|
|
21
|
-
}, true);
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
function defaultInvalid(node: FormKitNode) {
|
|
25
|
-
console.error('FormKit::invalidForm', node);
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
const onSubmitInvalid = node.props.onSubmitInvalid ?? defaultInvalid;
|
|
29
|
-
node.props.onSubmitInvalid = () => {
|
|
30
|
-
onSubmitInvalid(node);
|
|
31
|
-
scrollToErrors();
|
|
32
|
-
};
|
|
33
|
-
node.on('unsettled:errors', scrollToErrors);
|
|
34
|
-
}
|
|
35
|
-
return false;
|
|
36
|
-
}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import type { FormKitEvent, FormKitNode } from '@formkit/core';
|
|
2
|
-
|
|
3
|
-
export function valueChangesPlugin(node: FormKitNode) {
|
|
4
|
-
const { getDifferences } = useFormHelper();
|
|
5
|
-
if (node.props.type === 'form') {
|
|
6
|
-
setTimeout(() => {
|
|
7
|
-
node.on('commit', (event: FormKitEvent) => {
|
|
8
|
-
const diff = getDifferences(event.origin.props._init, event.payload);
|
|
9
|
-
node.emit('valueChanges', { init: event.origin.props._init, current: event.payload, diff: diff });
|
|
10
|
-
});
|
|
11
|
-
}, 300);
|
|
12
|
-
}
|
|
13
|
-
}
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
import { callWithNuxt, defineNuxtPlugin, useNuxtApp, useRuntimeConfig } from 'nuxt/app';
|
|
2
|
-
import { ofetch } from 'ofetch';
|
|
3
|
-
|
|
4
|
-
export default defineNuxtPlugin({
|
|
5
|
-
name: 'auth-server',
|
|
6
|
-
enforce: 'pre',
|
|
7
|
-
async setup() {
|
|
8
|
-
console.debug('4.auth.server.ts::init');
|
|
9
|
-
const _nuxt = useNuxtApp();
|
|
10
|
-
const config = await callWithNuxt(_nuxt, useRuntimeConfig);
|
|
11
|
-
const { refreshToken, accessToken } = await callWithNuxt(_nuxt, useAuthState);
|
|
12
|
-
const { setCurrentUser, getDecodedAccessToken, setTokens } = await callWithNuxt(_nuxt, useAuth);
|
|
13
|
-
const payload = accessToken.value ? getDecodedAccessToken(accessToken.value) : null;
|
|
14
|
-
|
|
15
|
-
if (!refreshToken.value) {
|
|
16
|
-
return;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
const refreshTokenResult = await ofetch(config.public.host, {
|
|
20
|
-
method: 'POST',
|
|
21
|
-
headers: {
|
|
22
|
-
Authorization: `Bearer ${refreshToken.value}`,
|
|
23
|
-
},
|
|
24
|
-
body: JSON.stringify({
|
|
25
|
-
query: 'mutation refreshToken {refreshToken {token, refreshToken}}',
|
|
26
|
-
variables: {},
|
|
27
|
-
}),
|
|
28
|
-
}).catch((err) => {
|
|
29
|
-
console.error('4.auth.server.ts::refreshToken::catch', err.data);
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
console.debug('4.auth.server.ts::refreshTokenResult', refreshTokenResult);
|
|
33
|
-
|
|
34
|
-
if (refreshTokenResult?.data) {
|
|
35
|
-
const data = refreshTokenResult.data.refreshToken;
|
|
36
|
-
console.debug('4.auth.server.ts::token', data?.token);
|
|
37
|
-
console.debug('4.auth.server.ts::refreshToken', data?.refreshToken);
|
|
38
|
-
setTokens(data.token, data.refreshToken);
|
|
39
|
-
|
|
40
|
-
if (payload?.id) {
|
|
41
|
-
const userResult = await ofetch(config.public.host, {
|
|
42
|
-
method: 'POST',
|
|
43
|
-
headers: {
|
|
44
|
-
Authorization: `Bearer ${refreshTokenResult.data.refreshToken?.token}`,
|
|
45
|
-
},
|
|
46
|
-
body: JSON.stringify({
|
|
47
|
-
query: 'query getUser($id: String!){' +
|
|
48
|
-
'getUser(id: $id){' +
|
|
49
|
-
'id ' +
|
|
50
|
-
'avatar ' +
|
|
51
|
-
'firstName ' +
|
|
52
|
-
'lastName ' +
|
|
53
|
-
'email ' +
|
|
54
|
-
'roles ' +
|
|
55
|
-
'}}',
|
|
56
|
-
variables: {
|
|
57
|
-
id: payload.id,
|
|
58
|
-
},
|
|
59
|
-
}),
|
|
60
|
-
}).catch((err) => {
|
|
61
|
-
console.error('4.auth.server.ts::getUser::catch', err.data);
|
|
62
|
-
});
|
|
63
|
-
console.debug('4.auth.server.ts::getUser::userResult', userResult);
|
|
64
|
-
if (userResult?.data) {
|
|
65
|
-
setCurrentUser(userResult?.data?.getUser);
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
},
|
|
70
|
-
});
|