diff --git a/dist/modulejs.js b/dist/modulejs.js index 026b2be..d0c23a9 100644 --- a/dist/modulejs.js +++ b/dist/modulejs.js @@ -259,12 +259,22 @@ return /******/ (function(modules) { // webpackBootstrap return out; }; + // Unregisters a module for `id: String` + var unregister = function unregister(id) { + // check arguments + assert(isString(id), 'id must be string: ' + id); + assert(has(definitions, id), 'id already defined: ' + id); + + delete definitions[id]; + }; + return { create: create, define: define, log: log, require: require, state: state, + unregister: unregister, _private: { assert: assert, contains: contains, diff --git a/dist/modulejs.min.js b/dist/modulejs.min.js index dbe9557..bfdf0a5 100644 --- a/dist/modulejs.min.js +++ b/dist/modulejs.min.js @@ -1,2 +1,2 @@ /*! modulejs v1.14.0 - https://larsjung.de/modulejs/ */ -!function(n,r){"object"==typeof exports&&"object"==typeof module?module.exports=r():"function"==typeof define&&define.amd?define([],r):"object"==typeof exports?exports.modulejs=r():n.modulejs=r()}(this,function(){return function(n){function r(t){if(e[t])return e[t].exports;var i=e[t]={exports:{},id:t,loaded:!1};return n[t].call(i.exports,i,i.exports,r),i.loaded=!0,i.exports}var e={};return r.m=n,r.c=e,r.p="",r(0)}([function(n,r){"use strict";var e=Object.prototype,t=function(n){return function(r){return e.toString.call(r)==="[object "+n+"]"}},i=t("Array"),o=t("Function"),u=t("String"),s=function(n,r){return void 0!==n&&null!==n&&e.hasOwnProperty.call(n,r)},f=function(n,r){if(n&&n.length)for(var e=0,t=n.length;t>e;e+=1)r(n[e],e,n);else for(var i in n)s(n,i)&&r(n[i],i,n)},c=function(n,r){if(n&&n.length)for(var e=0,t=n.length;t>e;e+=1)if(n[e]===r)return!0;return!1},a=function(n){var r=[];return f(n,function(n){c(r,n)||r.push(n)}),r},d=function(n,r){if(!n)throw new Error("[modulejs] "+r)},p=function l(){var n={},r={},e=function y(e,t,i){d(u(e),"id must be string: "+e);var o=t===!0,p=(o?void 0:t)||r;if(!o&&s(p,e))return p[e];var l=n[e];d(l,"id not defined: "+e),i=(i||[]).slice(),i.push(e);var v=[];if(f(l.deps,function(n){d(!c(i,n),"circular dependencies: "+n+" in "+i),o?(v=v.concat(y(n,t,i)),v.push(n)):v.push(y(n,t,i))}),o)return a(v);var h=l.fn.apply(void 0,v);return p[e]=h,h},t=function(r,e,t){if(void 0===t){var f=[[],e];e=f[0],t=f[1]}d(u(r),"id must be string: "+r),d(!s(n,r),"id already defined: "+r),d(i(e),"deps must be array: "+r),n[r]={id:r,deps:e,fn:o(t)?t:function(){return t}}},p=function(n,r){return e(n,r)},v=function(){var t={};return f(n,function(n,i){t[i]={deps:n.deps.slice(),reqs:e(i,!0),init:s(r,i)}}),f(n,function(r,e){var i=[];f(n,function(n,r){c(t[r].reqs,e)&&i.push(r)}),t[e].reqd=i}),t},h=function(n){var r="\n";return f(v(),function(e,t){var i=n?e.reqd:e.reqs;r+=(e.init?"* ":" ")+t+" -> [ "+i.join(", ")+" ]\n"}),r};return{create:l,define:t,log:h,require:p,state:v,_private:{assert:d,contains:c,definitions:n,each:f,has:s,instances:r,isArray:i,isFunction:o,isString:u,resolve:e,uniq:a}}};n.exports=p()}])}); \ No newline at end of file +!function(n,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.modulejs=e():n.modulejs=e()}(this,function(){return function(n){function e(t){if(r[t])return r[t].exports;var i=r[t]={exports:{},id:t,loaded:!1};return n[t].call(i.exports,i,i.exports,e),i.loaded=!0,i.exports}var r={};return e.m=n,e.c=r,e.p="",e(0)}([function(n,e){"use strict";var r=Object.prototype,t=function(n){return function(e){return r.toString.call(e)==="[object "+n+"]"}},i=t("Array"),o=t("Function"),u=t("String"),s=function(n,e){return void 0!==n&&null!==n&&r.hasOwnProperty.call(n,e)},f=function(n,e){if(n&&n.length)for(var r=0,t=n.length;t>r;r+=1)e(n[r],r,n);else for(var i in n)s(n,i)&&e(n[i],i,n)},c=function(n,e){if(n&&n.length)for(var r=0,t=n.length;t>r;r+=1)if(n[r]===e)return!0;return!1},d=function(n){var e=[];return f(n,function(n){c(e,n)||e.push(n)}),e},a=function(n,e){if(!n)throw new Error("[modulejs] "+e)},p=function l(){var n={},e={},r=function y(r,t,i){a(u(r),"id must be string: "+r);var o=t===!0,p=(o?void 0:t)||e;if(!o&&s(p,r))return p[r];var l=n[r];a(l,"id not defined: "+r),i=(i||[]).slice(),i.push(r);var v=[];if(f(l.deps,function(n){a(!c(i,n),"circular dependencies: "+n+" in "+i),o?(v=v.concat(y(n,t,i)),v.push(n)):v.push(y(n,t,i))}),o)return d(v);var h=l.fn.apply(void 0,v);return p[r]=h,h},t=function(e,r,t){if(void 0===t){var f=[[],r];r=f[0],t=f[1]}a(u(e),"id must be string: "+e),a(!s(n,e),"id already defined: "+e),a(i(r),"deps must be array: "+e),n[e]={id:e,deps:r,fn:o(t)?t:function(){return t}}},p=function(n,e){return r(n,e)},v=function(){var t={};return f(n,function(n,i){t[i]={deps:n.deps.slice(),reqs:r(i,!0),init:s(e,i)}}),f(n,function(e,r){var i=[];f(n,function(n,e){c(t[e].reqs,r)&&i.push(e)}),t[r].reqd=i}),t},h=function(n){var e="\n";return f(v(),function(r,t){var i=n?r.reqd:r.reqs;e+=(r.init?"* ":" ")+t+" -> [ "+i.join(", ")+" ]\n"}),e},g=function(e){a(u(e),"id must be string: "+e),a(s(n,e),"id already defined: "+e),delete n[e]};return{create:l,define:t,log:h,require:p,state:v,unregister:g,_private:{assert:a,contains:c,definitions:n,each:f,has:s,instances:e,isArray:i,isFunction:o,isString:u,resolve:r,uniq:d}}};n.exports=p()}])}); \ No newline at end of file diff --git a/lib/modulejs.js b/lib/modulejs.js index 7179a3d..21cd4cc 100644 --- a/lib/modulejs.js +++ b/lib/modulejs.js @@ -192,12 +192,22 @@ const create = () => { return out; }; + // Unregisters a module for `id: String` + const unregister = id => { + // check arguments + assert(isString(id), 'id must be string: ' + id); + assert(has(definitions, id), 'id already defined: ' + id); + + delete definitions[id]; + }; + return { create, define, log, require, state, + unregister, _private: { assert, contains, diff --git a/test/sub/modulejs.js b/test/sub/modulejs.js index 1a2795f..cbcd014 100644 --- a/test/sub/modulejs.js +++ b/test/sub/modulejs.js @@ -7,6 +7,7 @@ const PROPS = [ 'log', 'require', 'state', + 'unregister', '_private' ]; diff --git a/test/sub/unregister.js b/test/sub/unregister.js new file mode 100644 index 0000000..5931e2e --- /dev/null +++ b/test/sub/unregister.js @@ -0,0 +1,44 @@ +const {test, assert, insp} = require('scar'); +const modulejs = require('../loader').modulejs; + +test('modulejs.unregister is function', () => { + assert.equal(typeof modulejs.unregister, 'function'); +}); + +test('modulejs.unregister() throws', () => { + const modjs = modulejs.create(); + assert.throws(() => modjs.unregister(), /id must be string/); +}); + +test('modulejs.unregister() throws if non-string id', () => { + const modjs = modulejs.create(); + assert.throws(() => modjs.unregister(true), /id must be string/); +}); + +test('modulejs.unregister() throws if undefined module', () => { + const modjs = modulejs.create(); + assert.throws(() => modjs.unregister('a'), /id already defined/); +}); + +[ + undefined, + null, + true, + false, + 0, + 1, + [], + {}, + '' +].forEach(x => { + test(`modulejs.unregister(id) -> .define(id, arr, function () { return ${insp(x)}; })`, () => { + const modjs = modulejs.create(); + const defs = modjs._private.definitions; + const id = 'a'; + assert.equal(modjs.define(id, x), undefined); + + modjs.unregister(id); + assert.equal(typeof defs[id], 'undefined'); + assert.throws(() => modjs.require(id), /id not defined/); + }); +}); diff --git a/test/tests.js b/test/tests.js index 28b4e7f..e7a466a 100644 --- a/test/tests.js +++ b/test/tests.js @@ -17,4 +17,5 @@ require('./sub/require'); require('./sub/resolve'); require('./sub/state'); require('./sub/uniq'); +require('./sub/unregister'); test.cli();