Make require() compliant with CommonJS 1.0

This includes potentially breaking changes.
  Specifically, before this patch tiddlywiki would default to relative module identifiers
  Now, tiddlywiki will only search relative paths if explicitly specified
  Additionally, some "defaulted export contexts" were removed
    (some modules may make assumptions about context)
Some unit tests were modified slightly from their originals
  Tiddlywiki doesn't have a notion of a "main" program's path
  Some require calls were explicitly made relative
  None of these changes should affect the requirement under test in each case
This commit is contained in:
natecain
2013-09-17 20:20:37 -04:00
parent 7f3000aaae
commit 881325b7ed
32 changed files with 493 additions and 16 deletions

View File

@@ -0,0 +1,7 @@
title: GettingStarted
This wiki instance contains the CommonJS Modules/1.0 unit tests.
To run them, open a console repl and execute "$tw.modules.execute('allTests')" there. You should see no exceptions or output starting with "FAIL" in the console.

View File

@@ -0,0 +1,11 @@
/*\
title: absolute/b.js
type: application/javascript
module-type: library
Absolute require test
\*/
exports.foo = function() {};

View File

@@ -0,0 +1,16 @@
/*\
title: absolute/program.js
type: application/javascript
module-type: library
Absolute require test
\*/
var test = require('test');
var a = require('./submodule/a');
var b = require('./b');
test.assert(a.foo().foo === b.foo, 'require works with absolute identifiers');
test.print('DONE', 'info');

View File

@@ -0,0 +1,14 @@
/*\
title: absolute/submodule/a.js
type: application/javascript
module-type: library
Absolute require test
\*/
exports.foo = function () {
return require('../b');
};

View File

@@ -0,0 +1,23 @@
/*\
title: allTests.js
type: application/javascript
module-type: library
Runs all CommonJS Modules tests
\*/
$tw.modules.execute('absolute/program.js');
$tw.modules.execute('cyclic/program.js');
$tw.modules.execute('determinism/program.js');
$tw.modules.execute('exactExports/program.js');
$tw.modules.execute('hasOwnProperty/program.js');
$tw.modules.execute('method/program.js');
$tw.modules.execute('missing/program.js');
$tw.modules.execute('monkeys/program.js');
$tw.modules.execute('nested/program.js');
$tw.modules.execute('relative/program.js');
$tw.modules.execute('transitive/program.js');

View File

@@ -0,0 +1,15 @@
/*\
title: cyclic/a.js
type: application/javascript
module-type: library
Cycle require test A
\*/
exports.a = function () {
return b;
};
var b = require('./b');

View File

@@ -0,0 +1,16 @@
/*\
title: cyclic/b.js
type: application/javascript
module-type: library
Cycle require test B
\*/
var a = require('./a');
exports.b = function () {
return a;
};

View File

@@ -0,0 +1,22 @@
/*\
title: cyclic/program.js
type: application/javascript
module-type: library
Cycle require test
\*/
var test = require('test');
var a = require('./a');
var b = require('./b');
test.assert(a.a, 'a exists');
test.assert(b.b, 'b exists')
test.assert(a.a().b === b.b, 'a gets b');
test.assert(b.b().a === a.a, 'b gets a');
test.print('DONE', 'info');

View File

@@ -0,0 +1,14 @@
/*\
title: determinism/program.js
type: application/javascript
module-type: library
Determinism test
\*/
var test = require('test');
require('submodule/a');
test.print('DONE', 'info');

View File

@@ -0,0 +1,20 @@
/*\
title: determinism/submodule/a.js
type: application/javascript
module-type: library
Determinism require test A
\*/
var test = require('test');
var pass = false;
var test = require('test');
try {
require('a');
} catch (exception) {
pass = true;
}
test.assert(pass, 'require does not fall back to relative modules when absolutes are not available.')

View File

@@ -0,0 +1,15 @@
/*\
title: exactExports/a.js
type: application/javascript
module-type: library
ExactExports test A
\*/
exports.program = function () {
return require('./program');
};

View File

@@ -0,0 +1,16 @@
/*\
title: exactExports/program.js
type: application/javascript
module-type: library
ExactExports test
\*/
var test = require('test');
var a = require('./a');
test.assert(a.program() === exports, 'exact exports');
test.print('DONE', 'info');

View File

@@ -0,0 +1,6 @@
/*\
title: hasOwnProperty.js
type: application/javascript
module-type: library
\*/

View File

