@master/css-server 2.0.0-rc.5 → 2.0.0-rc.50

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.
package/README.md CHANGED
@@ -10,7 +10,7 @@
10
10
  </picture>
11
11
  </a>
12
12
  </p>
13
- <p align="center">Generate Master CSS text from markup on the server</p>
13
+ <p align="center">Render Master CSS on the server side</p>
14
14
 
15
15
  <p align="center">
16
16
  <a aria-label="GitHub release (latest by date including pre-releases)" href="https://github.com/master-co/css/releases">
@@ -41,7 +41,7 @@
41
41
  <img alt="Follow @mastercorg" src="https://img.shields.io/static/v1?label=%20&message=twitter&color=f6f7f8&logo=twitter&style=for-the-badge">
42
42
  </picture>
43
43
  </a>
44
- <a aria-label="Github Actions" href="https://github.com/1aron/repo/actions/workflows/release.yml">
44
+ <a aria-label="Github Actions" href="https://github.com/master-co/css/actions/workflows/release.yml">
45
45
  <picture>
46
46
  <source media="(prefers-color-scheme: dark)" srcset="https://img.shields.io/github/actions/workflow/status/master-co/css/release.yml?branch=rc&label=%20&message=twitter&color=212022&logo=githubactions&style=for-the-badge">
47
47
  <source media="(prefers-color-scheme: light)" srcset="https://img.shields.io/github/actions/workflow/status/master-co/css/release.yml?branch=rc&label=%20&message=twitter&color=f6f7f8&logo=githubactions&style=for-the-badge&logoColor=%23000">
@@ -53,4 +53,4 @@
53
53
  </div>
54
54
 
55
55
  ## Documentation
