summaryrefslogtreecommitdiff
path: root/test/es-module/test-esm-data-urls.js
blob: 7efe7a1199c5e6071de81865d6a5309c180dbe47 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
'use strict';
const common = require('../common');
const assert = require('assert');
function createURL(mime, body) {
  return `data:${mime},${body}`;
}
function createBase64URL(mime, body) {
  return `data:${mime};base64,${Buffer.from(body).toString('base64')}`;
}
(async () => {
  {
    const body = 'export default {a:"aaa"};';
    const plainESMURL = createURL('text/javascript', body);
    const ns = await import(plainESMURL);
    assert.deepStrictEqual(Object.keys(ns), ['default']);
    assert.deepStrictEqual(ns.default.a, 'aaa');
    const importerOfURL = createURL(
      'text/javascript',
      `export {default as default} from ${JSON.stringify(plainESMURL)}`
    );
    assert.strictEqual(
      (await import(importerOfURL)).default,
      ns.default
    );
    const base64ESMURL = createBase64URL('text/javascript', body);
    assert.notStrictEqual(
      await import(base64ESMURL),
      ns
    );
  }
  {
    const body = 'export default import.meta.url;';
    const plainESMURL = createURL('text/javascript', body);
    const ns = await import(plainESMURL);
    assert.deepStrictEqual(Object.keys(ns), ['default']);
    assert.deepStrictEqual(ns.default, plainESMURL);
  }
  {
    const body = 'export default import.meta.url;';
    const plainESMURL = createURL('text/javascript;charset=UTF-8', body);
    const ns = await import(plainESMURL);
    assert.deepStrictEqual(Object.keys(ns), ['default']);
    assert.deepStrictEqual(ns.default, plainESMURL);
  }
  {
    const body = 'export default import.meta.url;';
    const plainESMURL = createURL('text/javascript;charset="UTF-8"', body);
    const ns = await import(plainESMURL);
    assert.deepStrictEqual(Object.keys(ns), ['default']);
    assert.deepStrictEqual(ns.default, plainESMURL);
  }
  {
    const body = 'export default import.meta.url;';
    const plainESMURL = createURL('text/javascript;;a=a;b=b;;', body);
    const ns = await import(plainESMURL);
    assert.deepStrictEqual(Object.keys(ns), ['default']);
    assert.deepStrictEqual(ns.default, plainESMURL);
  }
  {
    const ns = await import('data:application/json;foo="test,"this"');
    assert.deepStrictEqual(Object.keys(ns), ['default']);
    assert.deepStrictEqual(ns.default, 'this');
  }
  {
    const ns = await import(`data:application/json;foo=${
      encodeURIComponent('test,')
    },0`);
    assert.deepStrictEqual(Object.keys(ns), ['default']);
    assert.deepStrictEqual(ns.default, 0);
  }
  {
    await assert.rejects(async () => {
      return import('data:application/json;foo="test,",0');
    }, {
      name: 'SyntaxError',
      message: /Unexpected end of JSON input/
    });
  }
  {
    const body = '{"x": 1}';
    const plainESMURL = createURL('application/json', body);
    const ns = await import(plainESMURL);
    assert.deepStrictEqual(Object.keys(ns), ['default']);
    assert.deepStrictEqual(ns.default.x, 1);
  }
  {
    const body = '{"default": 2}';
    const plainESMURL = createURL('application/json', body);
    const ns = await import(plainESMURL);
    assert.deepStrictEqual(Object.keys(ns), ['default']);
    assert.deepStrictEqual(ns.default.default, 2);
  }
  {
    const body = 'null';
    const plainESMURL = createURL('invalid', body);
    try {
      await import(plainESMURL);
      common.mustNotCall()();
    } catch (e) {
      assert.strictEqual(e.code, 'ERR_INVALID_RETURN_PROPERTY_VALUE');
    }
  }
})().then(common.mustCall());