@cilix/lightjs 0.0.1 → 0.0.2

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 (3) hide show
  1. package/README.md +146 -157
  2. package/index.js +12 -15
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -56,32 +56,170 @@ Light.js is **alpha** software. This documentation is a work in progress, but it
56
56
  ## Table of Contents
57
57
 
58
58
  - [Quick Start](#quick-start)
59
+ - [Usage](#usage)
59
60
  - [Syntax](#syntax)
60
61
  - [Document](#document)
61
62
  - [Data](#data)
62
63
  - [Control Flow](#control-flow)
63
64
  - [Components](#components)
64
65
  - [Javascript](#javascript)
65
- - [Usage](#usage)
66
66
 
67
67
  ## Quick Start
68
68
 
69
- Create a project boilerplate using Light.js's built-in backend router:
69
+ Create a project boilerplate using Light.js's built-in backend router. Usage below:
70
70
 
71
71
  ```bash
72
72
  npx lightjs create my-app
73
73
  ```
74
74
 
75
- Light.js is extremely flexible and can be used with any backend. Use the following command to create the same boilerplate but using Express instead:
75
+ ## Usage
76
76
 
77
- ```bash
78
- npx lightjs create my-app --express
77
+ ### `lightjs.compile()`
78
+
79
+ Fundamentally, Light.js is a library that takes in a Light.js source tree and outputs a single HTML file or string.
80
+
81
+ ```javascript
82
+ const lightjs = require('lightjs');
83
+
84
+ lightjs.compile({
85
+ input: 'src/index.lightjs',
86
+ output: 'public/index.html'
87
+ });
79
88
  ```
80
89
 
81
- And for the smallest possible boilerplate, use this command:
90
+ No other step is required for a fully reactive, bundled, minified application.
82
91
 
83
- ```bash
84
- npx lightjs create my-app --lean
92
+ This function may also be used to serve dynamic content in real time.
93
+
94
+ ```javascript
95
+ const express = require('express');
96
+ const lightjs = require('lightjs');
97
+
98
+ const app = express();
99
+
100
+ app.get('/', async (req, res) => {
101
+ const html = await lightjs.compile({
102
+ input: 'src/index.lightjs'
103
+ });
104
+ res.end(html);
105
+ });
106
+
107
+ app.listen(3838);
108
+ ```
109
+
110
+ In order for the above example to have production quality speed, you must enable caching. And if desired, Javascript minification can be enabled as well:
111
+
112
+ ```javascript
113
+ const html = await lightjs.compile({
114
+ input: 'src/index.lightjs',
115
+ cache: true,
116
+ minify: true
117
+ });
118
+ ```
119
+
120
+ The last thing to know about Light.js's compile function is document data.
121
+
122
+ ```javascript
123
+ const html = await lightjs.compile({
124
+ input: 'src/about.lightjs',
125
+ data: {
126
+ pageTitle: 'About me'
127
+ }
128
+ });
129
+ ```
130
+
131
+ In your Light.js document pageTitle can be found on the global 'data' object:
132
+
133
+ ```javascript
134
+ // index.lightjs
135
+ html [
136
+ head []
137
+ body [
138
+ h1 '{{data.pageTitle}}'
139
+ ]
140
+ ]
141
+ ```
142
+
143
+ ### `lightjs.app()`
144
+
145
+ As mentioned above, Light.js ships with a built-in backend router. This router is exposed through the 'app' function, which returns a Node.js HTTP request handler.
146
+
147
+ ```javascript
148
+ const http = require('http');
149
+ const light = require('lightjs');
150
+
151
+ const PORT = 4477;
152
+
153
+ const app = light.app({
154
+ publicDir: './public',
155
+ cache: true,
156
+ minify: true,
157
+ routes: {
158
+ // map a route directly to a light file
159
+ '/': 'src/index.light',
160
+
161
+ // or for more complex arrangements, you can map the route to the same arguments you would pass to light.compile()
162
+ '/blog/:id': {
163
+ input: 'src/blog.light',
164
+ data: async (req) => {
165
+ const post = 'hi' // get blog post with req.params.id
166
+ return post
167
+ }
168
+ }
169
+ }
170
+ })
171
+
172
+ http.createServer(app).listen(PORT);
173
+ ```
174
+
175
+ Light.js's router is also completely compatible with Express:
176
+
177
+ ```javascript
178
+ const http = require('http');
179
+ const light = require('lightjs');
180
+ const express = require('express');
181
+
182
+ const PORT = 4477;
183
+
184
+ const app = express();
185
+
186
+ const lightRouter = light.app({
187
+ cache: true,
188
+ minify: true,
189
+ routes: {
190
+ // ...
191
+ }
192
+ })
193
+
194
+ app.use(express.static('public'));
195
+ app.use(lightRouter);
196
+
197
+ http.createServer(app).listen(PORT);
198
+ ```
199
+
200
+ Or, as previously mentioned, you can simply use `light.compile` with Express:
201
+
202
+ ```javascript
203
+ const http = require('http');
204
+ const light = require('lightjs');
205
+ const express = require('express');
206
+
207
+ const PORT = 4477;
208
+
209
+ const app = express();
210
+
211
+ app.get('/', async (req, res) => {
212
+ const html = await light.compile({
213
+ input: 'src/index.light',
214
+ // for production
215
+ minify: true,
216
+ cache: true
217
+ });
218
+
219
+ res.end(html);
220
+ });
221
+
222
+ http.createServer(app).listen(PORT);
85
223
  ```
86
224
 
87
225
  ## Syntax
@@ -856,155 +994,6 @@ html [
856
994
  ]
857
995
  ```
858
996
 
859
- ## Usage
860
-
861
- ### `lightjs.compile()`
862
-
863
- Fundamentally, Light.js is a library that takes in a Light.js source tree and outputs a single HTML file or string.
864
-
865
- ```javascript
866
- const lightjs = require('lightjs');
867
-
868
- lightjs.compile({
869
- input: 'src/index.lightjs',
870
- output: 'public/index.html'
871
- });
872
- ```
873
-
874
- No other step is required for a fully reactive, bundled, minified application.
875
-
876
- This function may also be used to serve dynamic content in real time.
877
-
878
- ```javascript
879
- const express = require('express');
880
- const lightjs = require('lightjs');
881
-
882
- const app = express();
883
-
884
- app.get('/', async (req, res) => {
885
- const html = await lightjs.compile({
886
- input: 'src/index.lightjs'
887
- });
888
- res.end(html);
889
- });
890
-
891
- app.listen(3838);
892
- ```
893
-
894
- In order for the above example to have production quality speed, you must enable caching. And if desired, Javascript minification can be enabled as well:
895
-
896
- ```javascript
897
- const html = await lightjs.compile({
898
- input: 'src/index.lightjs',
899
- cache: true,
900
- minify: true
901
- });
902
- ```
903
-
904
- The last thing to know about Light.js's compile function is document data.
905
-
906
- ```javascript
907
- const html = await lightjs.compile({
908
- input: 'src/about.lightjs',
909
- data: {
910
- pageTitle: 'About me'
911
- }
912
- });
913
- ```
914
-
915
- In your Light.js document pageTitle can be found on the global 'data' object:
916
-
917
- ```javascript
918
- // index.lightjs
919
- html [
920
- head []
921
- body [
922
- h1 '{{data.pageTitle}}'
923
- ]
924
- ]
925
- ```
926
-
927
- ### `lightjs.app()`
928
-
929
- As mentioned above, Light.js ships with a built-in backend router. This router is exposed through the 'app' function, which returns a Node.js HTTP request handler.
930
-
931
- ```javascript
932
- const http = require('http');
933
- const light = require('lightjs');
934
-
935
- const PORT = 4477;
936
-
937
- const app = light.app({
938
- publicDir: './public',
939
- cache: true,
940
- minify: true,
941
- routes: {
942
- // map a route directly to a light file
943
- '/': 'src/index.light',
944
-
945
- // or for more complex arrangements, you can map the route to the same arguments you would pass to light.compile()
946
- '/blog/:id': {
947
- input: 'src/blog.light',
948
- data: async (req) => {
949
- const post = 'hi' // get blog post with req.params.id
950
- return post
951
- }
952
- }
953
- }
954
- })
955
-
956
- http.createServer(app).listen(PORT);
957
- ```
958
-
959
- Light.js's router is also completely compatible with Express:
960
-
961
- ```javascript
962
- const http = require('http');
963
- const light = require('lightjs');
964
- const express = require('express');
965
-
966
- const PORT = 4477;
967
-
968
- const app = express();
969
-
970
- const lightRouter = light.app({
971
- cache: true,
972
- minify: true,
973
- routes: {
974
- // ...
975
- }
976
- })
977
-
978
- app.use(express.static('public'));
979
- app.use(lightRouter);
980
-
981
- http.createServer(app).listen(PORT);
982
- ```
983
-
984
- Or, as previously mentioned, you can simply use `light.compile` with Express:
985
-
986
- ```javascript
987
- const http = require('http');
988
- const light = require('lightjs');
989
- const express = require('express');
990
-
991
- const PORT = 4477;
992
-
993
- const app = express();
994
-
995
- app.get('/', async (req, res) => {
996
- const html = await light.compile({
997
- input: 'src/index.light',
998
- // for production
999
- minify: true,
1000
- cache: true
1001
- });
1002
-
1003
- res.end(html);
1004
- });
1005
-
1006
- http.createServer(app).listen(PORT);
1007
- ```
1008
997
 
1009
998
  This is the entire feature set of Lightjs. If there is even one aspect of Lightjs that is missing from this document, it is considered a bug.
1010
999
 
package/index.js CHANGED
@@ -167,12 +167,14 @@ const serveStaticFile = (p, res) => {
167
167
  return true;
168
168
  }
169
169
  const data = fs.readFileSync(p);
170
- const mime = (mimeTypes[ext] || { source: 'text/plain' }).source;
170
+ const mime = mimeTypes[ext] || 'text/plain';
171
171
  res.writeHead(200, { 'Content-type': `${mime}` });
172
172
  res.end(data);
173
173
  return true;
174
174
  } catch (e) {
175
- return false;
175
+ res.statusCode = 404;
176
+ res.end();
177
+ return true;
176
178
  }
177
179
  };
178
180
 
@@ -209,14 +211,6 @@ const parseBody = (req, max) => {
209
211
  });
210
212
  };
211
213
 
212
- const parseQuery = (p) => {
213
- const purl = url.parse(p);
214
- if (purl.query) {
215
- return qs.parse(purl.query);
216
- }
217
- return {};
218
- };
219
-
220
214
  function matchRoute (istr, mstr) {
221
215
  if (mstr === '*') return {};
222
216
  const p0 = istr.split('/').filter(p => p);
@@ -286,12 +280,15 @@ Light.router = function (opts) {
286
280
  }
287
281
  }
288
282
  return async function (req, res, next) {
289
- const url = req.url;
290
- if (publicDir && serveStaticFile(path.join(publicDir, url), res)) {
283
+ const purl = url.parse(req.url);
284
+ if (publicDir && serveStaticFile(path.join(publicDir, purl.pathname), res)) {
291
285
  return;
292
286
  }
293
- const query = parseQuery(url);
294
- req.query = query;
287
+ if (purl.query) {
288
+ req.query = qs.parse(purl.query);
289
+ } else {
290
+ req.query = {};
291
+ }
295
292
  try {
296
293
  req.body = await parseBody(req, 1024 * 1024); // 1MB limit
297
294
  } catch (e) {
@@ -306,7 +303,7 @@ Light.router = function (opts) {
306
303
  let routeParams = {};
307
304
  let routeConfig = null;
308
305
  for (const [pattern, config] of Object.entries(routes)) {
309
- const params = matchRoute(url, pattern);
306
+ const params = matchRoute(purl.pathname, pattern);
310
307
  if (params !== null) {
311
308
  matchedRoute = pattern;
312
309
  routeParams = params;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cilix/lightjs",
3
- "version": "0.0.1",
3
+ "version": "0.0.2",
4
4
  "description": "A new kind of JavaScript framework",
5
5
  "main": "index.js",
6
6
  "scripts": {