Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions CHANGES.rst
Original file line number Diff line number Diff line change
@@ -1,6 +1,14 @@
Changelog
=========

1.1.2 (????-??-??)
------------------

- Provide the ability to interrogate artifacts that simply have their
function scope variable names mangled. [
`#8 <https://github.com/calmjs/calmjs.webpack/issues/8>`_
]

1.1.1 (2018-08-18)
------------------

Expand Down
36 changes: 30 additions & 6 deletions src/calmjs/webpack/interrogation.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
source files.
"""

import logging

from calmjs.parse.asttypes import Assign
from calmjs.parse.asttypes import Array
from calmjs.parse.asttypes import BracketAccessor
Expand All @@ -20,6 +22,7 @@
from calmjs.parse.walkers import Walker

walker = Walker()
logger = logging.getLogger(__name__)


def probe_calmjs_webpack_module_names(node):
Expand All @@ -30,14 +33,22 @@ def probe_calmjs_webpack_module_names(node):

# first, locate the index number of the entry point (calmjs export
# module), depending on whether or not the webpack is minified.
if factory_name == 'factory':
# non-minified.
try:
# attempt to verify that this is a factory node
verify_factory(webpack_wrapper, factory_name)
entry_index = extract_entry_index(node)
except TypeError:
# provide a fallback to check for minified/uglified version
if factory_name != 'factory':
verify_factory_min(webpack_wrapper, factory_name)
entry_index = extract_entry_index_min(node)
else:
raise
else:
# minified.
verify_factory_min(webpack_wrapper, factory_name)
entry_index = extract_entry_index_min(node)
verify_factory(webpack_wrapper, factory_name)
if factory_name != 'factory':
entry_index = extract_entry_index_mangled(node)
else:
entry_index = extract_entry_index(node)

# now that we have the entry point, extract the index of the module
# loader module from that
Expand Down Expand Up @@ -65,6 +76,7 @@ def verify_factory(node, factory_name):


def extract_entry_index(node):
logger.debug('probing module names from original artifact')
return int(walker.extract(node, lambda n: (
isinstance(n, Return) and
isinstance(n.expr, FunctionCall) and
Expand All @@ -75,6 +87,17 @@ def extract_entry_index(node):
)).expr.args.items[0].right.value)


def extract_entry_index_mangled(node):
logger.debug('probing module names from mangled artifact')
return int(walker.extract(node, lambda n: (
isinstance(n, Return) and
isinstance(n.expr, FunctionCall) and
n.expr.args.items and
isinstance(n.expr.args.items[0], Assign) and
isinstance(n.expr.args.items[0].right, Number)
)).expr.args.items[0].right.value)


def verify_factory_min(node, factory_name):
return walker.extract(node, lambda n: (
isinstance(n, Assign) and
Expand All @@ -85,6 +108,7 @@ def verify_factory_min(node, factory_name):


def extract_entry_index_min(node):
logger.debug('probing module names from uglified artifact')
return int(walker.extract(node, lambda n: (
isinstance(n, Return) and
isinstance(n.expr, Comma) and
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions src/calmjs/webpack/tests/test_interrogation.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,14 @@ def test_probe_calmjs_webpack_module_names(self):
self.assertEqual([], interrogation.probe_calmjs_webpack_module_names(
_empty))

def test_mangled_calmjs_webpack_module_names(self):
mangled = parse(read(join(_root, 'example_package.mangled.js')))
self.assertEqual([
'example/package/bad',
'example/package/main',
'example/package/math',
], interrogation.probe_calmjs_webpack_module_names(mangled))

def test_probe_failure(self):
# simply TypeError is raised
with self.assertRaises(TypeError):
Expand Down