├── .gitignore ├── examples ├── process.js ├── module.asp ├── http.js ├── module.js ├── buffer.js ├── fs.js ├── index.html ├── json.js └── default.asp ├── package.json ├── LICENSE ├── README.md └── NodeAsp.min.asp /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store -------------------------------------------------------------------------------- /examples/process.js: -------------------------------------------------------------------------------- 1 | console.log(process.env); 2 | console.log(process.uptime()); 3 | console.log(process.versions); -------------------------------------------------------------------------------- /examples/module.asp: -------------------------------------------------------------------------------- 1 | 2 | <% 3 | var c = require('./module.js'); 4 | 5 | c(); 6 | %> -------------------------------------------------------------------------------- /examples/http.js: -------------------------------------------------------------------------------- 1 | var http = require('http'); 2 | 3 | http.createServer(function(req, res) { 4 | console.log(req.query.a); 5 | }); 6 | 7 | 8 | //console.log(HTTP.get('http://api.webkits.cn')); -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nodeasp", 3 | "version": "0.1.18", 4 | "author": "evio, Spikef", 5 | "homepage": "http://nodeasp.com", 6 | "main": "nodeAsp.min.asp", 7 | "repository": "https://github.com/Spikef/NodeAsp", 8 | "license": "MIT" 9 | } 10 | -------------------------------------------------------------------------------- /examples/module.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Usage: console.js 3 | * Author: Spikef < Spikef@Foxmail.com > 4 | * Copyright: Envirs Team < http://envirs.com > 5 | */ 6 | 7 | //module.exports = function() { 8 | // var b; 9 | // require('./a').add(); 10 | //}; 11 | // 12 | //var b = require('./b'); 13 | 14 | console.log(require.resolve('./json')); 15 | 16 | //console.log(require.resolve('mff')); -------------------------------------------------------------------------------- /examples/buffer.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Usage: 3 | * Author: Spikef < Spikef@Foxmail.com > 4 | * Copyright: Envirs Team < http://envirs.com > 5 | */ 6 | 7 | var buf = new Buffer('hello world', 'ascii'); 8 | console.log(buf); 9 | // prints: 10 | console.log(buf.toString('hex')); 11 | // prints: 68656c6c6f20776f726c64 12 | console.log(buf.toString('base64')); 13 | // prints: aGVsbG8gd29ybGQ= -------------------------------------------------------------------------------- /examples/fs.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Usage: fs module test 3 | * Author: Spikef < Spikef@Foxmail.com > 4 | * Copyright: Envirs Team < http://envirs.com > 5 | */ 6 | 7 | var fs = require('fs-extra'); 8 | console.log(fs.readdirSync('C:\\Disk\\projects\\NodeAsp\\node_modules\\util')); 9 | console.log(fs.readdirsSync('C:\\Disk\\projects\\NodeAsp\\node_modules\\util')); 10 | console.log(fs.readTreeSync('C:\\Disk\\projects\\NodeAsp\\node_modules\\util')); -------------------------------------------------------------------------------- /examples/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 11 | 无标题 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /examples/json.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Usage: json test 3 | * Author: Spikef < Spikef@Foxmail.com > 4 | * Copyright: Envirs Team < http://envirs.com > 5 | */ 6 | 7 | var err; 8 | 9 | try{ 10 | var b = 1 / c; 11 | } catch(e) { 12 | err = e; 13 | } 14 | 15 | function m() { 16 | var a = ""; 17 | } 18 | 19 | var obj = {}; 20 | var json = { 21 | a: [1, 2, 3, true, 'asdf', 'yes'], 22 | b: Date.now(), 23 | c: 12, 24 | d: /asdf\b\d{2,}/, 25 | e: null, 26 | f: obj.f, 27 | g: '爱你一万年', 28 | h: Math, 29 | i: function() {}, 30 | j: {anything: 2016}, 31 | k: err, 32 | l: new function(){}(), 33 | m: m, 34 | n: false 35 | }; 36 | 37 | //console.log(JSON.stringify(true)); 38 | //console.log(JSON.stringify('yes')); 39 | //console.log(JSON.stringify(Date.now())); 40 | //console.log(JSON.stringify([123])); 41 | //console.log(JSON.stringify(json, null, 2)); 42 | //console.log(JSON.format(json)); 43 | console.log(json); 44 | console.log(); 45 | for (var i in json) { 46 | console.log(json[i]); 47 | } 48 | //console.log("asdf"); 49 | //console.log(12); 50 | //console.log(true); 51 | //console.log(err); 52 | //console.log(json.a); 53 | //console.log(json.i); 54 | 55 | //try{ 56 | // JSON.parse(JSON.format(json)); 57 | //} catch(e) { 58 | // console.warn(e); 59 | //} 60 | // 61 | //try{ 62 | // JSON.parse(JSON.format(json, {compatible: false})); 63 | //} catch(e) { 64 | // console.error(e); 65 | //} -------------------------------------------------------------------------------- /examples/default.asp: -------------------------------------------------------------------------------- 1 | 2 | <% 3 | (function(){ 4 | var mod = Request.QueryString("mod")(); 5 | 6 | if (mod) { 7 | require('./' + mod); 8 | } else { 9 | %> 10 | 11 | 12 | 13 | 14 | 模块测试 15 | 16 | 17 | 33 | 34 | 35 |
36 |
37 |

选择要测试的模块

