Skip to content

Commit

Permalink
Refactor import.meta.url handling
Browse files Browse the repository at this point in the history
  • Loading branch information
lukastaegert committed Mar 31, 2019
1 parent 0089eb9 commit 5665701
Show file tree
Hide file tree
Showing 43 changed files with 332 additions and 54 deletions.
6 changes: 6 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@
"source-map": "^0.6.1",
"source-map-support": "^0.5.11",
"sourcemap-codec": "^1.4.4",
"systemjs": "^3.1.0",
"terser": "^3.17.0",
"tslib": "^1.9.3",
"tslint": "^5.14.0",
Expand Down
46 changes: 23 additions & 23 deletions src/ast/nodes/MetaProperty.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,32 +7,32 @@ import MemberExpression from './MemberExpression';
import * as NodeType from './NodeType';
import { NodeBase } from './shared/Node';

// TODO Lukas make relative mechanism more uniform
// TODO Lukas reference absolute mechanism in relative mechanism

const getResolveUrl = (path: string, URL: string = 'URL') => `new ${URL}(${path}).href`;

const getUrlFromDocument = (chunkId: string) =>
`(document.currentScript && document.currentScript.src || new URL('${chunkId}', document.baseURI).href)`;

const amdModuleUrl = `(typeof process !== 'undefined' && process.versions && process.versions.node ? 'file:' : '') + module.uri`;
const getURLFromGlobalOrCjs = `(typeof URL !== 'undefined' ? URL : require('ur'+'l').URL)`;

const globalImportMetaUrlMechanism = `(typeof document !== 'undefined' ? document.currentScript && document.currentScript.src || document.baseURI : ${getResolveUrl(
`'file:' + __filename`,
getURLFromGlobalOrCjs
)})`;