@@ -0,0 +1,15 @@
/*\
title: hasOwnProperty/program.js
type: application/javascript
module-type: library
OwnProperty test
\*/
var hasOwnProperty = require('hasOwnProperty');
var toString = require('toString');
var test = require('test');
test.print('DONE', 'info');

View File

@@ -0,0 +1,6 @@
/*\
title: toString.js
type: application/javascript
module-type: library
\*/

View File

@@ -0,0 +1,23 @@
/*\
title: method/a.js
type: application/javascript
module-type: library
Method test
\*/
exports.foo = function () {
return this;
};
exports.set = function (x) {
this.x = x;
};
exports.get = function () {
return this.x;
};
exports.getClosed = function () {
return exports.x;
};

View File

@@ -0,0 +1,19 @@
/*\
title: method/program.js
type: application/javascript
module-type: library
Method test
\*/
var test = require('test');
var a = require('./a');
var foo = a.foo;
test.assert(a.foo() == a, 'calling a module member');
test.assert(foo() == (function (){return this})(), 'members not implicitly bound');
a.set(10);
test.assert(a.get() == 10, 'get and set')
test.print('DONE', 'info');

View File

@@ -0,0 +1,19 @@
/*\
title: missing/program.js
type: application/javascript
module-type: library
Missing test
\*/
var test = require('test');
try {
require('bogus');
test.print('FAIL require throws error when module missing', 'fail');
} catch (exception) {
test.print('PASS require throws error when module missing', 'pass');
}
test.print('DONE', 'info');

View File

@@ -0,0 +1,12 @@
/*\
title: monkeys/a.js
type: application/javascript
module-type: library
Missing test A
\*/
require('./program').monkey = 10;

View File

@@ -0,0 +1,15 @@
/*\
title: monkeys/program.js
type: application/javascript
module-type: library
Monkeys test
\*/
var a = require('./a');
var test = require('test');
test.assert(exports.monkey == 10, 'monkeys permitted');
test.print('DONE', 'info');

View File

@@ -0,0 +1,14 @@
/*\
title: a/b/c/d.js
type: application/javascript
module-type: library
Nested test
\*/
exports.foo = function () {
return 1;
};

View File

@@ -0,0 +1,14 @@
/*\
title: nested/program.js
type: application/javascript
module-type: library
Nested test
\*/
var test = require('test');
test.assert(require('a/b/c/d').foo() == 1, 'nested module identifier');
test.print('DONE', 'info');

View File

@@ -0,0 +1,16 @@
/*\
title: relative/program.js
type: application/javascript
module-type: library
Relative test
\*/
var test = require('test');
var a = require('submodule/a');
var b = require('submodule/b');
test.assert(a.foo == b.foo, 'a and b share foo through a relative require');
test.print('DONE', 'info');

View File

@@ -0,0 +1,13 @@
/*\
title: submodule/a.js
type: application/javascript
module-type: library
Relative test A
\*/
exports.foo = require('./b').foo;

View File

@@ -0,0 +1,12 @@
/*\
title: submodule/b.js
type: application/javascript
module-type: library
Relative test B
\*/
exports.foo = function () {
};

View File

@@ -0,0 +1,23 @@
/*\
title: test.js
type: application/javascript
module-type: library
testing lib
\*/
exports.assert = function(cond, msg) {
if(!cond) {
if(msg) {
throw msg
} else {
throw "ASSERT FAILED"
}
}
}
exports.print = function() {
console.log.apply(console, arguments);
}

View File

@@ -0,0 +1,11 @@
/*\
title: transitive/a.js
type: application/javascript
module-type: library
Transitive test A
\*/
exports.foo = require('./b').foo;

View File

@@ -0,0 +1,12 @@
/*\
title: transitive/b.js
type: application/javascript
module-type: library
Transitive test B
\*/
exports.foo = require('./c').foo;

View File

@@ -0,0 +1,14 @@
/*\
title: transitive/c.js
type: application/javascript
module-type: library
Transitive test C
\*/
exports.foo = function () {
return 1;
};

View File

@@ -0,0 +1,13 @@
/*\
title: transitive/program.js
type: application/javascript
module-type: library
Transitive test
\*/
var test = require('test');
test.assert(require('./a').foo() == 1, 'transitive');
test.print('DONE', 'info');

View File

@@ -0,0 +1,8 @@
{
"plugins": [
"tiddlywiki/fullscreen"
],
"themes": [
"tiddlywiki/snowwhite"
]
}