@makano/rew 1.2.54 → 1.2.56

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.
@@ -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": {