const importMetaUrlMechanisms: Record<string, string> = {
amd: getResolveUrl(amdModuleUrl),
cjs: getResolveUrl(
`(process.browser ? '' : 'file:') + __filename, process.browser && document.baseURI`,
getURLFromGlobalOrCjs
),
iife: globalImportMetaUrlMechanism,
umd: globalImportMetaUrlMechanism

const importMetaUrlMechanisms: Record<string, (chunkId: string) => string> = {
amd: () => getResolveUrl(`module.uri, document.baseURI`),
cjs: chunkId =>
`(typeof document === 'undefined' ? ${getResolveUrl(
`'file:' + __filename`,
`(require('u' + 'rl').URL)`
)} : ${getUrlFromDocument(chunkId)})`,
iife: chunkId => getUrlFromDocument(chunkId),
umd: chunkId =>
`(typeof document === 'undefined' ? ${getResolveUrl(
`'file:' + __filename`,
`(require('u' + 'rl').URL)`
)} : ${getUrlFromDocument(chunkId)})`
};

const globalRelUrlMechanism = (relPath: string) => {
return getResolveUrl(
`(typeof document !== 'undefined' ? document.currentScript && document.currentScript.src || document.baseURI : 'file:' + __filename) + '/../${relPath}'`,
getURLFromGlobalOrCjs
`(typeof URL !== 'undefined' ? URL : require('ur'+'l').URL)`
);
};

Expand All @@ -41,9 +41,9 @@ const relUrlMechanisms: Record<string, (relPath: string) => string> = {
cjs: (relPath: string) =>
getResolveUrl(
`(process.browser ? '' : 'file:') + __dirname + '/${relPath}', process.browser && document.baseURI`,
getURLFromGlobalOrCjs
`(typeof URL !== 'undefined' ? URL : require('ur'+'l').URL)`
),
es: (relPath: string) => getResolveUrl(`'../${relPath}', import.meta.url`), // TODO Lukas does this pattern make sense in more situations?
es: (relPath: string) => getResolveUrl(`'../${relPath}', import.meta.url`),
iife: globalRelUrlMechanism,
system: (relPath: string) => getResolveUrl(`'../${relPath}', module.url`),
umd: globalRelUrlMechanism
Expand All @@ -69,7 +69,6 @@ export default class MetaProperty extends NodeBase {
}

renderFinalMechanism(code: MagicString, chunkId: string, format: string): boolean {
// TODO Lukas why?
if (!this.rendered) return false;

if (this.parent instanceof MemberExpression === false) return false;
Expand All @@ -94,7 +93,8 @@ export default class MetaProperty extends NodeBase {
code.overwrite(this.meta.start, this.meta.end, 'module');
} else if (importMetaProperty === 'url') {
const importMetaUrlMechanism = importMetaUrlMechanisms[format];
if (importMetaUrlMechanism) code.overwrite(parent.start, parent.end, importMetaUrlMechanism);
if (importMetaUrlMechanism)
code.overwrite(parent.start, parent.end, importMetaUrlMechanism(chunkId));
return true;
}

Expand Down
1 change: 0 additions & 1 deletion test/chunking-form/samples/asset-emission/_config.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
module.exports = {
solo: true,
description: 'supports emitting assets from plugin hooks',
options: {
input: ['main.js'],
Expand Down
10 changes: 10 additions & 0 deletions test/chunking-form/samples/asset-emission/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script type="module" src="_actual/es/main.js"></script>
</body>
</html>
8 changes: 8 additions & 0 deletions test/chunking-form/samples/import-meta-url/_config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
module.exports = {
description: 'supports import.meta.url',
options: {
output: {
chunkFileNames: 'nested/chunk.js'
}
}
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
define(['module', 'require', './nested/chunk.js'], function (module, require, __chunk_1) { 'use strict';

__chunk_1.log('main: ' + new URL(module.uri, document.baseURI).href);
new Promise(function (resolve, reject) { require(['./nested/chunk2.js'], resolve, reject) });

});
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
define(['exports'], function (exports) { 'use strict';

function log(url) {
if (typeof document === 'undefined') {
console.log(url);
} else {
document.body.innerHTML += url + '<br>';
}
}

exports.log = log;

});
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
define(['module', './chunk.js'], function (module, __chunk_1) { 'use strict';

__chunk_1.log('nested: ' + new URL(module.uri, document.baseURI).href);

});
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
'use strict';

var __chunk_1 = require('./nested/chunk.js');

__chunk_1.log('main: ' + (typeof document === 'undefined' ? new (require('u' + 'rl').URL)('file:' + __filename).href : (document.currentScript && document.currentScript.src || new URL('main.js', document.baseURI).href)));
Promise.resolve(require('./nested/chunk2.js'));
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
'use strict';

function log(url) {
if (typeof document === 'undefined') {
console.log(url);
} else {
document.body.innerHTML += url + '<br>';
}
}

exports.log = log;
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
'use strict';

var __chunk_1 = require('./chunk.js');

__chunk_1.log('nested: ' + (typeof document === 'undefined' ? new (require('u' + 'rl').URL)('file:' + __filename).href : (document.currentScript && document.currentScript.src || new URL('nested/chunk2.js', document.baseURI).href)));
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import { a as log } from './nested/chunk.js';

log('main: ' + import.meta.url);
import('./nested/chunk2.js');
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
function log(url) {
if (typeof document === 'undefined') {
console.log(url);
} else {
document.body.innerHTML += url + '<br>';
}
}

export { log as a };
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import { a as log } from './chunk.js';

log('nested: ' + import.meta.url);
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
System.register(['./nested/chunk.js'], function (exports, module) {
'use strict';
var log;
return {
setters: [function (module) {
log = module.a;
}],
execute: function () {

log('main: ' + module.meta.url);
module.import('./nested/chunk2.js');

}
};
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
System.register([], function (exports, module) {
'use strict';
return {
execute: function () {

exports('a', log);

function log(url) {
if (typeof document === 'undefined') {
console.log(url);
} else {
document.body.innerHTML += url + '<br>';
}
}

}
};
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
System.register(['./chunk.js'], function (exports, module) {
'use strict';
var log;
return {
setters: [function (module) {
log = module.a;
}],
execute: function () {

log('nested: ' + module.meta.url);

}
};
});
10 changes: 10 additions & 0 deletions test/chunking-form/samples/import-meta-url/index-amd.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>AMD</title>
</head>
<body>
<script src="../../../../node_modules/requirejs/require.js" data-main="_actual/amd/main.js"></script>
</body>
</html>
10 changes: 10 additions & 0 deletions test/chunking-form/samples/import-meta-url/index-es.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>ES Module</title>
</head>
<body>
<script src="_actual/es/main.js" type="module"></script>
</body>
</html>
11 changes: 11 additions & 0 deletions test/chunking-form/samples/import-meta-url/index-system.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>SystemJS</title>
</head>
<body>
<script src="../../../../node_modules/systemjs/dist/s.js"></script>
<script>System.import('./_actual/system/main.js');</script>
</body>
</html>
7 changes: 7 additions & 0 deletions test/chunking-form/samples/import-meta-url/log.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
export function log(url) {
if (typeof document === 'undefined') {
console.log(url);
} else {
document.body.innerHTML += url + '<br>';
}
}
4 changes: 4 additions & 0 deletions test/chunking-form/samples/import-meta-url/main.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import {log} from './log';

log('main: ' + import.meta.url);
import('./nested.js');
3 changes: 3 additions & 0 deletions test/chunking-form/samples/import-meta-url/nested.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import {log} from './log';

log('nested: ' + import.meta.url);
3 changes: 1 addition & 2 deletions test/form/samples/import-meta-url/_config.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
module.exports = {
solo: true,
description: 'import.meta.url support'
description: 'supports import.meta.url'
};
10 changes: 9 additions & 1 deletion test/form/samples/import-meta-url/_expected/amd.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
define(['module'], function (module) { 'use strict';

document.body.innerText = new URL((typeof process !== 'undefined' && process.versions && process.versions.node ? 'file:' : '') + module.uri).href;
function log(url) {
if (typeof document === 'undefined') {
console.log(url);
} else {
document.body.innerText = url;
}
}

log(new URL(module.uri, document.baseURI).href);

});
10 changes: 9 additions & 1 deletion test/form/samples/import-meta-url/_expected/cjs.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
'use strict';

document.body.innerText = new (typeof URL !== 'undefined' ? URL : require('ur'+'l').URL)((process.browser ? '' : 'file:') + __filename, process.browser && document.baseURI).href;
function log(url) {
if (typeof document === 'undefined') {
console.log(url);
} else {
document.body.innerText = url;
}
}

log((typeof document === 'undefined' ? new (require('u' + 'rl').URL)('file:' + __filename).href : (document.currentScript && document.currentScript.src || new URL('cjs.js', document.baseURI).href)));
10 changes: 9 additions & 1 deletion test/form/samples/import-meta-url/_expected/es.js
Original file line number Diff line number Diff line change
@@ -1 +1,9 @@
document.body.innerText = import.meta.url;
function log(url) {
if (typeof document === 'undefined') {
console.log(url);
} else {
document.body.innerText = url;
}
}

log(import.meta.url);
10 changes: 9 additions & 1 deletion test/form/samples/import-meta-url/_expected/iife.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,14 @@
(function () {
'use strict';

document.body.innerText = (typeof document !== 'undefined' ? document.currentScript && document.currentScript.src || document.baseURI : new (typeof URL !== 'undefined' ? URL : require('ur'+'l').URL)('file:' + __filename).href);
function log(url) {
if (typeof document === 'undefined') {
console.log(url);
} else {
document.body.innerText = url;
}
}

log((document.currentScript && document.currentScript.src || new URL('iife.js', document.baseURI).href));

}());
10 changes: 9 additions & 1 deletion test/form/samples/import-meta-url/_expected/system.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,15 @@ System.register([], function (exports, module) {
return {
execute: function () {

document.body.innerText = module.meta.url;
function log(url) {
if (typeof document === 'undefined') {
console.log(url);
} else {
document.body.innerText = url;
}
}

log(module.meta.url);

}
};
Expand Down
10 changes: 9 additions & 1 deletion test/form/samples/import-meta-url/_expected/umd.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,14 @@
factory();
}(function () { 'use strict';

document.body.innerText = (typeof document !== 'undefined' ? document.currentScript && document.currentScript.src || document.baseURI : new (typeof URL !== 'undefined' ? URL : require('ur'+'l').URL)('file:' + __filename).href);
function log(url) {
if (typeof document === 'undefined') {
console.log(url);
} else {
document.body.innerText = url;
}
}

log((typeof document === 'undefined' ? new (require('u' + 'rl').URL)('file:' + __filename).href : (document.currentScript && document.currentScript.src || new URL('umd.js', document.baseURI).href)));

}));

0 comments on commit 5665701

Please sign in to comment.