nibjs 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (87) hide show
  1. data/CHANGELOG.md +11 -0
  2. data/Gemfile.lock +1 -1
  3. data/Manifest.txt +2 -1
  4. data/README.md +10 -0
  5. data/Rakefile +1 -1
  6. data/dist/nibjs-1.0.0.js +74 -0
  7. data/dist/nibjs-1.0.0.min.js +7 -0
  8. data/dist/nibjs-1.1.0.js +74 -0
  9. data/dist/nibjs-1.1.0.min.js +7 -0
  10. data/examples/1-basic/basic.js +27 -0
  11. data/examples/1-basic/build +7 -0
  12. data/examples/1-basic/illustrate.png +0 -0
  13. data/examples/1-basic/index.html +56 -0
  14. data/examples/1-basic/lib/App.js +9 -0
  15. data/examples/1-basic/lib/StringUtils.js +7 -0
  16. data/examples/1-basic/lib/index.js +2 -0
  17. data/examples/2-coffee/build +7 -0
  18. data/examples/2-coffee/coffee.js +24 -0
  19. data/examples/2-coffee/illustrate.png +0 -0
  20. data/examples/2-coffee/index.html +57 -0
  21. data/examples/2-coffee/lib/App.coffee +9 -0
  22. data/examples/2-coffee/lib/StringUtils.coffee +6 -0
  23. data/examples/2-coffee/lib/index.coffee +2 -0
  24. data/examples/3-embedded-coffee/build +7 -0
  25. data/examples/3-embedded-coffee/embedded-coffee.coffee +25 -0
  26. data/examples/3-embedded-coffee/illustrate.png +0 -0
  27. data/examples/3-embedded-coffee/index.html +68 -0
  28. data/examples/3-embedded-coffee/lib/App.coffee +9 -0
  29. data/examples/3-embedded-coffee/lib/StringUtils.coffee +6 -0
  30. data/examples/3-embedded-coffee/lib/index.coffee +2 -0
  31. data/examples/4-coffee-join/build +7 -0
  32. data/examples/4-coffee-join/coffee-join.js +19 -0
  33. data/examples/4-coffee-join/illustrate.png +0 -0
  34. data/examples/4-coffee-join/index.html +55 -0
  35. data/examples/4-coffee-join/lib/App.coffee +7 -0
  36. data/examples/4-coffee-join/lib/StringUtils.coffee +6 -0
  37. data/examples/4-coffee-join/lib/index.coffee +2 -0
  38. data/examples/5-standalone/build +7 -0
  39. data/examples/5-standalone/illustrate.png +0 -0
  40. data/examples/5-standalone/index.html +52 -0
  41. data/examples/5-standalone/lib/App.coffee +7 -0
  42. data/examples/5-standalone/lib/StringUtils.coffee +6 -0
  43. data/examples/5-standalone/lib/index.coffee +2 -0
  44. data/examples/5-standalone/standalone.js +94 -0
  45. data/examples/README.md +43 -0
  46. data/examples/commons.rb +11 -0
  47. data/{test/integration/integration_test.rb → examples/handler.rb} +5 -12
  48. data/examples/illustrate.png +0 -0
  49. data/examples/illustrations.graffle +4382 -0
  50. data/examples/index.html +32 -0
  51. data/examples/public/TestSuite.coffee +43 -0
  52. data/examples/public/TestSuite.js +53 -0
  53. data/examples/public/coffee-script.js +8 -0
  54. data/examples/public/forkme.png +0 -0
  55. data/examples/public/leftnav.png +0 -0
  56. data/examples/public/leftnav_bw.png +0 -0
  57. data/examples/public/nibjs.js +74 -0
  58. data/examples/public/rightnav.png +0 -0
  59. data/examples/public/rightnav_bw.png +0 -0
  60. data/examples/public/style.css +82 -0
  61. data/examples/public/test-false.png +0 -0
  62. data/examples/public/test-pending.gif +0 -0
  63. data/examples/public/test-true.png +0 -0
  64. data/lib/nibjs/main.rb +104 -79
  65. data/lib/nibjs/version.rb +1 -1
  66. data/nibjs.noespec +1 -1
  67. data/src/nibjs.coffee +104 -107
  68. data/tasks/analytics.txt +10 -0
  69. data/tasks/examples.rake +25 -0
  70. data/tasks/gh-pages.rake +15 -0
  71. data/tasks/test.rake +2 -3
  72. data/test/command/footer.js +1 -0
  73. data/test/command/sc_coffee_6.exp +106 -0
  74. data/test/command/sc_coffee_7.exp +151 -0
  75. data/test/command/sc_common_6.exp +1 -0
  76. data/test/command/sc_common_7.exp +33 -0
  77. data/test/command/sc_common_8.exp +107 -0
  78. data/test/command/sc_common_9.exp +7 -0
  79. data/test/command/scenarios.rb +24 -0
  80. data/test/jasmine/assumption_spec.coffee +23 -0
  81. data/test/jasmine/nibjs_spec.coffee +14 -15
  82. data/test/nibjs.js +33 -33
  83. metadata +81 -14
  84. data/test/integration/index.html +0 -42
  85. data/test/integration/integration_test.coffee +0 -29
  86. data/test/integration/integration_test.js +0 -34
  87. data/test/integration/jquery-1.4.4.min.js +0 -167
