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