Skip to content

Instantly share code, notes, and snippets.

@geekflyer
Last active March 6, 2017 16:37
Show Gist options
  • Save geekflyer/ab0b98a0fd788496a69e9e35cb6d851a to your computer and use it in GitHub Desktop.
Save geekflyer/ab0b98a0fd788496a69e9e35cb6d851a to your computer and use it in GitHub Desktop.
UI5 AMD Shim
sap.ui.define([], function () {
function jsInteropDefaultRequire(importedModule) {
if (importedModule && importedModule.__esModule) {
const exportedProps = Object.keys(importedModule);
if (exportedProps.length === 1 && exportedProps[0] === 'default') {
return importedModule.default;
}
}
return importedModule;
}
const originalSapDefine = sap.ui.define;
sap.ui.define = function newDefine(depArr, moduleFactory, ...args) {
const exportsIndices: Array<number> = [];
if (Array.isArray(depArr)) {
depArr = depArr.map((dep, i) => {
switch (dep) {
case 'require':
return 'sap/ui/base/Object';
case 'exports':
exportsIndices.push(i);
return 'sap/ui/base/Object';
default:
return dep;
}
});
if (exportsIndices.length > 0) {
// seems like typescript generated module (and non-ui5 classic module).
moduleFactory = wrapModuleFactoryForTSModule(moduleFactory, exportsIndices);
} else {
moduleFactory = wrapModuleFactoryForJSModule(moduleFactory);
}
}
return originalSapDefine.call(sap.ui, depArr, moduleFactory, ...args);
} as any;
function wrapModuleFactoryForTSModule(moduleFactory, exportIndices) {
return function tsModuleWrapper(...imports) {
const exports = {};
exportIndices.forEach(exportIndex => imports[exportIndex] = exports);
return moduleFactory(...imports) || exports;
}
}
function wrapModuleFactoryForJSModule(moduleFactory) {
return function jsModuleWrapper(...imports) {
return moduleFactory(...imports.map(jsInteropDefaultRequire));
};
}
window['define'] = sap.ui.define;
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment