Giter VIP home page Giter VIP logo

magepack's Introduction

Magepack ๐Ÿš€

Version 2.0.0 of Magepack released, with greater performance results and easier usage!

Magepack is a bold attempt in making Magento 2 frontend as fast as never before. It builds on experiences gained with Advanced JavaScript bundling guide and Baler to provide the best of both worlds - ease of use and superior performance.

Top highlights*

  • Up to 91 points mobile score in Google Lighthouse.
  • Up to 98% reduction in JavaScript file requests (from 177 to only 3).
  • Up to 44% reduction in transferred JavaScript size.
  • Up to 75% reduction in total load time.
  • Works with Magento's JavaScript minification and merging enabled.
  • Uses custom solution (inspired by Baler) instead of RequireJs optimizer which is way more flexible, faster, produces smaller bundle and doesn't break on missing files.

* All data gathered on clean Magento 2 with sample data installed.

Installing

Here are the requirements for Magepack to work:

  1. You need Node.js version 10 or higher installed.
  2. If you are using Magento 2.3.5 or lower, you need to have mixins.js module patched (patch provided and explained here).
  3. If you are using Magento 2.3.3 or lower, you need jquery.cookie module shim (patch provided and explained here).
  4. Magepack Magento module installed.

Install with npm:

npm install -g magepack

Install with yarn:

yarn global add magepack

Usage

Usage: magepack [generate|bundle] <options...>

Options:
  -v, --version       Output the current version.
  -h, --help          Show this command summary.

Commands:
  generate [options]  Generate optimization configuration based on given page URLs.
  bundle [options]    Bundle JavaScript files using given configuration file.

Generating bundler configuration

First step is to run the generation against the existing, working shop. You can do it on any machine with access to the target shop, even your own computer. The goal here is to collect all of the RequireJS dependencies needed for a certain type of page layout. Currently, following bundles are prepared:

  • cms containing modules needed by CMS pages.
  • category containing modules needed by category pages.
  • product containing modules needed by product pages.
  • checkout containing modules needed by cart and checkout pages.

In addition, there is the common bundle created by extracting all modules needed by each of above and loaded on every page.

Running the generator

magepack generate --cms-url="{{CMS_PAGE_URL}}" --category-url="{{CATEGORY_PAGE_URL}}" --product-url="{{PRODUCT_PAGE_URL}}"

There are 3 required options you need to pass:

--cms-url - URL to one of CMS pages (e.g. homepage).

--category-url - URL to one of category pages.

--product-url - URL to one of product pages.

Note: By default, Magepack will use given product page, add this product to the cart and visit both cart and checkout pages to collect dependencies. To avoid this, use the --skip-checkout option.

Running the above command will generate magepack.config.js file, where you can find each of the prepared bundles with the list of modules that will be included in them.

Bundling

Once you have generated bundler configuration, the next step would be to trigger the actual optimization after static content deploy stage has finished by running the following in shop root directory:

magepack bundle

This command will iterate over each deployed locale (excluding Magento/blank) and prepare bundles for each of them.

There are multiple optional params you can set:

-c, --config - defining the configuration file path, in case you have multiple configuration files (e.g multiple themes with individual configuration files)

-g, --glob - defining where to look for locales to bundle.

-s, --sourcemap - enables sourcemap generation for bundled js.

-m, --minify - overrides Magento 2 JS minification setting, minifying the bundle using Terser (used by default if Magento 2 JS minification is enabled).

Sourcemaps

It is possible to enable sourcemaps for bundled JS files, using the -s, --sourcemap flag with magepack bundle command. However, there are couple of caveats:

  • It does not respect existing sourcemaps for individual JS files (possible future update)
  • For sourcemaps to be meaningful, Magento 2 JS minification must be turned off. This is because Magento 2 does not (and cannot with current PHP implementation) generate sourcemaps for each minified JS file. For this reason, a separate -m, --minify flag exists to minify the resulting bundle using Terser.

Enabling

Once you made sure Magepack Magento module is installed, what is left is to enable it via admin panel under Stores->Configuration->Advanced->Developer or CLI:

bin/magento config:set dev/js/enable_magepack_js_bundling 1

and clearing the cache:

bin/magento cache:clean

Now the shop should be way faster then before ๐Ÿš€ You can (and should) even enable all Magento's performance optimizations (except JavaScript bundling of course) for even better results.

Results

Here are our tests results, testing homepage on local development environment with clean Magento 2.3.4, sample data, all caches enabled and following optimizations:

  • JavaScript:
    • Merge JavaScript Files - Yes.
    • Enable JavaScript Bundling - No.
    • Minify JavaScript Files - Yes.
    • Move JS code to the bottom of the page - Yes.
  • CSS:
    • Merge CSS Files - Yes.
    • Minify CSS Files - Yes.
    • Use CSS critical path - Yes.
  • Templates:
    • Minify Html - Yes.

No Bundling

Lighthouse report with 53 score

Bundling with Baler

Please note that Baler does not currently support Magento's JavaScript merging and minification.

Lighthouse report with 64 score

Bundling with Magepack

Lighthouse report with 91 score

Debugging

Before rising an issue please follow below guidelines:

  • Problems with bundling:
    • Make sure there are no JavaScript errors thrown by the shop which may prevent Magepack from collecting the dependencies.
  • Problems with generation:
    • Make sure all locales are properly deployed and no files are missing.
  • Try running the command with --debug or -d flag that makes Magepack output more information about the ongoing process which should make debugging easier.

Versioning

We use SemVer for versioning. For the versions available, see the tags on this repository.

License

This project is licensed under the OSL-3.0 license - see the LICENSE.md file for details

Acknowledgments

magepack's People

Contributors

augustsk avatar dependabot[bot] avatar fredden avatar hector68 avatar igloczek avatar ivanchepurnyi avatar jcarmona120 avatar jtomaszewski avatar krzksz avatar leeroybrun avatar rajankouzina avatar szpadel avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

magepack's Issues

Configurable product swatch selection for the first time takes longer

Hi

Thank you very much for this wonderful extension. It has improved the speed of our store a lot.

However, after enabling magepack bundling we are facing an issue with our configurable products. When the product page is loaded and we click on one of the swatches, it takes more time to actually select that swatch. It works fine for any subsequent selection.

Configurable product swatch selection for the first time takes longer

Cannot read property 'submit' of null

โ„น Collecting modules for bundle "checkout".
ERROR Evaluation failed: TypeError: Cannot read property 'submit' of null

I am seeing this error when trying to generate the config js.

Checkout config generation does not support sites not using Magento_Swatches

The config generation process for checkout only tries to assign configurable product options when it finds options generated by the Magento_Swatches module ('.product-options-wrapper .swatch-attribute .swatch-option' etc).

If sites do not use this module then these elements do not exist. I have a workaround for one such site, added to lib/generate/collector/checkout.js after line 53:

Array.from(
            document.querySelectorAll(
                '.super-attribute-select'
            )
        ).forEach((select) => {
            Array.from(select.querySelectorAll(
                'option:not([disabled])'
            )
            ).forEach((selectOption) => {
                if (selectOption.value && selectOption.innerText.toLowerCase().indexOf("out of stock") === -1) {
                    select.value =
                        selectOption.value;
                }
            })
        });

Note the "out of stock" is so this works with sites which use the ProductAlert module

2.2.9 compatibility

Hey there,

is it generaly intended to use magepack with 2.2.9? What about the mixins related stuff?

Cheers
Jan

Add posibility to run puppeteer with --no-sandbox

I got error

Failed to launch the browser process! 09:35:52
[0407/093552.508440:ERROR:zygote_host_impl_linux.cc(89)] Running as root without --no-sandbox is not supported. See https://crbug.com/638180.

TROUBLESHOOTING: https://github.com/puppeteer/puppeteer/blob/master/docs/troubleshooting.md

[0407/093552.508440:ERROR:zygote_host_impl_linux.cc(89)] Running as root without --no-sandbox is not supported. See https:crbug.com/638180.

TROUBLESHOOTING: https:github.com/puppeteer/puppeteer/blob/master/docs/troubleshooting.md

at onClose (/node_modules/puppeteer/lib/Launcher.js:750:14)
at Interface. (/node_modules/puppeteer/lib/Launcher.js:739:50)
at Interface.emit (events.js:323:22)
at Interface.close (readline.js:409:8)
at Socket.onend (readline.js:187:10)
at Socket.emit (events.js:323:22)
at endReadableNT (_stream_readable.js:1204:12)
at processTicksAndRejections (internal/process/task_queues.js:84:21)

Request: Ignore TLS errors

This came about as a result of troubleshooting a different issue: #6. In that issue, I made a comment, which points to my fork:

You'll see that in addition to --no-sandbox I'm also calling for ignoreHTTPSErrors. As this is a build tool, I see little reason to care for live-environment exposure and restrictions. Assuming this would run in a containerized environment during build phases of a deployment, it seems reasonable to ignore any TLS errors.

As a point of interest, I've just opened a PR to support Magepack for Warden. See here:

Right now I'm referencing my fork to get the benefits of ignored TLS errors. If we can support this officially, I can change my proposal for Warden to use your official package.

ie11 support

We've just had complaints from the sites we've put this onto that their customers on ie11 are having problems with the sites not working and showing JS errors. It looks like bundling is the cause as the errors are showing arrow functions that ie11 does not understand.

Is there any code that bundling introduces? Could this be changed to be IE11 compliant? Or am I missing something here?

