mgechev / aspect.js

JavaScript library for aspect-oriented programming using modern syntax.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Getting "Cannot read property 'value' of undefined" when using aspect.js from Node.js 10.12.0, plain JavaScript project that uses Babel 7

matthewadams opened this issue · comments

aspect.js is broken when using Node.js in a plain JavaScript project that uses Babel 7; error is below. Babel settings are in the babel section of the package.json. I have a feeling that the issue is related to @babel/plugin-proposal-decorators.

A git repository with reproducible test case is at https://github.com/matthewadams/aspect.js-babel7-poc. You can reproduce the error by cloning the repo and issuing the following command:

npm test

The same error exists when using Node.js 8.12.0.

I'm getting the following error:

/Users/matthewadams/dev/aspect.js-babel7-poc/node_modules/aspect.js/src/join_points/static_method.js:61
            pointcut.advice = new constr(target, descriptor.value);
                                                            ^

TypeError: Cannot read property 'value' of undefined
    at /Users/matthewadams/dev/aspect.js-babel7-poc/node_modules/aspect.js/src/join_points/static_method.js:61:61
    at _decorateElement (/Users/matthewadams/dev/aspect.js-babel7-poc/lib/main/aspects/Aspect.js:1:45845)
    at /Users/matthewadams/dev/aspect.js-babel7-poc/lib/main/aspects/Aspect.js:1:44152
    at Array.forEach (<anonymous>)
    at _decorateClass (/Users/matthewadams/dev/aspect.js-babel7-poc/lib/main/aspects/Aspect.js:1:43891)
    at _decorate (/Users/matthewadams/dev/aspect.js-babel7-poc/lib/main/aspects/Aspect.js:1:37108)
    at Object.<anonymous> (/Users/matthewadams/dev/aspect.js-babel7-poc/lib/main/aspects/Aspect.js:2:112)
    at Module._compile (internal/modules/cjs/loader.js:688:30)
    at Module.replacementCompile (/Users/matthewadams/dev/aspect.js-babel7-poc/node_modules/nyc/node_modules/append-transform/index.js:58:13)
    at Module._compile (/Users/matthewadams/dev/aspect.js-babel7-poc/node_modules/pirates/lib/index.js:83:24)
    at Module._extensions..js (internal/modules/cjs/loader.js:699:10)
    at /Users/matthewadams/dev/aspect.js-babel7-poc/node_modules/nyc/node_modules/append-transform/index.js:62:4
    at newLoader (/Users/matthewadams/dev/aspect.js-babel7-poc/node_modules/pirates/lib/index.js:88:7)
    at Object.<anonymous> (/Users/matthewadams/dev/aspect.js-babel7-poc/node_modules/nyc/node_modules/append-transform/index.js:62:4)
    at Module.load (internal/modules/cjs/loader.js:598:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:537:12)
    at Function.Module._load (internal/modules/cjs/loader.js:529:3)
    at Module.require (internal/modules/cjs/loader.js:636:17)
    at require (internal/modules/cjs/helpers.js:20:18)
    at Object.<anonymous> (/Users/matthewadams/dev/aspect.js-babel7-poc/lib/main/Thing.js:1:56820)
    at Module._compile (internal/modules/cjs/loader.js:688:30)
    at Module.replacementCompile (/Users/matthewadams/dev/aspect.js-babel7-poc/node_modules/nyc/node_modules/append-transform/index.js:58:13)
    at Module._compile (/Users/matthewadams/dev/aspect.js-babel7-poc/node_modules/pirates/lib/index.js:83:24)
    at Module._extensions..js (internal/modules/cjs/loader.js:699:10)
    at /Users/matthewadams/dev/aspect.js-babel7-poc/node_modules/nyc/node_modules/append-transform/index.js:62:4
    at newLoader (/Users/matthewadams/dev/aspect.js-babel7-poc/node_modules/pirates/lib/index.js:88:7)
    at Object.<anonymous> (/Users/matthewadams/dev/aspect.js-babel7-poc/node_modules/nyc/node_modules/append-transform/index.js:62:4)
    at Module.load (internal/modules/cjs/loader.js:598:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:537:12)
    at Function.Module._load (internal/modules/cjs/loader.js:529:3)
    at Module.require (internal/modules/cjs/loader.js:636:17)
    at require (internal/modules/cjs/helpers.js:20:18)
    at Object.<anonymous> (/Users/matthewadams/dev/aspect.js-babel7-poc/lib/test/integration/Thing.spec.js:9:15)
    at Module._compile (internal/modules/cjs/loader.js:688:30)
    at Module.replacementCompile (/Users/matthewadams/dev/aspect.js-babel7-poc/node_modules/nyc/node_modules/append-transform/index.js:58:13)
    at Module._compile (/Users/matthewadams/dev/aspect.js-babel7-poc/node_modules/pirates/lib/index.js:83:24)
    at Module._extensions..js (internal/modules/cjs/loader.js:699:10)
    at /Users/matthewadams/dev/aspect.js-babel7-poc/node_modules/nyc/node_modules/append-transform/index.js:62:4
    at newLoader (/Users/matthewadams/dev/aspect.js-babel7-poc/node_modules/pirates/lib/index.js:88:7)
    at Object.<anonymous> (/Users/matthewadams/dev/aspect.js-babel7-poc/node_modules/nyc/node_modules/append-transform/index.js:62:4)
    at Module.load (internal/modules/cjs/loader.js:598:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:537:12)
    at Function.Module._load (internal/modules/cjs/loader.js:529:3)
    at Module.require (internal/modules/cjs/loader.js:636:17)
    at require (internal/modules/cjs/helpers.js:20:18)
    at /Users/matthewadams/dev/aspect.js-babel7-poc/node_modules/mocha/lib/mocha.js:250:27
    at Array.forEach (<anonymous>)
    at Mocha.loadFiles (/Users/matthewadams/dev/aspect.js-babel7-poc/node_modules/mocha/lib/mocha.js:247:14)
    at Mocha.run (/Users/matthewadams/dev/aspect.js-babel7-poc/node_modules/mocha/lib/mocha.js:576:10)
    at Object.<anonymous> (/Users/matthewadams/dev/aspect.js-babel7-poc/node_modules/mocha/bin/_mocha:637:18)
    at Module._compile (internal/modules/cjs/loader.js:688:30)
    at Module.replacementCompile (/Users/matthewadams/dev/aspect.js-babel7-poc/node_modules/nyc/node_modules/append-transform/index.js:58:13)
    at Module._extensions..js (internal/modules/cjs/loader.js:699:10)
    at Object.<anonymous> (/Users/matthewadams/dev/aspect.js-babel7-poc/node_modules/nyc/node_modules/append-transform/index.js:62:4)
    at Module.load (internal/modules/cjs/loader.js:598:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:537:12)
    at Function.Module._load (internal/modules/cjs/loader.js:529:3)
    at Function.Module.runMain (internal/modules/cjs/loader.js:741:12)
    at runMain (/Users/matthewadams/.node-spawn-wrap-38692-42f74de48f81/node:68:10)
    at Function.<anonymous> (/Users/matthewadams/.node-spawn-wrap-38692-42f74de48f81/node:171:5)
    at Object.<anonymous> (/Users/matthewadams/dev/aspect.js-babel7-poc/node_modules/nyc/bin/wrap.js:23:4)
    at Module._compile (internal/modules/cjs/loader.js:688:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:699:10)
    at Module.load (internal/modules/cjs/loader.js:598:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:537:12)
    at Function.Module._load (internal/modules/cjs/loader.js:529:3)
    at Function.Module.runMain (internal/modules/cjs/loader.js:741:12)
    at /Users/matthewadams/.node-spawn-wrap-38692-42f74de48f81/node:178:8
    at Object.<anonymous> (/Users/matthewadams/.node-spawn-wrap-38692-42f74de48f81/node:181:3)
    at Module._compile (internal/modules/cjs/loader.js:688:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:699:10)
    at Module.load (internal/modules/cjs/loader.js:598:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:537:12)
    at Function.Module._load (internal/modules/cjs/loader.js:529:3)
    at Function.Module.runMain (internal/modules/cjs/loader.js:741:12)
    at startup (internal/bootstrap/node.js:285:19)
    at bootstrapNodeJSCore (internal/bootstrap/node.js:739:3)

I'm not familiar with the difference of the implementations of the decorators spec between Babel and TypeScript.

If anyone is using aspect.js with Babel, it would be great if you can share your experience.

@mgechev Thanks to https://babeljs.slack.com/archives/C0DFJT81H/p1542152010508400, I was able to workaround this issue. Relevant commit is matthewadams/aspect.js-babel7-poc@ba2e9d3.

The key fix was to set legacy to true; see matthewadams/aspect.js-babel7-poc@ba2e9d3#diff-b9cfc7f2cdf78a7f4b91a753d10865a2L67.

Running npm t fixed the tests, but I also had to change one other thing: the this reference in MethodCallCounterAspect looks like it's not getting set correctly, so I can't use state in my aspects. I'll open a separate issue for that.

I'll close this issue and open another one to support the modern behavior of @babel/plugin-proposal-decorators.