56
- Check out the official [documentation](https://rc.css.master.co/docs/server).
56
+ Check out the official [documentation](https://rc.css.master.co/reference/server).
@@ -0,0 +1,29 @@
1
+ 'use strict';
2
+
3
+ /*
4
+ * The framework will encode attribute values ​​when rendering HTML to prevent XSS,
5
+ * so we must decode it for correct CSS selectors.
6
+ * https://github.com/facebook/react/issues/27836
7
+ */ function decodeHTML(html) {
8
+ return html.replace(/&(amp|apos|#39|#x27|quot|lt|gt);/g, (match, entity)=>{
9
+ switch(entity){
10
+ case 'amp':
11
+ return '&';
12
+ case 'apos':
13
+ case '#39':
14
+ case '#x27':
15
+ return '\'';
16
+ case 'quot':
17
+ return '"';
18
+ case 'lt':
19
+ return '<';
20
+ case 'gt':
21
+ return '>';
22
+ default:
23
+ return match // 如果不是已知的實體,保留原樣
24
+ ;
25
+ }
26
+ });
27
+ }
28
+
29
+ module.exports = decodeHTML;
@@ -1 +1,27 @@
1
- function a(e){return e.replace(/&(amp|apos|#39|#x27|quot|lt|gt);/g,(t,r)=>{switch(r){case"amp":return"&";case"apos":case"#39":case"#x27":return"'";case"quot":return'"';case"lt":return"<";case"gt":return">";default:return t}})}export{a as default};
1
+ /*
2
+ * The framework will encode attribute values ​​when rendering HTML to prevent XSS,
3
+ * so we must decode it for correct CSS selectors.
4
+ * https://github.com/facebook/react/issues/27836
5
+ */ function decodeHTML(html) {
6
+ return html.replace(/&(amp|apos|#39|#x27|quot|lt|gt);/g, (match, entity)=>{
7
+ switch(entity){
8
+ case 'amp':
9
+ return '&';
10
+ case 'apos':
11
+ case '#39':
12
+ case '#x27':
13
+ return '\'';
14
+ case 'quot':
15
+ return '"';
16
+ case 'lt':
17
+ return '<';
18
+ case 'gt':
19
+ return '>';
20
+ default:
21
+ return match // 如果不是已知的實體,保留原樣
22
+ ;
23
+ }
24
+ });
25
+ }
26
+
27
+ export { decodeHTML as default };
package/dist/index.cjs ADDED
@@ -0,0 +1,11 @@
1
+ 'use strict';
2
+
3
+ var render = require('./render.cjs');
4
+ var renderCss = require('./render-css.cjs');
5
+ var parseHtml = require('./parse-html.cjs');
6
+
7
+
8
+
9
+ exports.render = render;
10
+ exports.renderCSS = renderCss;
11
+ exports.parseHTML = parseHtml;
package/dist/index.mjs CHANGED
@@ -1 +1,3 @@
1
- import{default as a}from"./render.mjs";import{default as o}from"./render-css.mjs";import{default as d}from"./parse-html.mjs";export{d as parseHTML,a as render,o as renderCSS};
1
+ export { default as render } from './render.mjs';
2
+ export { default as renderCSS } from './render-css.mjs';
3
+ export { default as parseHTML } from './parse-html.mjs';
@@ -0,0 +1,46 @@
1
+ 'use strict';
2
+
3
+ var htmlparser2 = require('htmlparser2');
4
+ var decodeHtml = require('./decode-html.cjs');
5
+
6
+ /**
7
+ * @param html
8
+ * @returns {classes from html, root element}
9
+ */ function parseHTML(html) {
10
+ const classes = [];
11
+ let htmlElement = null;
12
+ let headElement = null;
13
+ let styleElement = null;
14
+ const handler = new htmlparser2.DomHandler(undefined, {}, (element)=>{
15
+ if (element.type === 'tag') {
16
+ switch(element.name){
17
+ case 'html':
18
+ htmlElement = element;
19
+ break;
20
+ case 'head':
21
+ headElement = element;
22
+ break;
23
+ }
24
+ } else if (element.type === 'style') {
25
+ if (element.attribs.id === 'master') styleElement = element;
26
+ }
27
+ if (element.attribs.class) {
28
+ element.attribs.class.split(' ').forEach((className)=>{
29
+ className = decodeHtml(className);
30
+ if (!classes.includes(className)) classes.push(className);
31
+ });
32
+ }
33
+ });
34
+ new htmlparser2.Parser(handler, {
35
+ decodeEntities: false
36
+ }).end(html);
37
+ return {
38
+ classes,
39
+ nodes: handler.root.childNodes,
40
+ htmlElement,
41
+ headElement,
42
+ styleElement
43
+ };
44
+ }
45
+
46
+ module.exports = parseHTML;
@@ -1 +1,44 @@
1
- import{DomHandler as o,Parser as a}from"htmlparser2";import u from"./decode-html.mjs";function m(i){const t=[];let n=null,s=null,r=null;const d=new o(void 0,{},e=>{if(e.type==="tag")switch(e.name){case"html":n=e;break;case"head":s=e;break;default:break}else e.type==="style"&&e.attribs.id==="master"&&(r=e);e.attribs.class&&e.attribs.class.split(" ").forEach(l=>{l=u(l),t.includes(l)||t.push(l)})});return new a(d,{decodeEntities:!1}).end(i),{classes:t,nodes:d.root.childNodes,htmlElement:n,headElement:s,styleElement:r}}export{m as default};
1
+ import { DomHandler, Parser } from 'htmlparser2';
2
+ import decodeHTML from './decode-html.mjs';
3
+
4
+ /**
5
+ * @param html
6
+ * @returns {classes from html, root element}
7
+ */ function parseHTML(html) {
8
+ const classes = [];
9
+ let htmlElement = null;
10
+ let headElement = null;
11
+ let styleElement = null;
12
+ const handler = new DomHandler(undefined, {}, (element)=>{
13
+ if (element.type === 'tag') {
14
+ switch(element.name){
15
+ case 'html':
16
+ htmlElement = element;
17
+ break;
18
+ case 'head':
19
+ headElement = element;
20
+ break;
21
+ }
22
+ } else if (element.type === 'style') {
23
+ if (element.attribs.id === 'master') styleElement = element;
24
+ }
25
+ if (element.attribs.class) {
26
+ element.attribs.class.split(' ').forEach((className)=>{
27
+ className = decodeHTML(className);
28
+ if (!classes.includes(className)) classes.push(className);
29
+ });
30
+ }
31
+ });
32
+ new Parser(handler, {
33
+ decodeEntities: false
34
+ }).end(html);
35
+ return {
36
+ classes,
37
+ nodes: handler.root.childNodes,
38
+ htmlElement,
39
+ headElement,
40
+ styleElement
41
+ };
42
+ }
43
+
44
+ export { parseHTML as default };
@@ -0,0 +1,20 @@
1
+ 'use strict';
2
+
3
+ var parseHtml = require('./parse-html.cjs');
4
+ var css = require('@master/css');
5
+
6
+ /**
7
+ * Renders the Master CSS string from HTML
8
+ * @param html
9
+ * @param config
10
+ * @returns MasterCSS
11
+ */ function renderCSS(html, config) {
12
+ if (!html) return;
13
+ const { classes } = parseHtml(html);
14
+ if (!classes.length) return;
15
+ const css$1 = new css.MasterCSS(config);
16
+ classes.forEach((eachClass)=>css$1.add(eachClass));
17
+ return css$1;
18
+ }
19
+
20
+ module.exports = renderCSS;
@@ -1,4 +1,4 @@
1
- import MasterCSS, { Config } from '@master/css';
1
+ import { MasterCSS, Config } from '@master/css';
2
2
  /**
3
3
  * Renders the Master CSS string from HTML
4
4
  * @param html
@@ -1 +1,18 @@
1
- import s from"./parse-html.mjs";import f from"@master/css";function i(r,t){if(!r)return;const{classes:e}=s(r);if(!e.length)return;const n=new f(t);return e.forEach(o=>n.add(o)),n}export{i as default};
1
+ import parseHTML from './parse-html.mjs';
2
+ import { MasterCSS } from '@master/css';
3
+
4
+ /**
5
+ * Renders the Master CSS string from HTML
6
+ * @param html
7
+ * @param config
8
+ * @returns MasterCSS
9
+ */ function renderCSS(html, config) {
10
+ if (!html) return;
11
+ const { classes } = parseHTML(html);
12
+ if (!classes.length) return;
13
+ const css = new MasterCSS(config);
14
+ classes.forEach((eachClass)=>css.add(eachClass));
15
+ return css;
16
+ }
17
+
18
+ export { renderCSS as default };
@@ -0,0 +1,63 @@
1
+ 'use strict';
2
+
3
+ var css = require('@master/css');
4
+ var parseHtml = require('./parse-html.cjs');
5
+ var domhandler = require('domhandler');
6
+ var serialize = require('dom-serializer');
7
+
8
+ /**
9
+ * Renders the page-required and sorted CSS text from HTML and injected it back into HTML
10
+ * @param html
11
+ * @param config
12
+ */ function render(html, config) {
13
+ const context = parseHtml(html);
14
+ const { classes, nodes, htmlElement } = context;
15
+ let { headElement, styleElement } = context;
16
+ if (!classes.length) return {
17
+ html,
18
+ classes,
19
+ nodes,
20
+ htmlElement,
21
+ headElement,
22
+ styleElement
23
+ };
24
+ const css$1 = new css.MasterCSS(config);
25
+ classes.forEach((eachClass)=>css$1.add(eachClass));
26
+ if (styleElement) {
27
+ styleElement.childNodes = [
28
+ new domhandler.Text(css$1.text)
29
+ ];
30
+ } else {
31
+ styleElement = new domhandler.Element('style', {
32
+ id: 'master'
33
+ }, [
34
+ new domhandler.Text(css$1.text)
35
+ ]);
36
+ if (headElement) {
37
+ headElement.childNodes.push(styleElement);
38
+ } else {
39
+ if (htmlElement) {
40
+ headElement = new domhandler.Element('head', {}, [
41
+ styleElement
42
+ ]);
43
+ htmlElement.childNodes.unshift(headElement);
44
+ } else {
45
+ nodes.unshift(styleElement);
46
+ }
47
+ }
48
+ }
49
+ return {
50
+ html: serialize(nodes, {
51
+ decodeEntities: false,
52
+ encodeEntities: false
53
+ }),
54
+ css: css$1,
55
+ classes,
56
+ nodes,
57
+ htmlElement,
58
+ headElement,
59
+ styleElement
60
+ };
61
+ }
62
+
63
+ module.exports = render;
package/dist/render.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import MasterCSS, { Config } from '@master/css';
1
+ import { MasterCSS, Config } from '@master/css';
2
2
  import { Element, ChildNode } from 'domhandler';
3
3
  /**
4
4
  * Renders the page-required and sorted CSS text from HTML and injected it back into HTML
package/dist/render.mjs CHANGED
@@ -1 +1,61 @@
1
- import a from"@master/css";import c from"./parse-html.mjs";import{Element as d,Text as m}from"domhandler";import E from"dom-serializer";function u(o,f){const r=c(o),{classes:n,nodes:s,htmlElement:l}=r;let{headElement:t,styleElement:e}=r;if(!n.length)return{html:o,classes:n,nodes:s,htmlElement:l,headElement:t,styleElement:e};const i=new a(f);return n.forEach(h=>i.add(h)),e?e.childNodes=[new m(i.text)]:(e=new d("style",{id:"master"},[new m(i.text)]),t?t.childNodes.push(e):l?(t=new d("head",{},[e]),l.childNodes.unshift(t)):s.unshift(e)),{html:E(s,{decodeEntities:!1,encodeEntities:!1}),css:i,classes:n,nodes:s,htmlElement:l,headElement:t,styleElement:e}}export{u as default};
1
+ import { MasterCSS } from '@master/css';
2
+ import parseHTML from './parse-html.mjs';
3
+ import { Text, Element } from 'domhandler';
4
+ import serialize from 'dom-serializer';
5
+
6
+ /**
7
+ * Renders the page-required and sorted CSS text from HTML and injected it back into HTML
8
+ * @param html
9
+ * @param config
10
+ */ function render(html, config) {
11
+ const context = parseHTML(html);
12
+ const { classes, nodes, htmlElement } = context;
13
+ let { headElement, styleElement } = context;
14
+ if (!classes.length) return {
15
+ html,
16
+ classes,
17
+ nodes,
18
+ htmlElement,
19
+ headElement,
20
+ styleElement
21
+ };
22
+ const css = new MasterCSS(config);
23
+ classes.forEach((eachClass)=>css.add(eachClass));
24
+ if (styleElement) {
25
+ styleElement.childNodes = [
26
+ new Text(css.text)
27
+ ];
28
+ } else {
29
+ styleElement = new Element('style', {
30
+ id: 'master'
31
+ }, [
32
+ new Text(css.text)
33
+ ]);
34
+ if (headElement) {
35
+ headElement.childNodes.push(styleElement);
36
+ } else {
37
+ if (htmlElement) {
38
+ headElement = new Element('head', {}, [
39
+ styleElement
40
+ ]);
41
+ htmlElement.childNodes.unshift(headElement);
42
+ } else {
43
+ nodes.unshift(styleElement);
44
+ }
45
+ }
46
+ }
47
+ return {
48
+ html: serialize(nodes, {
49
+ decodeEntities: false,
50
+ encodeEntities: false
51
+ }),
52
+ css,
53
+ classes,
54
+ nodes,
55
+ htmlElement,
56
+ headElement,
57
+ styleElement
58
+ };
59
+ }
60
+
61
+ export { render as default };
package/package.json CHANGED
@@ -1 +1 @@
1
- {"name":"@master/css-server","scripts":{"build":"techor pack \"./src/**/*.ts\" --platform node --declare","dev":"pnpm run build --watch","lint":"eslint ./src","type-check":"tsc --noEmit","test":"jest"},"license":"MIT","description":"Generate Master CSS text from markup on the server","author":"Aoyue Design LLC.","funding":"https://css.master.co/docs/donate","homepage":"https://css.master.co","bugs":{"url":"https://github.com/master-co/css/issues"},"repository":{"type":"git","url":"https://github.com/master-co/css.git","directory":"packages/server"},"keywords":["server","static","html","markup","dom","css","mastercss"],"sideEffects":false,"main":"./dist/index.js","module":"./dist/index.mjs","jsnext:main":"./dist/index.mjs","esnext":"./dist/index.mjs","types":"./dist/index.d.ts","exports":{".":{"import":"./dist/index.mjs","require":"./dist/index.js","types":"./dist/index.d.ts"}},"files":["dist"],"publishConfig":{"access":"public"},"dependencies":{"@master/css":"^2.0.0-rc.5","htmlparser2":"^9.0.0"},"version":"2.0.0-rc.5"}
1
+ {"name":"@master/css-server","type":"module","scripts":{"build":"techor build \"src/**/*.ts\"","dev":"pnpm build --watch","lint":"eslint","type-check":"tsc --noEmit","test":"vitest"},"license":"MIT","description":"Render Master CSS on the server side","author":"Aoyue Design LLC.","funding":"https://rc.css.master.co/sponsor","homepage":"https://css.master.co","bugs":{"url":"https://github.com/master-co/css/issues"},"repository":{"type":"git","url":"https://github.com/master-co/css.git","directory":"packages/server"},"keywords":["server","static","html","markup","dom","css","mastercss"],"sideEffects":false,"main":"./dist/index.cjs","module":"./dist/index.mjs","jsnext:main":"./dist/index.mjs","esnext":"./dist/index.mjs","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"}},"files":["dist"],"publishConfig":{"access":"public","provenance":true},"dependencies":{"@master/css":"^2.0.0-rc.50","dom-serializer":"^2.0.0","domhandler":"^5.0.3","htmlparser2":"^9.1.0"},"devDependencies":{"shared":"^2.0.0-rc.50"},"version":"2.0.0-rc.50"}
@@ -1 +0,0 @@
1
- "use strict";var u=Object.defineProperty;var n=Object.getOwnPropertyDescriptor;var o=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var l=(t,e)=>{for(var r in e)u(t,r,{get:e[r],enumerable:!0})},d=(t,e,r,c)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of o(e))!p.call(t,a)&&a!==r&&u(t,a,{get:()=>e[a],enumerable:!(c=n(e,a))||c.enumerable});return t};var g=t=>d(u({},"__esModule",{value:!0}),t);var f={};l(f,{default:()=>s});module.exports=g(f);function s(t){return t.replace(/&(amp|apos|#39|#x27|quot|lt|gt);/g,(e,r)=>{switch(r){case"amp":return"&";case"apos":case"#39":case"#x27":return"'";case"quot":return'"';case"lt":return"<";case"gt":return">";default:return e}})}
package/dist/index.js DELETED
@@ -1 +0,0 @@
1
- "use strict";var u=Object.create;var o=Object.defineProperty;var x=Object.getOwnPropertyDescriptor;var n=Object.getOwnPropertyNames;var S=Object.getPrototypeOf,C=Object.prototype.hasOwnProperty;var H=(e,r)=>{for(var a in r)o(e,a,{get:r[a],enumerable:!0})},p=(e,r,a,d)=>{if(r&&typeof r=="object"||typeof r=="function")for(let f of n(r))!C.call(e,f)&&f!==a&&o(e,f,{get:()=>r[f],enumerable:!(d=x(r,f))||d.enumerable});return e};var t=(e,r,a)=>(a=e!=null?u(S(e)):{},p(r||!e||!e.__esModule?o(a,"default",{value:e,enumerable:!0}):a,e)),L=e=>p(o({},"__esModule",{value:!0}),e);var M={};H(M,{parseHTML:()=>m.default,render:()=>s.default,renderCSS:()=>l.default});module.exports=L(M);var s=t(require("./render")),l=t(require("./render-css")),m=t(require("./parse-html"));0&&(module.exports={parseHTML,render,renderCSS});
@@ -1 +0,0 @@
1
- "use strict";var f=Object.create;var i=Object.defineProperty;var h=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var p=Object.getPrototypeOf,b=Object.prototype.hasOwnProperty;var y=(e,l)=>{for(var t in l)i(e,t,{get:l[t],enumerable:!0})},u=(e,l,t,r)=>{if(l&&typeof l=="object"||typeof l=="function")for(let s of c(l))!b.call(e,s)&&s!==t&&i(e,s,{get:()=>l[s],enumerable:!(r=h(l,s))||r.enumerable});return e};var g=(e,l,t)=>(t=e!=null?f(p(e)):{},u(l||!e||!e.__esModule?i(t,"default",{value:e,enumerable:!0}):t,e)),k=e=>u(i({},"__esModule",{value:!0}),e);var w={};y(w,{default:()=>E});module.exports=k(w);var o=require("htmlparser2"),m=g(require("./decode-html"));function E(e){const l=[];let t=null,r=null,s=null;const a=new o.DomHandler(void 0,{},n=>{if(n.type==="tag")switch(n.name){case"html":t=n;break;case"head":r=n;break;default:break}else n.type==="style"&&n.attribs.id==="master"&&(s=n);n.attribs.class&&n.attribs.class.split(" ").forEach(d=>{d=(0,m.default)(d),l.includes(d)||l.push(d)})});return new o.Parser(a,{decodeEntities:!1}).end(e),{classes:l,nodes:a.root.childNodes,htmlElement:t,headElement:r,styleElement:s}}
@@ -1 +0,0 @@
1
- "use strict";var u=Object.create;var s=Object.defineProperty;var S=Object.getOwnPropertyDescriptor;var C=Object.getOwnPropertyNames;var g=Object.getPrototypeOf,p=Object.prototype.hasOwnProperty;var m=(r,e)=>{for(var n in e)s(r,n,{get:e[n],enumerable:!0})},f=(r,e,n,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of C(e))!p.call(r,t)&&t!==n&&s(r,t,{get:()=>e[t],enumerable:!(o=S(e,t))||o.enumerable});return r};var i=(r,e,n)=>(n=r!=null?u(g(r)):{},f(e||!r||!r.__esModule?s(n,"default",{value:r,enumerable:!0}):n,r)),M=r=>f(s({},"__esModule",{value:!0}),r);var l={};m(l,{default:()=>d});module.exports=M(l);var a=i(require("./parse-html")),c=i(require("@master/css"));function d(r,e){if(!r)return;const{classes:n}=(0,a.default)(r);if(!n.length)return;const o=new c.default(e);return n.forEach(t=>o.add(t)),o}
package/dist/render.js DELETED
@@ -1 +0,0 @@
1
- "use strict";var C=Object.create;var f=Object.defineProperty;var w=Object.getOwnPropertyDescriptor;var x=Object.getOwnPropertyNames;var N=Object.getPrototypeOf,S=Object.prototype.hasOwnProperty;var y=(e,t)=>{for(var n in t)f(e,n,{get:t[n],enumerable:!0})},a=(e,t,n,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of x(t))!S.call(e,s)&&s!==n&&f(e,s,{get:()=>t[s],enumerable:!(i=w(t,s))||i.enumerable});return e};var h=(e,t,n)=>(n=e!=null?C(N(e)):{},a(t||!e||!e.__esModule?f(n,"default",{value:e,enumerable:!0}):n,e)),M=e=>a(f({},"__esModule",{value:!0}),e);var T={};y(T,{default:()=>p});module.exports=M(T);var c=h(require("@master/css")),E=h(require("./parse-html")),r=require("domhandler"),u=h(require("dom-serializer"));function p(e,t){const n=(0,E.default)(e),{classes:i,nodes:s,htmlElement:d}=n;let{headElement:o,styleElement:l}=n;if(!i.length)return{html:e,classes:i,nodes:s,htmlElement:d,headElement:o,styleElement:l};const m=new c.default(t);return i.forEach(g=>m.add(g)),l?l.childNodes=[new r.Text(m.text)]:(l=new r.Element("style",{id:"master"},[new r.Text(m.text)]),o?o.childNodes.push(l):d?(o=new r.Element("head",{},[l]),d.childNodes.unshift(o)):s.unshift(l)),{html:(0,u.default)(s,{decodeEntities:!1,encodeEntities:!1}),css:m,classes:i,nodes:s,htmlElement:d,headElement:o,styleElement:l}}