diff options
Move to Server Side Render with expressjs
Backend Rewritten in typescript
Signed-off-by: Marc Pervaz Boocha <mboocha@sudomsg.xyz>
On branch main
Your branch is up to date with 'origin/main'.
Changes to be committed:
new file: .editorconfig
modified: .gitignore
new file: Containerfile
renamed: favicon/icon.svg -> assets/favicon.svg
modified: assets/index.css
deleted: assets/index.js
deleted: assets/mandle.png
deleted: assets/sw.js
new file: assets/syntax.css
modified: deploy
deleted: eleventy.config.js
deleted: favicon/192.png
deleted: favicon/512.png
deleted: favicon/icon.ico
deleted: license
modified: package-lock.json
modified: package.json
deleted: src/_data/env.js
deleted: src/_data/metadata.js
deleted: src/_includes/base.njk
deleted: src/_includes/page.njk
deleted: src/_includes/post.njk
deleted: src/about.njk
deleted: src/blog.njk
new file: src/client/index.ts
deleted: src/gen/atom.njk
deleted: src/gen/error.njk
deleted: src/gen/feedjson.11ty.js
deleted: src/gen/gen.11tydata.js
deleted: src/gen/manifest.11ty.js
deleted: src/gen/metadata.11ty.js
deleted: src/gen/robot.njk
deleted: src/gen/sitemap.njk
deleted: src/index.njk
deleted: src/post/post.11tydata.js
new file: src/server/app.ts
new file: src/server/build.ts
new file: src/server/content/about.ts
new file: src/server/content/blog.ts
new file: src/server/content/feed.ts
new file: src/server/content/index.ts
new file: src/server/content/robots.ts
new file: src/server/content/sitemap.ts
new file: src/server/content/webmanifest.ts
new file: src/server/errHanadler.ts
new file: src/server/img.ts
new file: src/server/metadata.ts
new file: src/server/router.ts
new file: src/server/server.ts
new file: src/server/template/Base.ts
new file: src/server/template/Page.ts
new file: src/server/template/Post.ts
new file: src/server/template/atom.ts
new file: src/server/template/header.ts
new file: src/server/template/html.ts
new file: src/server/template/sitemap.ts
new file: src/server/template/syntax.ts
new file: src/server/template/table.ts
new file: src/server/template/vdom.ts
new file: src/server/template/xml.ts
new file: src/server/utils/createUrl.ts
new file: src/server/utils/curl.ts
new file: src/server/utils/isDefined.ts
new file: src/server/utils/isDevel.ts
new file: src/server/utils/relDir.ts
new file: src/server/utils/relUrl.ts
new file: src/server/utils/schema.ts
new file: src/server/utils/setStingRoute.ts
new file: src/server/utils/strHandler.ts
new file: src/worker/sw.ts
new file: src/worker/tsconfig.json
new file: tsconfig.json
Diffstat (limited to 'src/server/template/vdom.ts')
-rw-r--r-- | src/server/template/vdom.ts | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/src/server/template/vdom.ts b/src/server/template/vdom.ts new file mode 100644 index 0000000..899565b --- /dev/null +++ b/src/server/template/vdom.ts @@ -0,0 +1,105 @@ +export type component< + T extends Attribute = Attribute, + U extends node[] = node[], + R extends node = node +> = ((attr: T, ...content: U) => R) + +export interface Attribute { + [key: string]: unknown, +} + +export interface element<T extends string = string> { + name: T, + attr: Attribute, + content: node[], +} + +export function iselement<T extends string = string>(e: unknown): e is element<T> { + return typeof e === "object" && e !== null && "name" in e; +} + +export interface typed_data<T extends string = string> { + content: string, + type: T +} + +export function istyped<T extends string = string>(e: unknown): e is typed_data<T> { + return typeof e === "object" && e !== null && "type" in e; +} + +export type node = element | typed_data | node[] | string + +export function c< + T extends Attribute = Attribute, + U extends node[] = node[], + R extends node = node +>(name: component<T, U, R>, attr: T, ...content: U): R { + return name(attr, ...content) +} + +export default function t<T extends string = string>(name: T, attr?: Attribute, ...content: node[]): element<T> { + return { + name, + attr: attr ?? ({} as Attribute), + content + } +} + +export function frag<T extends node[] = node[]>(_attr: Attribute, ...content: T) { + return content +} + +export function join({sep = ""}: Attribute & {sep?: string}, ...content: string[]) { + return content.join(sep) +} + +export function prenderdata<T extends string = string>(type: T) { + return function (content: string): typed_data<T> { + return { + content, + type + } + } +} + +export function render<T extends string = string>(type: T, rendFunc: (node: element, content: string) => string) { + const data = prenderdata(type) + return function rend(Node: node): typed_data<T> { + if (Array.isArray(Node)) { + return data(Node.map(element => rend(element).content ?? "").join("")) + } + + if (typeof Node == "string") { + return data(Node) + } + + if (iselement(Node)) { + return data(rendFunc(Node, rend(Node.content).content)) + } + + if (istyped<T>(Node)) { + if (Node.type == type) { + return Node + } else { + throw new Error(Node.type + "is not valid. The type must be:" + type) + } + } + throw new TypeError("" + Node) + } +} + +export function getText(node: node): string { + if (Array.isArray(node)) { + return node.map(element => getText(element) ?? "").join("") + } + + if (typeof node == "string") { + return node + } + + if (iselement(node)) { + return getText(node.content) + } + + throw new TypeError("" + node) +} |