diff --git a/.eslintrc.js b/.eslintrc.js index 27ab4fe0..f89a7ca5 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -15,19 +15,14 @@ module.exports = { window: true, }, parserOptions: { - parser: 'babel-eslint', + parser: '@babel/eslint-parser', }, extends: ['prestashop', 'plugin:vue/strongly-recommended'], plugins: ['import', 'vue'], rules: { 'class-methods-use-this': 0, 'func-names': 0, - 'import/no-extraneous-dependencies': [ - 'error', - { - devDependencies: ['tests/**/*.js', '.webpack/**/*.js'], - }, - ], + 'import/no-extraneous-dependencies': 0, 'max-len': ['error', {code: 120}], 'no-alert': 0, 'no-bitwise': 0, @@ -53,7 +48,10 @@ module.exports = { 'vue/require-default-prop': 0, }, settings: { - 'import/resolver': 'webpack', + 'import/resolver': { + node: {}, + webpack: 'webpack.config.js', + }, }, overrides: [ { diff --git a/.github/workflows/build-release.yml b/.github/workflows/build-release.yml index 51afc3f9..a2cc03d0 100644 --- a/.github/workflows/build-release.yml +++ b/.github/workflows/build-release.yml @@ -1,5 +1,4 @@ name: Build & Release draft - on: [push, pull_request] jobs: @@ -22,13 +21,18 @@ jobs: - name: Install Node.js uses: actions/setup-node@v1 with: - node-version: 12.x + node-version: 14.x + + - run: npm install - - run: yarn install + - name: Build PrestaShop assets + run: | + npm --prefix ~/PrestaShop/admin-dev/themes/new-theme install + npm --prefix ~/PrestaShop/admin-dev/themes/new-theme run build - name: Build JS dependencies run: | - yarn --cwd ~/PrestaShop/modules/blockwishlist run build + npm --prefix ~/PrestaShop/modules/blockwishlist run build rm -rf node_modules - name: Install composer dependencies @@ -36,9 +40,15 @@ jobs: - name: Clean-up project uses: PrestaShopCorp/github-action-clean-before-deploy@v1.0 - with: + with: paths: node_modules + - name: Prepare auto-index tool + run: composer global require prestashop/autoindex + + - name: Generate index.php + run: ~/.composer/vendor/bin/autoindex + - name: Create & upload artifact uses: actions/upload-artifact@v1 with: @@ -72,7 +82,7 @@ jobs: assets=`bin/hub api -t repos/${{ github.repository }}/releases/${{ steps.release_info.outputs.id }}/assets | awk '/\].url/ { print $2 }'` for asset in $assets do - bin/hub api -X DELETE $asset + bin/hub api -X DELETE $asset done env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/js.yml b/.github/workflows/js.yml index 4021b289..4cf45090 100644 --- a/.github/workflows/js.yml +++ b/.github/workflows/js.yml @@ -9,7 +9,7 @@ jobs: uses: actions/checkout@v2.0.0 - name: lint js dependencies - uses: PrestaShopCorp/github-action-lint-js/12@v1.0 + uses: PrestaShopCorp/github-action-lint-js/14@master with: cmd: yarn path: . diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index f3336b3a..2234e979 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -2,41 +2,79 @@ name: PHP tests on: [push, pull_request] jobs: php-linter: - name: PHP Syntax check 5.6|7.2|7.3 + name: PHP Syntax check 5.6 => 8.1 runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v2.0.0 + - name: PHP syntax checker 5.6 uses: prestashop/github-action-php-lint/5.6@master + - name: PHP syntax checker 7.2 uses: prestashop/github-action-php-lint/7.2@master + - name: PHP syntax checker 7.3 uses: prestashop/github-action-php-lint/7.3@master + + - name: PHP syntax checker 7.4 + uses: prestashop/github-action-php-lint/7.4@master + + - name: PHP syntax checker 8.0 + uses: prestashop/github-action-php-lint/8.0@master + + - name: PHP syntax checker 8.1 + uses: prestashop/github-action-php-lint/8.1@master + + # Check the PHP code follow the coding standards php-cs-fixer: name: PHP-CS-Fixer runs-on: ubuntu-latest steps: + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: '7.4' + - name: Checkout uses: actions/checkout@v2.0.0 + + - name: Cache dependencies + uses: actions/cache@v2 + with: + path: vendor + key: php-${{ hashFiles('composer.lock') }} + + - name: Install dependencies + run: composer install + - name: Run PHP-CS-Fixer - uses: prestashopcorp/github-action-php-cs-fixer@master + run: ./vendor/bin/php-cs-fixer fix --dry-run --diff --using-cache=no --diff-format udiff + + # Run PHPStan against the module and a PrestaShop release phpstan: name: PHPStan runs-on: ubuntu-latest strategy: matrix: - presta-versions: ['1.7.6.3', 'latest'] + presta-versions: ['1.7.6', '1.7.7', '1.7.8', 'latest'] steps: + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: '7.4' + - name: Checkout uses: actions/checkout@v2.0.0 + # Add vendor folder in cache to make next builds faster - name: Cache vendor folder uses: actions/cache@v1 with: path: vendor key: php-${{ hashFiles('composer.lock') }} + # Add composer local folder in cache to make next builds faster - name: Cache composer folder uses: actions/cache@v1 with: @@ -45,8 +83,6 @@ jobs: - run: composer install - - name: Pull PrestaShop files (Tag ${{ matrix.presta-versions }}) - run: docker run -tid --rm -v ps-volume:/var/www/html --name temp-ps prestashop/prestashop:${{ matrix.presta-versions }} - - - name : Run PHPStan - run: docker run --rm --volumes-from temp-ps -v $PWD:/web/module -e _PS_ROOT_DIR_=/var/www/html --workdir=/web/module phpstan/phpstan:0.12.32 analyse --configuration=/web/module/tests/phpstan/phpstan.neon --error-format github + # Docker images prestashop/prestashop may be used, even if the shop remains uninstalled + - name: Execute PHPStan on PrestaShop (Tag ${{ matrix.presta-versions }}) + run: ./tests/phpstan.sh ${{ matrix.presta-versions }} diff --git a/.gitignore b/.gitignore index 37ca3d96..83006710 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,7 @@ # php - -vendor -.php_cs.cache +/config_*.xml +/vendor/ +/.php_cs.cache # vim diff --git a/.webpack/common.js b/.webpack/common.js index a087059c..df7ac29c 100644 --- a/.webpack/common.js +++ b/.webpack/common.js @@ -66,7 +66,10 @@ module.exports = { './_dev/front/js/components/Create', './_dev/front/js/components/AddToWishlist', ], - backoffice: ['./_dev/back/js/backoffice.js', './_dev/back/scss/backoffice.scss'], + backoffice: [ + './_dev/back/js/backoffice.js', + './_dev/back/scss/backoffice.scss', + ], form: ['./_dev/back/js/form.js', './_dev/back/scss/backoffice.scss'], }, output: { @@ -75,10 +78,10 @@ module.exports = { libraryTarget: 'window', library: '[name]', sourceMapFilename: '[name].[hash:8].map', - chunkFilename: '[id].[hash:8].js', + chunkFilename: '[name].js', }, resolve: { - extensions: ['.js', '.vue', '.json', '.mjs'], + extensions: ['.js', '.vue', '.json', '.mjs', '.ts'], alias: { '@js': path.resolve(__dirname, '../_dev/front/js'), '@pages': path.resolve(__dirname, '../_dev/front/js/pages'), @@ -87,6 +90,10 @@ module.exports = { '@containers': path.resolve(__dirname, '../_dev/front/js/container'), '@constants': path.resolve(__dirname, '../_dev/front/js/constants'), '@scss': path.resolve(__dirname, '../_dev/front/scss'), + '@PSJs': path.resolve( + __dirname, + '../../../admin-dev/themes/new-theme/js', + ), '@node_modules': path.resolve(__dirname, '../node_modules'), vue: 'vue/dist/vue.esm.js', }, @@ -115,6 +122,15 @@ module.exports = { test: /\.vue$/, loader: 'vue-loader', }, + { + test: /\.ts?$/, + loader: 'ts-loader', + options: { + appendTsSuffixTo: [/\.vue$/], + onlyCompileBundledFiles: true, + }, + exclude: /node_modules/, + }, { test: /\.css$/, use: [ @@ -162,6 +178,23 @@ module.exports = { }, ], }, + optimization: { + splitChunks: { + cacheGroups: { + graphql: { + test: /[\\/]node_modules[\\/](graphql|graphql-tag|graphql-tools|graphql-type-json)[\\/]/, + name: 'graphql', + chunks: 'all', + }, + vendors: { + // eslint-disable-next-line max-len + test: /[\\/]node_modules[\\/](core-js|apollo-utilities|apollo-client|apollo-link|apollo-cache-inmemory|apollo-link-http|apollo-link-schema|vue|vue-apollo)[\\/]/, + name: 'vendors', + chunks: 'all', + }, + }, + }, + }, plugins: [ new FixStyleOnlyEntriesPlugin(), new CleanWebpackPlugin({ diff --git a/.webpack/dev.js b/.webpack/dev.js index 79254091..3f2bac60 100644 --- a/.webpack/dev.js +++ b/.webpack/dev.js @@ -1,24 +1,22 @@ const path = require('path'); +const {merge} = require('webpack-merge'); const common = require('./common.js'); /** * Returns the development webpack config, * by merging development specific configuration with the common one. */ -function devConfig() { - const dev = Object.assign( - common, - { - devtool: 'inline-source-map', - devServer: { - hot: true, - contentBase: path.resolve(__dirname, '/../public'), - publicPath: '/', - }, +const devConfig = () => (merge( + common, + { + devtool: 'inline-source-map', + devServer: { + hot: true, + contentBase: path.resolve(__dirname, '/../public'), + publicPath: '/', }, - ); - - return dev; -} + }, +) +); module.exports = devConfig; diff --git a/.webpack/prod.js b/.webpack/prod.js index 297223eb..44ddc46a 100644 --- a/.webpack/prod.js +++ b/.webpack/prod.js @@ -1,5 +1,6 @@ const webpack = require('webpack'); const TerserPlugin = require('terser-webpack-plugin'); +const {merge} = require('webpack-merge'); const common = require('./common.js'); /** @@ -7,32 +8,27 @@ const common = require('./common.js'); * by merging production specific configuration with the common one. * */ -function prodConfig() { - const prod = Object.assign(common, { - stats: 'minimal', - optimization: { - minimizer: [ - new TerserPlugin({ - sourceMap: true, - terserOptions: { - output: { - comments: /@license/i, - }, - }, - extractComments: false, - }), - ], - }, - }); - // Required for Vue production environment - prod.plugins.push( +const prodConfig = () => merge(common, { + stats: 'minimal', + optimization: { + minimizer: [ + new TerserPlugin({ + sourceMap: true, + terserOptions: { + output: { + comments: /@license/i, + }, + }, + extractComments: false, + }), + ], + }, + plugins: [ new webpack.DefinePlugin({ 'process.env.NODE_ENV': JSON.stringify('production'), }), - ); - - return prod; -} + ], +}); module.exports = prodConfig; diff --git a/_dev/back/js/backoffice.js b/_dev/back/js/backoffice.js index 5d96cc95..dea2193d 100644 --- a/_dev/back/js/backoffice.js +++ b/_dev/back/js/backoffice.js @@ -35,7 +35,10 @@ tabButtons.forEach((button) => { const tabs = document.querySelectorAll('.wishlist-tab'); tabs.forEach((tab) => { - if (tab.classList.contains('active') && tab.dataset.tab !== button.dataset.tab) { + if ( + tab.classList.contains('active') + && tab.dataset.tab !== button.dataset.tab + ) { tab.classList.remove('active'); } diff --git a/_dev/back/js/form.js b/_dev/back/js/form.js index 9310628c..3e4dc2a5 100644 --- a/_dev/back/js/form.js +++ b/_dev/back/js/form.js @@ -17,6 +17,6 @@ * International Registered Trademark & Property of PrestaShop SA */ -import TranslatableInput from '../../../../../admin-dev/themes/new-theme/js/components/translatable-input'; +import TranslatableInput from '@PSJs/components/translatable-input'; new TranslatableInput(); diff --git a/_dev/front/js/components/AddToWishlist/AddToWishlist.vue b/_dev/front/js/components/AddToWishlist/AddToWishlist.vue index 4441be77..db487a46 100644 --- a/_dev/front/js/components/AddToWishlist/AddToWishlist.vue +++ b/_dev/front/js/components/AddToWishlist/AddToWishlist.vue @@ -74,7 +74,7 @@ this.productId = event.detail.productId; } - if (event.detail.productAttributeId) { + if (typeof event.detail.productAttributeId === 'number') { this.productAttributeId = event.detail.productAttributeId; } @@ -86,33 +86,27 @@ }; -