0.0.1 • Published 3 years ago

magic-error v0.0.1

Weekly downloads
10
License
MIT
Repository
github
Last release
3 years ago

magic-error

How do I install it?

npm install --save magic-error

Usage

import createMagicError from 'magic-error';

const err = createMagicError(new ReferenceError('Impossible does not exist'));

How does it work?

It uses proxy and sets traps for 2 internal methods:

Ok, cool, but I still don't have a clue how this crap is supposed to work. I'll probably fail to describe it in a meaningful way and skip a couple of details, but let me try. If you take a look at a method like Object.keys, you should be able to see it invokes [[EnumerableOwnPropertyNames]]. Now, please take a look at the step 2 of [EnumerableOwnPropertyNames]. Yes, you see it right. It 'calls' [OwnPropertyKeys]. Then, step 4.II is kind of important (but not in our case, more on this later) as well in general, as if the desc[Enumerable] is not true, the key won't be included in the list. All descriptors we return have enumerable set to true, because we'd have a nice TypeError otherwise. The trap for [GetOwnProperty] internal method is needed due to that - we need to make properties enumerable and configurable.

Why do we have that new Set in ownKeys?

It's caused by the fact the trap result cannot return duplicate entries. See the step 9 of [OwnPropertyKeys] internal slot.

What about Object.getOwnPropertyNames?

Pretty much the same story. It has different steps, as, [EnumerableOwnPropertyNames] unlike it doesn't 'filter out' non-enumerable properties, but since everything is enumerable in our case, the output should be equal.

What about for in loop?

Alright - we need to get the syntax right first. As you can see, all for in iteration methods 'pass' enumerate 'to' ForIn/OfHeadEvaluation. Now, go ahead, look at step 6. EnumerateObjectProperties is described quite nicely - there is even a code sample.

What about xyz?

Google it or search in spec.

How does it differ from serialize-error?

Serialize-error can be used on production, while this thingy... well, I wouldn't use it.

Besides that, there a few other differences you most likely don't care about, but to name a few:

  • all available properties are exposed, i.e. columnNumber and lineNumber on Firefox,
  • constructor is set to an actual initial error constructor,
  • prototype is retained,
  • instanceof works 'correctly'... I think,
  • it's just cool.