nibjs 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
+ }