@@ -1,3 +1,14 @@
1
+ # 1.1.0 / 2011-02-23
2
+
3
+ * Enhancements
4
+
5
+ * Added examples acting as both documentation, gh-pages and integration tests
6
+ * Added --footer and --standalone options
7
+ * Added alias for --autorequire as -a
8
+ * Added alias for --uglify as -u
9
+ * Added alias for --join as -j
10
+ * Major boolean options (uglify, join, autorequire) have a [no-] counterpart
11
+
1
12
  # 1.0.0 / 2011-02-22
2
13
 
3
14
  * Enhancements
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- nibjs (1.0.0)
4
+ nibjs (1.1.0)
5
5
  bundler (~> 1.0)
6
6
  quickl (~> 0.2.0)
7
7
 
@@ -1,6 +1,7 @@
1
1
  bin/**/*
2
2
  CHANGELOG.md
3
- dist
3
+ dist/**/*
4
+ examples/**/*
4
5
  Gemfile
5
6
  Gemfile.lock
6
7
  lib/**/*
data/README.md CHANGED
@@ -62,3 +62,13 @@ Let assume that your project has the structure below.
62
62
  https://github.com/jashkenas/coffee-script/issues/#issue/1054 */
63
63
  var mylib = NibJS.require('mylib')
64
64
  </script>
65
+
66
+ ### See also
67
+
68
+ This project is related to CommonJS Module specification. In a sense, it is an offline
69
+ "compiler" implementation of the version 1.0 of that specification (not even complete).
70
+ I'll strongly consider any patch that would lead to respecting such specification more
71
+ correctly!
72
+
73
+ * http://wiki.commonjs.org/wiki/Modules/1.0
74
+ * http://wiki.commonjs.org/wiki/Modules/CompiledModules
data/Rakefile CHANGED
@@ -26,7 +26,7 @@ def dist(target)
26
26
  code += File.read("LICENCE.js")
27
27
  code += "(function(exports){\n"
28
28
  code += File.read(target).gsub(/^/m, " ")
29
- code += "}).call(this, this)"
29
+ code += "}).call(this, this);"
30
30
  File.open(target, "w"){|io| io << code}
31
31
  end
32
32
 
