@makano/rew 1.2.54 → 1.2.56

Sign up to get free protection for your applications and to get access to all the features.
@@ -10,7 +10,7 @@ function exportsThe(item, name, context) {
10
10
 
11
11
  module.exports.pubFunction = function (context) {
12
12
  return function (name, item) {
13
- if (name && !item) {
13
+ if (name && item == null) {
14
14
  item = name;
15
15
  name = null;
16
16
  }
@@ -8,7 +8,9 @@ const jsYaml = require('js-yaml');
8
8
  const { execOptions } = require('../const/opt');
9
9
 
10
10
  const cachedFiles = [];
11
-
11
+ module.exports.cleanCache = () => {
12
+ while(cachedFiles.length) cachedFiles.pop();
13
+ };
12
14
  const lookUpInOtherApps = (fullPath) => {
13
15
  const con = conf({});
14
16
  const name = fullPath.indexOf('/') ? fullPath.split('/')[0] : fullPath;
@@ -4,6 +4,7 @@ const { IttyRouter, AutoRouter, Router, createResponse, cors, error, StatusError
4
4
  const path = require('path');
5
5
  const { run } = require('../main');
6
6
  const { runPath } = require('../modules/runtime');
7
+ const { cleanCache } = require('../functions/import');
7
8
  module.exports = (context) => {
8
9
 
9
10
  // http.createServer((req, res) => {
@@ -137,20 +138,24 @@ module.exports = (context) => {
137
138
  `;
138
139
 
139
140
  const defaultSsrBundlerEntry = (file, layouts, data) => `
140
- files = "${layouts.join(',')},${file}".split(',')
141
+ files = "${layouts.length ? layouts.join(',')+',' : ''}${file}".split(',')
141
142
 
142
143
  renderers = []
144
+ staticRendering = false
143
145
 
144
146
  for key, file of files
145
147
  renderers.push imp file
148
+
149
+ staticRendering = true if renderers[renderers.length-1].staticRendering
146
150
 
147
- render = (data) ->
148
- page = renderers.pop().render(data)
151
+ render = (req, data) ->
152
+ target = renderers.pop()
153
+ page = target.render req, data
149
154
  for renderer in renderers
150
- page = renderer.render data, page
155
+ page = renderer.render req, data, page
151
156
  page
152
157
 
153
- exports { render }
158
+ exports { render, staticRendering }
154
159
  `;
155
160
 
156
161
  function createFileRouter({
@@ -163,7 +168,7 @@ module.exports = (context) => {
163
168
  ssrBundlerEntry = defaultSsrBundlerEntry,
164
169
  }) {
165
170
 
166
- const lookUpFiles = ['route', 'page', 'page.s', 'page.ss'];
171
+ const lookUpFiles = ['route', 'page', 'page.s'];
167
172
 
168
173
  const params = {};
169
174
 
@@ -215,14 +220,30 @@ module.exports = (context) => {
215
220
 
216
221
  async function renderPage(file, basename, req){
217
222
  const page = w.create({ viewportMeta: true });
218
- if(basename.endsWith('.s') || basename.endsWith('.ss')){
223
+ let staticRendering = false;
224
+ if(basename.endsWith('.s')){
219
225
  // SSR is enabled, do only ssr
220
226
  const layouts = findLayoutFiles(file, root, false);
221
227
  const fileContext = runPath(file, { code: ssrBundlerEntry(file, layouts) }).context.module.exports || {};
222
228
  if(typeof fileContext.render !== "function") throw new ReferenceError("Route does not export function render");
223
- let pageContent = fileContext.render(req);
229
+ let pageContent = fileContext.render(req, { page, ...getReqProps(req) });
230
+ if(fileContext.staticRendering) staticRendering = true;
224
231
  if(!w.isNode(pageContent)) throw new TypeError("Route.render does not return an element");
225
- page.add(pageContent);
232
+ if(pageContent?.type?.element == 'head'){
233
+ page.root.props.children.splice(page.root.props.children.indexOf(page.head), 1);
234
+ page.head = pageContent;
235
+ page.root.add(pageContent);
236
+ } else if(pageContent?.type?.element == 'body'){
237
+ page.root.props.children.splice(page.root.props.children.indexOf(page.body), 1);
238
+ page.body = pageContent;
239
+ page.root.add(pageContent);
240
+ } else if(pageContent?.type?.element == 'html'){
241
+ page.root = pageContent;
242
+ page.body = pageContent.find('body');
243
+ page.head = pageContent.find('head');
244
+ } else {
245
+ page.add(pageContent);
246
+ }
226
247
  } else {
227
248
  const layouts = findLayoutFiles(file, root, true);
228
249
  const scriptString = await w.bundle(path.join(root, 'bundle.js'), {
@@ -230,8 +251,9 @@ module.exports = (context) => {
230
251
  code: bundlerEntry(file, layouts, getReqProps(req))
231
252
  });
232
253
  page.script(scriptString);
254
+ staticRendering = true;
233
255
  }
234
- return html(page.render(basename.endsWith('.ss')));
256
+ return html(page.render(staticRendering));
235
257
  }
236
258
 
237
259
  async function handleRequest(req, file) {
@@ -257,6 +279,7 @@ module.exports = (context) => {
257
279
  const url = new URL(req.url);
258
280
  const pathname = basePath ? url.pathname.replace(new RegExp('^'+basePath), '') : url.pathname;
259
281
  const file = lookUp(pathname);
282
+ cleanCache();
260
283
 
261
284
  if (file) {
262
285
  const response = handleRequest(req, file);
@@ -165,8 +165,8 @@ function addChildren(nest, child) {
165
165
  }
166
166
 
167
167
  function findChild(nest, prop, value, recurse = false) {
168
- let child = nest.props.children.find(element => value ? element.props[prop] == value : element.type.element == prop);
169
- if (recurse && !child) return nest.props.children.find(element => findChild(element, prop, value, recurse));
168
+ let child = nest.props.children.find(element => element instanceof State ? false : value ? element.props[prop] == value : element.type.element == prop);
169
+ if (recurse && !child) return nest.props.children.find(element => element instanceof State ? false : findChild(element, prop, value, recurse));
170
170
  return child;
171
171
  }
172
172
 
@@ -210,7 +210,7 @@ function renderToString(element, js = false) {
210
210
  return renderToString(type(props))
211
211
  }
212
212
 
213
- const children = props?.children || []
213
+ const children = element instanceof TextNode ? [] : props?.children || []
214
214
  const childrenParsed = Array.isArray(children) ? children.map((c) => renderToString(c, js ? 'raw' : false)) : renderToString(children, js ? 'raw' : false)
215
215
  const childrenHTML = Array.isArray(childrenParsed) ? childrenParsed.join('') : childrenParsed;
216
216
 
@@ -256,11 +256,20 @@ class Page extends Node {
256
256
  return this.body.add(...children);
257
257
  }
258
258
  script(scriptString) {
259
- if (typeof scriptString == "object" && scriptString.scr)
259
+ if (typeof scriptString == "object" && scriptString.src)
260
260
  return this.add(createElement('script', { src: scriptString.src }));
261
261
  else
262
262
  return this.add(createElement('script', null, createTextNode(scriptString)));
263
263
  }
264
+ style(styleString) {
265
+ if (typeof styleString == "object" && styleString.href)
266
+ return this.head.add(createElement('link', { href: styleString.href, rel: 'stylesheet' }));
267
+ else
268
+ return this.head.add(createElement('style', null, createTextNode(styleString)));
269
+ }
270
+ link(rel, href){
271
+ return this.head.add(createElement('link', { href, rel }));
272
+ }
264
273
  serializeState() {
265
274
  const states = {};
266
275
  function extractStates(node) {
@@ -285,6 +294,19 @@ class Page extends Node {
285
294
  const emitter = ${emitter}
286
295
  ${State}
287
296
  const states = [];
297
+
298
+ function setAttribute(el, key, value){
299
+ let defVal = value;
300
+ if(key == 'style'){
301
+ for(let i in value){
302
+ const v = value[i];
303
+ el.style.setProperty(i, value[i]);
304
+ }
305
+ return;
306
+ }
307
+ el.setAttribute(key, defVal);
308
+ }
309
+
288
310
  function rehydrate() {
289
311
  const initialState = __INITIAL_STATE__;
290
312
 
@@ -306,8 +328,8 @@ class Page extends Node {
306
328
  Object.keys(node.props).forEach(key => {
307
329
  if (key !== 'children') {
308
330
  if(key in nodeState){
309
- elt.setAttribute(key, getState(nodeState[key].id)?.value ?? nodeState[key]._value);
310
- } else elt.setAttribute(key, node.props[key]);
331
+ setAttribute(elt, key, getState(nodeState[key].id)?.value ?? nodeState[key]._value);
332
+ } else setAttribute(elt, key, node.props[key]);
311
333
  }
312
334
  });
313
335
  if('data-only-if' in node.props){
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@makano/rew",
3
- "version": "1.2.54",
3
+ "version": "1.2.56",
4
4
  "description": "A simple coffescript runtime and app manager",
5
5
  "main": "main.js",
6
6
  "directories": {