diff --git a/.eslintignore b/.eslintignore index 849ddff..22203b9 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1 +1,2 @@ dist/ +*.config.js diff --git a/.eslintrc.js b/.eslintrc.js index 7192bea..db24fe5 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -35,5 +35,14 @@ module.exports = { jest: true, }, }, + { + files: [ + '**/__tests__/*.{j,t}s?(x)', + '**/tests/unit/**/*.spec.{j,t}s?(x)', + ], + env: { + jest: true, + }, + }, ], }; diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index dd311cf..4478eba 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -17,5 +17,7 @@ jobs: node-version: 12 - name: Install dependencies run: npm ci + - name: Run unit tests + run: npm run test --verbose - name: Build Library run: npm run build diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 0360628..0e19035 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -17,6 +17,10 @@ jobs: node-version: 12 - name: Install dependencies run: npm ci + - name: Run unit tests + run: npm run test --verbose + - name: Run e2e + run: npm run test:e2e - name: Build Library run: npm run build - name: Build Types Declarations diff --git a/.husky/.gitignore b/.husky/.gitignore new file mode 100644 index 0000000..31354ec --- /dev/null +++ b/.husky/.gitignore @@ -0,0 +1 @@ +_ diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100755 index 0000000..173ff47 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,4 @@ +#!/bin/sh +. "$(dirname $0)/_/husky.sh" + +npm run lint diff --git a/.husky/pre-push b/.husky/pre-push new file mode 100755 index 0000000..8416636 --- /dev/null +++ b/.husky/pre-push @@ -0,0 +1,4 @@ +#!/bin/sh +. "$(dirname $0)/_/husky.sh" + +npm test diff --git a/.npmignore b/.npmignore index 4c9c546..4fbd8f5 100644 --- a/.npmignore +++ b/.npmignore @@ -2,6 +2,7 @@ .vuegenerator .eslintrc.js .eslintignore +.husky netlify.toml jest.config.js babel.config.js diff --git a/.nyc_output/out.json b/.nyc_output/out.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/.nyc_output/out.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/cypress.json b/cypress.json new file mode 100644 index 0000000..a1c5bc4 --- /dev/null +++ b/cypress.json @@ -0,0 +1,5 @@ +{ + "baseUrl": "http://localhost:6044", + "pluginsFile": "tests/e2e/plugins/index.js", + "testFiles": "**/*.e2e.js*" +} diff --git a/demos/vue-3/.gitignore b/demos/vue-3/.gitignore new file mode 100644 index 0000000..403adbc --- /dev/null +++ b/demos/vue-3/.gitignore @@ -0,0 +1,23 @@ +.DS_Store +node_modules +/dist + + +# local env files +.env.local +.env.*.local + +# Log files +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/demos/vue-3/README.md b/demos/vue-3/README.md new file mode 100644 index 0000000..58b06c7 --- /dev/null +++ b/demos/vue-3/README.md @@ -0,0 +1,24 @@ +# vue-3 + +## Project setup +``` +yarn install +``` + +### Compiles and hot-reloads for development +``` +yarn serve +``` + +### Compiles and minifies for production +``` +yarn build +``` + +### Lints and fixes files +``` +yarn lint +``` + +### Customize configuration +See [Configuration Reference](https://cli.vuejs.org/config/). diff --git a/demos/vue-3/public/favicon.ico b/demos/vue-3/public/favicon.ico new file mode 100644 index 0000000..df36fcf Binary files /dev/null and b/demos/vue-3/public/favicon.ico differ diff --git a/demos/vue-3/public/index.html b/demos/vue-3/public/index.html new file mode 100644 index 0000000..4123528 --- /dev/null +++ b/demos/vue-3/public/index.html @@ -0,0 +1,17 @@ + + + + + + + + <%= htmlWebpackPlugin.options.title %> + + + +
+ + + diff --git a/demos/vue-3/src/App.vue b/demos/vue-3/src/App.vue new file mode 100644 index 0000000..f44cc48 --- /dev/null +++ b/demos/vue-3/src/App.vue @@ -0,0 +1,20 @@ + + + diff --git a/demos/vue-3/src/assets/logo.png b/demos/vue-3/src/assets/logo.png new file mode 100644 index 0000000..803b955 Binary files /dev/null and b/demos/vue-3/src/assets/logo.png differ diff --git a/demos/vue-3/src/assets/logo.svg b/demos/vue-3/src/assets/logo.svg new file mode 100644 index 0000000..72fe302 --- /dev/null +++ b/demos/vue-3/src/assets/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/demos/vue-3/src/components/Console.vue b/demos/vue-3/src/components/Console.vue new file mode 100644 index 0000000..4d6e457 --- /dev/null +++ b/demos/vue-3/src/components/Console.vue @@ -0,0 +1,36 @@ + + + + + diff --git a/demos/vue-3/src/components/Toolbar.vue b/demos/vue-3/src/components/Toolbar.vue new file mode 100644 index 0000000..e8f9b61 --- /dev/null +++ b/demos/vue-3/src/components/Toolbar.vue @@ -0,0 +1,30 @@ + + + + + diff --git a/demos/vue-3/src/main.ts b/demos/vue-3/src/main.ts new file mode 100644 index 0000000..86ccd12 --- /dev/null +++ b/demos/vue-3/src/main.ts @@ -0,0 +1,22 @@ +import { createApp } from 'vue'; +import App from './App.vue'; +import './styles/main.scss'; +import router from './router'; + +import { createDynamicForms } from '../../../src'; + +const VueDynamicForms = createDynamicForms({ + autoValidate: true, + form: { + customClass: 'plugin-options-class-added', + method: 'POST', + netlify: false, + netlifyHoneypot: null, + }, +}); + +export const app = createApp(App); + +app.use(VueDynamicForms); + +app.use(router).mount('#app'); diff --git a/demos/vue-3/src/router/index.ts b/demos/vue-3/src/router/index.ts new file mode 100644 index 0000000..29ac4e4 --- /dev/null +++ b/demos/vue-3/src/router/index.ts @@ -0,0 +1,102 @@ +import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router'; +import Home from '../views/Home.vue'; + +const routes: Array = [ + { + path: '/', + name: 'Home', + component: Home, + }, + { + path: '/general', + name: 'General', + meta: { + title: 'General', + }, + component: () => + import(/* webpackChunkName: "general" */ '../views/General.vue'), + }, + { + path: '/basic', + name: 'Basic', + meta: { + title: 'Basic', + }, + component: () => + import(/* webpackChunkName: "basic" */ '../views/Basic.vue'), + }, + { + path: '/text-fields', + name: 'Text Fields', + meta: { + title: 'Text Fields', + }, + component: () => + import(/* webpackChunkName: "text-fields" */ '../views/TextFields.vue'), + }, + { + path: '/number-fields', + name: 'Number Fields', + meta: { + title: 'Number Fields', + }, + component: () => + import(/* webpackChunkName: "text-fields" */ '../views/NumberFields.vue'), + }, + { + path: '/select-fields', + name: 'Select Fields', + meta: { + title: 'Select Fields', + }, + component: () => + import(/* webpackChunkName: "text-fields" */ '../views/SelectFields.vue'), + }, + { + path: '/textarea-fields', + name: 'TextArea Fields', + meta: { + title: 'TextArea Fields', + }, + component: () => + import( + /* webpackChunkName: "text-fields" */ '../views/TextAreaFields.vue' + ), + }, + { + path: '/checkbox-fields', + name: 'Checkbox Fields', + meta: { + title: 'Checkbox Fields', + }, + component: () => + import( + /* webpackChunkName: "checkbox-fields" */ '../views/CheckboxFields.vue' + ), + }, + { + path: '/radio-fields', + name: 'Radio Fields', + meta: { + title: 'Radio Fields', + }, + component: () => + import(/* webpackChunkName: "radio-fields" */ '../views/RadioFields.vue'), + }, + { + path: '/login', + name: 'Login', + meta: { + title: 'Login', + }, + component: () => + import(/* webpackChunkName: "campaigns" */ '../views/Login.vue'), + }, +]; + +const router = createRouter({ + history: createWebHistory(process.env.BASE_URL), + routes, +}); + +export default router; diff --git a/demos/vue-3/src/shims-vue.d.ts b/demos/vue-3/src/shims-vue.d.ts new file mode 100644 index 0000000..798e8fc --- /dev/null +++ b/demos/vue-3/src/shims-vue.d.ts @@ -0,0 +1,5 @@ +declare module '*.vue' { + import { defineComponent } from 'vue'; + const component: ReturnType; + export default component; +} diff --git a/demos/vue-3/src/styles/_vendors.scss b/demos/vue-3/src/styles/_vendors.scss new file mode 100644 index 0000000..e308c02 --- /dev/null +++ b/demos/vue-3/src/styles/_vendors.scss @@ -0,0 +1,7 @@ +@import 'tailwindcss/base'; + +@import 'tailwindcss/components'; + +@import 'tailwindcss/utilities'; + +@import '@/styles/themes/default.scss'; diff --git a/dev/vue/styles/base.scss b/demos/vue-3/src/styles/base.scss similarity index 55% rename from dev/vue/styles/base.scss rename to demos/vue-3/src/styles/base.scss index a4043a2..e003c32 100644 --- a/dev/vue/styles/base.scss +++ b/demos/vue-3/src/styles/base.scss @@ -1,7 +1,17 @@ @import url('https://fonts.googleapis.com/css2?family=Montserrat:ital,wght@0,600;0,700;1,400&family=Roboto:wght@300;500;700&display=swap'); .card { - @apply max-w-lg w-full rounded-lg shadow-lg; + @apply w-full rounded-lg shadow-lg border border-gray-100; +} + +.text-bg { + background-image: linear-gradient( + to top, + #99ffd580 54%, + transparent 54%, + transparent 100% + ); + width: fit-content; } .container { @@ -16,8 +26,8 @@ @apply font-serif font-bold text-gray-800 text-2xl; } -pre { - @apply bg-gray-900 text-white text-xs p-4 rounded-md; +.chip { + @apply text-xs rounded-full bg-gray-300 mr-4 py-1 px-2 font-thin; } .btn { diff --git a/dev/vue/styles/main.scss b/demos/vue-3/src/styles/main.scss similarity index 100% rename from dev/vue/styles/main.scss rename to demos/vue-3/src/styles/main.scss diff --git a/demos/vue-3/src/views/Basic.vue b/demos/vue-3/src/views/Basic.vue new file mode 100644 index 0000000..2acf4d3 --- /dev/null +++ b/demos/vue-3/src/views/Basic.vue @@ -0,0 +1,95 @@ + + + + diff --git a/demos/vue-3/src/views/CheckboxFields.vue b/demos/vue-3/src/views/CheckboxFields.vue new file mode 100644 index 0000000..7f3c4d1 --- /dev/null +++ b/demos/vue-3/src/views/CheckboxFields.vue @@ -0,0 +1,95 @@ + + + + diff --git a/dev/vue/App.vue b/demos/vue-3/src/views/General.vue similarity index 62% rename from dev/vue/App.vue rename to demos/vue-3/src/views/General.vue index fa265d3..971f950 100644 --- a/dev/vue/App.vue +++ b/demos/vue-3/src/views/General.vue @@ -1,13 +1,16 @@