@@ -0,0 +1,74 @@
1
+ /**
2
+ * nib.js - [Java/Coffee]script application packager from node.js conventions
3
+ *
4
+ * Copyright 2011, Bernard Lambeau
5
+ * Released under the MIT License
6
+ * http://github.com/blambeau/nib.js
7
+ */
8
+ (function(exports){
9
+ var Builder;
10
+ var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
11
+ exports.NibJS = {
12
+ pkgBuilders: [],
13
+ packages: [],
14
+ define: function(name, buildFn) {
15
+ return NibJS.pkgBuilders[name] = buildFn;
16
+ },
17
+ require: function(name) {
18
+ var _base, _ref;
19
+ return (_ref = (_base = NibJS.packages)[name]) != null ? _ref : _base[name] = NibJS._build_one(name);
20
+ },
21
+ _build_one: function(name) {
22
+ var builder;
23
+ builder = new Builder;
24
+ return NibJS.pkgBuilders[name](builder);
25
+ },
26
+ pending: [],
27
+ running: [],
28
+ ready: function(fn) {
29
+ return NibJS.pending.push(fn);
30
+ },
31
+ start: function() {
32
+ var fn, _i, _len, _ref;
33
+ _ref = NibJS.pending;
34
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
35
+ fn = _ref[_i];
36
+ NibJS.running.push(fn());
37
+ }
38
+ return NibJS.pending = [];
39
+ },
40
+ isRunning: function(fn) {
41
+ var c, _i, _len, _ref;
42
+ _ref = NibJS.running;
43
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
44
+ c = _ref[_i];
45
+ if (c === fn) {
46
+ return true;
47
+ }
48
+ }
49
+ return false;
50
+ }
51
+ };
52
+ Builder = (function() {
53
+ function Builder() {
54
+ this.build_file = __bind(this.build_file, this);;
55
+ this.require = __bind(this.require, this);;
56
+ this.register = __bind(this.register, this);; this.builders = [];
57
+ this.built = [];
58
+ }
59
+ Builder.prototype.register = function(file, builder) {
60
+ return this.builders[file] = builder;
61
+ };
62
+ Builder.prototype.require = function(file) {
63
+ var _base, _ref;
64
+ return (_ref = (_base = this.built)[file]) != null ? _ref : _base[file] = this.build_file(file);
65
+ };
66
+ Builder.prototype.build_file = function(file) {
67
+ var exports;
68
+ exports = {};
69
+ this.builders[file](exports, this.require);
70
+ return exports;
71
+ };
72
+ return Builder;
73
+ })();
74
+ }).call(this, this)
@@ -0,0 +1,7 @@
1
+ /**
2
+ * nib.js - [Java/Coffee]script application packager from node.js conventions
3
+ *
4
+ * Copyright 2011, Bernard Lambeau
5
+ * Released under the MIT License
6
+ * http://github.com/blambeau/nib.js
7
+ */(function(a){var b,c=function(a,b){return function(){return a.apply(b,arguments)}};a.NibJS={pkgBuilders:[],packages:[],define:function(a,b){return NibJS.pkgBuilders[a]=b},require:function(a){var b,c;return(c=(b=NibJS.packages)[a])!=null?c:b[a]=NibJS._build_one(a)},_build_one:function(a){var c;c=new b;return NibJS.pkgBuilders[a](c)},pending:[],running:[],ready:function(a){return NibJS.pending.push(a)},start:function(){var a,b,c,d;d=NibJS.pending;for(b=0,c=d.length;b<c;b++)a=d[b],NibJS.running.push(a());return NibJS.pending=[]},isRunning:function(a){var b,c,d,e;e=NibJS.running;for(c=0,d=e.length;c<d;c++){b=e[c];if(b===a)return!0}return!1}},b=function(){function a(){this.build_file=c(this.build_file,this),this.require=c(this.require,this),this.register=c(this.register,this),this.builders=[],this.built=[]}a.prototype.register=function(a,b){return this.builders[a]=b},a.prototype.require=function(a){var b,c;return(c=(b=this.built)[a])!=null?c:b[a]=this.build_file(a)},a.prototype.build_file=function(a){var b;b={},this.builders[a](b,this.require);return b};return a}()}).call(this,this)
@@ -0,0 +1,74 @@
1
+ /**
2
+ * nib.js - [Java/Coffee]script application packager from node.js conventions
3
+ *
4
+ * Copyright 2011, Bernard Lambeau
5
+ * Released under the MIT License
6
+ * http://github.com/blambeau/nib.js
7
+ */
8
+ (function(exports){
9
+ var Builder, Exception;
10
+ var __hasProp = Object.prototype.hasOwnProperty, __extends = function(child, parent) {
11
+ for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; }
12
+ function ctor() { this.constructor = child; }
13
+ ctor.prototype = parent.prototype;
14
+ child.prototype = new ctor;
15
+ child.__super__ = parent.prototype;
16
+ return child;
17
+ }, __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
18
+ exports.NibJS = {
19
+ pkgBuilders: [],
20
+ packages: [],
21
+ hasPackage: function(name) {
22
+ return (NibJS.pkgBuilders[name] != null) || (NibJS.packages[name] != null);
23
+ },
24
+ define: function(name, buildFn) {
25
+ return NibJS.pkgBuilders[name] = buildFn;
26
+ },
27
+ require: function(name) {
28
+ var _base, _ref;
29
+ return (_ref = (_base = NibJS.packages)[name]) != null ? _ref : _base[name] = NibJS._build_one(name);
30
+ },
31
+ _build_one: function(name) {
32
+ var builder;
33
+ if (NibJS.pkgBuilders[name]) {
34
+ builder = new Builder;
35
+ return NibJS.pkgBuilders[name](builder);
36
+ } else {
37
+ throw new Exception("NibJS error: no module '" + name + "' has been previously registered.");
38
+ }
39
+ }
40
+ };
41
+ Exception = (function() {
42
+ __extends(Exception, Error);
43
+ function Exception(message) {
44
+ this.message = message;
45
+ }
46
+ return Exception;
47
+ })();
48
+ Builder = (function() {
49
+ function Builder() {
50
+ this.build_file = __bind(this.build_file, this);;
51
+ this.require = __bind(this.require, this);;
52
+ this.register = __bind(this.register, this);; this.builders = [];
53
+ this.built = [];
54
+ }
55
+ Builder.prototype.register = function(file, builder) {
56
+ return this.builders[file] = builder;
57
+ };
58
+ Builder.prototype.require = function(file) {
59
+ var _base, _ref;
60
+ return (_ref = (_base = this.built)[file]) != null ? _ref : _base[file] = this.build_file(file);
61
+ };
62
+ Builder.prototype.build_file = function(file) {
63
+ var file_exp;
64
+ if (this.builders[file] != null) {
65
+ file_exp = {};
66
+ this.builders[file](file_exp, this.require);
67
+ return file_exp;
68
+ } else {
69
+ throw new Exception("NibJS error: no such file " + file);
70
+ }
71
+ };
72
+ return Builder;
73
+ })();
74
+ }).call(this, this);
@@ -0,0 +1,7 @@
1
+ /**
2
+ * nib.js - [Java/Coffee]script application packager from node.js conventions
3
+ *
4
+ * Copyright 2011, Bernard Lambeau
5
+ * Released under the MIT License
6
+ * http://github.com/blambeau/nib.js
7
+ */(function(a){var b,c,d=Object.prototype.hasOwnProperty,e=function(a,b){function e(){this.constructor=a}for(var c in b)d.call(b,c)&&(a[c]=b[c]);e.prototype=b.prototype,a.prototype=new e,a.__super__=b.prototype;return a},f=function(a,b){return function(){return a.apply(b,arguments)}};a.NibJS={pkgBuilders:[],packages:[],hasPackage:function(a){return NibJS.pkgBuilders[a]!=null||NibJS.packages[a]!=null},define:function(a,b){return NibJS.pkgBuilders[a]=b},require:function(a){var b,c;return(c=(b=NibJS.packages)[a])!=null?c:b[a]=NibJS._build_one(a)},_build_one:function(a){var d;if(NibJS.pkgBuilders[a]){d=new b;return NibJS.pkgBuilders[a](d)}throw new c("NibJS error: no module '"+a+"' has been previously registered.")}},c=function(){function a(a){this.message=a}e(a,Error);return a}(),b=function(){function a(){this.build_file=f(this.build_file,this),this.require=f(this.require,this),this.register=f(this.register,this),this.builders=[],this.built=[]}a.prototype.register=function(a,b){return this.builders[a]=b},a.prototype.require=function(a){var b,c;return(c=(b=this.built)[a])!=null?c:b[a]=this.build_file(a)},a.prototype.build_file=function(a){var b;if(this.builders[a]!=null){b={},this.builders[a](b,this.require);return b}throw new c("NibJS error: no such file "+a)};return a}()}).call(this,this)
@@ -0,0 +1,27 @@
1
+ NibJS.define('basic', function(nibjs) {
2
+ nibjs.register('./App', function(exports, require) {
3
+ var StringUtils = require('./StringUtils').StringUtils;
4
+ exports.App = {
5
+
6
+ runTests: function(){
7
+ $("body").append(StringUtils.pre("nibjs --output jsapp.js lib"));
8
+ return true;
9
+ }
10
+
11
+ };
12
+ });
13
+ nibjs.register('./index', function(exports, require) {
14
+ exports.StringUtils = require('./StringUtils').StringUtils;
15
+ exports.App = require('./App').App;
16
+ });
17
+ nibjs.register('./StringUtils', function(exports, require) {
18
+ exports.StringUtils = {
19
+
20
+ pre: function(what) {
21
+ return "<pre>" + what + "</pre>";
22
+ }
23
+
24
+ };
25
+ });
26
+ return nibjs.require('./index');
27
+ });
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+ require File.expand_path('../../commons', __FILE__)
3
+ here = File.dirname(__FILE__)
4
+ lib = File.join(here, 'lib')
5
+ options = %q{--libname=basic}
6
+ output = File.join(here, 'basic.js')
7
+ nibjs(options, __output(output), lib)
@@ -0,0 +1,56 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta http-equiv="content-type" content="text/html;charset=UTF-8" />
5
+ <title>NibJS - Basic Example</title>
6
+
7
+ <!-- This is your application -->
8
+ <script src="http://code.jquery.com/jquery-1.5.min.js" type="text/javascript"></script>
9
+ <script src="../public/nibjs.js" type="text/javascript"></script>
10
+ <script src="basic.js" type="text/javascript"></script>
11
+ <script>
12
+ $(document).ready(function(){
13
+ //
14
+ // this is how you require your application. App will now contain whatever
15
+ // your index.js has exported.
16
+ //
17
+ App = NibJS.require('basic').App;
18
+
19
+ //
20
+ // Let me profit from your browser and run the integration tests :-)
21
+ //
22
+ TestSuite.runOne(App);
23
+ });
24
+ </script>
25
+
26
+ <!-- This is some to be able to run integration tests -->
27
+ <link rel="stylesheet" type="text/css" href="../public/style.css">
28
+ <script src="../public/TestSuite.js" type="text/javascript"></script>
29
+
30
+ </head>
31
+ <body>
32
+ <a id="forkme" href="http://github.com/blambeau/nib.js"></a>
33
+ <div id="content">
34
+ <div id="feedback"><img src="../public/test-pending.gif"/></div>
35
+ <h2>Package your javascript in one single command</h2>
36
+ <p class="comment">
37
+ NibJS comes with a simple <code>nibjs</code> commandline tool that packages your app
38
+ offline. NibJS makes <b>no assumption about the server side technology</b>. It performs a
39
+ smart concatenation of .js files, while binding and respecting <code>exports</code> and
40
+ <code>require</code> conventions!
41
+ </p>
42
+ <div style="text-align:center">
43
+ <img src="illustrate.png" width="80%">
44
+ </div>
45
+ <p class="comment">
46
+ The basic use case is really simple, you want to concatenate <code>lib/**/*.js</code>
47
+ files, while respecting CommonJS conventions about <code>exports</code> and <code>require</code>.
48
+ </p>
49
+ </div>
50
+ <div id="navigation">
51
+ <a href="../index.html" class="button" id="leftnav"></a>
52
+ <a href="../2-coffee/index.html" class="button" id="rightnav"></a>
53
+ <div style="clear:both"></div>
54
+ </div>
55
+ </body>
56
+ </html>
@@ -0,0 +1,9 @@
1
+ var StringUtils = require('./StringUtils').StringUtils;
2
+ exports.App = {
3
+
4
+ runTests: function(){
5
+ $("body").append(StringUtils.pre("nibjs --output jsapp.js lib"));
6
+ return true;
7
+ }
8
+
9
+ };
@@ -0,0 +1,7 @@
1
+ exports.StringUtils = {
2
+
3
+ pre: function(what) {
4
+ return "<pre>" + what + "</pre>";
5
+ }
6
+
7
+ };
@@ -0,0 +1,2 @@
1
+ exports.StringUtils = require('./StringUtils').StringUtils;
2
+ exports.App = require('./App').App;
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+ require File.expand_path('../../commons', __FILE__)
3
+ here = File.dirname(__FILE__)
4
+ lib = File.join(here, 'lib')
5
+ options = %q{--coffee --libname=coffee}
6
+ output = File.join(here, 'coffee.js')
7
+ nibjs(options, __output(output), lib)
@@ -0,0 +1,24 @@
1
+ NibJS.define('coffee', function(nibjs) {
2
+ nibjs.register('./App', function(exports, require) {
3
+ var StringUtils;
4
+ StringUtils = require('./StringUtils').StringUtils;
5
+ return exports.App = {
6
+ runTests: function() {
7
+ $("body").append(StringUtils.pre("Have a look at 'nibjs --coffee'"));
8
+ return true;
9
+ }
10
+ };
11
+ });
12
+ nibjs.register('./index', function(exports, require) {
13
+ exports.StringUtils = require('./StringUtils').StringUtils;
14
+ return exports.App = require('./App').App;
15
+ });
16
+ nibjs.register('./StringUtils', function(exports, require) {
17
+ return exports.StringUtils = {
18
+ pre: function(what) {
19
+ return "<pre>" + what + "</pre>";
20
+ }
21
+ };
22
+ });
23
+ return nibjs.require('./index');
24
+ });
@@ -0,0 +1,57 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta http-equiv="content-type" content="text/html;charset=UTF-8" />
5
+ <title>NibJS - Coffee Example</title>
6
+
7
+ <!-- This is your application -->
8
+ <script src="http://code.jquery.com/jquery-1.5.min.js" type="text/javascript"></script>
9
+ <script src="../public/nibjs.js" type="text/javascript"></script>
10
+ <script src="coffee.js" type="text/javascript"></script>
11
+ <script>
12
+ $(document).ready(function(){
13
+ //
14
+ // this is how you require your application. App will now contain whatever
15
+ // your index.js has exported.
16
+ //
17
+ App = NibJS.require('coffee').App;
18
+
19
+ //
20
+ // Let me profit from your browser and run the integration tests :-)
21
+ //
22
+ TestSuite.runOne(App);
23
+ });
24
+ </script>
25
+
26
+ <!-- This is some to be able to run integration tests -->
27
+ <link rel="stylesheet" type="text/css" href="../public/style.css">
28
+ <script src="../public/TestSuite.js" type="text/javascript"></script>
29
+
30
+ </head>
31
+ <body>
32
+ <a id="forkme" href="http://github.com/blambeau/nib.js"></a>
33
+ <div id="content">
34
+ <div id="feedback"><img src="../public/test-pending.gif"/></div>
35
+ <h2>Why not writing source code in CoffeeScript instead?</h2>
36
+ <p class="comment">
37
+ CoffeeScript compiles to JavaScript but has a lot of friendly syntactic and semantic
38
+ features, like
39
+ <a href="http://jashkenas.github.com/coffee-script/#strings">string interpolation</a>,
40
+ <a href="http://jashkenas.github.com/coffee-script/#destructuring">destructuring assignment</a> and
41
+ <a href="http://jashkenas.github.com/coffee-script/#expressions">everything is an expression</a>.
42
+ </p>
43
+ <div style="text-align:center">
44
+ <img src="illustrate.png" width="80%">
45
+ </div>
46
+ <p class="comment">
47
+ So it makes sense to be able to maintain the sources in CoffeeScript instead of Javascript while
48
+ keeping the packaging option!
49
+ </p>
50
+ </div>
51
+ <div id="navigation">
52
+ <a href="../1-basic/index.html" class="button" id="leftnav"></a>
53
+ <a href="../3-embedded-coffee/index.html" class="button" id="rightnav"></a>
54
+ <div style="clear:both"></div>
55
+ </div>
56
+ </body>
57
+ </html>
@@ -0,0 +1,9 @@
1
+ {StringUtils} = require('./StringUtils')
2
+
3
+ exports.App = {
4
+
5
+ runTests: ()->
6
+ $("body").append StringUtils.pre("Have a look at 'nibjs --coffee'")
7
+ true
8
+
9
+ }