@purestack/ts-render 1.1.0
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/LICENSE +21 -0
- package/README.md +8 -0
- package/dist/ts-render.d.mts +24 -0
- package/dist/ts-render.d.mts.map +1 -0
- package/dist/ts-render.mjs +115 -0
- package/dist/ts-render.mjs.map +1 -0
- package/package.json +48 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Ahmed Yasin Koculu
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# @purestack/ts-render
|
|
2
|
+
|
|
3
|
+
Server-side rendering for PureStack's Regor components. `renderApp` takes HTML,
|
|
4
|
+
a component set, and a `TsSsgContext`, then returns rendered HTML with any
|
|
5
|
+
required component scripts attached.
|
|
6
|
+
|
|
7
|
+
`componentRegistry` lets custom build pipelines register components by name.
|
|
8
|
+
The site generator uses this package to turn page markup into static output.
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/*! @purestack/ts-render v1.1.0 | (c) 2026 Ahmed Yasin Koculu | MIT License */
|
|
2
|
+
|
|
3
|
+
import { Component } from "regor";
|
|
4
|
+
import { TsSsgContext } from "@purestack/ts-common";
|
|
5
|
+
//#region packages/ts-render/src/componentRegistry.d.ts
|
|
6
|
+
export declare const componentRegistry: {
|
|
7
|
+
register(name: string, component: Component<never>): void;
|
|
8
|
+
registerMany<TComponents>(...components: (TComponents | object)[]): void;
|
|
9
|
+
getAll(): Record<string, Component>;
|
|
10
|
+
hasComponentName(name: string): boolean;
|
|
11
|
+
snapshot(): Map<string, Component<never>>;
|
|
12
|
+
restore(snapshot: Map<string, Component<never>>): void;
|
|
13
|
+
clear(): void;
|
|
14
|
+
};
|
|
15
|
+
//#endregion
|
|
16
|
+
//#region packages/ts-render/src/renderApp.d.ts
|
|
17
|
+
interface RenderAppOptions<TContext extends TsSsgContext> {
|
|
18
|
+
components: unknown;
|
|
19
|
+
context: TContext;
|
|
20
|
+
}
|
|
21
|
+
export declare const renderApp: <TContext extends TsSsgContext>(html: string, options: RenderAppOptions<TContext>) => string;
|
|
22
|
+
//#endregion
|
|
23
|
+
export type { RenderAppOptions };
|
|
24
|
+
//# sourceMappingURL=ts-render.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ts-render.d.mts","names":[],"sources":["../src/componentRegistry.ts","../src/renderApp.ts"],"mappings":";;;qBAKa;EACX,SAAQ,cAAa,WAAa;EAGlC,aAAa,gBAAW,aAAkB;EAQ1C,UAAU,eAAe;EAGzB,iBAAgB;EAGhB,YAAY,YAAY;EAGxB,QAAO,UAAW,YAAY;EAM9B;;;;UC1Be,iBAAiB,iBAAiB;EACjD;EACA,SAAS;;qBAGE,YAAa,iBAAiB,cAAY,cACzC,SACH,iBAAiB"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/*! @purestack/ts-render v1.1.0 | (c) 2026 Ahmed Yasin Koculu | MIT License */
|
|
2
|
+
|
|
3
|
+
import { isPlainObject } from "@purestack/ts-util";
|
|
4
|
+
import { createDom } from "@purestack/ts-minidom";
|
|
5
|
+
import { buildModalScript, buildTabsScript } from "@purestack/ts-page-scripts";
|
|
6
|
+
import { createApp } from "regor";
|
|
7
|
+
|
|
8
|
+
//#region packages/ts-render/src/componentRegistry.ts
|
|
9
|
+
const registry = /* @__PURE__ */ new Map();
|
|
10
|
+
const componentRegistry = {
|
|
11
|
+
register(name, component) {
|
|
12
|
+
registry.set(name, component);
|
|
13
|
+
},
|
|
14
|
+
registerMany(...components) {
|
|
15
|
+
for (const compSet of components) {
|
|
16
|
+
if (!isPlainObject(compSet)) continue;
|
|
17
|
+
for (const [name, component] of Object.entries(compSet)) registry.set(name, component);
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
getAll() {
|
|
21
|
+
return Object.fromEntries(registry.entries());
|
|
22
|
+
},
|
|
23
|
+
hasComponentName(name) {
|
|
24
|
+
return hasComponentName(name, registry);
|
|
25
|
+
},
|
|
26
|
+
snapshot() {
|
|
27
|
+
return new Map(registry);
|
|
28
|
+
},
|
|
29
|
+
restore(snapshot) {
|
|
30
|
+
registry.clear();
|
|
31
|
+
for (const [name, component] of snapshot) registry.set(name, component);
|
|
32
|
+
},
|
|
33
|
+
clear() {
|
|
34
|
+
registry.clear();
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
function hasComponentName(input, source) {
|
|
38
|
+
const normalizedInput = normalizeComponentName(input);
|
|
39
|
+
if (!normalizedInput) return false;
|
|
40
|
+
for (const key of source.keys()) {
|
|
41
|
+
const normalizedKey = normalizeComponentName(key);
|
|
42
|
+
if (!normalizedKey) continue;
|
|
43
|
+
if (normalizedKey === normalizedInput) return true;
|
|
44
|
+
}
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
function normalizeComponentName(value) {
|
|
48
|
+
const trimmed = value.trim();
|
|
49
|
+
if (!trimmed) return "";
|
|
50
|
+
return trimmed.toLowerCase().replace(/[^a-z0-9]/g, "");
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
//#endregion
|
|
54
|
+
//#region packages/ts-render/src/renderApp.ts
|
|
55
|
+
const renderApp = (html, options) => {
|
|
56
|
+
const normalizedHtml = html.trimStart();
|
|
57
|
+
const isDocument = normalizedHtml.startsWith("<!DOCTYPE html>") || normalizedHtml.startsWith("<!doctype html>") || normalizedHtml.startsWith("<html");
|
|
58
|
+
const htmlToParse = isDocument ? normalizedHtml : `<!DOCTYPE html><html><body>${html}</body></html>`;
|
|
59
|
+
const cleanup = createDom(htmlToParse);
|
|
60
|
+
const snapshot = componentRegistry.snapshot();
|
|
61
|
+
const runtimeEmbeds = /* @__PURE__ */ new Map();
|
|
62
|
+
const baseContext = options.context;
|
|
63
|
+
const tsSsgContext = {
|
|
64
|
+
...baseContext,
|
|
65
|
+
recordRuntimeEmbed: (name, position) => {
|
|
66
|
+
const normalized = name.trim().toLowerCase();
|
|
67
|
+
if (normalized.length > 0) runtimeEmbeds.set(normalized, position);
|
|
68
|
+
baseContext.recordRuntimeEmbed(name, position);
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
try {
|
|
72
|
+
if (options.components) componentRegistry.registerMany(options.components);
|
|
73
|
+
const components = { ...componentRegistry.getAll() };
|
|
74
|
+
createApp({
|
|
75
|
+
components,
|
|
76
|
+
tsSsgContext
|
|
77
|
+
}, { element: document.body });
|
|
78
|
+
appendEmbeddedScriptsToDom(runtimeEmbeds, tsSsgContext);
|
|
79
|
+
if (isDocument) return `<!DOCTYPE html>${document.documentElement?.outerHTML ?? ""}`;
|
|
80
|
+
return document.body?.innerHTML ?? "";
|
|
81
|
+
} finally {
|
|
82
|
+
componentRegistry.restore(snapshot);
|
|
83
|
+
cleanup();
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
function appendEmbeddedScriptsToDom(runtimeEmbeds, context) {
|
|
87
|
+
appendRuntimeScript(resolveTabsEmbedPosition(runtimeEmbeds, context), buildTabsScript);
|
|
88
|
+
appendRuntimeScript(resolveModalEmbedPosition(runtimeEmbeds, context), buildModalScript);
|
|
89
|
+
}
|
|
90
|
+
function appendRuntimeScript(position, scriptBuilder) {
|
|
91
|
+
if (!position) return;
|
|
92
|
+
const targetParent = ensureScriptParent(position);
|
|
93
|
+
if (!targetParent) return;
|
|
94
|
+
const script = document.createElement("script");
|
|
95
|
+
script.textContent = scriptBuilder();
|
|
96
|
+
targetParent.appendChild(script);
|
|
97
|
+
}
|
|
98
|
+
function ensureScriptParent(position) {
|
|
99
|
+
if (position === "body") return document.body;
|
|
100
|
+
return document.head;
|
|
101
|
+
}
|
|
102
|
+
function resolveTabsEmbedPosition(runtimeEmbeds, context) {
|
|
103
|
+
const runtimePosition = runtimeEmbeds.get("tabs");
|
|
104
|
+
if (runtimePosition) return runtimePosition;
|
|
105
|
+
return context?.pageInfo?.frontmatter?.embed?.tabs;
|
|
106
|
+
}
|
|
107
|
+
function resolveModalEmbedPosition(runtimeEmbeds, context) {
|
|
108
|
+
const runtimePosition = runtimeEmbeds.get("modal");
|
|
109
|
+
if (runtimePosition) return runtimePosition;
|
|
110
|
+
return context?.pageInfo?.frontmatter?.embed?.modal;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
//#endregion
|
|
114
|
+
export { componentRegistry, renderApp };
|
|
115
|
+
//# sourceMappingURL=ts-render.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ts-render.mjs","names":[],"sources":["../src/componentRegistry.ts","../src/renderApp.ts"],"sourcesContent":["import { isPlainObject } from '@purestack/ts-util'\nimport type { Component } from 'regor'\n\nconst registry = new Map<string, Component<never>>()\n\nexport const componentRegistry = {\n register(name: string, component: Component<never>) {\n registry.set(name, component)\n },\n registerMany<TComponents>(...components: (TComponents | object)[]) {\n for (const compSet of components) {\n if (!isPlainObject(compSet)) continue\n for (const [name, component] of Object.entries(compSet)) {\n registry.set(name, component as Component<never>)\n }\n }\n },\n getAll(): Record<string, Component> {\n return Object.fromEntries(registry.entries())\n },\n hasComponentName(name: string) {\n return hasComponentName(name, registry)\n },\n snapshot(): Map<string, Component<never>> {\n return new Map(registry)\n },\n restore(snapshot: Map<string, Component<never>>) {\n registry.clear()\n for (const [name, component] of snapshot) {\n registry.set(name, component)\n }\n },\n clear() {\n registry.clear()\n },\n}\n\nfunction hasComponentName(\n input: string,\n source: Map<string, Component<never>>,\n) {\n const normalizedInput = normalizeComponentName(input)\n if (!normalizedInput) return false\n for (const key of source.keys()) {\n const normalizedKey = normalizeComponentName(key)\n if (!normalizedKey) continue\n if (normalizedKey === normalizedInput) return true\n }\n return false\n}\n\nfunction normalizeComponentName(value: string) {\n const trimmed = value.trim()\n if (!trimmed) return ''\n return trimmed.toLowerCase().replace(/[^a-z0-9]/g, '')\n}\n","import type { TsSsgContext } from '@purestack/ts-common'\nimport { createDom } from '@purestack/ts-minidom'\nimport { buildModalScript, buildTabsScript } from '@purestack/ts-page-scripts'\nimport { createApp } from 'regor'\nimport { componentRegistry } from './componentRegistry'\n\nexport interface RenderAppOptions<TContext extends TsSsgContext> {\n components: unknown\n context: TContext\n}\n\nexport const renderApp = <TContext extends TsSsgContext>(\n html: string,\n options: RenderAppOptions<TContext>,\n) => {\n const normalizedHtml = html.trimStart()\n const isDocument =\n normalizedHtml.startsWith('<!DOCTYPE html>') ||\n normalizedHtml.startsWith('<!doctype html>') ||\n normalizedHtml.startsWith('<html')\n const htmlToParse = isDocument\n ? normalizedHtml\n : `<!DOCTYPE html><html><body>${html}</body></html>`\n const cleanup = createDom(htmlToParse)\n const snapshot = componentRegistry.snapshot()\n const runtimeEmbeds = new Map<string, 'body' | 'head'>()\n const baseContext = options.context\n const tsSsgContext = {\n ...baseContext,\n recordRuntimeEmbed: (name: string, position: 'body' | 'head') => {\n const normalized = name.trim().toLowerCase()\n if (normalized.length > 0) {\n runtimeEmbeds.set(normalized, position)\n }\n baseContext.recordRuntimeEmbed(name, position)\n },\n }\n try {\n if (options.components) componentRegistry.registerMany(options.components)\n const components = {\n ...componentRegistry.getAll(),\n }\n createApp(\n {\n components,\n tsSsgContext,\n },\n {\n element: document.body,\n },\n )\n appendEmbeddedScriptsToDom(runtimeEmbeds, tsSsgContext)\n if (isDocument) {\n const documentHtml = document.documentElement?.outerHTML ?? ''\n return `<!DOCTYPE html>${documentHtml}`\n }\n return document.body?.innerHTML ?? ''\n } finally {\n componentRegistry.restore(snapshot)\n cleanup()\n }\n}\n\nfunction appendEmbeddedScriptsToDom(\n runtimeEmbeds: Map<string, 'body' | 'head'>,\n context: TsSsgContext,\n) {\n appendRuntimeScript(\n resolveTabsEmbedPosition(runtimeEmbeds, context),\n buildTabsScript,\n )\n appendRuntimeScript(\n resolveModalEmbedPosition(runtimeEmbeds, context),\n buildModalScript,\n )\n}\n\nfunction appendRuntimeScript(\n position: 'body' | 'head' | undefined,\n scriptBuilder: () => string,\n) {\n if (!position) return\n const targetParent = ensureScriptParent(position)\n if (!targetParent) return\n const script = document.createElement('script')\n script.textContent = scriptBuilder()\n targetParent.appendChild(script)\n}\n\nfunction ensureScriptParent(position: 'body' | 'head') {\n if (position === 'body') {\n return document.body\n }\n return document.head\n}\n\nfunction resolveTabsEmbedPosition(\n runtimeEmbeds: Map<string, 'body' | 'head'>,\n context: TsSsgContext,\n) {\n const runtimePosition = runtimeEmbeds.get('tabs')\n if (runtimePosition) return runtimePosition\n return context?.pageInfo?.frontmatter?.embed?.tabs\n}\n\nfunction resolveModalEmbedPosition(\n runtimeEmbeds: Map<string, 'body' | 'head'>,\n context: TsSsgContext,\n) {\n const runtimePosition = runtimeEmbeds.get('modal')\n if (runtimePosition) return runtimePosition\n return context?.pageInfo?.frontmatter?.embed?.modal\n}\n"],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@purestack/ts-render",
|
|
3
|
+
"version": "1.1.0",
|
|
4
|
+
"packageManager": "yarn@4.9.2",
|
|
5
|
+
"module": "./dist/ts-render.mjs",
|
|
6
|
+
"types": "./dist/ts-render.d.mts",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"sideEffects": false,
|
|
9
|
+
"repository": {
|
|
10
|
+
"type": "git",
|
|
11
|
+
"url": "git+https://github.com/PureStackStudio/PureStack.git",
|
|
12
|
+
"directory": "packages/ts-render"
|
|
13
|
+
},
|
|
14
|
+
"homepage": "https://purestack.studio",
|
|
15
|
+
"bugs": {
|
|
16
|
+
"url": "https://github.com/PureStackStudio/PureStack/issues"
|
|
17
|
+
},
|
|
18
|
+
"publishConfig": {
|
|
19
|
+
"access": "public"
|
|
20
|
+
},
|
|
21
|
+
"exports": {
|
|
22
|
+
".": {
|
|
23
|
+
"types": "./dist/ts-render.d.mts",
|
|
24
|
+
"import": "./dist/ts-render.mjs"
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
"license": "MIT",
|
|
28
|
+
"files": [
|
|
29
|
+
"dist/*.mjs",
|
|
30
|
+
"dist/*.mjs.map",
|
|
31
|
+
"dist/*.d.mts",
|
|
32
|
+
"dist/*.d.mts.map",
|
|
33
|
+
"README.md",
|
|
34
|
+
"LICENSE"
|
|
35
|
+
],
|
|
36
|
+
"scripts": {
|
|
37
|
+
"build": "tsc",
|
|
38
|
+
"lint": "biome check ./src --formatter-enabled=false --write",
|
|
39
|
+
"test": "vitest"
|
|
40
|
+
},
|
|
41
|
+
"dependencies": {
|
|
42
|
+
"@purestack/ts-common": "^1.1.0",
|
|
43
|
+
"@purestack/ts-minidom": "^1.1.0",
|
|
44
|
+
"@purestack/ts-page-scripts": "^1.1.0",
|
|
45
|
+
"@purestack/ts-util": "^1.1.0",
|
|
46
|
+
"regor": "^1.7.3"
|
|
47
|
+
}
|
|
48
|
+
}
|