UNPKG

babel-plugin-rewire

Version:

A babel plugin adding the ability to rewire module dependencies. This enables to mock modules for testing purposes.

14 lines (10 loc) 7.74 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = function (template) { var universalAccesorsTemplate = template("\nfunction GET_GLOBAL_VARIABLE_HANDLE_IDENTIFIER() {\n\ttry {\n\t\t\tif(!!global) {\n\t\t\t\t\treturn global;\n\t\t\t}\n\t} catch(e) {\n\t\t\ttry {\n\t\t\t\t\tif(!!window) {\n\t\t\t\t\t\t\treturn window;\n\t\t\t\t\t}\n\t\t\t} catch(e) {\n\t\t\t\t\treturn this;\n\t\t\t}\n\t}\n};\n\nvar UNIQUE_GLOBAL_MODULE_ID_IDENTIFIER = null;\nfunction GET_UNIQUE_GLOBAL_MODULE_ID_IDENTIFIER() {\n\tif(UNIQUE_GLOBAL_MODULE_ID_IDENTIFIER === null) {\n\t\tlet globalVariable = GET_GLOBAL_VARIABLE_HANDLE_IDENTIFIER();\n\t\tif(!globalVariable.__$$GLOBAL_REWIRE_NEXT_MODULE_ID__) {\n\t\t\tglobalVariable.__$$GLOBAL_REWIRE_NEXT_MODULE_ID__ = 0;\n\t\t}\n\t\tUNIQUE_GLOBAL_MODULE_ID_IDENTIFIER = __$$GLOBAL_REWIRE_NEXT_MODULE_ID__++;\n\t}\n\treturn UNIQUE_GLOBAL_MODULE_ID_IDENTIFIER;\n}\n\nfunction GET_REWIRE_REGISTRY_IDENTIFIER() {\n\tlet theGlobalVariable = GET_GLOBAL_VARIABLE_HANDLE_IDENTIFIER();\n\tif(!theGlobalVariable.__$$GLOBAL_REWIRE_REGISTRY__) {\n\t\ttheGlobalVariable.__$$GLOBAL_REWIRE_REGISTRY__ = Object.create(null);\n\t}\n\treturn theGlobalVariable.__$$GLOBAL_REWIRE_REGISTRY__; \n}\n\nfunction GET_REWIRE_DATA_IDENTIFIER() {\n\tlet moduleId = GET_UNIQUE_GLOBAL_MODULE_ID_IDENTIFIER();\n\tlet registry = GET_REWIRE_REGISTRY_IDENTIFIER();\n\tlet rewireData = registry[moduleId];\n\tif(!rewireData) {\n\t\tregistry[moduleId] = Object.create(null);\n\t\trewireData = registry[moduleId];\n\t}\n\treturn rewireData;\n}\n\n(function registerResetAll() {\n\tlet theGlobalVariable = GET_GLOBAL_VARIABLE_HANDLE_IDENTIFIER();\n\tif(!theGlobalVariable['__rewire_reset_all__']) {\n\t\ttheGlobalVariable['__rewire_reset_all__'] = function() {\n\t\t\ttheGlobalVariable.__$$GLOBAL_REWIRE_REGISTRY__ = Object.create(null);\n\t\t};\n\t}\n})();\n\nvar INTENTIONAL_UNDEFINED = '__INTENTIONAL_UNDEFINED__';\n\nlet API_OBJECT_ID = {};\n\n(function() {\n\tfunction addPropertyToAPIObject(name, value) {\n\t\tObject.defineProperty(API_OBJECT_ID, name, { value: value, enumerable: false, configurable: true });\n\t}\n\n\taddPropertyToAPIObject('__get__', UNIVERSAL_GETTER_ID);\n\taddPropertyToAPIObject('__GetDependency__', UNIVERSAL_GETTER_ID);\n\taddPropertyToAPIObject('__Rewire__', UNIVERSAL_SETTER_ID);\n\taddPropertyToAPIObject('__set__', UNIVERSAL_SETTER_ID);\n\taddPropertyToAPIObject('__reset__', UNIVERSAL_RESETTER_ID);\n\taddPropertyToAPIObject('__ResetDependency__', UNIVERSAL_RESETTER_ID);\n\taddPropertyToAPIObject('__with__', UNIVERSAL_WITH_ID);\n})();\n\nfunction UNIVERSAL_GETTER_ID(variableName) {\n\tlet rewireData = GET_REWIRE_DATA_IDENTIFIER();\n\tif (rewireData[variableName] === undefined) {\n\t\treturn ORIGINAL_VARIABLE_ACCESSOR_IDENTIFIER(variableName);\n\t} else {\n\t\tvar value = rewireData[variableName];\n\t\tif (value === INTENTIONAL_UNDEFINED) {\n\t\t\treturn undefined;\n\t\t} else {\n\t\t\treturn value;\n\t\t}\n\t}\n}\n\nORIGINAL_ACCESSOR\n\nfunction ASSIGNMENT_OPERATION_IDENTIFIER(variableName, value) {\n\tlet rewireData = GET_REWIRE_DATA_IDENTIFIER();\n\tif(rewireData[variableName] === undefined) {\n\t\treturn ORIGINAL_VARIABLE_SETTER_IDENTIFIER(variableName, value);\n\t} else {\n\t\treturn rewireData[variableName] = value;\n\t}\n}\n\nORIGINAL_SETTER;\n\nfunction UPDATE_OPERATION_IDENTIFIER(operation, variableName, prefix) {\n\tvar oldValue = UNIVERSAL_GETTER_ID(variableName);\n\tvar newValue = (operation === '++') ? oldValue + 1 : oldValue - 1;\n\tASSIGNMENT_OPERATION_IDENTIFIER(variableName, newValue);\n\treturn (prefix) ? newValue : oldValue;\n}\n\nfunction UNIVERSAL_SETTER_ID(variableName, value) {\n\tlet rewireData = GET_REWIRE_DATA_IDENTIFIER();\n\tif(typeof variableName === 'object') {\n\t\tObject.keys(variableName).forEach(function(name) {\n\t\t\trewireData[name] = variableName[name];\n\t\t});\n\n\t\treturn function() {\n\t\t\tObject.keys(variableName).forEach(function(name) {\n\t\t\t\tUNIVERSAL_RESETTER_ID(variableName);\n\t\t\t});\n\t\t}\n\t} else {\n\t\tif (value === undefined) {\n\t\t\trewireData[variableName] = INTENTIONAL_UNDEFINED\n\t\t} else {\n\t\t\trewireData[variableName] = value\n\t\t}\n\n\t\treturn function() {\n\t\t\tUNIVERSAL_RESETTER_ID(variableName);\n\t\t};\n\t}\n}\n\nfunction UNIVERSAL_RESETTER_ID(variableName) {\n\tlet rewireData = GET_REWIRE_DATA_IDENTIFIER();\n\tdelete rewireData[variableName];\n\tif(Object.keys(rewireData).length == 0) {\n\t\tdelete GET_REWIRE_REGISTRY_IDENTIFIER()[GET_UNIQUE_GLOBAL_MODULE_ID_IDENTIFIER];\n\t};\n}\n\nfunction UNIVERSAL_WITH_ID(object) {\n\tlet rewireData = GET_REWIRE_DATA_IDENTIFIER();\n\tvar rewiredVariableNames = Object.keys(object);\n\tvar previousValues = {};\n\n\tfunction reset() {\n\t\trewiredVariableNames.forEach(function(variableName) {\n\t\t\trewireData[variableName] = previousValues[variableName];\n\t\t});\n\t}\n\n\treturn function(callback) {\n\t\trewiredVariableNames.forEach(function(variableName) {\n\t\t\tpreviousValues[variableName] = rewireData[variableName];\n\t\t\trewireData[variableName] = object[variableName];\n\t\t});\n\t\tlet result = callback();\n\t\tif(!!result && typeof result.then == 'function') {\n\t\t\tresult.then(reset).catch(reset);\n\t\t} else {\n\t\t\treset();\n\t\t}\n\t\treturn result;\n\t}\n}\n\n\n", { placeholderPattern: false, placeholderWhitelist: new Set(["ORIGINAL_VARIABLE_ACCESSOR_IDENTIFIER", "ORIGINAL_VARIABLE_SETTER_IDENTIFIER", "ASSIGNMENT_OPERATION_IDENTIFIER", "UPDATE_OPERATION_IDENTIFIER", "ORIGINAL_ACCESSOR", "ORIGINAL_SETTER", "UNIVERSAL_GETTER_ID", "UNIVERSAL_SETTER_ID", "UNIVERSAL_RESETTER_ID", "UNIVERSAL_WITH_ID", "API_OBJECT_ID", "GET_GLOBAL_VARIABLE_HANDLE_IDENTIFIER", "GET_REWIRE_DATA_IDENTIFIER", "GET_UNIQUE_GLOBAL_MODULE_ID_IDENTIFIER", "GET_REWIRE_REGISTRY_IDENTIFIER", "UNIQUE_GLOBAL_MODULE_ID_IDENTIFIER"]) }); var enrichExportTemplate = template("\nlet TYPEOFORIGINALEXPORTVARIABLE = typeof EXPORT_VALUE;\nfunction addNonEnumerableProperty(name, value) {\n\tObject.defineProperty(EXPORT_VALUE, name, { value: value, enumerable: false, configurable: true });\n}\n\nif((TYPEOFORIGINALEXPORTVARIABLE === 'object' || TYPEOFORIGINALEXPORTVARIABLE === 'function') && Object.isExtensible(EXPORT_VALUE)) {\n\taddNonEnumerableProperty('__get__', UNIVERSAL_GETTER_ID);\n\taddNonEnumerableProperty('__GetDependency__', UNIVERSAL_GETTER_ID);\n\taddNonEnumerableProperty('__Rewire__', UNIVERSAL_SETTER_ID);\n\taddNonEnumerableProperty('__set__', UNIVERSAL_SETTER_ID);\n\taddNonEnumerableProperty('__reset__', UNIVERSAL_RESETTER_ID);\n\taddNonEnumerableProperty('__ResetDependency__', UNIVERSAL_RESETTER_ID);\n\taddNonEnumerableProperty('__with__', UNIVERSAL_WITH_ID);\n\taddNonEnumerableProperty('__RewireAPI__', API_OBJECT_ID);\n}\n"); var filterWildcardImportTemplate = template("\nfunction FILTER_WILDCARD_IMPORT_IDENTIFIER(wildcardImport={}) {\n\tlet validPropertyNames = Object.keys(wildcardImport).filter(function(propertyName) {\n\t\treturn propertyName !== '__get__' &&\n\t\t\t\tpropertyName !== '__set__' &&\n\t\t\t\tpropertyName !== '__reset__' &&\n\t\t\t\tpropertyName !== '__with__' &&\n\n\t\t\t\tpropertyName !== '__GetDependency__' &&\n\t\t\t\tpropertyName !== '__Rewire__' &&\n\t\t\t\tpropertyName !== '__ResetDependency__' &&\n\n\t\t\t\tpropertyName !== '__RewireAPI__';\n\t});\n\n\treturn validPropertyNames.reduce(\n\t\tfunction(filteredWildcardImport, propertyName) {\n\t\t\tfilteredWildcardImport[propertyName] = wildcardImport[propertyName];\n\t\t\treturn filteredWildcardImport;\n\t\t}, {}\n\t);\n}\n"); return { universalAccesorsTemplate: universalAccesorsTemplate, enrichExportTemplate: enrichExportTemplate, filterWildcardImportTemplate: filterWildcardImportTemplate }; };