Unexpected token { in fs-extra library

Preconditions

Magento 2.3.4
magepack 2.1.2

Problem

Hiya,

I've been trying to set-up the magepack bundling on m2.3.4 and magepack 2.1.2 and did an attempt on generating the js usingmagepack generate --cms-url="xxx" --category-url="xxx" --product-url="xxx" but bounced at the following error:

/opt/local/lib/node_modules/magepack/node_modules/fs-extra/lib/mkdirs/make-dir.js:86
      } catch {
              ^

SyntaxError: Unexpected token {
    at createScript (vm.js:80:10)
    at Object.runInThisContext (vm.js:139:10)
    at Module._compile (module.js:616:28)
    at Object.Module._extensions..js (module.js:663:10)
    at Module.load (module.js:565:32)
    at tryModuleLoad (module.js:505:12)
    at Function.Module._load (module.js:497:3)
    at Module.require (module.js:596:17)
    at require (internal/module.js:11:18)
    at Object.<anonymous> (/opt/local/lib/node_modules/magepack/node_modules/fs-extra/lib/mkdirs/index.js:3:44)

This seems like a bug in the fs-extra library to me. :) Can't really go on with the generation at this moment. Would you have an idea?

thx in advance!

[Improvement] Bundle Config

At this point, Magepack doesn't support a custom config for bundles. Ideally, it's needed to be able to define bundles as complex Magento builds have more spaces than CMS, Product, Category and Checkout. With the current config, all those custom pages will be broken which makes Magepack impossible to use on such builds.

I would add a config file where I would define bundles and URLs which are included to them like this:

magepack.config.json:

{
    "bundles": {
        "cms": {
            // possibly other configs
            "urls": [
                "/homepage",
                "/404"
            ]
        },
        "category": {
            //...
        },
        "product": {
            //...
        },
        "checkout": {
            //...
        }
    }
}

As a result, the generate command would take baseUrl, httpAuthUser and httpAuthPass as a param.

The backend part (https://github.com/magesuite/magepack-magento) seems to be flexible enough to support custom bundles. Just need to adjust the generator.

Failed to install magepack, permission denied

root@dev:~# npm install -g magepack
npm WARN npm npm does not support Node.js v10.15.2
npm WARN npm You should probably upgrade to a newer version of node as we
npm WARN npm can't make any promises that npm will work with this version.
npm WARN npm Supported releases of Node.js are the latest release of 4, 6, 7, 8, 9.
npm WARN npm You can find the latest version at https://nodejs.org/
/usr/local/bin/magepack -> /usr/local/lib/node_modules/magepack/cli.js

> [email protected] install /usr/local/lib/node_modules/magepack/node_modules/puppeteer
> node install.js

ERROR: Failed to download Chromium r722234! Set "PUPPETEER_SKIP_CHROMIUM_DOWNLOAD" env variable to skip download.
{ Error: EACCES: permission denied, mkdir '/usr/local/lib/node_modules/magepack/node_modules/puppeteer/.local-chromium'
  -- ASYNC --
    at BrowserFetcher.<anonymous> (/usr/local/lib/node_modules/magepack/node_modules/puppeteer/lib/helper.js:111:15)
    at Object.<anonymous> (/usr/local/lib/node_modules/magepack/node_modules/puppeteer/install.js:66:16)
    at Module._compile (internal/modules/cjs/loader.js:689:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
    at Module.load (internal/modules/cjs/loader.js:599:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
    at Function.Module._load (internal/modules/cjs/loader.js:530:3)
    at Function.Module.runMain (internal/modules/cjs/loader.js:742:12)
    at startup (internal/bootstrap/node.js:283:19)
    at bootstrapNodeJSCore (internal/bootstrap/node.js:743:3)
  errno: -13,
  code: 'EACCES',
  syscall: 'mkdir',
  path:
   '/usr/local/lib/node_modules/magepack/node_modules/puppeteer/.local-chromium' }
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: [email protected] (node_modules/magepack/node_modules/puppeteer):
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: [email protected] install: `node install.js`
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: Exit status 1

+ [email protected]
updated 1 package in 2.43s

Feature Request - Manual entries in local config file to be merged with crawled results

Provide the option for a local config file, that could be read, which is in the same format as the magepack.config.js file, and merge these entries with the ones produced from the crawl. Thus allowing users to manually add things to the bundles that don't get picked up by the automatic crawl (perhaps they only appear on one page somewhere that wasn't crawled)

Installation

Hi,

What npm/yarn/node versions do you use ?

I get this error:

martijn:~/Documents/php/magepack (master)$ magepack --generate --config config.js --output build.js
Error: Cannot find module 'magepack'
Require stack:
- /Users/martijn/Documents/php/magepack/config.js
- /Users/martijn/.config/yarn/global/node_modules/magepack/lib/generate.js
- /Users/martijn/.config/yarn/global/node_modules/magepack/cli.js
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:954:17)
    at Function.Module._load (internal/modules/cjs/loader.js:847:27)
    at Module.require (internal/modules/cjs/loader.js:1016:19)
    at require (internal/modules/cjs/helpers.js:69:18)
    at Object.<anonymous> (/Users/martijn/Documents/php/magepack/config.js:1:32)
    at Module._compile (internal/modules/cjs/loader.js:1121:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1160:10)
    at Module.load (internal/modules/cjs/loader.js:976:32)
    at Function.Module._load (internal/modules/cjs/loader.js:884:14)
    at Module.require (internal/modules/cjs/loader.js:1016:19) {
  code: 'MODULE_NOT_FOUND',
  requireStack: [
    '/Users/martijn/Documents/php/magepack/config.js',
    '/Users/martijn/.config/yarn/global/node_modules/magepack/lib/generate.js',
    '/Users/martijn/.config/yarn/global/node_modules/magepack/cli.js'
  ]
}

node -v
v13.2.0

npm -v
6.13.1

gulp -v
CLI version 3.9.1

When I open the magepack clone in PHPStorm I see this (when opening config.js):

Initialization error (ESLint). Unexpected token ...
/Users/martijn/Documents/php/magepack/node_modules/eslint/lib/cli-engine/cli-engine.js:256
...calculateStatsPerFile(messages)
^^^

SyntaxError: Unexpected token ...

Minification with uglify to get source maps

Debugging javascript on production is difficult when javascript is minified or bundled. That's where source maps are useful. These are .js.map files supported by uglify.

Two questions:

  1. Given that uglify is nodejs, would it be easy to incorperate to replace magento's own minification that does not support source maps?
  2. Have you given any thought to source maps for bundles? Perhaps they are already generated?!

Implement proper return/exit code if bundle process fails

I.e.

/var/www/html $ bundle
โ„น Using bundling config from "/var/www/html/magepack.config.js".                                                                                                                                                03:49:49

 ERROR  Cannot find module '/var/www/html/magepack.config.js'                                                                                                                                                   03:49:49
Require stack:
- /usr/lib/node_modules/magepack/lib/bundle.js
- /usr/lib/node_modules/magepack/cli.js

  Require stack:
  - /usr/lib/node_modules/magepack/lib/bundle.js
  - /usr/lib/node_modules/magepack/cli.js
  at Function.Module._resolveFilename (internal/modules/cjs/loader.js:966:15)
  at Function.Module._load (internal/modules/cjs/loader.js:842:27)
  at Module.require (internal/modules/cjs/loader.js:1026:19)
  at require (internal/modules/cjs/helpers.js:72:18)
  at module.exports (/usr/lib/node_modules/magepack/lib/bundle.js:18:28)
  at Command.<anonymous> (/usr/lib/node_modules/magepack/cli.js:47:32)
  at Command.listener [as _actionHandler] (/usr/lib/node_modules/magepack/node_modules/commander/index.js:413:31)
  at Command._parseCommand (/usr/lib/node_modules/magepack/node_modules/commander/index.js:914:14)
  at Command._dispatchSubcommand (/usr/lib/node_modules/magepack/node_modules/commander/index.js:865:18)
  at Command._parseCommand (/usr/lib/node_modules/magepack/node_modules/commander/index.js:882:12)

/var/www/html $ echo $?
0

Expected return code: 1

Actual return code: 0

This would be very useful for CI/CD. At the moment if an error occurs, the job has no way of knowing whether the process was successful or not.

ERROR No locales found! Make sure magepack is running after static content is deployed.

Hi

On magento default 2.3.5-p2 I'm getting this error when I run magepack bundle

I have the patch installed

"extra": {
        "magento-force": "override",
        "patches": {
            "magento/magento2-base": {
                "Refactor JavaScript mixins module https://github.com/magento/magento2/pull/25587": "patches/composer/M234/github-pr-25587-base.diff"
            }
        }
    }

I do have the MagePack Magento 2 Module installed and bin/magento config:set dev/js/enable_magepack_js_bundling 1

I run bin/magento setup:static-content:deploy -f but still get the error

Can you spot what I am doing wrong?

ERROR Failed to launch the browser process!

I am getting error when i run magepack generate command.
How to solve this?
ERROR Failed to launch the browser process! 07:46:13
/srv/.nvm/versions/node/v14.7.0/lib/node_modules/magepack/node_modules/puppeteer/.local-chromium/linux-722234/chrome-linux/chrome: error while loading shared libraries: libX11-xcb.so.1: cannot open shared object file: No such file or directory

TROUBLESHOOTING: https://github.com/puppeteer/puppeteer/blob/master/docs/troubleshooting.md

/srv/.nvm/versions/node/v14.7.0/lib/node_modules/magepack/node_modules/puppeteer/.local-chromium/linux-722234/chrome-linux/chrome: error while loading shared libraries: libX11-xcb.so.1: cannot open shared object file: No such file or directory

TROUBLESHOOTING: https://github.com/puppeteer/puppeteer/blob/master/docs/troubleshooting.md

at onClose (/srv/.nvm/versions/node/v14.7.0/lib/node_modules/magepack/node_modules/puppeteer/lib/Launcher.js:750:14)
at Interface. (/srv/.nvm/versions/node/v14.7.0/lib/node_modules/magepack/node_modules/puppeteer/lib/Launcher.js:739:50)
at Interface.emit (events.js:326:22)
at Interface.close (readline.js:424:8)
at Socket.onend (readline.js:202:10)
at Socket.emit (events.js:326:22)
at endReadableNT (_stream_readable.js:1244:12)
at processTicksAndRejections (internal/process/task_queues.js:80:21)

Add support for remote browsers

We develop + CI on a Kubernetes cluster and run a centralised Chrome browser for Puppeteer to connect to (Critical CSS, Performance Tests, etc).

It would be great if you could add support for passing in a remote URL. I have limited Javascript knowledge but have hacked this working for us with a patch:

--- a/generate.js
+++ b/generate.js

 module.exports = async (generationConfig) => {
-    const browser = await puppeteer.launch({
-        headless: !generationConfig.debug,
-        args: ['--no-sandbox', '--disable-dev-shm-usage'],
+    const browser = await puppeteer.connect({
+        browserURL: process.env.CHROME_HOST,
         defaultViewport: { width: 412, height: 732 },

It would be awesome if this could be enabled with a CLI command, i.e. magepack generate --chrome-url=

Swiper.js just dosen't get run

So we use version 3.4.2 of https://github.com/nolimits4web/swiper on our site and I've just been playing around with magepack (which is awsome by the way).
I'm currently seeing the swiper code basically get skipped. It's in the bundle files but it never gets called. On investigating further, I can get it working by removing the following from the end of the file:

/*===========================
Swiper AMD Export
===========================*/
if (typeof(module) !== 'undefined')
{
    module.exports = window.Swiper;
}
else if (typeof define === 'function' && define.amd) {
    define([], function () {
        'use strict';
        return window.Swiper;
    });
}

//# sourceMappingURL=maps/swiper.js.map

I suspect that the code is being wrapped in a define/require already and then it's trying to redefine in that.

Just thought you guys would like to know

Cheers

Tom

Uncaught TypeError: $(...).select2 is not a function

Used select2 in app/design/frontend/Vendor/theme/Magento_ConfigurableProduct/web/js/configurable-mixin.js
In console get error Uncaught TypeError: $(...).select2 is not a function.
Added select2 to define(). Get another error

Uncaught Error: Mismatched anonymous define() module: function(e){var t=function(){if(e&&e.fn&&e.fn.select2&&e.fn.select2.amd)var t=e.fn.select2.amd;var n,i,r,o,s,a,l,u,c,d,h,f,p,m,g,v;function y(e,t){return p.call(e,t)}function b(e,t){var n,i,r,o,s,a,l,u,c,d,f,p=t&&t.split("/"),m=h.map,v=m&&m["*"]||{};if(e){for(s=(e=e.split("/")).length-1,h.nodeIdCompat&&g.test(e[s])&&(e[s]=e[s].replace(g,"")),"."===e[0].charAt(0)&&p&&(e=p.slice(0,p.length-1).concat(e)),c=0;c<e.length;c++)if("."===(f=e[c]))e.splice(c,1),c-=1;else if(".."===f){if(0===c||1===c&&".."===e[2]||".."===e[c-1])continue;0<c&&(e.splice(c-1,2),c-=2)}e=e.join("/")}if((p||v)&&m){for(c=(n=e.split("/")).length;0<c;c-=1){if(i=n.slice(0,c).join("/"),p)for(d=p.length;0<d;d-=1)if(r=(r=m[p.slice(0,d).join("/")])&&r[i]){o=r,a=c;break}if(o)break;!l&&v&&v[i]&&(l=v[i],u=c)}!o&&l&&(o=l,a=u),o&&(n.splice(0,a,o),e=n.join("/"))}return e}function _(e,t){return function(){var n=m.call(arguments,0);return"string"!=typeof n[0]&&1===n.length&&n.push(null),a.apply(o,โ€ฆ
    makeError https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:16
    intakeDefines https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:77
    localRequire https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:97
    load https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/mage/requirejs/mixins.min.js:8
    callPlugin https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:71
    bind https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:11
    on https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:40
require.min.js:16:53
    makeError https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:16
    intakeDefines https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:77
    localRequire https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:97
    load https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/mage/requirejs/mixins.min.js:8
    callPlugin https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:71
    bind https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:11
    on https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:40
    callPlugin https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:61
    fetch https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:55
    check https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:56
    enable https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:73
    enable https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:101
    enable https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:73
    bind https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:11
    each https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:3
    enable https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:71
    enable https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:101
    enable https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:73
    bind https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:11
    each https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:3
    enable https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:71
    init https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:54
    callGetModule https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:74
    intakeDefines https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:77
    localRequire https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:97
    load https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/mage/requirejs/mixins.min.js:8
    callPlugin https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:71
    bind https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:11
    on https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:40
    callPlugin https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:61
    fetch https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:55
    check https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:56
    enable https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:73
    enable https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:101
    enable https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:73
    bind https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:11
    each https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:3
    enable https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:71
    enable https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:101
    enable https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:73
    bind https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:11
    each https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:3
    enable https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:71
    init https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:54
    callGetModule https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:74
    intakeDefines https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:77
    localRequire https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:97
    load https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/mage/requirejs/mixins.min.js:8
    callPlugin https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:71
    bind https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:11
    on https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:40
    callPlugin https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:61
    fetch https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:55
    check https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:56
    enable https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:73
    enable https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:101
    enable https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:73
    bind https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:11
    each https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:3
    enable https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:71
    init https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:54
    callGetModule https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:74
    intakeDefines https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:77
    localRequire https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:97
    load https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/mage/requirejs/mixins.min.js:8
    callPlugin https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:71
    bind https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:11
    on https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:40
    callPlugin https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:61
    fetch https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:55
    check https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:56
    enable https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:73
    enable https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:101
    enable https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:73
    bind https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:11
    each https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:3
    enable https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:71
    enable https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:101
    enable https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:73
    bind https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:11
    each https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:3
    enable https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:71
    enable https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:101
    enable https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:73
    bind https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:11
    each https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:3
    enable https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:71
    init https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:54
    callGetModule https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:74
    intakeDefines https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:77
    localRequire https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:97
    load https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/mage/requirejs/mixins.min.js:8
    callPlugin https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:71
    bind https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:11
    on https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:40
    callPlugin https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:61
    fetch https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:55
    check https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:56
    enable https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:73
    enable https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:101
    enable https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:73
    bind https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:11
    each https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:3
    enable https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:71
    init https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:54
    callGetModule https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:74
    completeLoad https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:103
    onScriptLoad https://mcstaging.blundstone.com/static/version1595448073/frontend/Blundstone/default/en_US/requirejs/require.min.js:112

Bonus question.
In ReadMe sayed that command magepack bundle have an options. But this options not described. Can you add some examples to ReadMe?

Navigation timeout of 30000 ms exceeded

I tried to run magepack against my local docker environment, but got title's error message.
Is it possible to disable timeout or expand? Or any other nice solution to solve this?

Here is my environment:

  • Magento Open Source 2.3.4
  • MageSuite 3.x
  • MageSuite-MagePack 1.0.x
  • PHP 7.3
  • production mode (just for testing magepack)

How to Set up MagePack with Multiple Website ?

Hello All,

I am facing issue to set up Mage Pack in Multi Website Instance. As we need to run the below command:

magepack generate --cms-url="http://WEBSITE1_URL/" --category-url="http://WEBSITE1_URL/category.html" --product-url="http://WEBSITE1_URL/product.html"

Also is there any documentation, How we can set up this on Magento Commerce Cloud Platform ?

Thanks

Use different product for bundle-product.js versus adding to cart

I propose adding a second (optional) argument to magepack generate:

--product-add-to-cart-url

The purpose of this argument would be to allow a developer to specify a simple product to add to the cart, while specifying a more complex product (Bundle, Configurable, Simple with custom options, etc) to be used for generating the bundle-product.js file.

The reason I'm asking for this is because I have a Magento site that use MageWorx Advanced Product Options on configurable products, and if I pass a configurable product to the --product-url argument, I run into errors. If I run magepack generate using a simple product, then when I load the configurable product, I see dozens of additional JS files getting loaded since they are not getting include in the bundle-product.js file.

Bundling js files are not including in require js - Magento2.1.x version

we are using magento2.1.x version. This library is creating bundling js in the pub folder but it's not including in require js file so bundling is not working in magento2.1.x version and also bundling js files are not minifying.
This is working fine in Magento2.3 and the above version.

Js error in bundle file

First of all thanks a lot for your amazing work, I give a shot for Magepack since I need a solution for bundling and Baler doesn't seem that much mature for me. It does what I need to create a bundle file and reduce payload. However, I got this issue and I haven't got any idea what could cause it

Preconditions

Install Magento2.3.5-p2, applied patch for mixins.js

Steps to reproduce

I installed magepack, run generate command, deployed static content, magepack bundle, clean cache.
One thing I found that there is some error in prod which may affect the crawling of megapack (is it?)
googleads.g.doubleclick.net/pagead/id:1 Failed to load resource: net::ERR_BLOCKED_BY_CLIENT static.doubleclick.net/instream/ad_status.js:1 Failed to load resource: net::ERR_BLOCKED_BY_CLIENT

Expected result

No JS errors

Actual result
bundle-common.js:formatted:65103 Uncaught TypeError: define(...) is not a function from this part

`(function(factory) {
if (typeof define === 'function' && define.amd) {
define('jquery/jquery.metadata', ["jquery"], factory);
} else {
factory(jQuery);
}
}(function($) {

$.extend({
    metadata: {
        defaults: {
            type: 'class',
            name: 'metadata',
            cre: /({.*})/,
            single: 'metadata',
            meta: 'validate'
        },
        setType: function(type, name) {
            this.defaults.type = type;
            this.defaults.name = name;`

Custom javascript is not running

I am doing several tests with magepack and it seems that all the functionalities work correctly except one. Which comes from a custom javascript.

I have checked that the functionality exists, the functionality exists in the merge file that is received first. You can see it in the image below. I attach the order and how the initial functionality exists in the file.

How can I solve that? can it be the order in which min js files are received?

The version I have of Magento is 2.3.5

javascripts order
Screenshot 2020-08-29 at 17 53 13

display of the js file in the browser the content of custom.js exists.
image

default.xml:

<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">

	<head>

        <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1.0, user-scalable=no"/>

		<script src="js/bootstrap.js"/>

		<script src="js/custom.js"/>

    </head>

    <body>
</page>

custom.js:

require([
	'jquery',
	'waypoints'
], function(jQuery){
	(function($) {
        console.log('entra1');

        $.fn.appear = function(fn, options) {

			var settings = $.extend({

				//arbitrary data to pass to fn
				data: undefined,

				//call fn only on the first appear?
				one: true,

				// X & Y accuracy
				accX: 0,
				accY: 0

			}, options);

			return this.each(function() {

				var t = $(this);

				//whether the element is currently visible
				t.appeared = false;

				if (!fn) {

					//trigger the custom event
					t.trigger('appear', settings.data);
					return;
				}

				var w = $(window);

				//fires the appear event when appropriate
				var check = function() {

					//is the element hidden?
					if (!t.is(':visible')) {

						//it became hidden
						t.appeared = false;
						return;
					}

					//is the element inside the visible window?
					var a = w.scrollLeft();
					var b = w.scrollTop();
					var o = t.offset();
					var x = o.left;
					var y = o.top;

					var ax = settings.accX;
					var ay = settings.accY;
					var th = t.height();
					var wh = w.height();
					var tw = t.width();
					var ww = w.width();

					if (y + th + ay >= b &&
						y <= b + wh + ay &&
						x + tw + ax >= a &&
						x <= a + ww + ax) {

						//trigger the custom event
						if (!t.appeared) t.trigger('appear', settings.data);

					} else {

						//it scrolled out of view
						t.appeared = false;
					}
				};

				//create a modified fn with some additional logic
				var modifiedFn = function() {

					//mark the element as visible
					t.appeared = true;

					//is this supposed to happen only once?
					if (settings.one) {

						//remove the check
						w.unbind('scroll', check);
						var i = $.inArray(check, $.fn.appear.checks);
						if (i >= 0) $.fn.appear.checks.splice(i, 1);
					}

					//trigger the original fn
					fn.apply(this, arguments);
				};

				//bind the modified fn to the element
				if (settings.one) t.one('appear', settings.data, modifiedFn);
				else t.bind('appear', settings.data, modifiedFn);

				//check whenever the window scrolls
				w.scroll(check);

				//check whenever the dom changes
				$.fn.appear.checks.push(check);

				//check now
				(check)();
			});
		};

		//keep a queue of appearance checks
		$.extend($.fn.appear, {

			checks: [],
			timeout: null,

			//process the queue
			checkAll: function() {
				var length = $.fn.appear.checks.length;
				if (length > 0) while (length--) ($.fn.appear.checks[length])();
			},

			//check the queue asynchronously
			run: function() {
				if ($.fn.appear.timeout) clearTimeout($.fn.appear.timeout);
				$.fn.appear.timeout = setTimeout($.fn.appear.checkAll, 20);
			}
		});

		//run checks when these methods are called
		$.each(['append', 'prepend', 'after', 'before', 'attr',
			'removeAttr', 'addClass', 'removeClass', 'toggleClass',
			'remove', 'css', 'show', 'hide'], function(i, n) {
			var old = $.fn[n];
			if (old) {
				$.fn[n] = function() {
					var r = old.apply(this, arguments);
					$.fn.appear.run();
					return r;
				}
			}
		});

		$(document).ready(function(){
			$("[data-appear-animation]").each(function() {
				$(this).addClass("appear-animation");
				if($(window).width() > 767) {
					$(this).appear(function() {

						var delay = ($(this).attr("data-appear-animation-delay") ? $(this).attr("data-appear-animation-delay") : 1);

						if(delay > 1) $(this).css("animation-delay", delay + "ms");
						$(this).addClass($(this).attr("data-appear-animation"));
						$(this).addClass("animated");

						setTimeout(function() {
							$(this).addClass("appear-animation-visible");
						}, delay);

					}, {accX: 0, accY: -150});
				} else {
					$(this).addClass("appear-animation-visible");
				}
			});
			// MEGAMENU JS
			$('.nav-main-menu li.mega-menu-fullwidth.menu-2columns').hover(function(){
				if($(window).width() > 1199){
					var position = $(this).position();
					var widthMenu = $("#mainMenu").width() - position.left;
					if(widthMenu > 500){
						widthMenu = 500;
					}
					$(this).find('ul.dropdown-menu').width(widthMenu);
				}
			});

			$('.nav-main-menu .static-menu li > .toggle-menu a').click(function(){
				$(this).toggleClass('active');
				$(this).parent().parent().find('> ul').slideToggle();
			});
			// END MEGAMENU

            console.log('entra4');

			// Responsive header
			$('.action.nav-toggle').click(function(){
				if ($('html').hasClass('nav-open')) {
					$('html').removeClass('nav-open');
					setTimeout(function () {
						$('html').removeClass('nav-before-open');
					}, 300);
				} else {
					$('html').addClass('nav-before-open');
					setTimeout(function () {
						$('html').addClass('nav-open');
					}, 42);
				}
			});

			$('.close-nav-button').click(function(){
				$('html').removeClass('nav-open');
				setTimeout(function () {
					$('html').removeClass('nav-before-open');
				}, 300);
			});

			// Closed filter fixed
			$(document).on("click","#close-filter",function(e){
				$('.block.filter .filter-title .title').click();
			});

			// Closed minicart
			$(document).on("click","#close-minicart",function(e){
				$('.table-icon-menu .minicart-wrapper .action.showcart').click();
			});

			/* Shipping & Discount Code */
			$('.checkout-extra > .block > .title').click(function(){
				$('.checkout-extra > .block > .title').removeClass('active');
				$('.checkout-extra > .block > .content').removeClass('active');
				$(this).addClass('active');
				$(this).parent().find('> .content').addClass('active');
			});

			$(document).on("click",".products-grid .product-item-info .product-top > a",function(e){
				if($(window).width() < 992 && !$('.products-grid .product-item-info').hasClass('disable_hover_effect')){
					if(!$(this).hasClass('active')){
						$('.products-grid .product-item-info .product-top > a.active').removeClass('active');
						event.returnValue = false;
						event.preventDefault();
						$(this).addClass('active');
					}
				}
			});

		});


	})(jQuery);
});

require([
	'jquery', 'mgs_quickview'
], function(jQuery){
	(function($) {
		$(document).ready(function(){
			$('.btn-loadmore').click(function(){
				var el = $(this);
				el.addClass('loading');
				url = $(this).attr('href');
				$.ajax({
					url: url,
					success: function(data,textStatus,jqXHR ){
						el.removeClass('loading');
						var result = $.parseJSON(data);
						if(result.content!=''){
							$('#'+result.element_id).append(result.content);
							$('.mgs-quickview').bind('click', function () {
								var prodUrl = $(this).attr('data-quickview-url');
								if (prodUrl.length) {
									reInitQuickview($,prodUrl);
								}
							});
						}

						if(result.url){
							el.attr('href', result.url);
						}else{
							el.remove();
						}
					}
				});
				return false;
			});
		});

	})(jQuery);
});

function reInitQuickview($, prodUrl){
	if (!prodUrl.length) {
		return false;
	}
	var url = QUICKVIEW_BASE_URL + 'mgs_quickview/index/updatecart';
	$.magnificPopup.open({
		items: {
			src: prodUrl
		},
		type: 'iframe',
		removalDelay: 300,
		mainClass: 'mfp-fade',
		closeOnBgClick: true,
		preloader: true,
		tLoading: '',
		callbacks: {
			open: function () {
				$('.mfp-preloader').css('display', 'block');
			},
			beforeClose: function () {
				$('[data-block="minicart"]').trigger('contentLoading');
				$.ajax({
					url: url,
					method: "POST"
				});
			},
			close: function () {
				$('.mfp-preloader').css('display', 'none');
			}
		}
	});
}

function setLocation(url) {
    require([
        'jquery'
    ], function (jQuery) {
        (function () {
            window.location.href = url;
        })(jQuery);
    });
}

require(['jquery'], function($) {
	$(document).ready(function() {

		function changeNumber(el, classEl) {
			if ($(".change-product-per-row a").hasClass('active')) {
				$(".change-product-per-row a").removeClass('active')
			}
			el.addClass('active');

			if($(window).width() >= 992) {
				$('.product-list-masonry-change-product .product-item-masonry').removeClass(function (index, css) {
					return (css.match (/\bcol-lg\S+/g) || []).join(' '); // removes anything that starts with "itemnx"
				});
				$('.product-list-masonry-change-product .product-item-masonry').removeClass(function (index, css) {
					return (css.match (/\bcol-md\S+/g) || []).join(' '); // removes anything that starts with "itemnx"
				});
			}
			$('.product-list-masonry-change-product .product-item-masonry').addClass(classEl);


		}

		if($(window).width() >= 992) {
			$(".change-product-per-row .one").click(function(e) {
				e.preventDefault();
				changeNumber($(this), 'col-lg-12 col-md-12');
			});
			$(".change-product-per-row .two").click(function(e) {
				e.preventDefault();
				changeNumber($(this), 'col-lg-6 col-md-6');
			});
			$(".change-product-per-row .three").click(function(e) {
				e.preventDefault();
				changeNumber($(this), 'col-lg-4 col-md-4');
			});
			$(".change-product-per-row .four").click(function(e) {
				e.preventDefault();
				changeNumber($(this), 'col-lg-3 col-md-3');
			});
			$(".change-product-per-row .five").click(function(e) {
				e.preventDefault();
				changeNumber($(this), 'col-md-custom-5');
			});
			$(".change-product-per-row .six").click(function(e) {
				e.preventDefault();
				changeNumber($(this), 'col-lg-2 col-md-2');
			});
			$(".change-product-per-row .seven").click(function(e) {
				e.preventDefault();
				changeNumber($(this), 'col-md-custom-7');
			});
			$(".change-product-per-row .eight").click(function(e) {
				e.preventDefault();
				changeNumber($(this), 'col-md-custom-8');
			});
		}

	});
	$(document).ajaxComplete(function() {

		function changeNumber(el, classEl) {
			if ($(".change-product-per-row a").hasClass('active')) {
				$(".change-product-per-row a").removeClass('active')
			}
			el.addClass('active');

			if($(window).width() >= 992) {
				$('.product-list-masonry-change-product .product-item-masonry').removeClass(function (index, css) {
					return (css.match (/\bcol-lg\S+/g) || []).join(' '); // removes anything that starts with "itemnx"
				});
				$('.product-list-masonry-change-product .product-item-masonry').removeClass(function (index, css) {
					return (css.match (/\bcol-md\S+/g) || []).join(' '); // removes anything that starts with "itemnx"
				});
			}
			$('.product-list-masonry-change-product .product-item-masonry').addClass(classEl);


		}

		if($(window).width() >= 992) {
			$(".change-product-per-row .one").click(function(e) {
				e.preventDefault();
				changeNumber($(this), 'col-lg-12 col-md-12');
			});
			$(".change-product-per-row .two").click(function(e) {
				e.preventDefault();
				changeNumber($(this), 'col-lg-6 col-md-6');
			});
			$(".change-product-per-row .three").click(function(e) {
				e.preventDefault();
				changeNumber($(this), 'col-lg-4 col-md-4');
			});
			$(".change-product-per-row .four").click(function(e) {
				e.preventDefault();
				changeNumber($(this), 'col-lg-3 col-md-3');
			});
			$(".change-product-per-row .five").click(function(e) {
				e.preventDefault();
				changeNumber($(this), 'col-md-custom-5');
			});
			$(".change-product-per-row .six").click(function(e) {
				e.preventDefault();
				changeNumber($(this), 'col-lg-2 col-md-2');
			});
			$(".change-product-per-row .seven").click(function(e) {
				e.preventDefault();
				changeNumber($(this), 'col-md-custom-7');
			});
			$(".change-product-per-row .eight").click(function(e) {
				e.preventDefault();
				changeNumber($(this), 'col-md-custom-8');
			});
		}

	});

});

Modularisation

Would it be possible to modularise magepack? Splitting out the generation and bundle tasks into separate modules would be helpful for us as magepack gets installed as part of our deployment pipeline, we only use the generate command locally, so it would be really helpful if we could reduce bulk in deployments as chromium takes a while to download each time

Can you describe some moments?

Could you give some comments about a deploy process?

  1. Command magepack generate --cms-url="{{CMS_PAGE_URL}}" --category-url="{{CATEGORY_PAGE_URL}}" --product-url="{{PRODUCT_PAGE_URL}}" need run BEFORE bin/magento config:set dev/js/enable_magepack_js_bundling 1 or i can run command after too ?
    1.1 This command mast run only once?

  2. If I use a site in production mode. How to set this settings:

dev/js/merge_files
dev/js/enable_js_bundling
dev/js/minify_files

Double minified file

Magento 2.3.3p1
JS minification turned on

In one theme, bundles included as expeced
In another theme, their name includes .min twice:

    <link rel="prefetch" as="script" href="https://blahdev.co.uk/static/frontend/Blah/Usa/en_US/magepack/bundle-common.min.min.js"/>
    <link rel="prefetch" as="script" href="https://blahdev/static/frontend/Blah/Usa/en_US/magepack/bundle-category.min.min.js"/>

This of course does not work, as the file only have .min in it once

Generate bundles for Magento/blank

It is not possible to generate bundles for Magento/blank

They are purposely excluded in file getLocales.js

I personally use Magento/blank and have all customisation in modules, and so I can't generate bundles.

magepack.config.js order is not stable

running the same magepack generate command twice in a row results in different magepack.config.js files. for git purposes, it would be great if the resulting config file's modules order wouldn't change when there are no code changes. maybe an array sort before outputting the modules configs would suffice?

net::ERR_CONNECTION_REFUSED

Hello team,

I am getting following error when running magepack generate command

net::ERR_CONNECTION_REFUSED at https://domain name/index.php/women.html 05:35:05

at navigate (/usr/lib/node_modules/magepack/node_modules/puppeteer/lib/FrameManager.js:120:37)
at process._tickCallback (internal/process/next_tick.js:68:7)
-- ASYNC --
at Frame. (/usr/lib/node_modules/magepack/node_modules/puppeteer/lib/helper.js:111:15)
at Page.goto (/usr/lib/node_modules/magepack/node_modules/puppeteer/lib/Page.js:672:49)
at Page. (/usr/lib/node_modules/magepack/node_modules/puppeteer/lib/helper.js:112:23)
at Object.category (/usr/lib/node_modules/magepack/lib/generate/collector/category.js:36:16)
at process._tickCallback (internal/process/next_tick.js:68:7)

Any idea why I am getting this error?

Thanks,

Dockerfile to ease execution

It would be handy to have a Dockerfile (and maybe even a Docker image on Docker Hub) to ease the execution of magepack. There are some dependencies like npm and puppeteer which make it a bit tricky to execute magepack - at least in your build pipeline. Having a Docker image (which requires a Dockerfile) which already bundles all necessary dependencies would make it much simpler to setup and execute magepack.
Beside the npm installation it would be great if you could also support environment variables for cms/product/category URLs.

HTTP Auth Support

Thank you for the great tool <3

We are using HTTP auth on the dev environment and it seems like this can trigger the following issue:

โ„น Collecting bundle modules in the browser.                                                                                                                                           12:50:04
โ„น Collecting modules for bundle "category".                                                                                                                                           12:50:04

 ERROR  Evaluation failed: TypeError: require is not a function                                                                                                                       12:50:08
    at __puppeteer_evaluation_script__:3:17
    at new Promise (<anonymous>)
    at __puppeteer_evaluation_script__:2:13

  at __puppeteer_evaluation_script__:3:17
  at new Promise (<anonymous>)
  at __puppeteer_evaluation_script__:2:13
  at ExecutionContext._evaluateInternal (/usr/local/share/.config/yarn/global/node_modules/puppeteer/lib/ExecutionContext.js:122:13)
  at process._tickCallback (internal/process/next_tick.js:68:7)
  -- ASYNC --
  at ExecutionContext.<anonymous> (/usr/local/share/.config/yarn/global/node_modules/puppeteer/lib/helper.js:111:15)
  at DOMWorld.evaluate (/usr/local/share/.config/yarn/global/node_modules/puppeteer/lib/DOMWorld.js:112:20)
  at process._tickCallback (internal/process/next_tick.js:68:7)
  -- ASYNC --
  at Frame.<anonymous> (/usr/local/share/.config/yarn/global/node_modules/puppeteer/lib/helper.js:111:15)
  at Page.evaluate (/usr/local/share/.config/yarn/global/node_modules/puppeteer/lib/Page.js:860:43)
  at Page.<anonymous> (/usr/local/share/.config/yarn/global/node_modules/puppeteer/lib/helper.js:112:23)
  at module.exports (/usr/local/share/.config/yarn/global/node_modules/magepack/lib/generate/collectModules.js:19:16)
  at process._tickCallback (internal/process/next_tick.js:68:7)

I have tried to use https://user:[email protected] format for links but got no luck with bypassing this.

It would be nice to support HTTP auth and let to run Megapack from similar dev setups.

Exclude js file

Hello,
Great module, works great better than baler...

i have a problem with a module slider that has problem with building
It is possibile to exclude some js file of a module from building?

Thanks

Differences between themes

I see that magepack creates bundles for each locale and theme, which is great as we have plenty of both.

My question is if there is a way to handle the differences between these themes/sites? We have two sites on the same installation with quite different functionality - it would make sense to bundle these separately. Luckily, each uses a different theme so we could split it that way.

The easiest way I see this working would be to allow explicit config files to be specified as output at generate, and as input for bundling; and to specify which themes to bundle for in the latter case. This would be a fairly minor change that would allow these differences to be handled and automated as part of a deployment process.

Alternatively, the target themes could be specified at the point of generation, which is then stored as part of a config file that includes theme names. Then bundling would read all available config files and output to the correct themes. The advantage of this approach would be that no arguments would need to be passed at the point of bundling.

Possibly needs some refining, but what do you think?

BASE_URL is not defined for checkout page

During magepack generate --cms-url="{{CMS_PAGE_URL}}" --category-url="{{CATEGORY_PAGE_URL}}" --product-url="{{PRODUCT_PAGE_URL}}" Got an error:

โ„น Collecting bundle modules in the browser.                                                                                                                                                     13:15:49
โ„น Collecting modules for bundle "category".                                                                                                                                                     13:15:49
โœ” Finished collecting modules for bundle "category".                                                                                                                                            13:16:02
โ„น Collecting modules for bundle "cms".                                                                                                                                                          13:16:02
โœ” Finished collecting modules for bundle "cms".                                                                                                                                                 13:16:12
โ„น Collecting modules for bundle "product".                                                                                                                                                      13:16:12
โœ” Finished collecting modules for bundle "product".                                                                                                                                             13:16:23
โ„น Collecting modules for bundle "checkout".                                                                                                                                                     13:16:23

ERROR  Evaluation failed: ReferenceError: BASE_URL is not defined                                                                                                                              13:16:31
    at __puppeteer_evaluation_script__:1:8

  at __puppeteer_evaluation_script__:1:8
  at ExecutionContext._evaluateInternal (/usr/local/lib/node_modules/magepack/node_modules/puppeteer/lib/ExecutionContext.js:122:13)
  at runMicrotasks (<anonymous>)
  at processTicksAndRejections (internal/process/task_queues.js:94:5)
  at async ExecutionContext.evaluate (/usr/local/lib/node_modules/magepack/node_modules/puppeteer/lib/ExecutionContext.js:48:12)
  at async Object.checkout (/usr/local/lib/node_modules/magepack/lib/generate/collector/checkout.js:63:21)
  at async module.exports (/usr/local/lib/node_modules/magepack/lib/generate.js:24:13)
  -- ASYNC --
  at ExecutionContext.<anonymous> (/usr/local/lib/node_modules/magepack/node_modules/puppeteer/lib/helper.js:111:15)
  at DOMWorld.evaluate (/usr/local/lib/node_modules/magepack/node_modules/puppeteer/lib/DOMWorld.js:112:20)
  at runMicrotasks (<anonymous>)
  at processTicksAndRejections (internal/process/task_queues.js:94:5)
  -- ASYNC --
  at Frame.<anonymous> (/usr/local/lib/node_modules/magepack/node_modules/puppeteer/lib/helper.js:111:15)
  at Page.evaluate (/usr/local/lib/node_modules/magepack/node_modules/puppeteer/lib/Page.js:860:43)
  at Page.<anonymous> (/usr/local/lib/node_modules/magepack/node_modules/puppeteer/lib/helper.js:112:23)
  at Object.checkout (/usr/local/lib/node_modules/magepack/lib/generate/collector/checkout.js:63:32)
  at runMicrotasks (<anonymous>)
  at processTicksAndRejections (internal/process/task_queues.js:94:5)
  at async module.exports (/usr/local/lib/node_modules/magepack/lib/generate.js:24:13)

Locally fixed it by adding static url here magepack/lib/generate/collector/checkout.js:63 const baseUrl = "https://mysite.test/";

[Issue] Uncaught Error: Mismatched anonymous define() module

I have the following module included to the page:

define(['mobile-detect', 'modernizr'], function(MobileDetect){
/*global Modernizr MobileDetect*/

    (function (window, Modernizr) {
        'use strict';
        var md = new MobileDetect(navigator.userAgent),
            grade = md.mobileGrade();
        Modernizr.addTest({
            mobile: !!md.mobile(),
            phone: !!md.phone(),
            tablet: !!md.tablet(),
            mobilegradea: grade === 'A'
        });
        window.mobileDetect = md;
    })(window, Modernizr);

});

It requires MobileDetect library and tries to use it. The issue is that after the bundling I started to undefined as MobileDetect param and the following errors on the frontend:

2020-04-16_23-08-25

Here is how mobile-detect dep is defined:

requirejs-config.js:

var config = {
    //...
    map: {
        '*': {
            // Libraries
            'mobile-detect': 'js/lib/mobile-detect/mobile-detect.min',
           //....
        }
    },
  //...
};

Looking through the bundle file, I mentioned that the mobile detect lib is bundled this way:

define('js/lib/mobile-detect/mobile-detect.min', function() {

    /*!@license Copyright 2013, Heinrich Goebl, License: MIT, see https://github.com/hgoebl/mobile-detect.js*/
!function(a,b){a(function(){"use strict";function a(a,b){return null!=a&&null!=b&&a.toLowerCase()===b.toLowerCase()}function c(a,b){var c,d,e=a.length;if(!e||!b)return!1;for(c=b.toLowerCase(),d=0;d<e;++d)if(c===a[d].toLowerCase())return!0;return!1}function d(a){for(var b in a)i.call(a,b)&&(a[b]=new RegExp(a[b],"i"))}function e(a){return(a||"").substr(0,500)}function f(a,b){this.ua=e(a),this._cache={},this.maxPhoneWidth=b||600}var g={};g.mobileDetectRules={phones:{iPhone:"\\biPhone\\b|\\biPod\\b",BlackBerry:"BlackBerry|\\bBB10\\b|rim[0-9]+",HTC:"HTC|HTC.*(Sensation|Evo|Vision|Explorer|6800|8100|8900|A7272|S510e|C110e|Legend|Desire|T8282)|APX515CKT|Qtek9090|APA9292KT|HD_mini|Sensation.*Z710e|PG86100|Z715e|Desire.*(A8181|HD)|ADR6200|ADR6400L|ADR6425|001HT|Inspire 4G|Android.*\\bEVO\\b|T-Mobile G1|Z520m|Android [0-9.]+; Pixel",Nexus:"Nexus One|Nexus S|Galaxy.*Nexus|Android.*Nexus.*Mobile|Nexus 4|Nexus 5|Nexus 6",Dell:"Dell[;]? (Streak|Aero|Venue|Venue Pro|Flash|Smoke|Mini 3iX)|XCD28|XCD35|\\b001DL\\b|\\b101DL\\b|\\bGS01\\b",Motorola:"Motorola|DROIDX|DROID BIONIC|\\bDroid\\b.*Build|Android.*Xoom|HRI39|MOT-|A1260|A1680|A555|A853|A855|A953|A955|A956|Motorola.*ELECTRIFY|Motorola.*i1|i867|i940|MB200|MB300|MB501|MB502|MB508|MB511|MB520|MB525|MB526|MB611|MB612|MB632|MB810|MB855|MB860|MB861|MB865|MB870|ME501|ME502|ME511|ME525|ME600|ME632|ME722|ME811|ME860|ME863|ME865|MT620|MT710|MT716|MT720|MT810|MT870|MT917|Motorola.*TITANIUM|WX435|WX445|XT300|XT301|XT311|XT316|XT317|XT319|XT320|XT390|XT502|XT530|XT531|XT532|XT535|XT603|XT610|XT611|XT615|XT681|XT701|XT702|XT711|XT720|XT800|XT806|XT860|XT862|XT875|XT882|XT883|XT894|XT901|XT907|XT909|XT910|XT912|XT928|XT926|XT915|XT919|XT925|XT1021|\\bMoto E\\b|XT1068|XT1092",Samsung:"\\bSamsung\\b|SM-G950F|SM-G955F|SM-G9250|GT-19300|SGH-I337|BGT-S5230|GT-B2100|GT-B2700|GT-B2710|GT-B3210|GT-B3310|GT-B3410|GT-B3730|GT-B3740|GT-B5510|GT-B5512|GT-B5722|GT-B6520|GT-B7300|GT-B7320|GT-B7330|GT-B7350|GT-B7510|GT-B7722|GT-B7800|GT-C3010|GT-C3011|GT-C3060|GT-C3200|GT-C3212|GT-C3212I|GT-C3262|GT-C3222|GT-C3300|GT-C3300K|GT-C3303|GT-C3303K|GT-C3310|GT-C3322|GT-C3330|GT-C3350|GT-C3500|GT-C3510|GT-C3530|GT-C3630|GT-C3780|GT-C5010|GT-C5212|GT-C6620|GT-C6625|GT-C6712|GT-E1050|GT-E1070|GT-E1075|GT-E1080|GT-E1081|GT-E1085|GT-E1087|GT-E1100|GT-E1107|GT-E1110|GT-E1120|GT-E1125|GT-E1130|GT-E1160|GT-E1170|GT-E1175|GT-E1180|GT-E1182|GT-E1200|GT-E1210|GT-E1225|GT-E1230|GT-E1390|GT-E2100|GT-E2120|GT-E2121|GT-E2152|GT-E2220|GT-E2222|GT-E2230|GT-E2232|GT-E2250|GT-E2370|GT-E2550|GT-E2652|GT-E3210|GT-E3213|GT-I5500|GT-I5503|GT-I5700|GT-I5800|GT-I5801|GT-I6410|GT-I6420|GT-I7110|GT-I7410|GT-I7500|GT-I8000|GT-I8150|GT-I8160|GT-I8190|GT-I8320|GT-I8330|GT-I8350|GT-I8530|GT-I8700|GT-I8703|GT-I8910|GT-I9000|GT-I9001|GT-I9003|GT-I9010|GT-I9020|GT-I9023|GT-I9070|GT-I9082|GT-I9100|GT-I9103|GT-I9220|GT-I9250|GT-I9300|GT-I9305|GT-I9500|GT-I9505|GT-M3510|GT-M5650|GT-M7500|GT-M7600|GT-M7603|GT-M8800|GT-M8910|GT-N7000|GT-S3110|GT-S3310|GT-S3350|GT-S3353|GT-S3370|GT-S3650|GT-S3653|GT-S3770|GT-S3850|GT-S5210|GT-S5220|GT-S5229|GT-S5230|GT-S5233|GT-S5250|GT-S5253|GT-S5260|GT-S5263|GT-S5270|GT-S5300|GT-S5330|GT-S5350|GT-S5360|GT-S5363|GT-S5369|GT-S5380|GT-S5380D|GT-S5560|GT-S5570|GT-S5600|GT-S5603|GT-S5610|GT-S5620|GT-S5660|GT-S5670|GT-S5690|GT-S5750|GT-S5780|GT-S5830|GT-S5839|GT-S6102|GT-S6500|GT-S7070|GT-S7200|GT-S7220|GT-S7230|GT-S7233|GT-S7250|GT-S7500|GT-S7530|GT-S7550|GT-S7562|GT-S7710|GT-S8000|GT-S8003|GT-S8500|GT-S8530|GT-S8600|SCH-A310|SCH-A530|SCH-A570|SCH-A610|SCH-A630|SCH-A650|SCH-A790|SCH-A795|SCH-A850|SCH-A870|SCH-A890|SCH-A930|SCH-A950|SCH-A970|SCH-A990|SCH-I100|SCH-I110|SCH-I400|SCH-I405|SCH-I500|SCH-I510|SCH-I515|SCH-I600|SCH-I730|SCH-I760|SCH-I770|SCH-I830|SCH-I910|SCH-I920|SCH-I959|SCH-LC11|SCH-N150|SCH-N300|SCH-R100|SCH-R300|SCH-R351|SCH-R400|SCH-R410|SCH-T300|SCH-U310|SCH-U320|SCH-U350|SCH-U360|SCH-U365|SCH-U370|SCH-U380|SCH-U410|SCH-U430|SCH-U450|SCH-U460|SCH-U470|SCH-U490|SCH-U540|SCH-U550|SCH-U620|SCH-U640|SCH-U650|SCH-U660|SCH-U700|SCH-U740|SCH-U750|SCH-U810|SCH-U820|SCH-U900|SCH-U940|SCH-U960|SCS-26UC|SGH-A107|SGH-A117|SGH-A127|SGH-A137|SGH-A157|SGH-A167|SGH-A177|SGH-A187|SGH-A197|SGH-A227|SGH-A237|SGH-A257|SGH-A437|SGH-A517|SGH-A597|SGH-A637|SGH-A657|SGH-A667|SGH-A687|SGH-A697|SGH-A707|SGH-A717|SGH-A727|SGH-A737|SGH-A747|SGH-A767|SGH-A777|SGH-A797|SGH-A817|SGH-A827|SGH-A837|SGH-A847|SGH-A867|SGH-A877|SGH-A887|SGH-A897|SGH-A927|SGH-B100|SGH-B130|SGH-B200|SGH-B220|SGH-C100|SGH-C110|SGH-C120|SGH-C130|SGH-C140|SGH-C160|SGH-C170|SGH-C180|SGH-C200|SGH-C207|SGH-C210|SGH-C225|SGH-C230|SGH-C417|SGH-C450|SGH-D307|SGH-D347|SGH-D357|SGH-D407|SGH-D415|SGH-D780|SGH-D807|SGH-D980|SGH-E105|SGH-E200|SGH-E315|SGH-E316|SGH-E317|SGH-E335|SGH-E590|SGH-E635|SGH-E715|SGH-E890|SGH-F300|SGH-F480|SGH-I200|SGH-I300|SGH-I320|SGH-I550|SGH-I577|SGH-I600|SGH-I607|SGH-I617|SGH-I627|SGH-I637|SGH-I677|SGH-I700|SGH-I717|SGH-I727|SGH-i747M|SGH-I777|SGH-I780|SGH-I827|SGH-I847|SGH-I857|SGH-I896|SGH-I897|SGH-I900|SGH-I907|SGH-I917|SGH-I927|SGH-I937|SGH-I997|SGH-J150|SGH-J200|SGH-L170|SGH-L700|SGH-M110|SGH-M150|SGH-M200|SGH-N105|SGH-N500|SGH-N600|SGH-N620|SGH-N625|SGH-N700|SGH-N710|SGH-P107|SGH-P207|SGH-P300|SGH-P310|SGH-P520|SGH-P735|SGH-P777|SGH-Q105|SGH-R210|SGH-R220|SGH-R225|SGH-S105|SGH-S307|SGH-T109|SGH-T119|SGH-T139|SGH-T209|SGH-T219|SGH-T229|SGH-T239|SGH-T249|SGH-T259|SGH-T309|SGH-T319|SGH-T329|SGH-T339|SGH-T349|SGH-T359|SGH-T369|SGH-T379|SGH-T409|SGH-T429|SGH-T439|SGH-T459|SGH-T469|SGH-T479|SGH-T499|SGH-T509|SGH-T519|SGH-T539|SGH-T559|SGH-T589|SGH-T609|SGH-T619|SGH-T629|SGH-T639|SGH-T659|SGH-T669|SGH-T679|SGH-T709|SGH-T719|SGH-T729|SGH-T739|SGH-T746|SGH-T749|SGH-T759|SGH-T769|SGH-T809|SGH-T819|SGH-T839|SGH-T919|SGH-T929|SGH-T939|SGH-T959|SGH-T989|SGH-U100|SGH-U200|SGH-U800|SGH-V205|SGH-V206|SGH-X100|SGH-X105|SGH-X120|SGH-X140|SGH-X426|SGH-X427|SGH-X475|SGH-X495|SGH-X497|SGH-X507|SGH-X600|SGH-X610|SGH-X620|SGH-X630|SGH-X700|SGH-X820|SGH-X890|SGH-Z130|SGH-Z150|SGH-Z170|SGH-ZX10|SGH-ZX20|SHW-M110|SPH-A120|SPH-A400|SPH-A420|SPH-A460|SPH-A500|SPH-A560|SPH-A600|SPH-A620|SPH-A660|SPH-A700|SPH-A740|SPH-A760|SPH-A790|SPH-A800|SPH-A820|SPH-A840|SPH-A880|SPH-A900|SPH-A940|SPH-A960|SPH-D600|SPH-D700|SPH-D710|SPH-D720|SPH-I300|SPH-I325|SPH-I330|SPH-I350|SPH-I500|SPH-I600|SPH-I700|SPH-L700|SPH-M100|SPH-M220|SPH-M240|SPH-M300|SPH-M305|SPH-M320|SPH-M330|SPH-M350|SPH-M360|SPH-M370|SPH-M380|SPH-M510|SPH-M540|SPH-M550|SPH-M560|SPH-M570|SPH-M580|SPH-M610|SPH-M620|SPH-M630|SPH-M800|SPH-M810|SPH-M850|SPH-M900|SPH-M910|SPH-M920|SPH-M930|SPH-N100|SPH-N200|SPH-N240|SPH-N300|SPH-N400|SPH-Z400|SWC-E100|SCH-i909|GT-N7100|GT-N7105|SCH-I535|SM-N900A|SGH-I317|SGH-T999L|GT-S5360B|GT-I8262|GT-S6802|GT-S6312|GT-S6310|GT-S5312|GT-S5310|GT-I9105|GT-I8510|GT-S6790N|SM-G7105|SM-N9005|GT-S5301|GT-I9295|GT-I9195|SM-C101|GT-S7392|GT-S7560|GT-B7610|GT-I5510|GT-S7582|GT-S7530E|GT-I8750|SM-G9006V|SM-G9008V|SM-G9009D|SM-G900A|SM-G900D|SM-G900F|SM-G900H|SM-G900I|SM-G900J|SM-G900K|SM-G900L|SM-G900M|SM-G900P|SM-G900R4|SM-G900S|SM-G900T|SM-G900V|SM-G900W8|SHV-E160K|SCH-P709|SCH-P729|SM-T2558|GT-I9205|SM-G9350|SM-J120F|SM-G920F|SM-G920V|SM-G930F|SM-N910C|SM-A310F|GT-I9190|SM-J500FN|SM-G903F",LG:"\\bLG\\b;|LG[- ]?(C800|C900|E400|E610|E900|E-900|F160|F180K|F180L|F180S|730|855|L160|LS740|LS840|LS970|LU6200|MS690|MS695|MS770|MS840|MS870|MS910|P500|P700|P705|VM696|AS680|AS695|AX840|C729|E970|GS505|272|C395|E739BK|E960|L55C|L75C|LS696|LS860|P769BK|P350|P500|P509|P870|UN272|US730|VS840|VS950|LN272|LN510|LS670|LS855|LW690|MN270|MN510|P509|P769|P930|UN200|UN270|UN510|UN610|US670|US740|US760|UX265|UX840|VN271|VN530|VS660|VS700|VS740|VS750|VS910|VS920|VS930|VX9200|VX11000|AX840A|LW770|P506|P925|P999|E612|D955|D802|MS323)",Sony:"SonyST|SonyLT|SonyEricsson|SonyEricssonLT15iv|LT18i|E10i|LT28h|LT26w|SonyEricssonMT27i|C5303|C6902|C6903|C6906|C6943|D2533",Asus:"Asus.*Galaxy|PadFone.*Mobile",NokiaLumia:"Lumia [0-9]{3,4}",Micromax:"Micromax.*\\b(A210|A92|A88|A72|A111|A110Q|A115|A116|A110|A90S|A26|A51|A35|A54|A25|A27|A89|A68|A65|A57|A90)\\b",Palm:"PalmSource|Palm",Vertu:"Vertu|Vertu.*Ltd|Vertu.*Ascent|Vertu.*Ayxta|Vertu.*Constellation(F|Quest)?|Vertu.*Monika|Vertu.*Signature",Pantech:"PANTECH|IM-A850S|IM-A840S|IM-A830L|IM-A830K|IM-A830S|IM-A820L|IM-A810K|IM-A810S|IM-A800S|IM-T100K|IM-A725L|IM-A780L|IM-A775C|IM-A770K|IM-A760S|IM-A750K|IM-A740S|IM-A730S|IM-A720L|IM-A710K|IM-A690L|IM-A690S|IM-A650S|IM-A630K|IM-A600S|VEGA PTL21|PT003|P8010|ADR910L|P6030|P6020|P9070|P4100|P9060|P5000|CDM8992|TXT8045|ADR8995|IS11PT|P2030|P6010|P8000|PT002|IS06|CDM8999|P9050|PT001|TXT8040|P2020|P9020|P2000|P7040|P7000|C790",Fly:"IQ230|IQ444|IQ450|IQ440|IQ442|IQ441|IQ245|IQ256|IQ236|IQ255|IQ235|IQ245|IQ275|IQ240|IQ285|IQ280|IQ270|IQ260|IQ250",Wiko:"KITE 4G|HIGHWAY|GETAWAY|STAIRWAY|DARKSIDE|DARKFULL|DARKNIGHT|DARKMOON|SLIDE|WAX 4G|RAINBOW|BLOOM|SUNSET|GOA(?!nna)|LENNY|BARRY|IGGY|OZZY|CINK FIVE|CINK PEAX|CINK PEAX 2|CINK SLIM|CINK SLIM 2|CINK +|CINK KING|CINK PEAX|CINK SLIM|SUBLIM",iMobile:"i-mobile (IQ|i-STYLE|idea|ZAA|Hitz)",SimValley:"\\b(SP-80|XT-930|SX-340|XT-930|SX-310|SP-360|SP60|SPT-800|SP-120|SPT-800|SP-140|SPX-5|SPX-8|SP-100|SPX-8|SPX-12)\\b",Wolfgang:"AT-B24D|AT-AS50HD|AT-AS40W|AT-AS55HD|AT-AS45q2|AT-B26D|AT-AS50Q",Alcatel:"Alcatel",Nintendo:"Nintendo 3DS",Amoi:"Amoi",INQ:"INQ",GenericPhone:"Tapatalk|PDA;|SAGEM|\\bmmp\\b|pocket|\\bpsp\\b|symbian|Smartphone|smartfon|treo|up.browser|up.link|vodafone|\\bwap\\b|nokia|Series40|Series60|S60|SonyEricsson|N900|MAUI.*WAP.*Browser"},tablets:{iPad:"iPad|iPad.*Mobile",NexusTablet:"Android.*Nexus[\\s]+(7|9|10)",SamsungTablet:"SAMSUNG.*Tablet|Galaxy.*Tab|SC-01C|GT-P1000|GT-P1003|GT-P1010|GT-P3105|GT-P6210|GT-P6800|GT-P6810|GT-P7100|GT-P7300|GT-P7310|GT-P7500|GT-P7510|SCH-I800|SCH-I815|SCH-I905|SGH-I957|SGH-I987|SGH-T849|SGH-T859|SGH-T869|SPH-P100|GT-P3100|GT-P3108|GT-P3110|GT-P5100|GT-P5110|GT-P6200|GT-P7320|GT-P7511|GT-N8000|GT-P8510|SGH-I497|SPH-P500|SGH-T779|SCH-I705|SCH-I915|GT-N8013|GT-P3113|GT-P5113|GT-P8110|GT-N8010|GT-N8005|GT-N8020|GT-P1013|GT-P6201|GT-P7501|GT-N5100|GT-N5105|GT-N5110|SHV-E140K|SHV-E140L|SHV-E140S|SHV-E150S|SHV-E230K|SHV-E230L|SHV-E230S|SHW-M180K|SHW-M180L|SHW-M180S|SHW-M180W|SHW-M300W|SHW-M305W|SHW-M380K|SHW-M380S|SHW-M380W|SHW-M430W|SHW-M480K|SHW-M480S|SHW-M480W|SHW-M485W|SHW-M486W|SHW-M500W|GT-I9228|SCH-P739|SCH-I925|GT-I9200|GT-P5200|GT-P5210|GT-P5210X|SM-T311|SM-T310|SM-T310X|SM-T210|SM-T210R|SM-T211|SM-P600|SM-P601|SM-P605|SM-P900|SM-P901|SM-T217|SM-T217A|SM-T217S|SM-P6000|SM-T3100|SGH-I467|XE500|SM-T110|GT-P5220|GT-I9200X|GT-N5110X|GT-N5120|SM-P905|SM-T111|SM-T2105|SM-T315|SM-T320|SM-T320X|SM-T321|SM-T520|SM-T525|SM-T530NU|SM-T230NU|SM-T330NU|SM-T900|XE500T1C|SM-P605V|SM-P905V|SM-T337V|SM-T537V|SM-T707V|SM-T807V|SM-P600X|SM-P900X|SM-T210X|SM-T230|SM-T230X|SM-T325|GT-P7503|SM-T531|SM-T330|SM-T530|SM-T705|SM-T705C|SM-T535|SM-T331|SM-T800|SM-T700|SM-T537|SM-T807|SM-P907A|SM-T337A|SM-T537A|SM-T707A|SM-T807A|SM-T237|SM-T807P|SM-P607T|SM-T217T|SM-T337T|SM-T807T|SM-T116NQ|SM-T116BU|SM-P550|SM-T350|SM-T550|SM-T9000|SM-P9000|SM-T705Y|SM-T805|GT-P3113|SM-T710|SM-T810|SM-T815|SM-T360|SM-T533|SM-T113|SM-T335|SM-T715|SM-T560|SM-T670|SM-T677|SM-T377|SM-T567|SM-T357T|SM-T555|SM-T561|SM-T713|SM-T719|SM-T813|SM-T819|SM-T580|SM-T355Y?|SM-T280|SM-T817A|SM-T820|SM-W700|SM-P580|SM-T587|SM-P350|SM-P555M|SM-P355M|SM-T113NU|SM-T815Y",Kindle:"Kindle|Silk.*Accelerated|Android.*\\b(KFOT|KFTT|KFJWI|KFJWA|KFOTE|KFSOWI|KFTHWI|KFTHWA|KFAPWI|KFAPWA|WFJWAE|KFSAWA|KFSAWI|KFASWI|KFARWI|KFFOWI|KFGIWI|KFMEWI)\\b|Android.*Silk/[0-9.]+ like Chrome/[0-9.]+ (?!Mobile)",SurfaceTablet:"Windows NT [0-9.]+; ARM;.*(Tablet|ARMBJS)",HPTablet:"HP Slate (7|8|10)|HP ElitePad 900|hp-tablet|EliteBook.*Touch|HP 8|Slate 21|HP SlateBook 10",AsusTablet:"^.*PadFone((?!Mobile).)*$|Transformer|TF101|TF101G|TF300T|TF300TG|TF300TL|TF700T|TF700KL|TF701T|TF810C|ME171|ME301T|ME302C|ME371MG|ME370T|ME372MG|ME172V|ME173X|ME400C|Slider SL101|\\bK00F\\b|\\bK00C\\b|\\bK00E\\b|\\bK00L\\b|TX201LA|ME176C|ME102A|\\bM80TA\\b|ME372CL|ME560CG|ME372CG|ME302KL| K010 | K011 | K017 | K01E |ME572C|ME103K|ME170C|ME171C|\\bME70C\\b|ME581C|ME581CL|ME8510C|ME181C|P01Y|PO1MA|P01Z|\\bP027\\b",BlackBerryTablet:"PlayBook|RIM Tablet",HTCtablet:"HTC_Flyer_P512|HTC Flyer|HTC Jetstream|HTC-P715a|HTC EVO View 4G|PG41200|PG09410",MotorolaTablet:"xoom|sholest|MZ615|MZ605|MZ505|MZ601|MZ602|MZ603|MZ604|MZ606|MZ607|MZ608|MZ609|MZ615|MZ616|MZ617",NookTablet:"Android.*Nook|NookColor|nook browser|BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2",AcerTablet:"Android.*; \\b(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700|A701|W500|W500P|W501|W501P|W510|W511|W700|G100|G100W|B1-A71|B1-710|B1-711|A1-810|A1-811|A1-830)\\b|W3-810|\\bA3-A10\\b|\\bA3-A11\\b|\\bA3-A20\\b|\\bA3-A30",ToshibaTablet:"Android.*(AT100|AT105|AT200|AT205|AT270|AT275|AT300|AT305|AT1S5|AT500|AT570|AT700|AT830)|TOSHIBA.*FOLIO",LGTablet:"\\bL-06C|LG-V909|LG-V900|LG-V700|LG-V510|LG-V500|LG-V410|LG-V400|LG-VK810\\b",FujitsuTablet:"Android.*\\b(F-01D|F-02F|F-05E|F-10D|M532|Q572)\\b",PrestigioTablet:"PMP3170B|PMP3270B|PMP3470B|PMP7170B|PMP3370B|PMP3570C|PMP5870C|PMP3670B|PMP5570C|PMP5770D|PMP3970B|PMP3870C|PMP5580C|PMP5880D|PMP5780D|PMP5588C|PMP7280C|PMP7280C3G|PMP7280|PMP7880D|PMP5597D|PMP5597|PMP7100D|PER3464|PER3274|PER3574|PER3884|PER5274|PER5474|PMP5097CPRO|PMP5097|PMP7380D|PMP5297C|PMP5297C_QUAD|PMP812E|PMP812E3G|PMP812F|PMP810E|PMP880TD|PMT3017|PMT3037|PMT3047|PMT3057|PMT7008|PMT5887|PMT5001|PMT5002",LenovoTablet:"Lenovo TAB|Idea(Tab|Pad)( A1|A10| K1|)|ThinkPad([ ]+)?Tablet|YT3-850M|YT3-X90L|YT3-X90F|YT3-X90X|Lenovo.*(S2109|S2110|S5000|S6000|K3011|A3000|A3500|A1000|A2107|A2109|A1107|A5500|A7600|B6000|B8000|B8080)(-|)(FL|F|HV|H|)|TB-X103F|TB-X304F|TB-8703F",DellTablet:"Venue 11|Venue 8|Venue 7|Dell Streak 10|Dell Streak 7",YarvikTablet:"Android.*\\b(TAB210|TAB211|TAB224|TAB250|TAB260|TAB264|TAB310|TAB360|TAB364|TAB410|TAB411|TAB420|TAB424|TAB450|TAB460|TAB461|TAB464|TAB465|TAB467|TAB468|TAB07-100|TAB07-101|TAB07-150|TAB07-151|TAB07-152|TAB07-200|TAB07-201-3G|TAB07-210|TAB07-211|TAB07-212|TAB07-214|TAB07-220|TAB07-400|TAB07-485|TAB08-150|TAB08-200|TAB08-201-3G|TAB08-201-30|TAB09-100|TAB09-211|TAB09-410|TAB10-150|TAB10-201|TAB10-211|TAB10-400|TAB10-410|TAB13-201|TAB274EUK|TAB275EUK|TAB374EUK|TAB462EUK|TAB474EUK|TAB9-200)\\b",MedionTablet:"Android.*\\bOYO\\b|LIFE.*(P9212|P9514|P9516|S9512)|LIFETAB",ArnovaTablet:"97G4|AN10G2|AN7bG3|AN7fG3|AN8G3|AN8cG3|AN7G3|AN9G3|AN7dG3|AN7dG3ST|AN7dG3ChildPad|AN10bG3|AN10bG3DT|AN9G2",IntensoTablet:"INM8002KP|INM1010FP|INM805ND|Intenso Tab|TAB1004",IRUTablet:"M702pro",MegafonTablet:"MegaFon V9|\\bZTE V9\\b|Android.*\\bMT7A\\b",EbodaTablet:"E-Boda (Supreme|Impresspeed|Izzycomm|Essential)",AllViewTablet:"Allview.*(Viva|Alldro|City|Speed|All TV|Frenzy|Quasar|Shine|TX1|AX1|AX2)",ArchosTablet:"\\b(101G9|80G9|A101IT)\\b|Qilive 97R|Archos5|\\bARCHOS (70|79|80|90|97|101|FAMILYPAD|)(b|c|)(G10| Cobalt| TITANIUM(HD|)| Xenon| Neon|XSK| 2| XS 2| PLATINUM| CARBON|GAMEPAD)\\b",AinolTablet:"NOVO7|NOVO8|NOVO10|Novo7Aurora|Novo7Basic|NOVO7PALADIN|novo9-Spark",NokiaLumiaTablet:"Lumia 2520",SonyTablet:"Sony.*Tablet|Xperia Tablet|Sony Tablet S|SO-03E|SGPT12|SGPT13|SGPT114|SGPT121|SGPT122|SGPT123|SGPT111|SGPT112|SGPT113|SGPT131|SGPT132|SGPT133|SGPT211|SGPT212|SGPT213|SGP311|SGP312|SGP321|EBRD1101|EBRD1102|EBRD1201|SGP351|SGP341|SGP511|SGP512|SGP521|SGP541|SGP551|SGP621|SGP612|SOT31",PhilipsTablet:"\\b(PI2010|PI3000|PI3100|PI3105|PI3110|PI3205|PI3210|PI3900|PI4010|PI7000|PI7100)\\b",CubeTablet:"Android.*(K8GT|U9GT|U10GT|U16GT|U17GT|U18GT|U19GT|U20GT|U23GT|U30GT)|CUBE U8GT",CobyTablet:"MID1042|MID1045|MID1125|MID1126|MID7012|MID7014|MID7015|MID7034|MID7035|MID7036|MID7042|MID7048|MID7127|MID8042|MID8048|MID8127|MID9042|MID9740|MID9742|MID7022|MID7010",MIDTablet:"M9701|M9000|M9100|M806|M1052|M806|T703|MID701|MID713|MID710|MID727|MID760|MID830|MID728|MID933|MID125|MID810|MID732|MID120|MID930|MID800|MID731|MID900|MID100|MID820|MID735|MID980|MID130|MID833|MID737|MID960|MID135|MID860|MID736|MID140|MID930|MID835|MID733|MID4X10",MSITablet:"MSI \\b(Primo 73K|Primo 73L|Primo 81L|Primo 77|Primo 93|Primo 75|Primo 76|Primo 73|Primo 81|Primo 91|Primo 90|Enjoy 71|Enjoy 7|Enjoy 10)\\b",SMiTTablet:"Android.*(\\bMID\\b|MID-560|MTV-T1200|MTV-PND531|MTV-P1101|MTV-PND530)",RockChipTablet:"Android.*(RK2818|RK2808A|RK2918|RK3066)|RK2738|RK2808A",FlyTablet:"IQ310|Fly Vision",bqTablet:"Android.*(bq)?.*(Elcano|Curie|Edison|Maxwell|Kepler|Pascal|Tesla|Hypatia|Platon|Newton|Livingstone|Cervantes|Avant|Aquaris ([E|M]10|M8))|Maxwell.*Lite|Maxwell.*Plus",HuaweiTablet:"MediaPad|MediaPad 7 Youth|IDEOS S7|S7-201c|S7-202u|S7-101|S7-103|S7-104|S7-105|S7-106|S7-201|S7-Slim|M2-A01L",NecTablet:"\\bN-06D|\\bN-08D",PantechTablet:"Pantech.*P4100",BronchoTablet:"Broncho.*(N701|N708|N802|a710)",VersusTablet:"TOUCHPAD.*[78910]|\\bTOUCHTAB\\b",ZyncTablet:"z1000|Z99 2G|z99|z930|z999|z990|z909|Z919|z900",PositivoTablet:"TB07STA|TB10STA|TB07FTA|TB10FTA",NabiTablet:"Android.*\\bNabi",KoboTablet:"Kobo Touch|\\bK080\\b|\\bVox\\b Build|\\bArc\\b Build",DanewTablet:"DSlide.*\\b(700|701R|702|703R|704|802|970|971|972|973|974|1010|1012)\\b",TexetTablet:"NaviPad|TB-772A|TM-7045|TM-7055|TM-9750|TM-7016|TM-7024|TM-7026|TM-7041|TM-7043|TM-7047|TM-8041|TM-9741|TM-9747|TM-9748|TM-9751|TM-7022|TM-7021|TM-7020|TM-7011|TM-7010|TM-7023|TM-7025|TM-7037W|TM-7038W|TM-7027W|TM-9720|TM-9725|TM-9737W|TM-1020|TM-9738W|TM-9740|TM-9743W|TB-807A|TB-771A|TB-727A|TB-725A|TB-719A|TB-823A|TB-805A|TB-723A|TB-715A|TB-707A|TB-705A|TB-709A|TB-711A|TB-890HD|TB-880HD|TB-790HD|TB-780HD|TB-770HD|TB-721HD|TB-710HD|TB-434HD|TB-860HD|TB-840HD|TB-760HD|TB-750HD|TB-740HD|TB-730HD|TB-722HD|TB-720HD|TB-700HD|TB-500HD|TB-470HD|TB-431HD|TB-430HD|TB-506|TB-504|TB-446|TB-436|TB-416|TB-146SE|TB-126SE",PlaystationTablet:"Playstation.*(Portable|Vita)",TrekstorTablet:"ST10416-1|VT10416-1|ST70408-1|ST702xx-1|ST702xx-2|ST80208|ST97216|ST70104-2|VT10416-2|ST10216-2A|SurfTab",PyleAudioTablet:"\\b(PTBL10CEU|PTBL10C|PTBL72BC|PTBL72BCEU|PTBL7CEU|PTBL7C|PTBL92BC|PTBL92BCEU|PTBL9CEU|PTBL9CUK|PTBL9C)\\b",AdvanTablet:"Android.* \\b(E3A|T3X|T5C|T5B|T3E|T3C|T3B|T1J|T1F|T2A|T1H|T1i|E1C|T1-E|T5-A|T4|E1-B|T2Ci|T1-B|T1-D|O1-A|E1-A|T1-A|T3A|T4i)\\b ",DanyTechTablet:"Genius Tab G3|Genius Tab S2|Genius Tab Q3|Genius Tab G4|Genius Tab Q4|Genius Tab G-II|Genius TAB GII|Genius TAB GIII|Genius Tab S1",GalapadTablet:"Android.*\\bG1\\b",MicromaxTablet:"Funbook|Micromax.*\\b(P250|P560|P360|P362|P600|P300|P350|P500|P275)\\b",KarbonnTablet:"Android.*\\b(A39|A37|A34|ST8|ST10|ST7|Smart Tab3|Smart Tab2)\\b",AllFineTablet:"Fine7 Genius|Fine7 Shine|Fine7 Air|Fine8 Style|Fine9 More|Fine10 Joy|Fine11 Wide",PROSCANTablet:"\\b(PEM63|PLT1023G|PLT1041|PLT1044|PLT1044G|PLT1091|PLT4311|PLT4311PL|PLT4315|PLT7030|PLT7033|PLT7033D|PLT7035|PLT7035D|PLT7044K|PLT7045K|PLT7045KB|PLT7071KG|PLT7072|PLT7223G|PLT7225G|PLT7777G|PLT7810K|PLT7849G|PLT7851G|PLT7852G|PLT8015|PLT8031|PLT8034|PLT8036|PLT8080K|PLT8082|PLT8088|PLT8223G|PLT8234G|PLT8235G|PLT8816K|PLT9011|PLT9045K|PLT9233G|PLT9735|PLT9760G|PLT9770G)\\b",YONESTablet:"BQ1078|BC1003|BC1077|RK9702|BC9730|BC9001|IT9001|BC7008|BC7010|BC708|BC728|BC7012|BC7030|BC7027|BC7026",ChangJiaTablet:"TPC7102|TPC7103|TPC7105|TPC7106|TPC7107|TPC7201|TPC7203|TPC7205|TPC7210|TPC7708|TPC7709|TPC7712|TPC7110|TPC8101|TPC8103|TPC8105|TPC8106|TPC8203|TPC8205|TPC8503|TPC9106|TPC9701|TPC97101|TPC97103|TPC97105|TPC97106|TPC97111|TPC97113|TPC97203|TPC97603|TPC97809|TPC97205|TPC10101|TPC10103|TPC10106|TPC10111|TPC10203|TPC10205|TPC10503",GUTablet:"TX-A1301|TX-M9002|Q702|kf026",PointOfViewTablet:"TAB-P506|TAB-navi-7-3G-M|TAB-P517|TAB-P-527|TAB-P701|TAB-P703|TAB-P721|TAB-P731N|TAB-P741|TAB-P825|TAB-P905|TAB-P925|TAB-PR945|TAB-PL1015|TAB-P1025|TAB-PI1045|TAB-P1325|TAB-PROTAB[0-9]+|TAB-PROTAB25|TAB-PROTAB26|TAB-PROTAB27|TAB-PROTAB26XL|TAB-PROTAB2-IPS9|TAB-PROTAB30-IPS9|TAB-PROTAB25XXL|TAB-PROTAB26-IPS10|TAB-PROTAB30-IPS10",OvermaxTablet:"OV-(SteelCore|NewBase|Basecore|Baseone|Exellen|Quattor|EduTab|Solution|ACTION|BasicTab|TeddyTab|MagicTab|Stream|TB-08|TB-09)|Qualcore 1027",HCLTablet:"HCL.*Tablet|Connect-3G-2.0|Connect-2G-2.0|ME Tablet U1|ME Tablet U2|ME Tablet G1|ME Tablet X1|ME Tablet Y2|ME Tablet Sync",DPSTablet:"DPS Dream 9|DPS Dual 7",VistureTablet:"V97 HD|i75 3G|Visture V4( HD)?|Visture V5( HD)?|Visture V10",CrestaTablet:"CTP(-)?810|CTP(-)?818|CTP(-)?828|CTP(-)?838|CTP(-)?888|CTP(-)?978|CTP(-)?980|CTP(-)?987|CTP(-)?988|CTP(-)?989",MediatekTablet:"\\bMT8125|MT8389|MT8135|MT8377\\b",ConcordeTablet:"Concorde([ ]+)?Tab|ConCorde ReadMan",GoCleverTablet:"GOCLEVER TAB|A7GOCLEVER|M1042|M7841|M742|R1042BK|R1041|TAB A975|TAB A7842|TAB A741|TAB A741L|TAB M723G|TAB M721|TAB A1021|TAB I921|TAB R721|TAB I720|TAB T76|TAB R70|TAB R76.2|TAB R106|TAB R83.2|TAB M813G|TAB I721|GCTA722|TAB I70|TAB I71|TAB S73|TAB R73|TAB R74|TAB R93|TAB R75|TAB R76.1|TAB A73|TAB A93|TAB A93.2|TAB T72|TAB R83|TAB R974|TAB R973|TAB A101|TAB A103|TAB A104|TAB A104.2|R105BK|M713G|A972BK|TAB A971|TAB R974.2|TAB R104|TAB R83.3|TAB A1042",ModecomTablet:"FreeTAB 9000|FreeTAB 7.4|FreeTAB 7004|FreeTAB 7800|FreeTAB 2096|FreeTAB 7.5|FreeTAB 1014|FreeTAB 1001 |FreeTAB 8001|FreeTAB 9706|FreeTAB 9702|FreeTAB 7003|FreeTAB 7002|FreeTAB 1002|FreeTAB 7801|FreeTAB 1331|FreeTAB 1004|FreeTAB 8002|FreeTAB 8014|FreeTAB 9704|FreeTAB 1003",VoninoTablet:"\\b(Argus[ _]?S|Diamond[ _]?79HD|Emerald[ _]?78E|Luna[ _]?70C|Onyx[ _]?S|Onyx[ _]?Z|Orin[ _]?HD|Orin[ _]?S|Otis[ _]?S|SpeedStar[ _]?S|Magnet[ _]?M9|Primus[ _]?94[ _]?3G|Primus[ _]?94HD|Primus[ _]?QS|Android.*\\bQ8\\b|Sirius[ _]?EVO[ _]?QS|Sirius[ _]?QS|Spirit[ _]?S)\\b",ECSTablet:"V07OT2|TM105A|S10OT1|TR10CS1",StorexTablet:"eZee[_']?(Tab|Go)[0-9]+|TabLC7|Looney Tunes Tab",VodafoneTablet:"SmartTab([ ]+)?[0-9]+|SmartTabII10|SmartTabII7|VF-1497",EssentielBTablet:"Smart[ ']?TAB[ ]+?[0-9]+|Family[ ']?TAB2",RossMoorTablet:"RM-790|RM-997|RMD-878G|RMD-974R|RMT-705A|RMT-701|RME-601|RMT-501|RMT-711",iMobileTablet:"i-mobile i-note",TolinoTablet:"tolino tab [0-9.]+|tolino shine",AudioSonicTablet:"\\bC-22Q|T7-QC|T-17B|T-17P\\b",AMPETablet:"Android.* A78 ",SkkTablet:"Android.* (SKYPAD|PHOENIX|CYCLOPS)",TecnoTablet:"TECNO P9",JXDTablet:"Android.* \\b(F3000|A3300|JXD5000|JXD3000|JXD2000|JXD300B|JXD300|S5800|S7800|S602b|S5110b|S7300|S5300|S602|S603|S5100|S5110|S601|S7100a|P3000F|P3000s|P101|P200s|P1000m|P200m|P9100|P1000s|S6600b|S908|P1000|P300|S18|S6600|S9100)\\b",iJoyTablet:"Tablet (Spirit 7|Essentia|Galatea|Fusion|Onix 7|Landa|Titan|Scooby|Deox|Stella|Themis|Argon|Unique 7|Sygnus|Hexen|Finity 7|Cream|Cream X2|Jade|Neon 7|Neron 7|Kandy|Scape|Saphyr 7|Rebel|Biox|Rebel|Rebel 8GB|Myst|Draco 7|Myst|Tab7-004|Myst|Tadeo Jones|Tablet Boing|Arrow|Draco Dual Cam|Aurix|Mint|Amity|Revolution|Finity 9|Neon 9|T9w|Amity 4GB Dual Cam|Stone 4GB|Stone 8GB|Andromeda|Silken|X2|Andromeda II|Halley|Flame|Saphyr 9,7|Touch 8|Planet|Triton|Unique 10|Hexen 10|Memphis 4GB|Memphis 8GB|Onix 10)",FX2Tablet:"FX2 PAD7|FX2 PAD10",XoroTablet:"KidsPAD 701|PAD[ ]?712|PAD[ ]?714|PAD[ ]?716|PAD[ ]?717|PAD[ ]?718|PAD[ ]?720|PAD[ ]?721|PAD[ ]?722|PAD[ ]?790|PAD[ ]?792|PAD[ ]?900|PAD[ ]?9715D|PAD[ ]?9716DR|PAD[ ]?9718DR|PAD[ ]?9719QR|PAD[ ]?9720QR|TelePAD1030|Telepad1032|TelePAD730|TelePAD731|TelePAD732|TelePAD735Q|TelePAD830|TelePAD9730|TelePAD795|MegaPAD 1331|MegaPAD 1851|MegaPAD 2151",ViewsonicTablet:"ViewPad 10pi|ViewPad 10e|ViewPad 10s|ViewPad E72|ViewPad7|ViewPad E100|ViewPad 7e|ViewSonic VB733|VB100a",VerizonTablet:"QTAQZ3|QTAIR7|QTAQTZ3|QTASUN1|QTASUN2|QTAXIA1",OdysTablet:"LOOX|XENO10|ODYS[ -](Space|EVO|Xpress|NOON)|\\bXELIO\\b|Xelio10Pro|XELIO7PHONETAB|XELIO10EXTREME|XELIOPT2|NEO_QUAD10",CaptivaTablet:"CAPTIVA PAD",IconbitTablet:"NetTAB|NT-3702|NT-3702S|NT-3702S|NT-3603P|NT-3603P|NT-0704S|NT-0704S|NT-3805C|NT-3805C|NT-0806C|NT-0806C|NT-0909T|NT-0909T|NT-0907S|NT-0907S|NT-0902S|NT-0902S",TeclastTablet:"T98 4G|\\bP80\\b|\\bX90HD\\b|X98 Air|X98 Air 3G|\\bX89\\b|P80 3G|\\bX80h\\b|P98 Air|\\bX89HD\\b|P98 3G|\\bP90HD\\b|P89 3G|X98 3G|\\bP70h\\b|P79HD 3G|G18d 3G|\\bP79HD\\b|\\bP89s\\b|\\bA88\\b|\\bP10HD\\b|\\bP19HD\\b|G18 3G|\\bP78HD\\b|\\bA78\\b|\\bP75\\b|G17s 3G|G17h 3G|\\bP85t\\b|\\bP90\\b|\\bP11\\b|\\bP98t\\b|\\bP98HD\\b|\\bG18d\\b|\\bP85s\\b|\\bP11HD\\b|\\bP88s\\b|\\bA80HD\\b|\\bA80se\\b|\\bA10h\\b|\\bP89\\b|\\bP78s\\b|\\bG18\\b|\\bP85\\b|\\bA70h\\b|\\bA70\\b|\\bG17\\b|\\bP18\\b|\\bA80s\\b|\\bA11s\\b|\\bP88HD\\b|\\bA80h\\b|\\bP76s\\b|\\bP76h\\b|\\bP98\\b|\\bA10HD\\b|\\bP78\\b|\\bP88\\b|\\bA11\\b|\\bA10t\\b|\\bP76a\\b|\\bP76t\\b|\\bP76e\\b|\\bP85HD\\b|\\bP85a\\b|\\bP86\\b|\\bP75HD\\b|\\bP76v\\b|\\bA12\\b|\\bP75a\\b|\\bA15\\b|\\bP76Ti\\b|\\bP81HD\\b|\\bA10\\b|\\bT760VE\\b|\\bT720HD\\b|\\bP76\\b|\\bP73\\b|\\bP71\\b|\\bP72\\b|\\bT720SE\\b|\\bC520Ti\\b|\\bT760\\b|\\bT720VE\\b|T720-3GE|T720-WiFi",OndaTablet:"\\b(V975i|Vi30|VX530|V701|Vi60|V701s|Vi50|V801s|V719|Vx610w|VX610W|V819i|Vi10|VX580W|Vi10|V711s|V813|V811|V820w|V820|Vi20|V711|VI30W|V712|V891w|V972|V819w|V820w|Vi60|V820w|V711|V813s|V801|V819|V975s|V801|V819|V819|V818|V811|V712|V975m|V101w|V961w|V812|V818|V971|V971s|V919|V989|V116w|V102w|V973|Vi40)\\b[\\s]+",JaytechTablet:"TPC-PA762",BlaupunktTablet:"Endeavour 800NG|Endeavour 1010",DigmaTablet:"\\b(iDx10|iDx9|iDx8|iDx7|iDxD7|iDxD8|iDsQ8|iDsQ7|iDsQ8|iDsD10|iDnD7|3TS804H|iDsQ11|iDj7|iDs10)\\b",EvolioTablet:"ARIA_Mini_wifi|Aria[ _]Mini|Evolio X10|Evolio X7|Evolio X8|\\bEvotab\\b|\\bNeura\\b",LavaTablet:"QPAD E704|\\bIvoryS\\b|E-TAB IVORY|\\bE-TAB\\b",AocTablet:"MW0811|MW0812|MW0922|MTK8382|MW1031|MW0831|MW0821|MW0931|MW0712",MpmanTablet:"MP11 OCTA|MP10 OCTA|MPQC1114|MPQC1004|MPQC994|MPQC974|MPQC973|MPQC804|MPQC784|MPQC780|\\bMPG7\\b|MPDCG75|MPDCG71|MPDC1006|MP101DC|MPDC9000|MPDC905|MPDC706HD|MPDC706|MPDC705|MPDC110|MPDC100|MPDC99|MPDC97|MPDC88|MPDC8|MPDC77|MP709|MID701|MID711|MID170|MPDC703|MPQC1010",CelkonTablet:"CT695|CT888|CT[\\s]?910|CT7 Tab|CT9 Tab|CT3 Tab|CT2 Tab|CT1 Tab|C820|C720|\\bCT-1\\b",WolderTablet:"miTab \\b(DIAMOND|SPACE|BROOKLYN|NEO|FLY|MANHATTAN|FUNK|EVOLUTION|SKY|GOCAR|IRON|GENIUS|POP|MINT|EPSILON|BROADWAY|JUMP|HOP|LEGEND|NEW AGE|LINE|ADVANCE|FEEL|FOLLOW|LIKE|LINK|LIVE|THINK|FREEDOM|CHICAGO|CLEVELAND|BALTIMORE-GH|IOWA|BOSTON|SEATTLE|PHOENIX|DALLAS|IN 101|MasterChef)\\b",MiTablet:"\\bMI PAD\\b|\\bHM NOTE 1W\\b",NibiruTablet:"Nibiru M1|Nibiru Jupiter One",NexoTablet:"NEXO NOVA|NEXO 10|NEXO AVIO|NEXO FREE|NEXO GO|NEXO EVO|NEXO 3G|NEXO SMART|NEXO KIDDO|NEXO MOBI",LeaderTablet:"TBLT10Q|TBLT10I|TBL-10WDKB|TBL-10WDKBO2013|TBL-W230V2|TBL-W450|TBL-W500|SV572|TBLT7I|TBA-AC7-8G|TBLT79|TBL-8W16|TBL-10W32|TBL-10WKB|TBL-W100",UbislateTablet:"UbiSlate[\\s]?7C",PocketBookTablet:"Pocketbook",KocasoTablet:"\\b(TB-1207)\\b",HisenseTablet:"\\b(F5281|E2371)\\b",Hudl:"Hudl HT7S3|Hudl 2",TelstraTablet:"T-Hub2",GenericTablet:"Android.*\\b97D\\b|Tablet(?!.*PC)|BNTV250A|MID-WCDMA|LogicPD Zoom2|\\bA7EB\\b|CatNova8|A1_07|CT704|CT1002|\\bM721\\b|rk30sdk|\\bEVOTAB\\b|M758A|ET904|ALUMIUM10|Smartfren Tab|Endeavour 1010|Tablet-PC-4|Tagi Tab|\\bM6pro\\b|CT1020W|arc 10HD|\\bTP750\\b|\\bQTAQZ3\\b"},oss:{AndroidOS:"Android",BlackBerryOS:"blackberry|\\bBB10\\b|rim tablet os",PalmOS:"PalmOS|avantgo|blazer|elaine|hiptop|palm|plucker|xiino",SymbianOS:"Symbian|SymbOS|Series60|Series40|SYB-[0-9]+|\\bS60\\b",WindowsMobileOS:"Windows CE.*(PPC|Smartphone|Mobile|[0-9]{3}x[0-9]{3})|Window Mobile|Windows Phone [0-9.]+|WCE;",WindowsPhoneOS:"Windows Phone 10.0|Windows Phone 8.1|Windows Phone 8.0|Windows Phone OS|XBLWP7|ZuneWP7|Windows NT 6.[23]; ARM;",iOS:"\\biPhone.*Mobile|\\biPod|\\biPad|AppleCoreMedia",MeeGoOS:"MeeGo",MaemoOS:"Maemo",JavaOS:"J2ME/|\\bMIDP\\b|\\bCLDC\\b",webOS:"webOS|hpwOS",badaOS:"\\bBada\\b",BREWOS:"BREW"},uas:{Chrome:"\\bCrMo\\b|CriOS|Android.*Chrome/[.0-9]* (Mobile)?",Dolfin:"\\bDolfin\\b",Opera:"Opera.*Mini|Opera.*Mobi|Android.*Opera|Mobile.*OPR/[0-9.]+|Coast/[0-9.]+",Skyfire:"Skyfire",Edge:"Mobile Safari/[.0-9]* Edge",IE:"IEMobile|MSIEMobile",Firefox:"fennec|firefox.*maemo|(Mobile|Tablet).*Firefox|Firefox.*Mobile|FxiOS",Bolt:"bolt",TeaShark:"teashark",Blazer:"Blazer",Safari:"Version.*Mobile.*Safari|Safari.*Mobile|MobileSafari",UCBrowser:"UC.*Browser|UCWEB",baiduboxapp:"baiduboxapp",baidubrowser:"baidubrowser",DiigoBrowser:"DiigoBrowser",Puffin:"Puffin",Mercury:"\\bMercury\\b",ObigoBrowser:"Obigo",NetFront:"NF-Browser",GenericBrowser:"NokiaBrowser|OviBrowser|OneBrowser|TwonkyBeamBrowser|SEMC.*Browser|FlyFlow|Minimo|NetFront|Novarra-Vision|MQQBrowser|MicroMessenger",PaleMoon:"Android.*PaleMoon|Mobile.*PaleMoon"},props:{Mobile:"Mobile/[VER]",Build:"Build/[VER]",Version:"Version/[VER]",VendorID:"VendorID/[VER]",iPad:"iPad.*CPU[a-z ]+[VER]",iPhone:"iPhone.*CPU[a-z ]+[VER]",iPod:"iPod.*CPU[a-z ]+[VER]",Kindle:"Kindle/[VER]",Chrome:["Chrome/[VER]","CriOS/[VER]","CrMo/[VER]"],Coast:["Coast/[VER]"],Dolfin:"Dolfin/[VER]",Firefox:["Firefox/[VER]","FxiOS/[VER]"],Fennec:"Fennec/[VER]",Edge:"Edge/[VER]",IE:["IEMobile/[VER];","IEMobile [VER]","MSIE [VER];","Trident/[0-9.]+;.*rv:[VER]"],NetFront:"NetFront/[VER]",NokiaBrowser:"NokiaBrowser/[VER]",Opera:[" OPR/[VER]","Opera Mini/[VER]","Version/[VER]"],"Opera Mini":"Opera Mini/[VER]","Opera Mobi":"Version/[VER]",UCBrowser:["UCWEB[VER]","UC.*Browser/[VER]"],MQQBrowser:"MQQBrowser/[VER]",MicroMessenger:"MicroMessenger/[VER]",baiduboxapp:"baiduboxapp/[VER]",baidubrowser:"baidubrowser/[VER]",SamsungBrowser:"SamsungBrowser/[VER]",Iron:"Iron/[VER]",Safari:["Version/[VER]","Safari/[VER]"],Skyfire:"Skyfire/[VER]",Tizen:"Tizen/[VER]",Webkit:"webkit[ /][VER]",PaleMoon:"PaleMoon/[VER]",Gecko:"Gecko/[VER]",Trident:"Trident/[VER]",Presto:"Presto/[VER]",Goanna:"Goanna/[VER]",iOS:" \\bi?OS\\b [VER][ ;]{1}",Android:"Android [VER]",BlackBerry:["BlackBerry[\\w]+/[VER]","BlackBerry.*Version/[VER]","Version/[VER]"],BREW:"BREW [VER]",Java:"Java/[VER]","Windows Phone OS":["Windows Phone OS [VER]","Windows Phone [VER]"],"Windows Phone":"Windows Phone [VER]","Windows CE":"Windows CE/[VER]","Windows NT":"Windows NT [VER]",Symbian:["SymbianOS/[VER]","Symbian/[VER]"],webOS:["webOS/[VER]","hpwOS/[VER];"]},utils:{Bot:"Googlebot|facebookexternalhit|AdsBot-Google|Google Keyword Suggestion|Facebot|YandexBot|YandexMobileBot|bingbot|ia_archiver|AhrefsBot|Ezooms|GSLFbot|WBSearchBot|Twitterbot|TweetmemeBot|Twikle|PaperLiBot|Wotbox|UnwindFetchor|Exabot|MJ12bot|YandexImages|TurnitinBot|Pingdom",MobileBot:"Googlebot-Mobile|AdsBot-Google-Mobile|YahooSeeker/M1A1-R2D2",DesktopMode:"WPDesktop",TV:"SonyDTV|HbbTV",WebKit:"(webkit)[ /]([\\w.]+)",Console:"\\b(Nintendo|Nintendo WiiU|Nintendo 3DS|PLAYSTATION|Xbox)\\b",Watch:"SM-V700"}},g.detectMobileBrowsers={fullPattern:/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i,shortPattern:/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i,
    tabletPattern:/android|ipad|playbook|silk/i};var h,i=Object.prototype.hasOwnProperty;return g.FALLBACK_PHONE="UnknownPhone",g.FALLBACK_TABLET="UnknownTablet",g.FALLBACK_MOBILE="UnknownMobile",h="isArray"in Array?Array.isArray:function(a){return"[object Array]"===Object.prototype.toString.call(a)},function(){var a,b,c,e,f,j,k=g.mobileDetectRules;for(a in k.props)if(i.call(k.props,a)){for(b=k.props[a],h(b)||(b=[b]),f=b.length,e=0;e<f;++e)c=b[e],j=c.indexOf("[VER]"),j>=0&&(c=c.substring(0,j)+"([\\w._\\+]+)"+c.substring(j+5)),b[e]=new RegExp(c,"i");k.props[a]=b}d(k.oss),d(k.phones),d(k.tablets),d(k.uas),d(k.utils),k.oss0={WindowsPhoneOS:k.oss.WindowsPhoneOS,WindowsMobileOS:k.oss.WindowsMobileOS}}(),g.findMatch=function(a,b){for(var c in a)if(i.call(a,c)&&a[c].test(b))return c;return null},g.findMatches=function(a,b){var c=[];for(var d in a)i.call(a,d)&&a[d].test(b)&&c.push(d);return c},g.getVersionStr=function(a,b){var c,d,e,f,h=g.mobileDetectRules.props;if(i.call(h,a))for(c=h[a],e=c.length,d=0;d<e;++d)if(f=c[d].exec(b),null!==f)return f[1];return null},g.getVersion=function(a,b){var c=g.getVersionStr(a,b);return c?g.prepareVersionNo(c):NaN},g.prepareVersionNo=function(a){var b;return b=a.split(/[a-z._ \/\-]/i),1===b.length&&(a=b[0]),b.length>1&&(a=b[0]+".",b.shift(),a+=b.join("")),Number(a)},g.isMobileFallback=function(a){return g.detectMobileBrowsers.fullPattern.test(a)||g.detectMobileBrowsers.shortPattern.test(a.substr(0,4))},g.isTabletFallback=function(a){return g.detectMobileBrowsers.tabletPattern.test(a)},g.prepareDetectionCache=function(a,c,d){if(a.mobile===b){var e,h,i;return(h=g.findMatch(g.mobileDetectRules.tablets,c))?(a.mobile=a.tablet=h,void(a.phone=null)):(e=g.findMatch(g.mobileDetectRules.phones,c))?(a.mobile=a.phone=e,void(a.tablet=null)):void(g.isMobileFallback(c)?(i=f.isPhoneSized(d),i===b?(a.mobile=g.FALLBACK_MOBILE,a.tablet=a.phone=null):i?(a.mobile=a.phone=g.FALLBACK_PHONE,a.tablet=null):(a.mobile=a.tablet=g.FALLBACK_TABLET,a.phone=null)):g.isTabletFallback(c)?(a.mobile=a.tablet=g.FALLBACK_TABLET,a.phone=null):a.mobile=a.tablet=a.phone=null)}},g.mobileGrade=function(a){var b=null!==a.mobile();return a.os("iOS")&&a.version("iPad")>=4.3||a.os("iOS")&&a.version("iPhone")>=3.1||a.os("iOS")&&a.version("iPod")>=3.1||a.version("Android")>2.1&&a.is("Webkit")||a.version("Windows Phone OS")>=7||a.is("BlackBerry")&&a.version("BlackBerry")>=6||a.match("Playbook.*Tablet")||a.version("webOS")>=1.4&&a.match("Palm|Pre|Pixi")||a.match("hp.*TouchPad")||a.is("Firefox")&&a.version("Firefox")>=12||a.is("Chrome")&&a.is("AndroidOS")&&a.version("Android")>=4||a.is("Skyfire")&&a.version("Skyfire")>=4.1&&a.is("AndroidOS")&&a.version("Android")>=2.3||a.is("Opera")&&a.version("Opera Mobi")>11&&a.is("AndroidOS")||a.is("MeeGoOS")||a.is("Tizen")||a.is("Dolfin")&&a.version("Bada")>=2||(a.is("UC Browser")||a.is("Dolfin"))&&a.version("Android")>=2.3||a.match("Kindle Fire")||a.is("Kindle")&&a.version("Kindle")>=3||a.is("AndroidOS")&&a.is("NookTablet")||a.version("Chrome")>=11&&!b||a.version("Safari")>=5&&!b||a.version("Firefox")>=4&&!b||a.version("MSIE")>=7&&!b||a.version("Opera")>=10&&!b?"A":a.os("iOS")&&a.version("iPad")<4.3||a.os("iOS")&&a.version("iPhone")<3.1||a.os("iOS")&&a.version("iPod")<3.1||a.is("Blackberry")&&a.version("BlackBerry")>=5&&a.version("BlackBerry")<6||a.version("Opera Mini")>=5&&a.version("Opera Mini")<=6.5&&(a.version("Android")>=2.3||a.is("iOS"))||a.match("NokiaN8|NokiaC7|N97.*Series60|Symbian/3")||a.version("Opera Mobi")>=11&&a.is("SymbianOS")?"B":(a.version("BlackBerry")<5||a.match("MSIEMobile|Windows CE.*Mobile")||a.version("Windows Mobile")<=5.2,"C")},g.detectOS=function(a){return g.findMatch(g.mobileDetectRules.oss0,a)||g.findMatch(g.mobileDetectRules.oss,a)},g.getDeviceSmallerSide=function(){return window.screen.width<window.screen.height?window.screen.width:window.screen.height},f.prototype={constructor:f,mobile:function(){return g.prepareDetectionCache(this._cache,this.ua,this.maxPhoneWidth),this._cache.mobile},phone:function(){return g.prepareDetectionCache(this._cache,this.ua,this.maxPhoneWidth),this._cache.phone},tablet:function(){return g.prepareDetectionCache(this._cache,this.ua,this.maxPhoneWidth),this._cache.tablet},userAgent:function(){return this._cache.userAgent===b&&(this._cache.userAgent=g.findMatch(g.mobileDetectRules.uas,this.ua)),this._cache.userAgent},userAgents:function(){return this._cache.userAgents===b&&(this._cache.userAgents=g.findMatches(g.mobileDetectRules.uas,this.ua)),this._cache.userAgents},os:function(){return this._cache.os===b&&(this._cache.os=g.detectOS(this.ua)),this._cache.os},version:function(a){return g.getVersion(a,this.ua)},versionStr:function(a){return g.getVersionStr(a,this.ua)},is:function(b){return c(this.userAgents(),b)||a(b,this.os())||a(b,this.phone())||a(b,this.tablet())||c(g.findMatches(g.mobileDetectRules.utils,this.ua),b)},match:function(a){return a instanceof RegExp||(a=new RegExp(a,"i")),a.test(this.ua)},isPhoneSized:function(a){return f.isPhoneSized(a||this.maxPhoneWidth)},mobileGrade:function(){return this._cache.grade===b&&(this._cache.grade=g.mobileGrade(this)),this._cache.grade}},"undefined"!=typeof window&&window.screen?f.isPhoneSized=function(a){return a<0?b:g.getDeviceSmallerSide()<=a}:f.isPhoneSized=function(){},f._impl=g,f.version="1.4.1 2017-12-24",f})}(function(a){if("undefined"!=typeof module&&module.exports)return function(a){module.exports=a()};if("function"==typeof define&&define.amd)return define;if("undefined"!=typeof window)return function(a){window.MobileDetect=a()};throw new Error("unknown environment")}());

    var shim = require.s.contexts._.config.shim['js/lib/mobile-detect/mobile-detect.min'];
    return shim && shim.exportsFn && shim.exportsFn();

}.bind(window));

Have you faced such issues before?

ERROR Navigation timeout of 30000 ms exceeded. Not compatible with Athlete 2 Theme?

I'm using this theme https://athlete2.com/us/alvord-10-ws-mens-trail-running-shoes.html on Magento 2.3.4 with the patch for mixins.

It seems to work, but when I tries to add checkout I get:

โ„น Collecting bundle modules in the browser. 16:24:46
โ„น Collecting modules for bundle "category". 16:24:46
โœ” Finished collecting modules for bundle "category". 16:24:57
โ„น Collecting modules for bundle "cms". 16:24:57
โœ” Finished collecting modules for bundle "cms". 16:25:07
โ„น Collecting modules for bundle "product". 16:25:07
โœ” Finished collecting modules for bundle "product". 16:25:18
โ„น Collecting modules for bundle "checkout". 16:25:18

ERROR Navigation timeout of 30000 ms exceeded 16:26:05

at /usr/local/share/.config/yarn/global/node_modules/puppeteer/lib/LifecycleWatcher.js:142:21
-- ASYNC --
at Frame. (/usr/local/share/.config/yarn/global/node_modules/puppeteer/lib/helper.js:111:15)
at Page.goto (/usr/local/share/.config/yarn/global/node_modules/puppeteer/lib/Page.js:672:49)
at Page. (/usr/local/share/.config/yarn/global/node_modules/puppeteer/lib/helper.js:112:23)
at Object.checkout (/usr/local/share/.config/yarn/global/node_modules/magepack/lib/generate/collector/checkout.js:65:16)
at runMicrotasks ()
at processTicksAndRejections (internal/process/task_queues.js:97:5)
at async module.exports (/usr/local/share/.config/yarn/global/node_modules/magepack/lib/generate.js:23:13)

Checkout page doesn't take 30 seconds to load, so it may be some html problem. No?

mage/apply/main.js minification error

function (error) {
            if ('console' in window && typeof window.console.error === 'function') {
                console.error(error);
            }

is minified to

function(e) {
            return "console"in window && "function" == typeof window.console.error && console.error(e),
            !0
        }

image

image

I'm not bigup on javascript, but something doesn't look right to me.

Magepack never ends process with no error

I'm trying to generate the bundler configuration but I can't. First, it gave me timeout errors. So I increased the timeout. But now it never ends the process with no error (with --debug). The website also works perfectly with no JS error in the console. The only output is:

โ„น Collecting bundle modules in the browser.                                                                                                                                
โ„น Collecting modules for bundle "category"

What can I do to debug more?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.