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