{ "info": { "author": "Tommy Yu", "author_email": "tommy.yu@auckland.ac.nz", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Environment :: Console", "Environment :: Plugins", "Framework :: Setuptools Plugin", "Intended Audience :: Developers", "License :: OSI Approved :: GNU General Public License v2 or later (GPLv2+)", "Operating System :: MacOS :: MacOS X", "Operating System :: Microsoft :: Windows", "Operating System :: OS Independent", "Operating System :: POSIX", "Operating System :: POSIX :: BSD", "Operating System :: POSIX :: Linux", "Programming Language :: JavaScript", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy", "Topic :: Software Development :: Build Tools", "Topic :: System :: Software Distribution", "Topic :: Utilities" ], "description": "calmjs.webpack\n==============\n\nProvide the integration of |webpack|_ into a Python environment through\nthe `Calmjs framework`_ to facilitate the usage of JavaScript sources\nincluded with Python packages in conjunction with Node.js packages\nsourced from |npm|_ or similar package repositories, for the declaration\nand production of prebuilt JavaScript artifacts with |webpack| in a\nmanner that allow reuse and extension by Python packages' dependants.\n\n.. image:: https://travis-ci.org/calmjs/calmjs.webpack.svg?branch=1.2.0\n :target: https://travis-ci.org/calmjs/calmjs.webpack\n.. image:: https://ci.appveyor.com/api/projects/status/327fghy5uhnhplf5/branch/1.2.0?svg=true\n :target: https://ci.appveyor.com/project/metatoaster/calmjs-webpack/branch/1.2.0\n.. image:: https://coveralls.io/repos/github/calmjs/calmjs.webpack/badge.svg?branch=1.2.0\n :target: https://coveralls.io/github/calmjs/calmjs.webpack?branch=1.2.0\n\n.. |AMD| replace:: AMD (Asynchronous Module Definition)\n.. |calmjs| replace:: ``calmjs``\n.. |calmjs.dev| replace:: ``calmjs.dev``\n.. |calmjs.parse| replace:: ``calmjs.parse``\n.. |calmjs.webpack| replace:: ``calmjs.webpack``\n.. |karma| replace:: ``karma``\n.. |npm| replace:: ``npm``\n.. |webpack| replace:: ``webpack``\n.. _Calmjs framework: https://pypi.python.org/pypi/calmjs\n.. _calmjs: https://pypi.python.org/pypi/calmjs\n.. _calmjs.parse: https://pypi.python.org/pypi/calmjs.parse\n.. _Node.js: https://nodejs.org/\n.. _npm: https://www.npmjs.com/\n.. _webpack: https://webpack.js.org/\n\nIntroduction\n------------\n\nWeb applications may be created using any language as their backends,\nhowever interactive front-end user interfaces that they may provide\nultimately rely on some form of JavaScript. This is especially true if\nassociated functionalities are sourced from `Node.js`_ based package\nmanagement systems such as |npm|_. However, backend languages that\noffer their own package management system typically lack comprehensive\nintegration with |npm|, or integration is tightly coupled with whatever\nframework that is not reusable in a more generalized manner.\n\nA common way to address this issue is that a package may be forced to be\nsplit into two, or at the very least a completely separate deployment\nsystem is used, in order for the JavaScript tools to manage the front-\nend facing parts. On top of this, these separate systems do not\nnecessarily communicate with each other. This results in issues such as\ndifficulties in building the software stack, deployments being flaky and\nnon-reproducible outside of the project's context, limiting reusability\nof all the components at hand as the entire process is typically tightly\ncoupled to the underlying source repository. Ultimately, this leaves\nthe users of the backend language not able to convey front end\ndeployment information across package boundaries for reuse by their\ndependents (e.g. for other downstream packages to extend the package in\nways that promote reusability in a way that is well-tested.)\n\nThis kind of self-contained behavior also plagues |webpack|_, where each\n`Node.js`_ package provide the resulting artifact, but not necessarily\nthe methods that went into generating them in a form that is reusable.\nSure, most typical use case for those packages can be addressed by\nsimply specifying the entry point, however for systems that offer\ndynamic plugin-based systems this quickly becomes problematic, as\nwebpack requires that all imports be known at build time. This makes\narbitrary extensions very difficult to implement without a separate\nsystem that acts as an overseer for what modules names are available and\nwhere they might be.\n\nAs the goal of the `Calmjs framework`_ is to allow Python packages to\nexpose their JavaScript code as if they are part of the |npm| managed\nmodule system from the client side code, this package, |calmjs.webpack|,\nleverages that capability to provide not only the standard invocation\nmethod for |webpack| for Python packages, but also the ability for\ndownstream packages the option to generate comprehensive webpack\nartifacts or standalone webpack artifacts that only contain their\nspecific extensions to be used in conjunction with other existing\nartifacts.\n\n\nFeatures\n--------\n\nHow |calmjs.webpack| works\n~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe Calmjs framework provides the framework to allow Python packages to\ndeclare the dependencies they need against |npm| based packages for the\nJavaScript code they provide, and also enable Python packages to expose\nany JavaScript source files that they may contain in a declarative\nmanner.\n\nThe utility included with |calmjs.webpack| provide the means to consume\nthose declarations, treating the JavaScript files as both source and\ncompilation target, with the final deployable artifact(s) being produced\nthrough |webpack| from the |webpack|_ package.\n\nWhile the input source files made available through Python packages\ncould be written in any format as understood by webpack, currently only\nstandard ES5 is properly processed. The reason for this is that\n|calmjs.parse|_, the parser library that |calmjs.webpack| make use for\nthe parsing of JavaScript, currently only understand ES5, and is used\nfor extracting all the import statements to create the dynamic Calmjs\nimport system for webpack, and to also transpile the CommonJS and |AMD|\nrequire statements to make use of this dynamic import system.\n\nThe resulting sources will be placed in a build directory, along with\nall the declared bundled sources acquired from the Node.js package\nmanagers or repositories, plus the (optionally) generated import module.\nA webpack configuration file will then be generated to include all the\nrelevant sources as selected to enable the generation of the final\nartifact file. These can then be deployed to the appropriate\nenvironment, or the whole above process can be included as part of the\nfunctionality of the Python backend at hand through the API provided\nthrough this package.\n\nUltimately, the goal of |calmjs.webpack| is to ease the integration and\ninteractions between of client-side JavaScript with server-side Python,\nby simplifying the task of building, shipping and deployment of the two\nset of sources in one shared package and environment. The Calmjs\nframework provides the linkage between these two environment and the\ntools provided by there will assist with the setup of a common,\nreproducible local Node.js environments.\n\nFinally, for quality control, this package has integration with\n|calmjs.dev|, which provides the tools needed to set up the test\nenvironment and harnesses for running of JavaScript tests that are part\nof the Python packages for the associated JavaScript code. However,\nthat package is not declared as a direct dependency, as not all use\ncases will require the availability of that package. Please refer to\ninstallation section for details.\n\nSupported webpack versions\n~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nAs webpack is a very active project, multiple major versions have been\nreleased since the initial development and release of |calmjs.webpack|.\nCurrently, |calmjs.webpack| is known to support webpack-2 version 2.6 or\ngreater, webpack-3 and webpack-4. While webpack@2.7.0 is declared for\nthis version of |calmjs.webpack|, downstream packages may declare later\nversions but it is recommended that the |calmjs.webpack| test suite be\nexecuted in full to verify that the integration tests pass for the given\nversion in the environment. Detailed instructions on the execution of\nthe integration tests for |calmjs.webpack| is covered in the `Testing\nthe installation`_ section.\n\n\nInstallation\n------------\n\nIt is recommended that the local environment already have Node.js and\n|npm| installed at the very minimum to enable the installation of\n|webpack|, if it hasn't already been installed and available. Also,\nthe version of Python must be either 2.7 or 3.3+. Both PyPy and PyPy3\nare supported, with the recommended versions being PyPy3-5.2 or greater,\nalthough PyPy3-2.4 should work, however there may be difficulties due to\nnew versions of dependencies rejecting older versions of Python.\n\nTo install |calmjs.webpack| into a given Python environment, it may be\ninstalled directly from PyPI with the following command:\n\n.. code:: sh\n\n $ pip install calmjs.webpack\n\nAs this Python package interface with Node.js tools, the runtime for\nthis language should also be available on the system. Please install\none of the supported LTS versions as listed on the `Node.js`_ website.\nCurrently, the minimum supported Node.js version is 6 for this package.\n\nInstalling/using webpack with calmjs\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n.. _installing webpack for calmjs:\n\nTo establish a development/build environment for a Python package with\nthe support for |webpack| through |calmjs.webpack| in the current\nworking directory, the following command may be executed:\n\n.. code:: sh\n\n $ calmjs npm --install calmjs.webpack\n\nWhile running ``npm install webpack`` (along with other related packages\ndeclared by |calmjs.webpack| that it needs from |npm|) will achieve the\nsame effect, do note the Calmjs framework makes it possible for |npm|\ndependencies to be propagated down to dependent packages; such that if a\nPython package that have declared |calmjs.webpack| as a dependency\n(either through ``install_requires`` or an ``extras_require`` in its\n``setup.py``) may have its complete set of dependencies on |npm| be\ninstalled using the following command (assuming the package is named\n``example.package``:\n\n.. code:: sh\n\n $ calmjs npm --install example.package\n\nIf the dependency on |calmjs.webpack| was declared as an extras_require\ndependency under a section named |webpack|, the command will then become\nthe following:\n\n.. code:: sh\n\n $ calmjs npm --install example.package[webpack]\n\nIf the dependencies are declared correctly, using the above command will\ninstall all the required dependencies for the JavaScript/Node.js code\nrequired by ``example.package`` into the current directory through\n|npm|. Note that its dependents will also gain the declared\ndependencies.\n\nFor further details about how this all works can be found in the\ndocumentation for |calmjs|_. Otherwise, please continue to the `usage`_\nsection.\n\nAlternative installation methods (advanced users)\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nDevelopment is still ongoing with |calmjs.webpack|, for the latest\nfeatures and bug fixes, the development version can be installed through\ngit like so:\n\n.. code:: sh\n\n $ pip install calmjs\n $ pip install git+https://github.com/calmjs/calmjs.webpack.git#egg=calmjs.webpack\n\nAlternatively, the git repository can be cloned directly and execute\n``python setup.py develop`` while inside the root of the source\ndirectory.\n\nKeep in mind that |calmjs| MUST be available before the ``setup.py``\nwithin the |calmjs.webpack| source tree is executed, for it needs the\n``package_json`` writing capabilities in |calmjs|. Alternatively,\nplease execute ``python setup.py egg_info`` if any message about\n``Unknown distribution option:`` is noted during the invocation of\n``setup.py``.\n\nAs |calmjs| is declared as both namespace and package, there are certain\nlow-level setup that is required on the working Python environment to\nensure that all modules within can be located correctly. However,\nversions of ``setuptools`` earlier than `v31.0.0`__ does not create the\nrequired package namespace declarations when a package is installed\nusing this development installation method when mixed with ``pip\ninstall`` within the same namespace. As a result, inconsistent import\nfailures can happen for any modules under the |calmjs| namespace. As an\nexample:\n\n.. __: https://setuptools.readthedocs.io/en/latest/history.html#v31-0-0\n\n.. code:: python\n\n >>> import calmjs.webpack\n Traceback (most recent call last):\n File \"\", line 1, in \n ImportError: No module named 'calmjs.webpack'\n >>> import calmjs.base\n >>> import calmjs.webpack\n >>>\n\nIf this behavior (and workaround) is undesirable, please ensure the\ninstallation of all |calmjs| related packages follow the same method\n(i.e. either ``python setup.py develop`` for all packages, or using the\nwheels acquired through ``pip``), or upgrade ``setuptools`` to version\n31 or greater and reinstall all affected packages.\n\nTesting the installation\n~~~~~~~~~~~~~~~~~~~~~~~~\n\nFinally, to verify for the successful installation of |calmjs.webpack|,\nthe included tests may be executed through this command:\n\n.. code:: sh\n\n $ python -m unittest calmjs.webpack.tests.make_suite\n\nHowever, if the steps to install external Node.js dependencies to the\ncurrent directory was followed, the current directory may be specified\nas the ``CALMJS_TEST_ENV`` environment variable. Under POSIX compatible\nshells this may be executed instead from within that directory:\n\n.. code:: sh\n\n $ CALMJS_TEST_ENV=. python -m unittest calmjs.webpack.tests.make_suite\n\nAs this particular form of invocation make direct use of whatever the\ncurrent Node.js environment found, this may be used to test for\ncompatibility with other versions of webpack intended for use with the\ncurrent environment (e.g. if a specific package declared specific later\nversions of webpack for their artifact build process.).\n\nAlso note that if the |calmjs.dev| package is unavailable, a number of\ntests relating to integration with |karma| will be skipped. To avoid\nthis, either install |calmjs.dev| manually, or install |calmjs.webpack|\nusing its extras dependencies declaration like so:\n\n.. code:: sh\n\n $ pip install calmjs.webpack[dev]\n\n\nUsage\n-----\n\nTo generate a webpack artifact from packages that have JavaScript code\nexposed through the Calmjs module registry system that are already\ninstalled into the current environment, simply execute the following\ncommand:\n\n.. code:: sh\n\n $ calmjs webpack example.package\n\nThe following sections in this document will provide an overview on how\nto enable the JavaScript module export feature for a given Python\npackage through the Calmjs module registry system, however a more\nthorough description on this topic may be found in the README provided\nby the |calmjs|_ package, under the section `Export JavaScript code from\nPython packages`__.\n\n.. __: https://pypi.python.org/pypi/calmjs/#export-javascript-code-from-python-packages\n\n\nDeclaring JavaScript exports for the Python package\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nJavaScript code embedded within a Python package can be exposed to the\nCalmjs framework through the ``calmjs.module`` registry. For example,\ngiven the the following entry points for that registry defined by a\npackage named ``example``:\n\n.. code:: ini\n\n [calmjs.module]\n example = example\n\nThis is the most basic declaration that works for packages that share\nthe same name as the import location provided.\n\nThe following is am example for packages that have nested submodules\n(called ``example.lib`` and ``example.app``):\n\n.. code:: ini\n\n [calmjs.module]\n example.lib = example.lib\n example.app = example.app\n\nWhile the import locations declared looks exactly like a Python module\n(as per the rules of a Python entry point), the ``calmjs.module``\nregistry will present them using the CommonJS/ES6 style import paths\n(i.e. ``'example/lib'`` and ``'example/app'``). Thus users that wish\nto import those specific JavaScript modules will then ``require`` the\nrequired modules prefixed by those strings.\n\nPlease also note that the default source extractor will extract all\nJavaScript files within those directories. Finally, as a consequence of\nhow the imports are done, it is recommended that no relative imports are\nto be used.\n\nIf the package at hand does not directly declare its dependency on\n|calmjs|, an explicit ``calmjs_module_registry=['calmjs.module']`` may\nneed to be declared in the ``setup`` function for the package to ensure\nthat this default module registry will be used to acquire the JavaScript\nsources from.\n\nPutting this together, the ``setup.py`` file should contain the\nfollowing:\n\n.. code:: Python\n\n setup(\n name='example',\n # ... plus other declarations\n # this is recommended\n license='gpl',\n install_requires=[\n 'calmjs>=3.0.0,<4',\n 'calmjs.webpack>=1.0.0,<2',\n # plus other installation requirements\n ],\n # If the usage of the GPL is impossible for the project, or\n # declaring a direct dependency on calmjs packages is impossible\n # for the project for whatever other reasons (even though the\n # project itself will NOT be required to include/import ANY code\n # from the calmjs namespace), setup_requires may be used instead\n # of install_requires, and the following should also be included\n # as well:\n package_json={\n \"devDependencies\": {\n \"webpack\": \"~2.6.0\",\n }\n },\n calmjs_module_registry=['calmjs.module'],\n # the entry points are required to allow calmjs to pick this up\n entry_points=\"\"\"\n [calmjs.module]\n example = example\n example.lib = example.lib\n example.app = example.app\n \"\"\",\n )\n\nFor the construction of the webpack artifact for the example package, it\nmay be done like so through the ``calmjs webpack`` build tool, which\nwould extract all the relevant sources, create a temporary build\ndirectory, generate the build manifest and invoke ``webpack`` on that\nfile. An example run:\n\n.. code:: sh\n\n $ calmjs webpack example\n Hash: 1dbcdb61e3afb4d2a383\n Version: webpack 2.7.0\n Time: 82ms\n Asset Size Chunks Chunk Names\n example.js 4.49 kB 0 [emitted] main\n [1] /tmp/tmp7qvdjb5z/build/example/lib/core.js 51 bytes {0} [built]\n cjs require example/lib/core [2] /tmp/tmp7qvdjb5z/build/__calmjs_loader__.js 6:24-51\n cjs require example/lib/core [4] /tmp/tmp7qvdjb5z/build/example/app/index.js 1:10-37\n [2] /tmp/tmp7qvdjb5z/build/__calmjs_loader__.js 559 bytes {0} [built]\n cjs require __calmjs_loader__ [3] /tmp/tmp7qvdjb5z/build/__calmjs_bootstrap__.js 3:20-48\n [3] /tmp/tmp7qvdjb5z/build/__calmjs_bootstrap__.js 341 bytes {0} [built]\n [4] /tmp/tmp7qvdjb5z/build/example/app/index.js 74 bytes {0} [built]\n cjs require example/app/index [2] /tmp/tmp7qvdjb5z/build/__calmjs_loader__.js 7:25-53\n + 1 hidden modules\n\nAs the build process used by |calmjs.webpack| is executed in a separate\nbuild directory, all imports through the Node.js module system must be\ndeclared as ``extras_calmjs``, as the availability of ``node_modules``.\nwill not be present. For instance, if ``example/app/index.js`` require\nthe usage of the ``jquery`` and ``underscore`` modules like so:\n\n.. code:: JavaScript\n\n var $ = require('jquery'),\n _ = require('underscore');\n\nIt will need to declare the target location sourced from |npm| plus the\n``package_json`` for the dependencies, it will need to declare this in\nits ``setup.py``:\n\n.. code:: Python\n\n setup(\n # ...\n package_json={\n \"dependencies\": {\n \"jquery\": \"~3.1.0\",\n \"underscore\": \"~1.8.0\",\n },\n \"devDependencies\": {\n # development dependencies from npm\n },\n },\n extras_calmjs = {\n 'node_modules': {\n 'jquery': 'jquery/dist/jquery.js',\n 'underscore': 'underscore/underscore.js',\n },\n },\n )\n\nOnce that is done, rerun ``python setup.py egg_info`` to write the\nfreshly declared metadata into the package's egg-info directory, so that\nit can be used from within the environment. ``calmjs npm --install\nexample`` can now be invoked to install the |npm| dependencies into the\ncurrent directory; to permit |calmjs.webpack| to find the required files\nsourced from |npm| to put into the build directory for ``webpack`` to\nlocate them.\n\nThe resulting calmjs run may then end up looking something like this:\n\n.. code:: sh\n\n $ calmjs webpack example\n Hash: fa76455e8abdb96273aa\n Version: webpack 2.7.0\n Time: 332ms\n Asset Size Chunks Chunk Names\n example.js 326 kB 0 [emitted] [big] main\n [1] /tmp/tmposbsof05/build/example/lib/core.js 51 bytes {0} [built]\n cjs require example/lib/core [4] /tmp/tmposbsof05/build/__calmjs_loader__.js 7:24-51\n cjs require example/lib/core [6] /tmp/tmposbsof05/build/example/app/index.js 1:10-37\n [2] /tmp/tmposbsof05/build/jquery.js 268 kB {0} [built]\n cjs require jquery [4] /tmp/tmposbsof05/build/__calmjs_loader__.js 8:14-31\n cjs require jquery [6] /tmp/tmposbsof05/build/example/app/index.js 2:8-25\n [3] /tmp/tmposbsof05/build/underscore.js 52.9 kB {0} [built]\n cjs require underscore [4] /tmp/tmposbsof05/build/__calmjs_loader__.js 9:18-39\n cjs require underscore [6] /tmp/tmposbsof05/build/example/app/index.js 2:31-52\n [4] /tmp/tmposbsof05/build/__calmjs_loader__.js 633 bytes {0} [built]\n cjs require __calmjs_loader__ [5] /tmp/tmposbsof05/build/__calmjs_bootstrap__.js 3:20-48\n [5] /tmp/tmposbsof05/build/__calmjs_bootstrap__.js 341 bytes {0} [built]\n [6] /tmp/tmposbsof05/build/example/app/index.js 128 bytes {0} [built]\n cjs require example/app/index [4] /tmp/tmposbsof05/build/__calmjs_loader__.js 6:25-53\n + 1 hidden modules\n\nTrigger test execution as part of webpack artifact building process\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nFor testing, declare the appropriate entries to the module test registry\nthat accompanies the module registry for the given package, and with the\nuse of the |karma| runtime provided by the ``calmjs.dev`` package, the\ntests may be executed as part of the webpack artifact build process.\nThe command is simply this:\n\n.. code:: sh\n\n $ calmjs karma webpack example\n\nDo note that both the ``devDependencies`` provided by both\n``calmjs.dev`` and ``calmjs.webpack`` must be installed. This can\neasily be done by declaring the appropriate ``install_requires``, or\nmanually install ``calmjs.dev`` and then install the dependencies from\n|npm| using ``calmjs npm -D --install calmjs.webpack[dev]``.\n\nDynamic module imports\n~~~~~~~~~~~~~~~~~~~~~~\n\nWhile |webpack| does natively support this to some extent, the support\nis only implemented through direct filesystem level support. In the\ncase of Calmjs, where the imports are done using identifiers on the\naliases explicitly defined in generated ``webpack.conf.js``\nconfiguration, |webpack| is unable to resolve those aliases by default.\n\nInstead of trying to make ``ContextReplacementPlugin`` work or writing\nanother webpack plugin, a surrogate ``__calmjs__`` import module is\nautomatically generated and included in each generated artifact such\nthat the dynamic imports will function as intended. The rationale for\nusing this as a workaround is simply a desire to avoid possible API\nchanges to |webpack| as plugins of these nature will end up being\ntightly coupled to |webpack|.\n\nWith the usage of a surrogate import module, the dynamic imports also\nwork across multiple |webpack| artifacts generated through ``calmjs\nwebpack``, however this is an advanced topic thus further documentation\nwill be required, as specific declaration/import order and various other\ncaveats exists that complicates real world usage (e.g. correct handling\nof circular imports will always remain a non-trivial problem).\n\nFor the simple case, imagine the following JavaScript code:\n\n.. code:: JavaScript\n\n var loader = function(module_name) {\n // the dynamic import\n var module = require(module_name);\n console.log(module + ' was loaded dynamically.');\n };\n\n var demo = loader('example/lib/core');\n\nIf the ``example/lib/core.js`` source file was exported by ``example``\npackage and was included in the webpack, the above dynamic import should\nfunction without issues at all by default without further configuration.\n\nIf this dynamic import module functionality is unwanted and that no\ndynamic imports are used by any JavaScript code to be included, this\nfeature may be disabled by the ``--disable-calmjs-compat`` flag.\n\nHandling of Webpack loaders\n~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nWebpack provides the support of loaders to handle the importing of\nfiles that are not JavaScript sources, such that the importing of files\nsuch as text of JSON file can be done seamlessly with their import\nsystem. Python packages may export these resource files to make them\navailable for the webpack environment through a subsidiary loader\nregistry ``calmjs.module.loader`` that will expose the relevant resource\nfiles for namespaces defined in ``calmjs.module`` registry for the given\npackage.\n\nAs for the integration of the loaders themselves with the Calmjs\ntoolchain system, a separate loaderplugin registry must be specified.\nFor the webpack toolchain, the ``calmjs.webpack.loaderplugins`` registry\nis assigned as the default, which will resolve a generic handler to\nhandle the target resource files. This generic handler supports the\nchaining of loaders. Specific handlers for the resource types may be\nassigned directly to that registry, for example if an alternative\nNode.js package is required to override the default automatically\ngenerated handler.\n\nIf this automatic resolution behavior is unwanted, a static registry is\ndefined at ``calmjs.webpack.static.loaderplugins`` for this purpose,\nhowever, to enable the usage of this registry at this time require the\nusage of the toolchain API directly.\n\nAs for specifying which resource files contained in Python packages are\nto be made available for the webpack environment, the subsidiary module\nloader registry ``calmjs.module.loader`` should be used.\n\nPutting all this together, the ``example`` package defined earlier is\nnow extended to expose various types of resource files for usage:\n\n.. code:: ini\n\n [calmjs.module]\n example.lib = example.lib\n example.app = example.app\n\n [calmjs.module.loader]\n json = json[json]\n text = text[txt,json]\n\nThis would make the relevant resource files under both the\n``example/lib`` and ``example/app`` namespace available under the\nrelevant loaders, such that if some JavaScript code contain a require\nstatement like either of the following:\n\n.. code:: JavaScript\n\n var readme_lib = require('text!example/lib/readme.txt');\n var data_txt = require('text!example/lib/data.json');\n var data = require('json!example/lib/data.json');\n\nPlease do note that this will make available these full names for\ndynamic module imports as the full names are exposed out of the\ngenerated artifact.\n\nThe default loaderplugin handler registry will provide the standard\nhandler as none are defined, such that those require statements with an\nexplicit loader prefix will be resolved correctly. However, webpack has\nlargely deprecated the usage of explicit loader prefixes, and prefers a\nsyntax that imports without the prefix specified. This requires a\ndifferent handling method, documented in the next section.\n\nHandling of ``require()`` without explicit ``loader!`` prefixes\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nIf the support of the RequireJS/AMD tooling is ignored (note that this\nwill affect any dependent Python packages that make use of this code\ndirectly, as it does not currently support this import method yet), the\nbare import syntax may be used, for example:\n\n.. code:: JavaScript\n\n var readme_app = require('example/app/readme.txt');\n var style = require('example/app/style.css');\n\nOne reason why compatibility across all toolchains, especially with\nloaders, is difficult if not impossible to implement is due to the many\nvariations with there are a variety of methods implemented by the\ndifferent Node.js tooling. For instance, importing stylesheets from\nwithin webpack is usually done by chaining the ``style-loader`` with\nwhatever specific stylesheet loader, such as ``css-loader`` or\n``sass-loader`` down the chain. While it is possible to define the\nfollowing entry point on the ``calmjs.module.loader`` registry::\n\n [calmjs.module.loader]\n style!css = css[css]\n\nWith the above definition, importing stylesheet resources using the\ncomplete syntax (i.e. ``require('style!css!example/app/style.css');``\nwill work, but it is incompatible with the ``require-css`` loader as\nit does not necessarily support the chaining of the ``style!`` loader\nprefix as the RequireJS version of the plugin will apply the styles\nimmediately without that (this is why the loader-prefixes are considered\nnon-portable).\n\nSo to better support this more agnostic use case, |webpack| provides a\n``module.rules`` section that dictates how the specific module is to be\nloaded, so that the loaderprefix-free loading can be achieved (i.e. the\nprevious JavaScript fragment). To specifically support this through\nCalmjs, the resources entry points should be defined under the\n``calmjs.module.webpackloader`` registry instead of the common\n``calmjs.module.loader`` registry. For example:\n\n.. code:: ini\n\n [calmjs.module]\n example.lib = example.lib\n example.app = example.app\n\n [calmjs.module.webpackloader]\n style-loader!css-loader = stylesheet[css]\n text-loader = txt[txt]\n\nPlease note that while it is possible to also define the entry point\nlike the following:\n\n.. code:: ini\n\n [calmjs.module.webpackloader]\n style!css = stylesheet[css]\n\nPreviously this relies on a legacy behavior which |webpack| removed, but\nit is still supported by |calmjs| and |calmjs.webpack| simply due to the\ngeneric support of this format, but given that this registry is\nspecifically for webpack, there is should be no issue if the webpack\nspecific syntax is used, if the following caveats are addressed.\n\nPlease note that if a given file name extension is defined on multiple\nwebpackloaders (note that the text loader has removed json as a file\nname extension), the resulting behavior is undefined as the generated\nconfiguration will not guarantee that the loaders are chained together\nin the expected manner, as both loaders will be applied to the selected\nfiles under an undefined ordering.\n\nModule names exported by the ``calmjs.module.webpackloader`` will not be\nmade available the gathered module or import names for the dynamic\nimport module when processed by the default loader plugin handlers, as\nthere exists a number of subtle complexities that severely complicates\nexposing these names in a meaningful manner for usage within the calmjs\nsystem. In effect, no dynamic imports will be possible after the\nconstruction of the artifact.\n\nIf a file name extension defined in this is also defined in the\n``calmjs.module.loader`` registry, it will also cause complications if\nthe dynamic import module was also generated. This issue is related to\nthe issue outlined by the previous paragraph.\n\nIf multiple loaders are required (such as for the case of stylesheets),\nuse the chained syntax as in the ``style-loader!css-loader`` definition\nto ensure that they are applied correctly, much like they would have\nbeen if they were prefixed on the imports directly for this particular\nPython package (i.e. ``style!css!``).\n\nMuch like the standard ``calmjs.module.loader`` registry, the\ndefinitions for any given filename extensions declared under the\n``calmjs.module.webpackloader`` registry are local to the package, so\nthat definitions that make use of a different set of loaders from an\nupstream or downstream package will not cause interference with how they\nare applied.\n\nTesting standalone, finalized webpack artifacts\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nWebpack artifacts generated using the standard ``calmjs webpack``\ntoolchain runtime may be tested using the ``calmjs karma`` runtime\nprovided by the ``calmjs.dev`` package. Given a finalized\n``example.webpack.js`` that implements the features provided by the\n``example`` package, the artifact may be tested with the tests provided\nby the ``example`` package using the following command:\n\n.. code:: sh\n\n $ calmjs karma run \\\n -t calmjs.webpack \\\n --artifact=example.webpack.js \\\n example\n\nThe above command invokes the standalone Karma runner using the\n``calmjs.webpack`` settings to test against the ``example.webpack.js``\nartifact file, using the tests provided by the ``example`` package. The\ntest execution is similar to the one during the development process.\n\nDeclaring prebuilt webpack artifacts for Python packages\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nFinally, to complete the Python package deployment story, the process\nshould include the automatic generation and inclusion of the JavaScript\nartifacts in the resulting Python wheel. This can be achieved by\nspecifying an entry in the ``calmjs.artifacts`` registry, with the key\nbeing the filename of the artifact and the value being the import\nlocation to a builder. A default builder function provided at\n``calmjs.webpack.artifact:complete_webpack`` will enable the generation\nof a complete webpack artifact for the Python package. The builder\n``calmjs.webpack.artifact:optimize_webpack`` will do the same, but with\nthe optimize options enabled (currently only the minimize output is\nsupported).\n\nFor example, a configuration that contains both forms might look like\nso:\n\n.. code:: ini\n\n [calmjs.artifacts]\n example.webpack.js = calmjs.webpack.artifact:complete_webpack\n example.webpack.min.js = calmjs.webpack.artifact:optimize_webpack\n\nOnce those entry points are added to ``setup.py`` and the package\nmetadata is regenerated using ``setup.py egg_info``, running ``calmjs\nartifact build example.package`` will make use of the webpack toolchain\nand build the artifact at ``example.webpack.js`` inside the\n``calmjs_artifacts`` directory within the package metadata directory for\n``example.package``. Alternatively, for solution more integrated with\n``setuptools``, the ``setup`` function in ``setup.py`` should also\nenable the ``build_calmjs_artifacts`` flag such that ``setup.py build``\nwill also trigger the building process. This is useful for\nautomatically generating and including the artifact as part of the wheel\nbuilding process. Consider this ``setup.py``:\n\n.. code:: Python\n\n setup(\n name='example.package',\n # ... other required fields truncated\n build_calmjs_artifacts=True,\n entry_points=\"\"\"\n # ... other entry points truncated\n [calmjs.module]\n example.package = example.package\n\n [calmjs.artifacts]\n example.webpack.js = calmjs.webpack.artifact:complete_webpack\n example.webpack.min.js = calmjs.webpack.artifact:optimize_webpack\n \"\"\",\n )\n\nBuilding the wheel using ``setup.py`` may result in something like this.\nNote that the execution of |webpack| was part of the process and that\nthe metadata (egg-info) directory was then built into the wheel.\n\n.. code::\n\n $ python setup.py bdist_wheel\n running bdist_wheel\n running build\n ...\n running build_calmjs_artifacts\n automatically picked registries ['calmjs.module'] for sourcepaths\n using loaderplugin registry 'calmjs.webpack.loaderplugins'\n using calmjs bootstrap; webpack.output.library set to '__calmjs__'\n ...\n Version: webpack 2.7.0\n Time: 240ms\n Asset Size Chunks Chunk Names\n example.webpack.js 10 kB 0 [emitted] [big] main\n ...\n running install_egg_info\n Copying src/example.package.egg-info to build/.../wheel/example.package...\n running install_scripts\n creating build/.../wheel/example.package-1.0.dist-info/WHEEL\n\nFor testing the package artifact, the following entry point should also\nbe specified under the ``calmjs.artifacts.tests`` registry, such that\nrunning ``calmjs artifact karma example.package`` will execute the\nJavaScript tests declared by ``example.package`` against the artifacts\nthat were declared in ``calmjs.artifacts``.\n\n.. code:: ini\n\n [calmjs.artifacts.tests]\n example.webpack.js = calmjs.webpack.artifact:test_complete_webpack\n example.webpack.min.js = calmjs.webpack.artifact:test_complete_webpack\n\nNote that the same ``test_complete_webpack`` test builder will be able\nto test the optimize_webpack artifact also.\n\n\nTroubleshooting\n---------------\n\nThe following are some known issues with regards to this package and its\nintegration with other Python/Node.js packages.\n\nCRITICAL calmjs.runtime WebpackRuntimeError: unable to locate 'webpack'\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThis means the current Node.js environment is missing the |webpack|\npackage from |npm|; either install it manually with it or through\n|calmjs| on this package. If a given Python package is required to use\nwebpack to generate the package, its ``package_json`` should declare\nthat, or declare dependency on ``calmjs.webpack``.\n\nCRITICAL calmjs.runtime WebpackExitError: webpack terminated\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThis can be caused by a variety of reasons; it can be due to invalid\nsyntax in the provided JavaScript code, or that the configuration not\ncontaining enough information for |webpack| to correctly execute, or\nthat specific ``calmjs webpack`` flags have been enabled in a way that\nis incompatible with |webpack|. To extract further information about\nthe error, the same |calmjs| command may be executed once more with the\n``--verbose`` and/or ``--debug`` flag enabled for extra log message\nwhich may reveal further information about the nature of the error, or\nthat the full traceback may provide further information. Detailed\ninformation must be included for the filing of bug reports on the\n`issue tracker`_.\n\nUserWarning: Unknown distribution option:\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nDuring setup and installation using the development method, if this\nwarning message is shown, please ensure the egg metadata is correctly\ngenerated by running ``python setup.py egg_info`` in the source\ndirectory, as the package |calmjs| was not available when the setup\nscript was initially executed.\n\nWARNING could not locate 'package.json' for the npm package '???-loader'\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe warning message is triggered when there was an attempt to use a\nwebpack loader without the appropriate loader module installed into the\nworking Node.js environment. As a quick workaround to the webpack\nartifact build issue, the missing package installation command may be\nattempted, however the correct solution is for that package to declare\nthe correct loader package as the dependency in ``package_json``.\n\n\nContribute\n----------\n\n.. _issue tracker:\n\n- Issue Tracker: https://github.com/calmjs/calmjs.webpack/issues\n- Source Code: https://github.com/calmjs/calmjs.webpack\n\n\nLegal\n-----\n\nThe |calmjs.webpack| package is part of the calmjs project.\n\nThe calmjs project is copyright (c) 2016 Auckland Bioengineering\nInstitute, University of Auckland. |calmjs.webpack| is licensed under\nthe terms of the GPLv2 or later.\n\nChangelog\n=========\n\n1.2.0 (2018-08-22)\n------------------\n\n- Various changes to enable the support of webpack 3 and 4. [\n `#6 `_\n ]\n\n - Substantial modification to the generation of webpack configuration\n scripts, as they are constructed through helpers that construct an\n abstract syntax tree through ``calmjs.parse``. This is done so that\n webpack version specific incompatibilities can be added/removed into\n the generated script as executable Node.js code.\n - A kill plugin is provided to karma by default; if webpack fails to\n build, the karma process will halt, as the ``singleRun: true`` flag\n no longer does the job for webpack.\n\n- Provide the ability to interrogate artifacts that simply have their\n function scope variable names mangled. [\n `#8 `_\n ]\n\n1.1.1 (2018-08-18)\n------------------\n\n- Ensure the line-continuation mark is filtered out in the to_identifier\n helper function as the values of String node object included that mark\n as of ``calmjs.parse-1.1.0``. [\n `#7 `_\n ]\n\n1.1.0 (2018-07-25)\n------------------\n\n- Provide support of prefix-free loaders through a customized webpack\n loader module registry; this one also works in tandem with the\n ``calmjs.module`` registry. [\n `#5 `_\n ]\n\n - Integrate the support of the package resource loader registry\n introduced by ``calmjs-3.3.0``.\n - Bumped supported ``calmjs.dev`` to version 2.2.0 such that the\n correct test loader registries can be automatically acquired. This\n also makes it possible to declare test data files as resources for\n JavaScript tests in the most straightforward manner as possible\n\n- The base loader plugin handler will also generate a modname prefixed\n with ``./``, in an attempt to provide a more natural include mechanism\n from within certain webpack loader contexts, as a number of them will\n implicitly resolve by relative path for a bare import, and the goal is\n to avoid further proprietary webpack syntaxes (e.g. the usage of the\n ``~`` prefixes to some ``namespace/package`` import/inclusions done\n inside the loader context). [\n `#4 `_\n ]\n\n1.0.2 (2018-05-24)\n------------------\n\n- Provide a builder that will generate an artifact with the supported\n optimize flags enabled. [\n `#3 `_\n ]\n\n1.0.1 (2018-05-03)\n------------------\n\n- Update the export_target production and usage of working_dir to be\n inline with what is expected by ``calmjs-3.1.0``. [\n `#2 `_\n ]\n\n1.0.0 (2018-01-12)\n------------------\n\n- Initial implementation of the Calmjs integration tool that enable the\n production of webpack artifacts from JavaScript sources that are\n included with Python packages, that also allow import of their\n dependencies sourced through ``npm`` through the Calmjs framework.\n- Enabled the ``calmjs webpack`` tool entry point.\n- Also provide integration with ``calmjs.dev`` by correcting the correct\n hooks so that this package can be used as an advice package for the\n execution of tests against artifacts generated through this package,\n through the usage of ``calmjs karma webpack``.\n- Support for prebuilt artifacts for packages is provided through\n ``calmjs.artifacts`` registry; default complete builders for both\n building and testing are available via the ``calmjs.webpack.artifact``\n module.\n- Webpack is pinned to ~2.6.0, as that is the current stable version\n that is verified to work with building and testing of artifacts.\n\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/calmjs/calmjs.webpack", "keywords": "", "license": "gpl", "maintainer": "", "maintainer_email": "", "name": "calmjs.webpack", "package_url": "https://pypi.org/project/calmjs.webpack/", "platform": "", "project_url": "https://pypi.org/project/calmjs.webpack/", "project_urls": { "Homepage": "https://github.com/calmjs/calmjs.webpack" }, "release_url": "https://pypi.org/project/calmjs.webpack/1.2.0/", "requires_dist": [ "calmjs (>=3.3.1)", "calmjs.dev (<3,>=2.2.2); extra == 'dev'" ], "requires_python": "", "summary": "Package for extending the Calmjs framework to support the usage of webpack for the generation of deployable artifacts from JavaScript source code provided by Python packages in conjunction with standard JavaScript or Node.js packages sourced from npm or other similar package repositories.", "version": "1.2.0" }, "last_serial": 4194772, "releases": { "0.0.dev0": [], "1.0.0": [ { "comment_text": "", "digests": { "md5": "e694d0bc4fc561340bbc041f85811c8d", "sha256": "0f451a05b2e01451979a491ab07852d659113da1173b3eb0d5910dac7b152bf7" }, "downloads": -1, "filename": "calmjs.webpack-1.0.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "e694d0bc4fc561340bbc041f85811c8d", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 90424, "upload_time": "2018-01-12T07:13:06", "url": "https://files.pythonhosted.org/packages/df/4f/c3119f68e09ecf03c6cc70eb70a29aa4e890fdc2d62406ed8b3785395978/calmjs.webpack-1.0.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b1bcb3ad1042c44e2cd9a6c22d9bcbf5", "sha256": "9ce878226574caad352d852dab60c86b4461338317df61f7451c225676d7dd46" }, "downloads": -1, "filename": "calmjs.webpack-1.0.0.zip", "has_sig": false, "md5_digest": "b1bcb3ad1042c44e2cd9a6c22d9bcbf5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 103761, "upload_time": "2018-01-12T07:13:08", "url": "https://files.pythonhosted.org/packages/4a/f0/9e99f112334321c628a9bd9a36c54c18081acb7767db24a4aa6d135593ad/calmjs.webpack-1.0.0.zip" } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "6fa05e66131e864b1179a528efd47d58", "sha256": "4572ccff0ab0bf2d5a4a7a7733e9a92d574c4484c0cd55f84d1a479aa0d3a9d8" }, "downloads": -1, "filename": "calmjs.webpack-1.0.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "6fa05e66131e864b1179a528efd47d58", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 79601, "upload_time": "2018-05-03T03:08:33", "url": "https://files.pythonhosted.org/packages/2b/c6/792a2e1177ade38044490e96f79fbe7c01407bd73e5cd42c0d54cb49fcd9/calmjs.webpack-1.0.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ce82a5313e5653b88f6e670eda79ccdf", "sha256": "01e902b936d7cfbac5910f2d093a0a94075164ff79b921bc38e8ceed093a3ede" }, "downloads": -1, "filename": "calmjs.webpack-1.0.1.zip", "has_sig": false, "md5_digest": "ce82a5313e5653b88f6e670eda79ccdf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 104508, "upload_time": "2018-05-03T03:08:35", "url": "https://files.pythonhosted.org/packages/3f/64/b4436dcb211fdf25322096e4afbd43bd16f9ba43c498f13e4d57b0e0ed8a/calmjs.webpack-1.0.1.zip" } ], "1.0.2": [ { "comment_text": "", "digests": { "md5": "1a3e624797ddd33a8c072ebbd2b43d8d", "sha256": "f1459e49b57f93defab805b5ba93d8821cbd2aa78c66a8200d94f49141a1d049" }, "downloads": -1, "filename": "calmjs.webpack-1.0.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "1a3e624797ddd33a8c072ebbd2b43d8d", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 80217, "upload_time": "2018-05-24T02:14:53", "url": "https://files.pythonhosted.org/packages/6b/52/96b8758cc1e62a197030735f85a94eb7628447363ce6277b0504937d15a3/calmjs.webpack-1.0.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f350de76e775946555d5753dc3f6984d", "sha256": "ce9b5ea476349c27797d8ebbf6832f7ba72a55912aec25f645e6f8c4f743e4bf" }, "downloads": -1, "filename": "calmjs.webpack-1.0.2.zip", "has_sig": false, "md5_digest": "f350de76e775946555d5753dc3f6984d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 105807, "upload_time": "2018-05-24T02:14:55", "url": "https://files.pythonhosted.org/packages/28/ff/0af2668daea28103501c3517f7b2aae256f932af0f534210bca648de32aa/calmjs.webpack-1.0.2.zip" } ], "1.1.0": [ { "comment_text": "", "digests": { "md5": "41737005bd1ab8e746262dad698e41b2", "sha256": "489cea6ec664abb06e530e434e65c97da18d8c94afe995a7819e4be6be6ec3a9" }, "downloads": -1, "filename": "calmjs.webpack-1.1.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "41737005bd1ab8e746262dad698e41b2", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 88927, "upload_time": "2018-07-25T07:04:42", "url": "https://files.pythonhosted.org/packages/f8/bd/4fac1ec1fdd5732531b3fa8dd10178788da51f8833ce31c40b637a0b4417/calmjs.webpack-1.1.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "68022bf765d281afeadd4a73c25dea0d", "sha256": "d68913ddec452b917fb8863a7dd4a5dea8078a41bf3949bd8dedafa60393179b" }, "downloads": -1, "filename": "calmjs.webpack-1.1.0.zip", "has_sig": false, "md5_digest": "68022bf765d281afeadd4a73c25dea0d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 119339, "upload_time": "2018-07-25T07:04:44", "url": "https://files.pythonhosted.org/packages/b6/26/865c7d91574c403a8904414b1721815c96e77adfe8dbbc97ac82bc70e85a/calmjs.webpack-1.1.0.zip" } ], "1.1.1": [ { "comment_text": "", "digests": { "md5": "1e9a499f347ebded1550b0adeaac7ff9", "sha256": "dca7a4b2cba9dd0bfabb62543302ba9e211beef565d06ae5c0e0a5d06bed1334" }, "downloads": -1, "filename": "calmjs.webpack-1.1.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "1e9a499f347ebded1550b0adeaac7ff9", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 89139, "upload_time": "2018-08-18T05:35:51", "url": "https://files.pythonhosted.org/packages/a2/7c/0d3303752d79c96e396847cb00bb47735022b7d7d7b8db51a8bc91275e36/calmjs.webpack-1.1.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a4ba1c9d0423999d92f49be251141ce0", "sha256": "b06a22ef052bee1ebcb787ee64e34180549009b1886152009e487513e5e97dcb" }, "downloads": -1, "filename": "calmjs.webpack-1.1.1.zip", "has_sig": false, "md5_digest": "a4ba1c9d0423999d92f49be251141ce0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 119768, "upload_time": "2018-08-18T05:35:53", "url": "https://files.pythonhosted.org/packages/cb/d3/232707eb44f5f50de8f5203d833b31eebb5514600318e99c578194b2cc1b/calmjs.webpack-1.1.1.zip" } ], "1.2.0": [ { "comment_text": "", "digests": { "md5": "3ac278071861e88409fe42be7b8b6707", "sha256": "016adce74ca4b225af6a8015310d4792b1ec2fe46999c77efbc872aacce805ef" }, "downloads": -1, "filename": "calmjs.webpack-1.2.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "3ac278071861e88409fe42be7b8b6707", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 116137, "upload_time": "2018-08-22T02:28:47", "url": "https://files.pythonhosted.org/packages/eb/de/4d357eca1370c91f1e16b8f85b1a60239898d16a7a158d28ba5471bc7b63/calmjs.webpack-1.2.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a67e82fd968c57167a6945cb98318308", "sha256": "15a89879f15d0db577d7e18849c68ad8fc56ffc6a9c8732b971acea8cc1b8406" }, "downloads": -1, "filename": "calmjs.webpack-1.2.0.zip", "has_sig": false, "md5_digest": "a67e82fd968c57167a6945cb98318308", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 148341, "upload_time": "2018-08-22T02:28:49", "url": "https://files.pythonhosted.org/packages/26/89/d3d29a13d5badfb69e1ab236b9a13a43d7018eaf9af3421b2ec6b25da99c/calmjs.webpack-1.2.0.zip" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "3ac278071861e88409fe42be7b8b6707", "sha256": "016adce74ca4b225af6a8015310d4792b1ec2fe46999c77efbc872aacce805ef" }, "downloads": -1, "filename": "calmjs.webpack-1.2.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "3ac278071861e88409fe42be7b8b6707", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 116137, "upload_time": "2018-08-22T02:28:47", "url": "https://files.pythonhosted.org/packages/eb/de/4d357eca1370c91f1e16b8f85b1a60239898d16a7a158d28ba5471bc7b63/calmjs.webpack-1.2.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a67e82fd968c57167a6945cb98318308", "sha256": "15a89879f15d0db577d7e18849c68ad8fc56ffc6a9c8732b971acea8cc1b8406" }, "downloads": -1, "filename": "calmjs.webpack-1.2.0.zip", "has_sig": false, "md5_digest": "a67e82fd968c57167a6945cb98318308", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 148341, "upload_time": "2018-08-22T02:28:49", "url": "https://files.pythonhosted.org/packages/26/89/d3d29a13d5badfb69e1ab236b9a13a43d7018eaf9af3421b2ec6b25da99c/calmjs.webpack-1.2.0.zip" } ] }