1 |
|
2 |
|
3 |
|
4 |
|
5 | import template from 'babel-template';
|
6 | import {
|
7 | booleanLiteral,
|
8 | numericLiteral,
|
9 | stringLiteral
|
10 | } from 'babel-types';
|
11 |
|
12 | const pattern = /^\s*?=>( async)?\s*/;
|
13 |
|
14 | const tpl = template(`
|
15 | (function() {
|
16 | var assert = require('assert');
|
17 | assert.equal(result, ASSERTION);
|
18 | })();
|
19 | `);
|
20 |
|
21 |
|
22 |
|
23 |
|
24 |
|
25 |
|
26 | export function test(value) {
|
27 | return pattern.test(value);
|
28 | }
|
29 |
|
30 |
|
31 |
|
32 |
|
33 |
|
34 |
|
35 | export function build(value) {
|
36 | return tpl({
|
37 | ASSERTION: literal(value.replace(pattern, ''))
|
38 | });
|
39 | }
|
40 |
|
41 |
|
42 |
|
43 |
|
44 |
|
45 |
|
46 | function literal(l) {
|
47 |
|
48 |
|
49 | let f, i;
|
50 | switch (typeof l) {
|
51 | case 'boolean':
|
52 | return booleanLiteral(l);
|
53 | case 'number':
|
54 | return numericLiteral(l);
|
55 | case 'string':
|
56 | if (l === 'true') {
|
57 | return booleanLiteral(true);
|
58 | }
|
59 | if (l === 'false') {
|
60 | return booleanLiteral(false);
|
61 | }
|
62 | i = parseInt(l, 10);
|
63 | if (!Number.isNaN(i)) {
|
64 | return numericLiteral(i);
|
65 | }
|
66 | f = parseFloat(l);
|
67 | if (!Number.isNaN(f)) {
|
68 | return numericLiteral(f);
|
69 | }
|
70 | return stringLiteral(l);
|
71 | default:
|
72 | throw new Error('Unsupported literal type');
|
73 | }
|
74 | }
|