isite 2026.4.5 → 2026.6.1

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.
@@ -0,0 +1,1009 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <title>isite Documentation</title>
7
+ <meta
8
+ name="description"
9
+ content="Documentation for the isite Node.js web framework, including setup, routing, sessions, MongoDB, WebSocket, and helper APIs."
10
+ />
11
+ <link rel="stylesheet" href="style.css" />
12
+ </head>
13
+ <body>
14
+ <aside class="sidebar">
15
+ <a class="brand" href="#overview" aria-label="isite documentation home">
16
+ <span class="brand-mark">i</span>
17
+ <span>
18
+ <strong>isite</strong>
19
+ <small>Documentation</small>
20
+ </span>
21
+ </a>
22
+
23
+ <label class="search">
24
+ <span>Search docs</span>
25
+ <input id="searchInput" type="search" placeholder="routes, mongodb, session..." autocomplete="off" />
26
+ </label>
27
+
28
+ <nav class="nav" aria-label="Documentation sections">
29
+ <a href="#overview">Overview</a>
30
+ <a href="#installation">Installation</a>
31
+ <a href="#configuration">Configuration</a>
32
+ <a href="#folder-structure">Folder Structure</a>
33
+ <a href="#routing">Routing</a>
34
+ <a href="#request-response">Request and Response</a>
35
+ <a href="#files">Files</a>
36
+ <a href="#websocket">WebSocket</a>
37
+ <a href="#sessions">Cookies and Sessions</a>
38
+ <a href="#apps">Custom Apps</a>
39
+ <a href="#master-pages">Master Pages</a>
40
+ <a href="#server-tags">Server Tags</a>
41
+ <a href="#mongodb">MongoDB</a>
42
+ <a href="#upload-download">Upload and Download</a>
43
+ <a href="#languages">Multi Language</a>
44
+ <a href="#client-libraries">Client Libraries</a>
45
+ <a href="#helpers">Helpers</a>
46
+ <a href="#events">Events</a>
47
+ <a href="#api">API Reference</a>
48
+ <a href="#function-index">Function Index</a>
49
+ <a href="#ai-agent-files">AI Agent Files</a>
50
+ </nav>
51
+ </aside>
52
+
53
+ <main>
54
+ <section class="hero doc-section" id="overview" data-tags="overview features framework nodejs social browser">
55
+ <div class="hero-content">
56
+ <p class="eyebrow">Node.js web framework</p>
57
+ <h1>isite documentation</h1>
58
+ <p>
59
+ isite helps you build secure, multi-language Node.js websites with automatic routes, file
60
+ management, sessions, permissions, MongoDB helpers, WebSocket handling, and custom apps.
61
+ </p>
62
+ <div class="hero-actions">
63
+ <a class="button primary" href="#installation">Get started</a>
64
+ <a class="button" href="#api">View API</a>
65
+ </div>
66
+ </div>
67
+ <div class="hero-panel" aria-label="isite quick facts">
68
+ <span>Package</span>
69
+ <strong>isite</strong>
70
+ <span>Current repo version</span>
71
+ <strong>2026.04.05</strong>
72
+ <span>Main entry</span>
73
+ <strong>index.js</strong>
74
+ </div>
75
+ </section>
76
+
77
+ <section class="doc-section" data-tags="features automatic routing websocket mongodb security uploads downloads">
78
+ <h2>What is included</h2>
79
+ <div class="feature-grid">
80
+ <article>
81
+ <h3>Automatic routing</h3>
82
+ <p>Map URLs to files, callbacks, folders, merged assets, dynamic paths, or wildcard routes.</p>
83
+ </article>
84
+ <article>
85
+ <h3>Server-side site files</h3>
86
+ <p>Read HTML, CSS, JS, JSON, XML, images, fonts, downloads, and merged files with cache support.</p>
87
+ </article>
88
+ <article>
89
+ <h3>Sessions and security</h3>
90
+ <p>Built-in cookies, session storage, users, roles, permissions, and feature-based HTML display.</p>
91
+ </article>
92
+ <article>
93
+ <h3>MongoDB helpers</h3>
94
+ <p>Connect collections and use high-level insert, find, update, delete, import, export, and backup APIs.</p>
95
+ </article>
96
+ <article>
97
+ <h3>Custom apps</h3>
98
+ <p>Load reusable modules from local paths, the global apps folder, or isite's built-in apps.</p>
99
+ </article>
100
+ <article>
101
+ <h3>WebSocket support</h3>
102
+ <p>Create WebSocket routes on the server and connect from the client with the bundled helper.</p>
103
+ </article>
104
+ </div>
105
+ </section>
106
+
107
+ <section class="doc-section" id="installation" data-tags="install npm start template startup">
108
+ <h2>Installation</h2>
109
+ <p>Install the package from npm, then create a server using the exported factory function.</p>
110
+ <pre><code>npm install isite</code></pre>
111
+ <h3>Minimal server</h3>
112
+ <pre><code>var isite = require('isite');
113
+ var site = isite({ port: 8080 });
114
+
115
+ site.loadLocalApp('client-side');
116
+ site.loadLocalApp('security');
117
+
118
+ site.run();</code></pre>
119
+ <h3>Startup template</h3>
120
+ <pre><code>git clone https://github.com/absunstar/isite-template
121
+ cd isite-template
122
+ npm i
123
+ npm start</code></pre>
124
+ </section>
125
+
126
+ <section class="doc-section" id="configuration" data-tags="configuration options port cwd app dir mongodb session security cache https">
127
+ <h2>Configuration</h2>
128
+ <p>
129
+ Pass an options object to <code>isite()</code>. The framework also initializes defaults for
130
+ folders, cache, MongoDB, sessions, security, language, HTTPS, and local apps.
131
+ </p>
132
+ <pre><code>var site = require('isite')({
133
+ port: process.env.port || 80,
134
+ cwd: process.cwd(),
135
+ dir: process.cwd() + '/site_files',
136
+ upload_dir: process.cwd() + '/../uploads',
137
+ download_dir: process.cwd() + '/../downloads',
138
+ backup_dir: process.cwd() + '/../backup',
139
+ apps: true,
140
+ apps_dir: process.cwd() + '/apps',
141
+ name: 'Your Site',
142
+ lang: 'en',
143
+ theme: 'default',
144
+ mongodb: {
145
+ enabled: true,
146
+ host: 'localhost',
147
+ port: '27017',
148
+ db: 'default_db',
149
+ collection: 'default_collection'
150
+ },
151
+ session: {
152
+ timeout: 60 * 24 * 30,
153
+ enabled: true,
154
+ storage: 'file'
155
+ },
156
+ security: {
157
+ enabled: true,
158
+ users_collection: 'users_info',
159
+ roles_collection: 'users_roles'
160
+ }
161
+ });</code></pre>
162
+ </section>
163
+
164
+ <section class="doc-section" id="folder-structure" data-tags="folder structure site_files html css js images fonts json xml apps">
165
+ <h2>Folder Structure</h2>
166
+ <p>
167
+ isite expects a <code>site_files</code> folder for public and parsed assets. Apps live in
168
+ <code>apps</code>, while uploads, downloads, and backups can be configured.
169
+ </p>
170
+ <pre><code>server.js
171
+ package.json
172
+ apps/
173
+ site_files/
174
+ css/
175
+ js/
176
+ html/
177
+ fonts/
178
+ images/
179
+ json/
180
+ xml/
181
+ uploads/
182
+ downloads/
183
+ backup/</code></pre>
184
+ </section>
185
+
186
+ <section class="doc-section" id="routing" data-tags="routes onget onpost onrequest wildcard dynamic folder merged cache parser compress">
187
+ <h2>Routing</h2>
188
+ <p>
189
+ Routes can return files, folders, merged files, JSON content, or callback output. Route names
190
+ and request parameters are normalized to lowercase, with raw variants available when needed.
191
+ </p>
192
+ <h3>Static file routes</h3>
193
+ <pre><code>site.onGET({ name: ['/', '/home', '/index'], path: site.dir + '/html/index.html' });
194
+ site.onGET({ name: '/css/bootstrap.css', path: site.dir + '/css/bootstrap.min.css' });
195
+ site.onPOST({ name: '/api', path: site.dir + '/json/employees.json' });</code></pre>
196
+ <h3>Merge multiple files</h3>
197
+ <pre><code>site.onGET({
198
+ name: '/css/style.css',
199
+ path: [
200
+ site.dir + '/css/bootstrap.css',
201
+ site.dir + '/css/custom.css'
202
+ ]
203
+ });</code></pre>
204
+ <h3>Callbacks, dynamic params, and wildcard routes</h3>
205
+ <pre><code>site.onGET('/post/:id/category/:cat_id', function (req, res) {
206
+ res.end('Post: ' + req.params.id + ', category: ' + req.params.cat_id);
207
+ });
208
+
209
+ site.onGET('/post/*', function (req, res) {
210
+ res.end('Any post route');
211
+ });
212
+
213
+ site.onGET('*', function (req, res) {
214
+ res.end('Fallback route');
215
+ });</code></pre>
216
+ </section>
217
+
218
+ <section class="doc-section" id="request-response" data-tags="request response query body params render redirect status json feature">
219
+ <h2>Request and Response</h2>
220
+ <p>
221
+ isite decorates request and response objects with helpers for query/body data, params, headers,
222
+ rendering, JSON responses, redirects, cookies, sessions, and user features.
223
+ </p>
224
+ <pre><code>site.onGET('/api', function (req, res) {
225
+ res.json({
226
+ queryName: req.query.name,
227
+ rawName: req.queryRaw.name,
228
+ ip: req.ip,
229
+ browserIsChrome: req.hasFeature('browser.chrome')
230
+ });
231
+ });
232
+
233
+ site.onPOST('/users', function (req, res) {
234
+ res.status(201).json({ done: true, user: req.body });
235
+ });
236
+
237
+ site.onGET('/old-url', function (req, res) {
238
+ res.redirect('/new-url', 302);
239
+ });</code></pre>
240
+ </section>
241
+
242
+ <section class="doc-section" id="files" data-tags="files readfile html css js json xml write delete mkdir stat cache">
243
+ <h2>Files</h2>
244
+ <p>
245
+ File helpers read from <code>site_files</code> by type, cache content in memory, merge files,
246
+ check stats, write data, and create or remove directories.
247
+ </p>
248
+ <pre><code>site.html('index', function (err, content) {
249
+ site.log(content);
250
+ });
251
+
252
+ site.readFiles([
253
+ site.dir + '/html/head.html',
254
+ site.dir + '/html/content.html',
255
+ site.dir + '/html/footer.html'
256
+ ], function (err, content) {
257
+ site.log(content);
258
+ });
259
+
260
+ site.isFileExists(path, function (yes) {});
261
+ site.fileStat(path, function (err, stats) {});
262
+ site.writeFile(path, data, function (err) {});
263
+ site.removeFile(path, function (err) {});
264
+ site.createDir(path, function (err, path) {});</code></pre>
265
+ </section>
266
+
267
+ <section class="doc-section" id="websocket" data-tags="websocket ws chat client server onws">
268
+ <h2>WebSocket</h2>
269
+ <p>Register WebSocket endpoints with <code>site.onWS()</code> and connect from the browser with <code>site.ws()</code>.</p>
270
+ <pre><code>site.onWS('/chat', function (client) {
271
+ client.onMessage = function (message) {
272
+ if (message.type === 'connected') {
273
+ client.send({ type: 'ready' });
274
+ }
275
+ };
276
+ });</code></pre>
277
+ <pre><code>&lt;script src="/x-js/all.js"&gt;&lt;/script&gt;
278
+ &lt;script&gt;
279
+ site.ws('ws://localhost/chat', function (server) {
280
+ server.onOpen = function () {
281
+ server.send({ type: 'accessToken', content: '##session.accessToken##' });
282
+ };
283
+ server.onMessage = function (msg) {
284
+ console.log(msg);
285
+ };
286
+ });
287
+ &lt;/script&gt;</code></pre>
288
+ </section>
289
+
290
+ <section class="doc-section" id="sessions" data-tags="cookie cookies session sessions access token users">
291
+ <h2>Cookies and Sessions</h2>
292
+ <p>
293
+ Cookies store client-side values per user. Sessions store server-side user data and are
294
+ automatically associated with an access token.
295
+ </p>
296
+ <pre><code>site.onGET('/testSetCookie', function (req, res) {
297
+ res.cookie('name', req.query.name);
298
+ res.end('cookie set');
299
+ });
300
+
301
+ site.onGET('/testGetCookie', function (req, res) {
302
+ res.end('name from cookie: ' + req.cookie('name'));
303
+ });</code></pre>
304
+ <pre><code>site.onGET('/testSetSession', function (req, res) {
305
+ req.session.user_name = req.query.user_name;
306
+ res.session.ip = req.ip;
307
+ site.saveSession(res.session);
308
+ res.end('Session set');
309
+ });</code></pre>
310
+ </section>
311
+
312
+ <section class="doc-section" id="apps" data-tags="apps modules custom loadlocalapp importapp github">
313
+ <h2>Custom Apps</h2>
314
+ <p>
315
+ Apps are modules that receive the <code>site</code> instance. They can register routes, words,
316
+ variables, permissions, roles, and app-specific logic.
317
+ </p>
318
+ <pre><code>// apps/my-app/app.js
319
+ module.exports = function (site) {
320
+ site.onGET('/my-app', function (req, res) {
321
+ res.send('My app is loaded');
322
+ });
323
+ };</code></pre>
324
+ <pre><code>site.importApp(FOLDER_PATH);
325
+ site.loadApp('my-app');
326
+ site.loadLocalApp('security');</code></pre>
327
+ </section>
328
+
329
+ <section class="doc-section" id="master-pages" data-tags="master page layout header footer parser">
330
+ <h2>Master Pages</h2>
331
+ <p>Master pages wrap route content with shared header and footer files.</p>
332
+ <pre><code>site.addMasterPage({
333
+ name: 'main',
334
+ header: site.dir + '/html/header.html',
335
+ footer: site.dir + '/html/footer.html'
336
+ });
337
+
338
+ site.onGET({
339
+ name: '/contact',
340
+ masterPage: 'main',
341
+ path: site.dir + '/html/contact.html',
342
+ parser: 'html'
343
+ });</code></pre>
344
+ </section>
345
+
346
+ <section class="doc-section" id="server-tags" data-tags="server tags x-import x-lang x-permission x-feature variables words parser">
347
+ <h2>HTML Server Tags and Attributes</h2>
348
+ <p>
349
+ Enable <code>parser: 'html'</code> to import site files, inject variables, use words, and show
350
+ content conditionally by language, permission, login state, browser, operating system, or IP.
351
+ </p>
352
+ <pre><code>site.var('siteName', 'First Site With isite');
353
+ site.onGET({ name: '/', path: site.dir + '/html/index.html', parser: 'html' });</code></pre>
354
+ <pre><code>&lt;style x-import="page.css"&gt;&lt;/style&gt;
355
+ &lt;div x-import="navbar.html"&gt;&lt;/div&gt;
356
+ &lt;title&gt;##var.siteName##&lt;/title&gt;
357
+ &lt;h2&gt;##word.user_name##&lt;/h2&gt;
358
+
359
+ &lt;div x-lang="Ar"&gt;Arabic content&lt;/div&gt;
360
+ &lt;div x-permission="admin"&gt;Admins only&lt;/div&gt;
361
+ &lt;div x-feature="login"&gt;Logged-in users&lt;/div&gt;
362
+ &lt;div x-feature="browser.chrome"&gt;Chrome users&lt;/div&gt;</code></pre>
363
+ </section>
364
+
365
+ <section class="doc-section" id="mongodb" data-tags="mongodb database collection connectcollection insert find update delete backup restore index duplicate">
366
+ <h2>MongoDB</h2>
367
+ <p>
368
+ Use <code>site.connectCollection()</code> for high-level collection access, or
369
+ <code>site.mongodb</code> for lower-level database operations.
370
+ </p>
371
+ <pre><code>var employees = site.connectCollection('employees', 'company');
372
+
373
+ employees.insertOne({ name: 'amr', salary: 50000 }, function (err, doc) {});
374
+
375
+ employees.findMany({
376
+ where: { name: /a/i },
377
+ select: { name: 1, salary: 1 },
378
+ limit: 50,
379
+ skip: 10,
380
+ sort: { salary: -1 }
381
+ }, function (err, docs, count) {});
382
+
383
+ employees.updateOne({
384
+ where: { id: 5 },
385
+ set: { salary: 30000 }
386
+ }, function (err, result) {});
387
+
388
+ employees.deleteOne({ where: { id: 5 } }, function (err, result) {});</code></pre>
389
+ <pre><code>site.backupDB();
390
+ site.restoreDB();
391
+ employees.createIndex({ name: 1 }, {}, function (err, result) {});
392
+ employees.createUnique({ email: 1 }, function (err, result) {});</code></pre>
393
+ </section>
394
+
395
+ <section class="doc-section" id="upload-download" data-tags="upload download formidable files mv multipart">
396
+ <h2>Upload and Download</h2>
397
+ <p>isite parses uploaded files and provides response helpers for forced downloads.</p>
398
+ <pre><code>&lt;form action="uploadFile" method="post" enctype="multipart/form-data"&gt;
399
+ &lt;input type="file" name="fileToUpload" /&gt;
400
+ &lt;input type="submit" /&gt;
401
+ &lt;/form&gt;</code></pre>
402
+ <pre><code>site.onPOST('uploadFile', function (req, res) {
403
+ var response = { done: true };
404
+ var file = req.files.fileToUpload;
405
+ var newpath = site.options.upload_dir + '/' + file.originalFilename;
406
+
407
+ site.mv(file.filepath, newpath, function (err) {
408
+ if (err) {
409
+ response.done = false;
410
+ response.error = err;
411
+ }
412
+ res.json(response);
413
+ });
414
+ });
415
+
416
+ site.onGET('/files/file1.zip', function (req, res) {
417
+ res.download(site.options.download_dir + '/file1.zip', 'info.zip');
418
+ });</code></pre>
419
+ </section>
420
+
421
+ <section class="doc-section" id="languages" data-tags="multi language words json x-lang word change language arabic english">
422
+ <h2>Multi Language</h2>
423
+ <p>
424
+ Store translated words in <code>site_files/json/words.json</code>, use <code>##word.name##</code>
425
+ in HTML, and switch language with <code>/x-language/change</code>.
426
+ </p>
427
+ <pre><code>[
428
+ { "name": "user_name", "En": "User Name", "Ar": "اسم المستخدم" },
429
+ { "name": "user_email", "En": "Email", "Ar": "البريد الالكترونى" }
430
+ ]</code></pre>
431
+ <pre><code>&lt;label&gt;##word.user_name##&lt;/label&gt;
432
+ &lt;div x-lang="Ar"&gt;Arabic content&lt;/div&gt;
433
+ &lt;div x-lang="En"&gt;English content&lt;/div&gt;</code></pre>
434
+ </section>
435
+
436
+ <section class="doc-section" id="client-libraries" data-tags="client libraries jquery bootstrap angular font awesome x-css x-js charts">
437
+ <h2>Client Libraries and Charts</h2>
438
+ <p>
439
+ The client-side app exposes common browser libraries through fixed routes. The charts app adds
440
+ local chart creation helpers.
441
+ </p>
442
+ <pre><code>site.loadLocalApp('client-side');
443
+ site.loadLocalApp('charts');</code></pre>
444
+ <pre><code>&lt;link rel="stylesheet" href="/x-css/bootstrap3.css" /&gt;
445
+ &lt;link rel="stylesheet" href="/x-css/font-awesome.css" /&gt;
446
+ &lt;script src="/x-js/jquery.js"&gt;&lt;/script&gt;
447
+ &lt;script src="/x-js/bootstrap3.js"&gt;&lt;/script&gt;
448
+ &lt;script src="/x-js/angular.js"&gt;&lt;/script&gt;</code></pre>
449
+ </section>
450
+
451
+ <section class="doc-section" id="helpers" data-tags="helpers md5 base64 json copy render feature request response">
452
+ <h2>Helpers</h2>
453
+ <p>isite includes helpers for rendering, hashing, encoding, JSON conversion, object copying, and feature checks.</p>
454
+ <pre><code>res.render('index.html', { name: 'amr' }, {
455
+ compress: true,
456
+ cache: false,
457
+ parser: 'html css js'
458
+ });
459
+
460
+ var copy = site.copy({ name: 'amr' });
461
+ var hash = site.md5('content');
462
+ var base64 = site.toBase64('content');
463
+ var normal = site.fromBase64(base64);
464
+ var jsonString = site.toJson(copy);
465
+ var jsonObj = site.fromJson(jsonString);</code></pre>
466
+ </section>
467
+
468
+ <section class="doc-section" id="events" data-tags="events on call quee queue sync async callback">
469
+ <h2>Events</h2>
470
+ <p>Global events let apps and routes communicate across the site lifecycle.</p>
471
+ <pre><code>site.on('event name', function (obj) {
472
+ site.log('name: ' + obj.name);
473
+ });
474
+
475
+ site.call('event name', { name: 'x1' });
476
+
477
+ site.on('sync event name', function (obj, callback, next) {
478
+ site.log(obj.name);
479
+ next();
480
+ });
481
+
482
+ site.quee('sync event name', { name: 'x2' });</code></pre>
483
+ </section>
484
+
485
+ <section class="doc-section" id="api" data-tags="api reference methods onget onpost files mongodb websocket apps sessions helpers">
486
+ <h2>API Reference</h2>
487
+ <div class="table-wrap">
488
+ <table>
489
+ <thead>
490
+ <tr>
491
+ <th>Area</th>
492
+ <th>Methods and properties</th>
493
+ </tr>
494
+ </thead>
495
+ <tbody>
496
+ <tr>
497
+ <td>Server</td>
498
+ <td><code>site.run</code>, <code>site.start</code>, <code>site.listen</code>, <code>site.close</code></td>
499
+ </tr>
500
+ <tr>
501
+ <td>Routing</td>
502
+ <td><code>onREQUEST</code>, <code>onGET</code>, <code>onPOST</code>, <code>onPUT</code>, <code>onDELETE</code>, <code>onALL</code>, <code>callRoute</code></td>
503
+ </tr>
504
+ <tr>
505
+ <td>Extra methods</td>
506
+ <td><code>onPATCH</code>, <code>onOPTIONS</code>, <code>onHEAD</code>, <code>onVIEW</code>, <code>onCOPY</code>, <code>onLINK</code>, <code>onUNLINK</code>, <code>onLOCK</code>, <code>onUNLOCK</code></td>
507
+ </tr>
508
+ <tr>
509
+ <td>Files</td>
510
+ <td><code>html</code>, <code>css</code>, <code>js</code>, <code>json</code>, <code>xml</code>, <code>readFile</code>, <code>readFiles</code>, <code>writeFile</code>, <code>removeFile</code>, <code>createDir</code></td>
511
+ </tr>
512
+ <tr>
513
+ <td>Apps</td>
514
+ <td><code>importApp</code>, <code>importApps</code>, <code>loadApp</code>, <code>loadLocalApp</code>, <code>addApp</code>, <code>getApp</code></td>
515
+ </tr>
516
+ <tr>
517
+ <td>Database</td>
518
+ <td><code>connectCollection</code>, <code>mongodb</code>, <code>backupDB</code>, <code>restoreDB</code></td>
519
+ </tr>
520
+ <tr>
521
+ <td>HTML parser</td>
522
+ <td><code>var</code>, <code>addVars</code>, <code>word</code>, <code>words.addFile</code>, <code>addMasterPage</code></td>
523
+ </tr>
524
+ <tr>
525
+ <td>Utilities</td>
526
+ <td><code>copy</code>, <code>md5</code>, <code>toBase64</code>, <code>fromBase64</code>, <code>toJson</code>, <code>fromJson</code>, <code>cmd</code>, <code>fetch</code></td>
527
+ </tr>
528
+ </tbody>
529
+ </table>
530
+ </div>
531
+ </section>
532
+
533
+ <section class="doc-section" id="function-index" data-tags="complete all functions public api methods collection mongodb security websocket helpers response request">
534
+ <h2>Complete Function Index</h2>
535
+ <p>
536
+ This index lists the public and commonly consumed functions found in the isite source. Some
537
+ aliases call the same implementation, so they are grouped together.
538
+ </p>
539
+
540
+ <div class="function-index">
541
+ <article>
542
+ <h3>Site lifecycle and core</h3>
543
+ <div class="method-list">
544
+ <code>isite(options)</code>
545
+ <code>site.run()</code>
546
+ <code>site.start()</code>
547
+ <code>site.listen()</code>
548
+ <code>site.close(wait)</code>
549
+ <code>site.reset()</code>
550
+ <code>site.require(filePath)</code>
551
+ <code>site.cmd(command, callback)</code>
552
+ <code>site.log(...args)</code>
553
+ <code>site.canRequire(name)</code>
554
+ <code>site.newURL(url, base)</code>
555
+ <code>site.requireFromString(code, filename, opts)</code>
556
+ </div>
557
+ </article>
558
+
559
+ <article>
560
+ <h3>Routing</h3>
561
+ <div class="method-list">
562
+ <code>site.onREQUEST(method, route, callback)</code>
563
+ <code>site.onGET(route, callback)</code>
564
+ <code>site.get(route, callback)</code>
565
+ <code>site.onPOST(route, callback)</code>
566
+ <code>site.post(route, callback)</code>
567
+ <code>site.onPUT(route, callback)</code>
568
+ <code>site.put(route, callback)</code>
569
+ <code>site.onDELETE(route, callback)</code>
570
+ <code>site.delete(route, callback)</code>
571
+ <code>site.onALL(route, callback)</code>
572
+ <code>site.all(route, callback)</code>
573
+ <code>site.onTEST(route, callback)</code>
574
+ <code>site.test(route, callback)</code>
575
+ <code>site.onVIEW(route, callback)</code>
576
+ <code>site.onOPTIONS(route, callback)</code>
577
+ <code>site.onPATCH(route, callback)</code>
578
+ <code>site.onCOPY(route, callback)</code>
579
+ <code>site.onHEAD(route, callback)</code>
580
+ <code>site.onLINK(route, callback)</code>
581
+ <code>site.onUNLINK(route, callback)</code>
582
+ <code>site.onPURGE(route, callback)</code>
583
+ <code>site.onLOCK(route, callback)</code>
584
+ <code>site.onUNLOCK(route, callback)</code>
585
+ <code>site.onPROPFIND(route, callback)</code>
586
+ <code>site.callRoute(name, req, res)</code>
587
+ <code>site.off(routeOrPath)</code>
588
+ </div>
589
+ </article>
590
+
591
+ <article>
592
+ <h3>Request helpers</h3>
593
+ <div class="method-list">
594
+ <code>req.addFeature(name)</code>
595
+ <code>req.hasFeature(name)</code>
596
+ <code>req.removeFeature(name)</code>
597
+ <code>req.getUserFinger()</code>
598
+ <code>req.word(name)</code>
599
+ <code>req.cookie(name)</code>
600
+ <code>req.cookies(name)</code>
601
+ </div>
602
+ </article>
603
+
604
+ <article>
605
+ <h3>Response helpers</h3>
606
+ <div class="method-list">
607
+ <code>res.set(name, value)</code>
608
+ <code>res.status(code)</code>
609
+ <code>res.error(code)</code>
610
+ <code>res.download(path, name)</code>
611
+ <code>res.download2(path, name)</code>
612
+ <code>res.render(file, data, options)</code>
613
+ <code>res.html(file, data, options)</code>
614
+ <code>res.txt(name, data)</code>
615
+ <code>res.css(name, data)</code>
616
+ <code>res.js(name, data)</code>
617
+ <code>res.jsonFile(name, data)</code>
618
+ <code>res.send(content)</code>
619
+ <code>res.sendHTML(content)</code>
620
+ <code>res.htmlContent(content)</code>
621
+ <code>res.textContent(text)</code>
622
+ <code>res.sendTEXT(text)</code>
623
+ <code>res.json(object, time)</code>
624
+ <code>res.redirect(url, code)</code>
625
+ <code>res.remove(name)</code>
626
+ <code>res.delete(name)</code>
627
+ <code>res.cookie(name, value)</code>
628
+ <code>res.cookies(name, value)</code>
629
+ </div>
630
+ </article>
631
+
632
+ <article>
633
+ <h3>File system</h3>
634
+ <div class="method-list">
635
+ <code>site.fileStat(path, callback)</code>
636
+ <code>site.fileStatSync(path)</code>
637
+ <code>site.css(name, callback)</code>
638
+ <code>site.xml(name, callback)</code>
639
+ <code>site.js(name, callback)</code>
640
+ <code>site.json(name, callback)</code>
641
+ <code>site.html(name, callback)</code>
642
+ <code>site.download(name, req, res)</code>
643
+ <code>site.downloadFile(path, req, res)</code>
644
+ <code>site.isFileExists(path, callback)</code>
645
+ <code>site.isFileExistsSync(path)</code>
646
+ <code>site.readFile(path, callback)</code>
647
+ <code>site.readFileRaw(path, callback)</code>
648
+ <code>site.readFileStream(path)</code>
649
+ <code>site.readFiles(paths, callback)</code>
650
+ <code>site.readFileSync(path)</code>
651
+ <code>site.writeFile(path, data, callback)</code>
652
+ <code>site.writeFileSync(path, data, encode, callback)</code>
653
+ <code>site.removeFile(path, callback)</code>
654
+ <code>site.deleteFile(path, callback)</code>
655
+ <code>site.removeFileSync(path)</code>
656
+ <code>site.deleteFileSync(path)</code>
657
+ <code>site.createDir(path, callback)</code>
658
+ <code>site.mkDir(path, callback)</code>
659
+ <code>site.createDirSync(path)</code>
660
+ <code>site.mkdirSync(path)</code>
661
+ </div>
662
+ </article>
663
+
664
+ <article>
665
+ <h3>Events and features</h3>
666
+ <div class="method-list">
667
+ <code>site.on(name, callback)</code>
668
+ <code>site.call(name, args, callback)</code>
669
+ <code>site.quee(name, args, callback)</code>
670
+ <code>site.quee_check(name, fire)</code>
671
+ <code>site.addFeature(name, value)</code>
672
+ <code>site.getFeature(name)</code>
673
+ <code>site.hasFeature(name)</code>
674
+ <code>site.feature(name, value)</code>
675
+ <code>site.addfeatures(path)</code>
676
+ </div>
677
+ </article>
678
+
679
+ <article>
680
+ <h3>Variables, words, and master pages</h3>
681
+ <div class="method-list">
682
+ <code>site.addVar(name, value)</code>
683
+ <code>site.getVar(name)</code>
684
+ <code>site.var(name, value)</code>
685
+ <code>site.addVars(path)</code>
686
+ <code>site.word(obj)</code>
687
+ <code>site.words.word(obj)</code>
688
+ <code>site.words.get(name)</code>
689
+ <code>site.words.add(word)</code>
690
+ <code>site.words.set(word)</code>
691
+ <code>site.words.addList(list)</code>
692
+ <code>site.words.addFile(path)</code>
693
+ <code>site.words.save()</code>
694
+ <code>site.addMasterPage(page)</code>
695
+ </div>
696
+ </article>
697
+
698
+ <article>
699
+ <h3>Apps</h3>
700
+ <div class="method-list">
701
+ <code>site.addApp(app)</code>
702
+ <code>site.getApp(name)</code>
703
+ <code>site.connectApp(appOptions)</code>
704
+ <code>site.importApp(appPath, name2)</code>
705
+ <code>site.importApps(appDir)</code>
706
+ <code>site.loadApp(name, name2)</code>
707
+ <code>site.loadLocalApp(name, name2)</code>
708
+ <code>app.init()</code>
709
+ <code>app.add(item, callback)</code>
710
+ <code>app.update(item, callback)</code>
711
+ <code>app.delete(item, callback)</code>
712
+ <code>app.view(item, callback)</code>
713
+ <code>app.all(options, callback)</code>
714
+ <code>app.handleRequest(req, res, callback)</code>
715
+ <code>app.api(apiOptions, callback)</code>
716
+ </div>
717
+ </article>
718
+
719
+ <article>
720
+ <h3>Collections</h3>
721
+ <div class="method-list">
722
+ <code>site.connectCollection(option, db)</code>
723
+ <code>collection.insertOne(doc, callback)</code>
724
+ <code>collection.insert(doc, callback)</code>
725
+ <code>collection.add(doc, callback)</code>
726
+ <code>collection.addOne(doc, callback)</code>
727
+ <code>collection.insertMany(docs, callback)</code>
728
+ <code>collection.addMany(docs, callback)</code>
729
+ <code>collection.insertAll(docs, callback)</code>
730
+ <code>collection.addAll(docs, callback)</code>
731
+ <code>collection.update(options, callback)</code>
732
+ <code>collection.updateOne(options, callback)</code>
733
+ <code>collection.edit(options, callback)</code>
734
+ <code>collection.editOne(options, callback)</code>
735
+ <code>collection.updateMany(options, callback)</code>
736
+ <code>collection.editMany(options, callback)</code>
737
+ <code>collection.updateAll(options, callback)</code>
738
+ <code>collection.editAll(options, callback)</code>
739
+ <code>collection.delete(options, callback)</code>
740
+ <code>collection.deleteOne(options, callback)</code>
741
+ <code>collection.remove(options, callback)</code>
742
+ <code>collection.removeOne(options, callback)</code>
743
+ <code>collection.deleteMany(options, callback)</code>
744
+ <code>collection.removeMany(options, callback)</code>
745
+ <code>collection.deleteAll(options, callback)</code>
746
+ <code>collection.removeAll(options, callback)</code>
747
+ <code>collection.get(options, callback)</code>
748
+ <code>collection.getOne(options, callback)</code>
749
+ <code>collection.find(options, callback)</code>
750
+ <code>collection.findOne(options, callback)</code>
751
+ <code>collection.select(options, callback)</code>
752
+ <code>collection.selectOne(options, callback)</code>
753
+ <code>collection.getMany(options, callback)</code>
754
+ <code>collection.getAll(options, callback)</code>
755
+ <code>collection.findAll(options, callback)</code>
756
+ <code>collection.findMany(options, callback)</code>
757
+ <code>collection.selectAll(options, callback)</code>
758
+ <code>collection.selectMany(options, callback)</code>
759
+ <code>collection.count(options, callback)</code>
760
+ <code>collection.getCount(options, callback)</code>
761
+ <code>collection.ObjectId(id)</code>
762
+ <code>collection.ObjectID(id)</code>
763
+ <code>collection.drop(callback)</code>
764
+ <code>collection.createUnique(obj, callback)</code>
765
+ <code>collection.createIndex(obj, options, callback)</code>
766
+ <code>collection.dropIndex(obj, options, callback)</code>
767
+ <code>collection.dropIndexes(options, callback)</code>
768
+ <code>collection.aggregate(pipeline, callback)</code>
769
+ <code>collection.findDuplicate(obj, callback)</code>
770
+ <code>collection.deleteDuplicate(obj, callback)</code>
771
+ <code>collection.removeDuplicate(obj, callback)</code>
772
+ <code>collection.loadAll(options, callback)</code>
773
+ <code>collection.import(filePath, callback)</code>
774
+ <code>collection.export(options, filePath, callback)</code>
775
+ </div>
776
+ </article>
777
+
778
+ <article>
779
+ <h3>MongoDB low-level</h3>
780
+ <div class="method-list">
781
+ <code>site.mongodb.ObjectID(id)</code>
782
+ <code>site.mongodb.ObjectId(id)</code>
783
+ <code>site.mongodb.handleDoc(doc, badLetter)</code>
784
+ <code>site.mongodb.connectDB(name, callback)</code>
785
+ <code>site.mongodb.connectCollection(options, callback)</code>
786
+ <code>site.mongodb.createIndex(options, callback)</code>
787
+ <code>site.mongodb.dropIndex(options, callback)</code>
788
+ <code>site.mongodb.dropIndexes(options, callback)</code>
789
+ <code>site.mongodb.aggregate(options, callback)</code>
790
+ <code>site.mongodb.dropCollection(options, callback)</code>
791
+ <code>site.mongodb.insertOne(options, callback)</code>
792
+ <code>site.mongodb.insert(options, callback)</code>
793
+ <code>site.mongodb.insertMany(options, callback)</code>
794
+ <code>site.mongodb.findOne(options, callback)</code>
795
+ <code>site.mongodb.find(options, callback)</code>
796
+ <code>site.mongodb.findMany(options, callback)</code>
797
+ <code>site.mongodb.count(options, callback)</code>
798
+ <code>site.mongodb.distinct(options, callback)</code>
799
+ <code>site.mongodb.updateOne(options, callback)</code>
800
+ <code>site.mongodb.update(options, callback)</code>
801
+ <code>site.mongodb.updateMany(options, callback)</code>
802
+ <code>site.mongodb.deleteOne(options, callback)</code>
803
+ <code>site.mongodb.delete(options, callback)</code>
804
+ <code>site.mongodb.deleteMany(options, callback)</code>
805
+ <code>site.backupDB(options, callback)</code>
806
+ <code>site.restoreDB(options, callback)</code>
807
+ </div>
808
+ </article>
809
+
810
+ <article>
811
+ <h3>Security</h3>
812
+ <div class="method-list">
813
+ <code>site.security.addKey(key)</code>
814
+ <code>site.security.addPermissions(list, callback)</code>
815
+ <code>site.security.addRole(role, callback)</code>
816
+ <code>site.security.updateRole(role, callback)</code>
817
+ <code>site.security.editeRole(role, callback)</code>
818
+ <code>site.security.deleteRole(role, callback)</code>
819
+ <code>site.security.removeRole(role, callback)</code>
820
+ <code>site.security.addRoles(list, callback)</code>
821
+ <code>site.security.removeUserFinger(obj)</code>
822
+ <code>site.security.getUserFinger(obj)</code>
823
+ <code>site.security.handleUser(user)</code>
824
+ <code>site.security.loadAllUsers(callback)</code>
825
+ <code>site.security.loadAllRoles(callback)</code>
826
+ <code>site.security.getUsers(options, callback)</code>
827
+ <code>site.security.getUser(user, callback)</code>
828
+ <code>site.security.isUserExists(user, callback)</code>
829
+ <code>site.security.login(user, callback)</code>
830
+ <code>site.security.register(user, callback)</code>
831
+ <code>site.security.logout(req, res, callback)</code>
832
+ <code>site.security.addUser(user, callback)</code>
833
+ <code>site.security.updateUser(user, callback)</code>
834
+ <code>site.security.deleteUser(user, callback)</code>
835
+ <code>site.security.isUserLogin(req, res)</code>
836
+ <code>site.security.isUserHasPermission(req, res, permission)</code>
837
+ <code>site.security.isUserHasPermissions(req, res, permissions)</code>
838
+ <code>site.security.isUserHasRole(req, res, role)</code>
839
+ <code>site.security.isUserHasRoles(req, res, roles)</code>
840
+ <code>site.security.getUserPermissions(req, res)</code>
841
+ <code>site.security.getUserRoles(req, res)</code>
842
+ <code>site.security.addUserPermission(id, permission, callback)</code>
843
+ </div>
844
+ </article>
845
+
846
+ <article>
847
+ <h3>Sessions, storage, and logs</h3>
848
+ <div class="method-list">
849
+ <code>site.getSession(req, callback)</code>
850
+ <code>site.sessions.attach(req, callback)</code>
851
+ <code>site.saveSession(session)</code>
852
+ <code>site.sessions.save(session)</code>
853
+ <code>site.storage(key, value)</code>
854
+ <code>site.logs(key, value)</code>
855
+ </div>
856
+ </article>
857
+
858
+ <article>
859
+ <h3>WebSocket</h3>
860
+ <div class="method-list">
861
+ <code>site.onWS(options, callback)</code>
862
+ <code>site.ws.start(options, callback)</code>
863
+ <code>site.ws.sendToAll(message)</code>
864
+ <code>site.ws.closeAll()</code>
865
+ <code>site.ws.onNewSupportedClient(client)</code>
866
+ <code>site.ws.wsSupport()</code>
867
+ <code>site.ws.supportHandle(client, message)</code>
868
+ </div>
869
+ </article>
870
+
871
+ <article>
872
+ <h3>General utilities</h3>
873
+ <div class="method-list">
874
+ <code>site.copy(obj)</code>
875
+ <code>site.toNumber(value)</code>
876
+ <code>site.to_number(value)</code>
877
+ <code>site.toInt(value)</code>
878
+ <code>site.to_int(value)</code>
879
+ <code>site.toFloat(value)</code>
880
+ <code>site.to_float(value)</code>
881
+ <code>site.toMoney(value, float)</code>
882
+ <code>site.random(min, max)</code>
883
+ <code>site.guid()</code>
884
+ <code>site.getRegExp(text, flag)</code>
885
+ <code>site.get_RegExp(text, flag)</code>
886
+ <code>site.fetchURLContent(options, callback)</code>
887
+ <code>site.fetch(url, options)</code>
888
+ <code>site.request(url, options)</code>
889
+ <code>site.AI(text)</code>
890
+ <code>site.hide(data)</code>
891
+ <code>site.hideObject(data)</code>
892
+ <code>site.show(data)</code>
893
+ <code>site.showObject(data)</code>
894
+ <code>site.ul(data)</code>
895
+ <code>site.removeRefObject(obj)</code>
896
+ <code>site.objectDiff(obj1, obj2)</code>
897
+ <code>site.toHtmlTable(obj)</code>
898
+ <code>site.typeof(value)</code>
899
+ <code>site.typeOf(value)</code>
900
+ <code>site.escapeRegExp(text)</code>
901
+ </div>
902
+ </article>
903
+
904
+ <article>
905
+ <h3>Date, JSON, and encoding</h3>
906
+ <div class="method-list">
907
+ <code>site.getDate(value)</code>
908
+ <code>site.toDate(value)</code>
909
+ <code>site.toDateOnly(value)</code>
910
+ <code>site.toDateTime(value)</code>
911
+ <code>site.getDateTime(value)</code>
912
+ <code>site.toDateX(value)</code>
913
+ <code>site.toDateXT(value)</code>
914
+ <code>site.toDateXF(value)</code>
915
+ <code>site.toDateT(value)</code>
916
+ <code>site.toDateF(value)</code>
917
+ <code>site.yy()</code>
918
+ <code>site.mm()</code>
919
+ <code>site.dd()</code>
920
+ <code>site.fromJson(data, defaultValue)</code>
921
+ <code>site.fromJSON(data, defaultValue)</code>
922
+ <code>site.toJson(obj)</code>
923
+ <code>site.toJSON(obj)</code>
924
+ <code>site.toBase64(data)</code>
925
+ <code>site.fromBase64(data)</code>
926
+ <code>site.to123(data)</code>
927
+ <code>site.from123(data)</code>
928
+ <code>site.f1(data)</code>
929
+ <code>site.getContentType(path)</code>
930
+ <code>site.getFileEncode(path)</code>
931
+ <code>site.md5(text)</code>
932
+ <code>site.hash(text)</code>
933
+ </div>
934
+ </article>
935
+
936
+ <article>
937
+ <h3>Email, Telegram, PDF, and proxy</h3>
938
+ <div class="method-list">
939
+ <code>site.sendEmail(mail, callback)</code>
940
+ <code>site.sendMail(mail, callback)</code>
941
+ <code>site.sendFreeMail(mail, callback)</code>
942
+ <code>site.sendSmptMail(mail, callback)</code>
943
+ <code>site.checkMailConfig(mail, callback)</code>
944
+ <code>site.connectTelegramClient(session, apiId, apiHash, options)</code>
945
+ <code>site.telegramInit(token, onNewMessage, polling)</code>
946
+ <code>site.newTelegramBot(data, onNewMessage, polling)</code>
947
+ <code>site.sendTelegramMessage(token, chatID, message)</code>
948
+ <code>site.initFontKit(options, callback)</code>
949
+ <code>site.loadPDF(options, callback)</code>
950
+ <code>site.httpTrustedOnline()</code>
951
+ <code>site.startProxy(options)</code>
952
+ <code>site.closeProxy(options)</code>
953
+ </div>
954
+ </article>
955
+
956
+ <article>
957
+ <h3>Prototype helpers</h3>
958
+ <div class="method-list">
959
+ <code>String.prototype.test(reg, flag)</code>
960
+ <code>String.prototype.like(name)</code>
961
+ <code>String.prototype.contains(name)</code>
962
+ <code>String.prototype.contain(name)</code>
963
+ <code>Array.prototype.test(reg, flag)</code>
964
+ <code>Array.prototype.like(name)</code>
965
+ <code>Array.prototype.contains(name)</code>
966
+ <code>Array.prototype.contain(name)</code>
967
+ </div>
968
+ </article>
969
+ </div>
970
+ </section>
971
+
972
+ <section class="doc-section" id="ai-agent-files" data-tags="ai agent llms context api map examples guide">
973
+ <h2>AI Agent Files</h2>
974
+ <p>
975
+ These files are included to help AI coding agents understand the library quickly and make
976
+ safer changes in this repository.
977
+ </p>
978
+ <div class="feature-grid">
979
+ <article>
980
+ <h3>Agent guide</h3>
981
+ <p><a href="agent-guide.md">agent-guide.md</a> explains the repo structure, architecture, conventions, and safe editing notes.</p>
982
+ </article>
983
+ <article>
984
+ <h3>LLM index</h3>
985
+ <p><a href="llms.txt">llms.txt</a> gives tools and crawlers a compact public index of the project and docs.</p>
986
+ </article>
987
+ <article>
988
+ <h3>AI context</h3>
989
+ <p><a href="ai-context.md">ai-context.md</a> summarizes the framework mental model, startup flow, APIs, and pitfalls.</p>
990
+ </article>
991
+ <article>
992
+ <h3>API map</h3>
993
+ <p><a href="api-map.json">api-map.json</a> provides a machine-readable map of source files and public API groups.</p>
994
+ </article>
995
+ <article>
996
+ <h3>Examples</h3>
997
+ <p><a href="examples-for-ai.md">examples-for-ai.md</a> contains common recipes for routes, CRUD, uploads, WebSocket, and apps.</p>
998
+ </article>
999
+ </div>
1000
+ </section>
1001
+
1002
+ <p class="empty-state" id="emptyState">No sections match your search.</p>
1003
+ </main>
1004
+
1005
+ <button class="top-button" id="topButton" type="button" aria-label="Back to top">↑</button>
1006
+
1007
+ <script src="script.js"></script>
1008
+ </body>
1009
+ </html>