38 |
39 |
40 | 41 |
42 | <% 43 | var modules = [], pages = []; 44 | 45 | var fso = new ActiveXObject('Scripting.FileSystemObject'); 46 | var folder = fso.GetFolder(Server.MapPath('./')); 47 | var files = new Enumerator(folder.Files); 48 | for (; !files.atEnd(); files.moveNext()) { 49 | var name = files.item().Name; 50 | if ( /\.js$/i.test(name) ) { 51 | modules.push(name.replace(/\.js$/i, '')); 52 | } 53 | if ( /\.html$/i.test(name) ) { 54 | pages.push(name.replace(/\.html$/i, '')); 55 | } 56 | } 57 | modules.forEach(function(name) { 58 | if ( pages.indexOf(name) === -1 ) { 59 | %> 60 | <%=name%> 61 | <% 62 | } 63 | }); 64 | pages.forEach(function(name) { 65 | %> 66 | <%=name%> 67 | <% 68 | }); 69 | %> 70 |
71 | 72 | 73 | <% 74 | } 75 | })(); 76 | %> -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # NodeAsp # 2 | 3 | `NodeAsp`是一套Classic ASP框架,借鉴了NodeJS的模块化思想,让您可以使用全新的理念愉快地书写ASP程序。 4 | 5 | `NodeAsp`使用遵循CommonJS规范的require,完全兼容NodeJS模块加载方式,让您可以直接使用NodeJS 50%以上的模块。一切不关乎NodeJS运行环境和ES5-ES6特有对象的模块都能直接使用。如此庞大的模块资源库,这在以往任何ASP框架下都是没有的。 6 | 7 | `NodeAsp`是ASP领域独树一帜的创新性框架,她的出现改变了传统的ASP编写模式,让您只需要会js就可以同时完成前后端开发,并免除了部署NodeJS服务器的繁琐过程。 8 | 9 | `NodeAsp`作为ASP领域的终结者,来了。 10 | 11 | ## 主页 ## 12 | 13 | NodeAsp:http://nodeasp.com 14 | 15 | 模块下载:http://nap.webkits.cn 16 | 17 | ## 运行环境 ## 18 | 19 | 这个框架仅限在WIN平台IIS上运行。通常普通的ASP虚拟主机即可运行本框架。 20 | 21 | ## 简单示例 ## 22 | 23 | default.asp 24 | 25 | ```asp 26 | 27 | 28 | <% 29 | require('./index.js'); 30 | %> 31 | ``` 32 | 33 | index.js 34 | 35 | ```javascript 36 | var http = require('http'); 37 | 38 | http.createServer(function(req, res){ 39 | res.writeHead(200, {'Content-Type': 'text/plain'}); 40 | res.end('Hello World\n'); 41 | }); 42 | ``` 43 | 44 | ## 使用方法 ## 45 | 46 | 第一步:下载NodeAsp。 47 | 48 | 第二步:引用NodeAsp。 49 | 50 | ```html 51 | 52 | ``` 53 | 54 | 第三步:使用NodeAsp。 55 | 56 | ```html 57 | <% 58 | var version = process.version; 59 | Response.Write(version); 60 | %> 61 | ``` 62 | 63 | ## 全局对象 ## 64 | 65 | 这些对象在所有模块中都是可用的。有些对象实际上并非在全局作用域内,而仅仅是在模块作用域内——这种情况在以下文档中会特别指出。 66 | 67 | ### global ### 68 | 69 | 在浏览器中,顶级作用域就是全局作用域。这就是说,在浏览器中,如果当前是在全局作用域内,var something将会声明一个全局变量。在NodeAsp中则不同。顶级作用域并非全局作用域,在NodeAsp模块里的var something只属于那个模块。 70 | 71 | ### process ### 72 | 73 | 输出与运行环境有关的一些信息。 74 | 75 | 在NodeAsp中,process存在的主要目的是为了兼容某些NodeJS模块,通常不会使用得到。 76 | 77 | ### console ### 78 | 79 | 用于打印标准输出和标准错误。 80 | 81 | 详见下面的`控制台`章节。 82 | 83 | ### Buffer ### 84 | 85 | 我们引入了buffer模块来兼容NodeJS的Buffer,请注意必须在node_modules下包含buffer模块才能使用Buffer。 86 | 87 | 如果您忘记在node_modules下放入buffer模块,这并不会影响程序的正常运行,只有当您使用Buffer时,才会抛出错误。 88 | 89 | ### require ### 90 | 91 | 引入模块。与NodeJS有点不一样的是,因为IIS只能直接执行ASP文件而非JS文件,所以require也可以用于在ASP代码中require一个模块。类似于在命令行中执行node test.js。 92 | 93 | 如果想知道调用require()方法加载模块时的真实文件路径,可以使用require.resolve()方法来得到。 94 | 95 | 详见下面的`模块`章节。 96 | 97 | ### __filename ### 98 | 99 | 当前所执行代码文件的文件路径。这是该代码文件经过解析后的绝对路径。 100 | 101 | 例如:执行 C:\websites\nodeasp\index.asp 102 | 103 | ```javascript 104 | // module.js 105 | Response.Write(__filename); 106 | // C:\websites\nodeasp\module.js 107 | 108 | // index.asp 109 | require('./module'); 110 | Response.Write(__filename); 111 | // C:\websites\nodeasp\index.asp 112 | ``` 113 | 114 | ### __dirname ### 115 | 116 | 当前执行脚本所在目录的目录名。 117 | 118 | ### module ### 119 | 120 | 当前模块的引用。特别地,module.exports和exports指向同一个对象。module实际上并非全局的而是各个模块本地的。 121 | 122 | 详见下面的`模块`章节。 123 | 124 | ### exports ### 125 | 126 | module.exports对象的引用,该对象被当前模块的所有实例所共享,通过require()可访问该对象。 何时使用exports以及何时使用module.exports的详情可参见模块系统文档。 exports实际上并非全局的而是各个模块本地的。 127 | 128 | 详见下面的`模块`章节。 129 | 130 | ### 定时器 ### 131 | 132 | 定时器函数一共包括以下四个。由于ASP是单线程的,所以以下函数实际上是不兼容的。 133 | 134 | setTimeout(cb, ms) 135 | 136 | clearTimeout(t) 137 | 138 | setInterval(cb, ms) 139 | 140 | clearInterval(t) 141 | 142 | ## 控制台 ## 143 | 144 | 为了更好的调试ASP程序,我们实现了类似NodeJS/Chrome浏览器的命令行调试工具。下载地址:https://github.com/Spikef/NodeAsp-Console 145 | 146 | > NOTE: 需要IIS7.5和.NET4才能运行,其它环境未测试。 147 | 148 | ### 使用指南 ### 149 | 150 | #### 第一步:注册COM组件 #### 151 | 152 | 以管理员权限打开CMD,使用REGASM命令注册component\Terminal.dll,其中REGASM位于C:\Windows\Microsoft.NET\Framework\v4.0.30319(具体位置与版本号有关)。 153 | 154 | ``` 155 | C:\Windows\Microsoft.NET\Framework\v4.0.30319\REGASM D:\component\Terminal.dll /codebase 156 | ``` 157 | 158 | #### 第二步:修改注册表,解决 ASP 0177 : 8000ffff 错误 #### 159 | 160 | 对于32位系统,找到如下注册表位置: 161 | > HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_IGNORE_ZONES_INITIALIZATION_FAILURE_KB945701 162 | 163 | 对于64位系统,找到如下注册表位置: 164 | > HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_IGNORE_ZONES_INITIALIZATION_FAILURE_KB945701 165 | 166 | 选择或者新建项FEATURE_IGNORE_ZONES_INITIALIZATION_FAILURE_KB945701,然后新建DWORD值: 167 | 168 | > 名称:w3wp.exe 169 | > 值:1 170 | 171 | #### 第三步:启动Console #### 172 | 173 | 双击Console.exe,打开NodeAsp调试命令行。 174 | 175 | #### 第四步:调试 #### 176 | 177 | 在default.asp中输入以下代码,然后通过浏览器访问default.asp。接下来,你就可以在`Console.exe`中看到结果了。 178 | 179 | ```javascript 180 | var a = {name: "nodeasp", value: true} 181 | // 在console中将输出 182 | //{ 183 | // name: "nodeasp", 184 | // value: true 185 | //} 186 | ``` 187 | 188 | ### 模块方法 ### 189 | 190 | #### console.log() #### 191 | 192 | 向Console输出,使用默认颜色。 193 | 194 | ```javascript 195 | var a = {name: "NodeAsp", version: "0.0.1"}; 196 | console.log(a); 197 | ``` 198 | 199 | #### console.info() #### 200 | 201 | 向Console输出,使用绿色。 202 | 203 | #### console.error() #### 204 | 205 | 向Console输出,使用红色。特别地,如果输出的是Error对象,将显示完整的错误信息。 206 | 207 | #### console.warn() #### 208 | 209 | 向Console输出,使用黄色。 210 | 211 | #### console.time(label) #### 212 | 213 | 使用label指定名称,开始一个计时器,用于计算操作所需要花费的时间。 214 | 215 | #### console.timeEnd(label) #### 216 | 217 | 输出某项操作所需要消耗的时间。 218 | 219 | Example: 220 | 221 | ```javascript 222 | console.time('100-elements'); 223 | for (var i = 0; i < 100; i++) { 224 | ; 225 | } 226 | console.timeEnd('100-elements'); 227 | // prints 100-elements: 262ms 228 | ``` 229 | 230 | ### 命令 ### 231 | 232 | 在控制台中可以输入以下命令。 233 | 234 | * cls/clear:清空调试信息,不可恢复。 235 | 236 | * about:显示关于信息。 237 | 238 | * copylast:复制上一条输出信息。 239 | 240 | * copyall:复制所有输出信息。 241 | 242 | ## 模块 ## 243 | 244 | NodeAsp有一个跟NodeJS几乎一致的模块加载系统,这样可以保证NodeAsp可以直接使用大量NodeJS的模块。 245 | 246 | NodeAsp的核心几乎不包含任何开发网站需要功能,所有功能都是通过模块来扩展的。可以通过NodeAsp的[模块中心](http://nap.webkits.cn/")或者[NPM](http://npmjs.org)来寻找您所需要的功能模块。 247 | 248 | 在NodeAsp中,文件和模块是一一对应的。下面是示例foo.js加载同一目录下的circle.js。 249 | 250 | foo.js的内容 251 | 252 | ```javascript 253 | var circle = require('./circle.js'); 254 | console.log( 'The area of a circle of radius 4 is ' 255 | + circle.area(4)); 256 | ``` 257 | 258 | circle.js的内容: 259 | 260 | ```javascript 261 | var PI = Math.PI; 262 | exports.area = function (r) { 263 | return PI * r * r; 264 | }; 265 | exports.circumference = function (r) { 266 | return 2 * PI * r; 267 | }; 268 | ``` 269 | 270 | circle.js模块输出了area()和circumference()两个函数。要输出某个对象,把它加到exports这个特殊对象下即可。 271 | 272 | 注意,exports是module.exports的一个引用,只是为了用起来方便。当你想输出的是例如构造函数这样的单个项目,那么需要使用module.exports。 273 | 274 | ```javascript 275 | // 正确输出构造函数 276 | module.exports = MyConstructor; 277 | ``` 278 | 279 | 模块内的本地变量是私有的。在这个例子中,PI这个变量就是circle.js私有的。 280 | 281 | ### 循环 ### 282 | 283 | 考虑这样一种情形: 284 | 285 | a.js 286 | 287 | ```javascript 288 | console.log('a starting'); 289 | exports.done = false; 290 | var b = require('./b.js'); 291 | console.log('in a, b.done = %j', b.done); 292 | exports.done = true; 293 | console.log('a done'); 294 | ``` 295 | 296 | b.js 297 | 298 | ```javascript 299 | console.log('b starting'); 300 | exports.done = false; 301 | var a = require('./a.js'); 302 | console.log('in b, a.done = %j', a.done); 303 | exports.done = true; 304 | console.log('b done'); 305 | ``` 306 | 307 | main.js 308 | 309 | ```javascript 310 | console.log('main starting'); 311 | var a = require('./a.js'); 312 | var b = require('./b.js'); 313 | console.log('in main, a.done=%j, b.done=%j', a.done, b.done); 314 | ``` 315 | 316 | 首先main.js加载a.js,接着a.js又去加载b.js。这时,b.js会尝试去加载a.js。为了防止无限的循环,a.js会返回一个unfinished copy给b.js。然后b.js就会停止加载,并将其exports对象返回给a.js模块。 317 | 318 | 这样main.js就把这两个模块都加载完成了。这段程序的输出如下: 319 | 320 | ```javascript 321 | main starting 322 | a starting 323 | b starting 324 | in b, a.done = false 325 | b done 326 | in a, b.done = true 327 | a done 328 | in main, a.done=true, b.done=true 329 | ``` 330 | 331 | 跟NodeJS一样,通常循环依赖模块并不会导致死循环,但是如果此时直接在模块加载时执行其它模块的方法,会提示找不到对应的方法,所以应该避开这种情况。 332 | 333 | ```javascript 334 | // a.js 335 | var b = require('./b.js'); 336 | exports.add = function(m, n) { 337 | console.info(m + n); 338 | }; 339 | 340 | // b.js 341 | var a = require('./a'); 342 | var m = 101, n = 102; 343 | exports.result = function() { 344 | a.add(m, n); // 此处没有问题 345 | }; 346 | a.add(m, n); // 此处会报错,找不到a.add方法 347 | ``` 348 | 349 | ### 文件模块 ### 350 | 351 | 如果按文件名没有查找到,那么NodeAsp会添加` .js`和` .json`后缀名,再尝试加载。 352 | 353 | ` .js`会被解析为Javascript纯文本文件,` .json`会被解析为JSON格式的纯文本文件。 354 | 355 | 模块以'/'为前缀,则表示绝对路径。例如,require('/home/marco/foo.js') ,加载的是/home/marco/foo.js这个文件。 356 | 357 | 模块以'./'为前缀,则路径是相对于调用require()的文件。 也就是说,circle.js必须和foo.js在同一目录下,require('./circle')才能找到。 358 | 359 | 当没有以'/'或者'./'来指向一个文件时,这个模块是从node_modules文件夹加载的。 360 | 361 | 如果指定的路径不存在,require()会抛出一个错误。 362 | 363 | > NOTE: 考虑到IIS主机上,` .js`文件可以直接通过浏览器访问,所以如果不希望泄露源码,您也可以使用任意文件后缀名。 364 | 365 | ### 从node_modules文件夹中加载 ### 366 | 367 | 如果require()中的模块名不是一个本地模块,也没有以'/', '../', 或是 './'开头,那么node会从当前模块的父目录开始,尝试在它的/node_modules文件夹里加载相应模块。 368 | 369 | 如果没有找到,那么就再向上移动到父目录,直到到达顶层目录位置。 370 | 371 | 例如,如果位于'/home/ry/projects/foo.js'的文件调用了require('bar.js'),那么node查找的位置依次为: 372 | 373 | * /home/ry/projects/node_modules/bar.js 374 | 375 | * /home/ry/node_modules/bar.js 376 | 377 | * /home/node_modules/bar.js 378 | 379 | * /node_modules/bar.js 380 | 381 | ### 模块包 ### 382 | 383 | 可以把程序和库放到一个单独的文件夹里,并提供单一入口来指向它。有三种方法,使一个文件夹可以作为require()的参数来加载。 384 | 385 | 首先是在文件夹的根目录创建一个叫做package.json的文件,它需要指定一个main模块。下面是一个package.json文件的示例。 386 | 387 | ```javascript 388 | { 389 | "name" : "some-library", 390 | "main" : "./lib/some-library.js" 391 | } 392 | ``` 393 | 394 | 示例中这个文件,如果是放在./some-library目录下面,那么require('./some-library')就将会去加载./some-library/lib/some-library.js。 395 | 396 | 如果目录里没有package.json这个文件,那么node就会尝试去加载这个路径下的index.js。 397 | 398 | ### 缓存 ### 399 | 400 | 模块在第一次加载后会被缓存。这意味着(类似其他缓存)每次调用require('foo')的时候都会返回同一个对象,当然,必须是每次都解析到同一个文件。 401 | 402 | 多次调用 require(foo) 未必会导致模块中的代码执行多次. 这是一个重要的功能. 借助这个功能, 可以返回部分完成的对象; 这样, 传递依赖也能被加载, 即使它们可能导致循环依赖。 403 | 404 | 如果你希望一个模块多次执行,那么就输出一个函数,然后调用这个函数。 405 | 406 | 模块的缓存是依赖于解析后的文件名。由于随着调用的位置不同,可能解析到不同的文件(比如需从node_modules文件夹加载的情况),所以,如果解析到其他文件时,就不能保证require('foo')总是会返回确切的同一对象。 407 | 408 | ### 模块对象 ### 409 | 410 | 在每一个模块中,变量 module 是一个代表当前模块的对象的引用。 特别地,module.exports 可以通过全局模块对象 exports 获取到。 module 不是事实上的全局对象,而更像是每个模块内部的。 411 | 412 | #### module.exports #### 413 | 414 | module.exports对象是通过模块系统产生的。因此,只需要将要导出的对象赋值给`module.exports`。例如,我们也可以使用下面的方法来写circle.js,这是完全等效的。 415 | 416 | ```javascript 417 | // circle.js 418 | var PI = Math.PI; 419 | var circle = {}; 420 | circle.area = function (r) { 421 | return PI * r * r; 422 | }; 423 | circle.circumference = function (r) { 424 | return 2 * PI * r; 425 | }; 426 | module.exports = circle; 427 | ``` 428 | 429 | #### module.id #### 430 | 431 | 用于区别模块的标识符。通常是完全解析后的文件名。 432 | 433 | #### module.filename #### 434 | 435 | 模块完全解析后的文件名。 436 | 437 | #### module.parent #### 438 | 439 | 引入这个模块的模块。 440 | 441 | ### 查找流程 ### 442 | 443 | 当使用require()引用一个模块时,是按照如下流程根据表达式来查找目标模块的。 444 | 445 | ```javascript 446 | require(X) from module at path Y 447 | 1. If X begins with './' or '/' or '../' 448 | a. LOAD_AS_FILE(Y + X) 449 | b. LOAD_AS_DIRECTORY(Y + X) 450 | 2. LOAD_NODE_MODULES(X, dirname(Y)) 451 | 3. THROW "not found" 452 | 453 | LOAD_AS_FILE(X) 454 | 1. If X is a file, load X as JavaScript text. STOP 455 | 2. If X.js is a file, load X.js as JavaScript text. STOP 456 | 3. If X.json is a file, parse X.json to a JavaScript Object. STOP 457 | 458 | LOAD_AS_DIRECTORY(X) 459 | 1. If X/package.json is a file, 460 | a. Parse X/package.json, and look for "main" field. 461 | b. let M = X + (json main field) 462 | c. LOAD_AS_FILE(M) 463 | 2. If X/index.js is a file, load X/index.js as JavaScript text. STOP 464 | 3. If X/index.json is a file, parse X/index.json to a JavaScript object. STOP 465 | 466 | LOAD_NODE_MODULES(X, START) 467 | 1. let DIRS=NODE_MODULES_PATHS(START) 468 | 2. for each DIR in DIRS: 469 | a. LOAD_AS_FILE(DIR/X) 470 | b. LOAD_AS_DIRECTORY(DIR/X) 471 | 472 | NODE_MODULES_PATHS(START) 473 | 1. let PARTS = path split(START) 474 | 2. let I = count of PARTS - 1 475 | 3. let DIRS = [] 476 | 4. while I >= 0, 477 | a. if PARTS[I] = "node_modules" CONTINUE 478 | c. DIR = path join(PARTS[0 .. I] + "node_modules") 479 | b. DIRS = DIRS + DIR 480 | c. let I = I - 1 481 | 5. return DIRS 482 | ``` 483 | 484 | ## 内置模块 ## 485 | 486 | 内置模块与NodeJS一样,也必需先require才能使用。 487 | 488 | ### assert ### 489 | 490 | 该模块用于编写程序的单元测试用例,通过require('assert')调用。直接移植自NodeJS。 491 | 492 | ### events ### 493 | 494 | 事件处理模块,直接移植自NodeJS。 495 | 496 | ### fs ### 497 | 498 | 文件操作模块,兼容绝大部分NodeJS文件操作模块的同步操作API方法。 499 | 500 | ### http ### 501 | 502 | HTTP请求与处理模块。移植并修改自NodeJS,绝大部分兼容。 503 | 504 | ### path ### 505 | 506 | 本模块包含一套用于处理和转换文件路径的工具集。几乎所有的方法只做字符串变换, 不会调用文件系统检查路径是否有效。 507 | 508 | 移植并修改自NodeJS,几乎完全兼容。 509 | 510 | ### punycode ### 511 | 512 | 编码和解码URL,完全兼容NodeJS。 513 | 514 | ### auerystring ### 515 | 516 | 处理URL查询字符串,完全兼容NodeJS。 517 | 518 | ### url ### 519 | 520 | 该模块包含用以 URL 解析的实用函数。 使用 require('url') 来调用该模块。 521 | 522 | 完全兼容NodeJS。 523 | 524 | ### util ### 525 | 526 | 辅助方法模块,兼容4.0以下版本的NodeJS。 527 | 528 | ## 编译NodeAsp源码 ## 529 | 530 | 编译NodeAsp源码需要安装node环境,同时需要全局安装uglifyJS。 531 | 532 | 在命令行中执行`node build`即可,编译好的文件位于bundle目录中。 533 | 534 | ``` 535 | C:\Disk\projects\NodeAsp>node build 536 | ----------------------- 537 | # build nodeAsp success 538 | + build/NodeAsp.min.asp 539 | @ 2016-03-01 13:46:04 540 | ----------------------- 541 | ``` 542 | 543 | ## License ## 544 | 545 | MIT -------------------------------------------------------------------------------- /NodeAsp.min.asp: -------------------------------------------------------------------------------- 1 | <%@LANGUAGE="JAVASCRIPT" CODEPAGE="65001"%><%Response.Buffer = true;Server.ScriptTimeOut = 999;Session.CodePage = 65001;Session.LCID = 2052;Response.Charset = "utf-8";Response.Expires = 0;var __node_start_timer__=(new Date).getTime();var global={},process={},JSON={},console={},require;var Buffer;var __filename=Server.MapPath(Request.ServerVariables("SCRIPT_NAME"));var __dirname=Server.MapPath("./");(function(){"use strict";var rx_one=/^[\],:{}\s]*$/,rx_two=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,rx_three=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,rx_four=/(?:^|:|,)(?:\s*\[)+/g,rx_escapable=/[\\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,rx_dangerous=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;function f(e){return e<10?"0"+e:e}var gap,indent,meta,rep;function quote(e){rx_escapable.lastIndex=0;return rx_escapable.test(e)?'"'+e.replace(rx_escapable,function(e){var r=meta[e];return typeof r==="string"?r:"\\u"+("0000"+e.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+e+'"'}function str(e,r){var t,n,i,a,o=gap,s,u=r[e];if(typeof rep==="function"){u=rep.call(r,e,u)}var f=getType(u);switch(f){case"string":return quote(u);case"number":return isFinite(u)?String(u):"null";case"boolean":return String(u);case"date":return new Date(u).getTime();case"null":return f;case"undefined":case"unknown":case"function":return;case"error":return"{}";case"custom":return u.toString();default:gap+=indent;s=[];if(Object.prototype.toString.apply(u)==="[object Array]"){a=u.length;for(t=0;t10)return e;var r=[];for(var t=0;t>>0;t>>0;var n=new Array(t);for(var i=0;i>>0;i>>0;t>>0;t>>0,t=0,n;if(arguments.length>1){n=arguments[1]}else{do{if(t in this){n=this[t++];break}if(++t>=r){throw new TypeError("reduce of empty array with on initial value")}}while(true)}for(;t>>0,t=r-1,n;if(arguments.length>1){n=arguments[1]}else{do{if(t in this){n=this[t--];break}if(--t<0)throw new TypeError("reduce of empty array with on initial value")}while(true)}for(;t>=0;t--){if(t in this){n=e.call(null,n,this[t],t,this)}}return n});r.indexOf||(r.indexOf=function(e,r){var t=this.length>>>0;r=Number(r)||0;r=Math[r<0?"ceil":"floor"](r);if(r<0){r=Math.max(r+t,0)}for(;r>>0;r=Number(r)||t-1;r=Math[r<0?"ceil":"floor"](r);if(r<0){r+=t}r=Math.min(r,t-1);for(;r>=0;r--){if(r in this&&this[r]===e){return r}}return-1});n.trim||(n.trim=function(){var e=["\\s","00A0","1680","180E","2000-\\u200A","200B","2028","2029","202F","205F","3000"].join("\\u");var r=new RegExp("^["+e+"]+");var t=new RegExp("["+e+"]+$");return function(){return String(this).replace(r,"").replace(t,"")}}());Date.now||(Date.now=function(){return(new Date).getTime()});Object.create||(Object.create=function(e,r){var t=function(){};t.prototype=e;var n=new t;for(var i in r){n[i]=r[i].value}n.__proto__=e;n.constructor=Object;return n});Object.getPrototypeOf||(Object.getPrototypeOf=function(e){var r=e.__proto__;if(r||r===null){return r}else if(e.constructor){return e.constructor.prototype}else{return _objproto}});r.find||(r.find=function(e,r){var t=Object(this);var n=t.length>>>0;if(!n||n<0){return}for(var i=0,a;i>>0;if(!n||n<0){return-1}for(var i=0;i>>0;r=r||0;t=t||i;var a=r<0?Math.max(i+r,0):Math.min(r,i);for(;a>>0;var i=parseInt(e,10);var a=i<0?Math.max(n+i,0):Math.min(i,n);var o=parseInt(r,10);var s=o<0?Math.max(n+o,0):Math.min(o,n);var u=arguments[2];var f=u===undefined?n:parseInt(u,10);var c=f<0?Math.max(n+f,0):Math.min(f,n);var l=Math.min(c-s,n-a);if(s0){if(s in t)t[a]=t[s];else delete t[a];s--;a--;l--}}else{while(l>0){if(s in t)t[a]=t[s];else delete t[a];s++;a++;l--}}return t});r.of||(r.of=function(){return a.call(arguments)});r.from||(r.from=function(e){var r=function(e){var r=Number(e);var t;if(r!=r){t=0}else if(r===0||!isFinite(r)){t=r}else{t=(r<0?-1:+1)*Math.floor(Math.abs(r))}if(t<=0){return 0}return Math.min(t,9007199254740991)};var t=Object(e),n=arguments.length>1?arguments[1]:undefined,i=arguments.length>2?arguments[2]:undefined,a=true;if(n===undefined){a=false}else if(typeof n!="function"){throw TypeError()}var o=r(t.length),s=new Array(o),u=0,f,c;while(u-9007199254740992&&e<9007199254740992&&Math.floor(e)===e}}if(!Number.isSafeInteger){Number.isSafeInteger=function(e){return Number.isInteger(e)&&Math.abs(e)<=Number.MAX_SAFE_INTEGER}}if(!Number.isNaN){Number.isNaN=function(e){return e!==e}}if(!Object.is){var u=function(e){return typeof e==="number"&&isNaN(e)};Object.is=function c(e,r){if(e===0&&r===0){return 1/e===1/r}else if(e===r){return true}else if(u(e)&&u(r)){return true}return false}}if(!Object.assign){var f=function(e){return e&&typeof e==="object"};Object.assign=function l(e,r){var t,n,i,a;if(!f(e)){throw new TypeError("target must be an object")}for(t=1,i=arguments.length;t-1?r[i]:undefined}}}function t(e,r,t){return{value:function(n,i){var a=f(e,n,t);if(a>-1){r[a]=i}else{r[e.push(n)-1]=i}}}}function n(e,r,t){return{value:function(n){var i=f(e,n,t);if(i>-1){e.splice(i,1);r.splice(i,1);return true}return false}}}function i(e,r,t){return{value:function(r){return f(e,r,t)>-1}}}function a(e,r){return{value:function(t){var n=f(e,t,r);if(n===-1){e.push(t)}}}}function o(e,r){return{value:function(){e.length=0;r.length=0}}}function s(e){return{value:function(){return e.length}}}function u(e,r){return{value:function(t,n){e.forEach(function(e,n){t.call(this,e,r[n])},n)}}}function f(r,t,n){var i;if(t!=t||t===0){for(i=r.length;i--;){if(Object.is(r[i],t)){break}}}else{i=e.call(r,t)}return i}})();(function(){Error=function(e,r,t,n,i,a,o){var s=Array.prototype.slice.apply(arguments);if(typeof s[0]==="object"){var u=s[0];s=[];s.push(u.number||0);s.push(u.message||"");s.push(u.filename||__filename);s.push(u.line||0);s.push(u.column||0);s.push(u.source||"");s.push(u.name||"")}else if(typeof s[0]==="string"){s.unshift(0)}this.number=s[0]&65535;this.message=s[1]||"";this.filename=s[2]||__filename;this.line=s[3]||0;this.column=s[4]||0;this.source=s[5]||"";this.name=s[6]||this.name||"Error"};ConversionError=function(){this.name="ConversionError";return Error.apply(this,arguments)};RangeError=function(){this.name="RangeError";return Error.apply(this,arguments)};ReferenceError=function(){this.name="ReferenceError";return Error.apply(this,arguments)};RegExpError=function(){this.name="RegExpError";return Error.apply(this,arguments)};SyntaxError=function(){this.name="SyntaxError";return Error.apply(this,arguments)};TypeError=function(){this.name="TypeError";return Error.apply(this,arguments)};URIError=function(){this.name="URIError";return Error.apply(this,arguments)}})();(function(e){var r;try{r=Server.CreateObject("Terminal.Console")}catch(t){}var n="log";["log","info","warn","error","time","timeEnd"].forEach(function(t){e[t]=function(){if(!r)return;n=t;var a=t.startsWith("time")?arguments[0]:i.apply(e,arguments);if(t==="log")t="style";r[t](a)}});function i(){if(arguments.length===0)return"\n";var e=[];for(var r=0;r";r=s.buffer(r)}else{r=JSON.format(e,{compatible:false});r=s.json(r)}}catch(l){try{var p={};for(var v in e){p[v]=typeof e[v]==="object"?a(e[v]):e[v]}r=JSON.format(p,{compatible:false});r=s.json(r)}catch(h){}}}break;default:r=e}return r}var s={};s.buffer=function(e){if(n!=="style"&&n!=="log")return e;return e.replace(/^(").replace(/(>)$/,"")};s.title=function(e){if(n!=="style"&&n!=="log")return e;return e.replace(/^(\[[A-Z]+: )/i,"").replace(/(])$/,"")};s.string=function(e){if(n!=="style"&&n!=="log")return e;return")/g,"\\$1")+">"};s.number=function(e){if(n!=="style"&&n!=="log")return e;return""};s.boolean=function(e){if(n!=="style"&&n!=="log")return e;return""};s.json=function(e){if(n!=="style"&&n!=="log")return e;e=e.replace(/(: )(.+?)(?=,?\n)/g,function(e,r,t){if(/^(\d|\.)+$/.test(t)){return r+""}else if(/^".*"$/.test(t)){t=t.replace(/(<|>)/g,"\\$1");return r+""}else if(/^true|false$/.test(t)){return r+""}else if(/^null|undefined|unknown$/.test(t)){return r+""}else if(/^\/.+\/([gim]*)$/.test(t)){return r+""}else{return e}});e=e.replace(/("[^"]+"):/g,":");return e}})(console);process.platform="win32";process.version="v0.1.18";process.versions={nodeasp:"0.1.18",assert:"1.3.0",buffer:"4.5.0",events:"1.1.0",fs:"0.0.2",http:"0.0.3",os:"0.0.1",path:"0.12.7",punycode:"1.3.2",querystring:"0.2.0",url:"0.11.0",util:"0.10.3"};process.browser=false;process.title="Node Asp Component FrameWork";process.cwd=function(){return __dirname};process.chdir=function(e){__dirname=e};process.env={};process.env.NODE_ENV="production";process.env.ALL_HTTP=String(Request.ServerVariables("ALL_HTTP"));process.env.ALL_RAW=String(Request.ServerVariables("ALL_RAW"));process.env.APPL_MD_PATH=String(Request.ServerVariables("APPL_MD_PATH"));process.env.APPL_PHYSICAL_PATH=String(Request.ServerVariables("APPL_PHYSICAL_PATH"));process.env.AUTH_PASSWORD=String(Request.ServerVariables("AUTH_PASSWORD"));process.env.AUTH_TYPE=String(Request.ServerVariables("AUTH_TYPE"));process.env.AUTH_USER=String(Request.ServerVariables("AUTH_USER"));process.env.CERT_COOKIE=String(Request.ServerVariables("CERT_COOKIE"));process.env.CERT_FLAGS=String(Request.ServerVariables("CERT_FLAGS"));process.env.CERT_ISSUER=String(Request.ServerVariables("CERT_ISSUER"));process.env.CERT_KEYSIZE=String(Request.ServerVariables("CERT_KEYSIZE"));process.env.CERT_SECRETKEYSIZE=String(Request.ServerVariables("CERT_SECRETKEYSIZE"));process.env.CERT_SERIALNUMBER=String(Request.ServerVariables("CERT_SERIALNUMBER"));process.env.CERT_SERVER_ISSUER=String(Request.ServerVariables("CERT_SERVER_ISSUER"));process.env.CERT_SERVER_SUBJECT=String(Request.ServerVariables("CERT_SERVER_SUBJECT"));process.env.CERT_SUBJECT=String(Request.ServerVariables("CERT_SUBJECT"));process.env.CONTENT_LENGTH=String(Request.ServerVariables("CONTENT_LENGTH"));process.env.CONTENT_TYPE=String(Request.ServerVariables("CONTENT_TYPE"));process.env.GATEWAY_INTERFACE=String(Request.ServerVariables("GATEWAY_INTERFACE"));process.env.HTTPS=String(Request.ServerVariables("HTTPS"));process.env.HTTPS_KEYSIZE=String(Request.ServerVariables("HTTPS_KEYSIZE"));process.env.HTTPS_SECRETKEYSIZE=String(Request.ServerVariables("HTTPS_SECRETKEYSIZE"));process.env.HTTPS_SERVER_ISSUER=String(Request.ServerVariables("HTTPS_SERVER_ISSUER"));process.env.HTTPS_SERVER_SUBJECT=String(Request.ServerVariables("HTTPS_SERVER_SUBJECT"));process.env.INSTANCE_ID=String(Request.ServerVariables("INSTANCE_ID"));process.env.INSTANCE_META_PATH=String(Request.ServerVariables("INSTANCE_META_PATH"));process.env.LOCAL_ADDR=String(Request.ServerVariables("LOCAL_ADDR"));process.env.LOGON_USER=String(Request.ServerVariables("LOGON_USER"));process.env.PATH_INFO=String(Request.ServerVariables("PATH_INFO"));process.env.PATH_TRANSLATED=String(Request.ServerVariables("PATH_TRANSLATED"));process.env.QUERY_STRING=String(Request.ServerVariables("QUERY_STRING"));process.env.REMOTE_ADDR=String(Request.ServerVariables("REMOTE_ADDR"));process.env.REMOTE_HOST=String(Request.ServerVariables("REMOTE_HOST"));process.env.REMOTE_USER=String(Request.ServerVariables("REMOTE_USER"));process.env.REQUEST_METHOD=String(Request.ServerVariables("REQUEST_METHOD"));process.env.SCRIPT_NAME=String(Request.ServerVariables("SCRIPT_NAME"));process.env.SERVER_NAME=String(Request.ServerVariables("SERVER_NAME"));process.env.SERVER_PORT=Number(Request.ServerVariables("SERVER_PORT"));process.env.SERVER_PORT_SECURE=String(Request.ServerVariables("SERVER_PORT_SECURE"));process.env.SERVER_PROTOCOL=String(Request.ServerVariables("SERVER_PROTOCOL"));process.env.SERVER_SOFTWARE=String(Request.ServerVariables("SERVER_SOFTWARE"));process.env.URL=String(Request.ServerVariables("URL"));var ServerVariables=new Enumerator(Request.ServerVariables);for(;!ServerVariables.atEnd();ServerVariables.moveNext()){var item=ServerVariables.item();if(/^HTTP_/.test(item))process.env[item]=String(Request.ServerVariables(item))}process.env.CLIENT_IP=process.env.HTTP_X_FORWARDED_FOR||process.env.REMOTE_ADDR;process.abort=function(){Response.End()};process.exit=function(e){if(typeof e==="number"&&/^\d+$/.test(e)){process.exitCode=e;Response.Write(e)}Response.End()};process.release={name:"nodeasp"};process.uptime=function(){var e=__node_start_timer__;var r=(new Date).getTime();return(r-e)/1e3};(function(){var e=new ActiveXObject("Scripting.FileSystemObject");var r={};r.exists=function(r){return e.FileExists(r)};r.readFile=function(e){var r=new ActiveXObject("Adodb.Stream");r.Type=2;r.Mode=3;r.Open();r.Charset="utf-8";r.Position=r.Size;r.LoadFromFile(e);var t=r.ReadText;r.Close();return t};r.resolve=function(){var e=__dirname||Server.MapPath("./");var r=Array.prototype.slice.call(arguments);if(r.length===0)return e;var t=-1;for(var n=r.length-1;n>=0;n--){if(/^(\/|\\|\w:)/.test(r[n])){t=n;break}}if(t===-1){r.unshift(e)}else{r=r.slice(t)}var i=r.join("\\");i=i.replace(/\//g,"\\");i=i.replace(/\\\\/g,"\\");var a=/([^\\:]+\\)(\.\.\\)/;while(a.test(i)){i=i.replace(a,"")}i=i.replace(/\.{1,2}\\/g,"");i=i.replace(/([^:])\\$/,"$1");i=i.replace(/^(?=\\)/,e.substr(0,2));return i};r.dirname=function(r){return e.GetParentFolderName(r)};r.extname=function(r){var t=e.GetExtensionName(r);if(t.length>0)t="."+t;return t};r.AspError=function(e){var r="";if(e.source)r+="source: "+e.source;if(e.filename)r+="\n@"+e.filename;if(e.line)r+=", line "+e.line+", column "+e.column;var t=e.name+": "+e.message;var n=[];n.push("Function ThrowError(number, source, description)");n.push(" Err.Clear");n.push(" Err.Raise number, source, description");n.push("End Function");var i=new ActiveXObject("MSScriptControl.ScriptControl");i.Language="VBScript";i.AddCode(n.join("\n"));i.run("ThrowError",-1,r,t);CollectGarbage()};var t=function(e,r){this.id=e;this.filename=e;this.exports={};if(r)this.parent=t.caches[r];this.loaded=false;this.children=[]};var n={line:0};t.routes={};t.caches={};t.prototype.require=function(e){var i,u=r.dirname(this.filename);if(t.routes[u]&&t.routes[u][e]){i=t.routes[u][e]}else{try{i=s(e,u)}catch(f){if(n.inRequire){throw f}else{var c=new Error({filename:this.filename,message:f.message,source:f.source,line:n.line,name:f.name});console.error(c);r.AspError(c)}}t.routes[u]=t.routes[u]||{};t.routes[u][e]=i}if(t.caches[i]){return t.caches[i].exports}else{var l=new t(i,this.filename);a.apply(l);o.apply(l);l.loaded=true;l.parent&&l.parent.children&&l.parent.children.push(l);return a.apply(l)}};function i(){var e=r.readFile(this.filename);if(r.extname(this.filename.toLowerCase())===".json"){e="module.exports="+e}return e}function a(){return(t.caches[this.filename]=this).exports}function o(){var e;var t=i.apply(this);var n=this.exports={};var a=this.filename;var o=r.dirname(this.filename);try{var u=this.require.bind(this);u.cache={};u.resolve=function(e){return s(e,o)};u.toString=function(){return"function require(){\n [native code]\n}"};u.resolve.toString=function(){return"function resolve(){\n [native code]\n}"};e=new Function("return function(exports, require, module, __filename, __dirname){\n"+t+"\n}")();e.call(n,n,u,this,a,o)}catch(f){if(f.name!=="SearchError"&&f.filename)throw f;var c={number:f.number,message:f.message,filename:a,name:f.name};throw new Error(c)}}function s(e,t){if(!t){var n={message:"The target module '"+e+"' does not exist!",source:'require("'+e+'")',name:"SearchError"};throw n}var i;if(/(^\.|^\/|:)/.test(e)){i=u(r.resolve(t,e));if(i){return i}else{i=r.resolve(t,e,"index.js");if(r.exists(i)){return i}else{return s(e,r.dirname(t))}}}else{var a,o;var f=e.split("/");if(f.length>1){a=f[0];o=f.slice(1)}else{a=e;o=[]}if(o.length>0){i=u(r.resolve(t,"node_modules",a,o.join("/")));if(i){return i}else{i=r.resolve(t,"node_modules",a,o.join("/"),"index.js");if(r.exists(i)){return i}else{return s(e,r.dirname(t))}}}else{i=r.resolve(t,"node_modules",a,"package.json");if(r.exists(i)){var c=JSON.parse(r.readFile(i));if(c.main){i=u(r.resolve(t,"node_modules",a,c.main));if(i){return i}else{i=r.resolve(t,"node_modules",a,c.main,"index.js");if(r.exists(i)){return i}else{i=r.resolve(t,"node_modules",a,"index.js");if(r.exists(i)){return i}else{return s(e,r.dirname(t))}}}}else{i=r.resolve(t,"node_modules",a,"index.js");if(r.exists(i)){return i}else{return s(e,r.dirname(t))}}}else{i=r.resolve(t,"node_modules",a,"index.js");if(r.exists(i)){return i}else{return s(e,r.dirname(t))}}}}}function u(e){if(r.exists(e))return e;e=e+".js";if(r.exists(e))return e;return false}require=function(e){n.inRequire=true;try{var i=new t(__filename);return i.require(e)}catch(a){if(e!=="buffer"){console.error(a);r.AspError(a)}else{throw a}}finally{delete n.inRequire}};require.cache={};require.resolve=function(e){return s(e,r.dirname(__filename))};require.toString=function(){return"function require(){\n [native code]\n}"};require.resolve.toString=function(){return"function resolve(){\n [native code]\n}"}})();try{Buffer=require("buffer").Buffer}catch(e){Buffer=function(){throw{message:"The node_modules/buffer does not exist!",source:"Buffer",name:"TypeError"}}}Enumerator.prototype.forEach=function(e){if(typeof e!=="function")return;var r=0;for(;!this.atEnd();this.moveNext()){e.call(e,this.item(),r);r++}};function setTimeout(fn){if(typeof fn==="string"){eval(fn)}else if(typeof fn==="function"){fn()}}function clearTimeout(e){}function setInterval(fn){if(typeof fn==="string"){eval(fn)}else if(typeof fn==="function"){fn()}}function clearInterval(e){}global.Array=Array;global.Boolean=Boolean;global.Date=Date;global.Error=Error;global.Function=Function;global.Enumerator=Enumerator;global.Math=Math;global.Number=Number;global.Object=Object;global.RegExp=RegExp;global.String=String;global.Buffer=Buffer;global.TypeError=TypeError;%> --------------------------------------------------------------------------------