@hyperspan/framework 0.1.7 → 0.1.8
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/dist/assets.js +1 -1
- package/dist/server.js +8 -11
- package/package.json +1 -1
- package/src/assets.ts +1 -1
- package/src/server.ts +17 -8
package/dist/assets.js
CHANGED
|
@@ -61,7 +61,7 @@ function md5(content) {
|
|
|
61
61
|
}
|
|
62
62
|
async function copyPreactToPublicFolder() {
|
|
63
63
|
const sourceFile = resolve(PWD, "../", "./src/clientjs/preact.ts");
|
|
64
|
-
|
|
64
|
+
await Bun.build({
|
|
65
65
|
entrypoints: [sourceFile],
|
|
66
66
|
outdir: "./public/_hs/js",
|
|
67
67
|
minify: true,
|
package/dist/server.js
CHANGED
|
@@ -9,7 +9,7 @@ import { basename, extname, join } from "node:path";
|
|
|
9
9
|
import { html, isHSHtml, renderStream, renderAsync, render } from "@hyperspan/html";
|
|
10
10
|
|
|
11
11
|
// node_modules/isbot/index.mjs
|
|
12
|
-
var fullPattern = " daum[ /]| deusu/| yadirectfetcher|(?:^|[^g])news(?!sapphire)|(?<! (?:channel/|google/))google(?!(app|/google| pixel))|(?<! cu)bots?(?:\\b|_)|(?<!(?:lib))http|(?<![hg]m)score
|
|
12
|
+
var fullPattern = " daum[ /]| deusu/| yadirectfetcher|(?:^|[^g])news(?!sapphire)|(?<! (?:channel/|google/))google(?!(app|/google| pixel))|(?<! cu)bots?(?:\\b|_)|(?<!(?:lib))http|(?<![hg]m)score|@[a-z][\\w-]+\\.|\\(\\)|\\.com\\b|\\btime/|\\||^<|^[\\w \\.\\-\\(?:\\):%]+(?:/v?\\d+(?:\\.\\d+)?(?:\\.\\d{1,10})*?)?(?:,|$)|^[^ ]{50,}$|^\\d+\\b|^\\w*search\\b|^\\w+/[\\w\\(\\)]*$|^active|^ad muncher|^amaya|^avsdevicesdk/|^biglotron|^bot|^bw/|^clamav[ /]|^client/|^cobweb/|^custom|^ddg[_-]android|^discourse|^dispatch/\\d|^downcast/|^duckduckgo|^email|^facebook|^getright/|^gozilla/|^hobbit|^hotzonu|^hwcdn/|^igetter/|^jeode/|^jetty/|^jigsaw|^microsoft bits|^movabletype|^mozilla/\\d\\.\\d\\s[\\w\\.-]+$|^mozilla/\\d\\.\\d\\s\\(compatible;?(?:\\s\\w+\\/\\d+\\.\\d+)?\\)$|^navermailapp|^netsurf|^offline|^openai/|^owler|^php|^postman|^python|^rank|^read|^reed|^rest|^rss|^snapchat|^space bison|^svn|^swcd |^taringa|^thumbor/|^track|^w3c|^webbandit/|^webcopier|^wget|^whatsapp|^wordpress|^xenu link sleuth|^yahoo|^yandex|^zdm/\\d|^zoom marketplace/|^{{.*}}$|adscanner/|analyzer|archive|ask jeeves/teoma|audit|bit\\.ly/|bluecoat drtr|browsex|burpcollaborator|capture|catch|check\\b|checker|chrome-lighthouse|chromeframe|classifier|cloudflare|convertify|cookiehubscan|crawl|cypress/|dareboost|datanyze|dejaclick|detect|dmbrowser|download|evc-batch/|exaleadcloudview|feed|firephp|functionize|gomezagent|headless|httrack|hubspot marketing grader|hydra|ibisbrowser|infrawatch|insight|inspect|iplabel|ips-agent|java(?!;)|jsjcw_scanner|library|linkcheck|mail\\.ru/|manager|measure|neustar wpm|node|nutch|offbyone|onetrust|optimize|pageburst|pagespeed|parser|perl|phantomjs|pingdom|powermarks|preview|proxy|ptst[ /]\\d|retriever|rexx;|rigor|rss\\b|scanner\\.|scrape|server|sogou|sparkler/|speedcurve|spider|splash|statuscake|supercleaner|synapse|synthetic|tools|torrent|transcoder|url|validator|virtuoso|wappalyzer|webglance|webkit2png|whatcms/|zgrab";
|
|
13
13
|
var naivePattern = /bot|crawl|http|lighthouse|scan|search|spider/i;
|
|
14
14
|
var pattern;
|
|
15
15
|
function getPattern() {
|
|
@@ -841,11 +841,7 @@ var Hono = class {
|
|
|
841
841
|
optionHandler = options;
|
|
842
842
|
} else {
|
|
843
843
|
optionHandler = options.optionHandler;
|
|
844
|
-
|
|
845
|
-
replaceRequest = (request) => request;
|
|
846
|
-
} else {
|
|
847
|
-
replaceRequest = options.replaceRequest;
|
|
848
|
-
}
|
|
844
|
+
replaceRequest = options.replaceRequest;
|
|
849
845
|
}
|
|
850
846
|
}
|
|
851
847
|
const getOptions = optionHandler ? (c) => {
|
|
@@ -855,8 +851,7 @@ var Hono = class {
|
|
|
855
851
|
let executionContext = undefined;
|
|
856
852
|
try {
|
|
857
853
|
executionContext = c.executionCtx;
|
|
858
|
-
} catch {
|
|
859
|
-
}
|
|
854
|
+
} catch {}
|
|
860
855
|
return [c.env, executionContext];
|
|
861
856
|
};
|
|
862
857
|
replaceRequest ||= (() => {
|
|
@@ -1750,8 +1745,7 @@ var serveStatic2 = (options) => {
|
|
|
1750
1745
|
try {
|
|
1751
1746
|
const stats = await stat(path);
|
|
1752
1747
|
isDir2 = stats.isDirectory();
|
|
1753
|
-
} catch {
|
|
1754
|
-
}
|
|
1748
|
+
} catch {}
|
|
1755
1749
|
return isDir2;
|
|
1756
1750
|
};
|
|
1757
1751
|
return serveStatic({
|
|
@@ -1952,6 +1946,9 @@ function getRunnableRoute(route) {
|
|
|
1952
1946
|
function isRunnableRoute(route) {
|
|
1953
1947
|
return typeof route === "object" && "run" in route;
|
|
1954
1948
|
}
|
|
1949
|
+
function createLayout(layout) {
|
|
1950
|
+
return layout;
|
|
1951
|
+
}
|
|
1955
1952
|
async function showErrorReponse(context, err) {
|
|
1956
1953
|
const output = render(html`
|
|
1957
1954
|
<main>
|
|
@@ -1969,7 +1966,6 @@ async function showErrorReponse(context, err) {
|
|
|
1969
1966
|
var ROUTE_SEGMENT = /(\[[a-zA-Z_\.]+\])/g;
|
|
1970
1967
|
async function buildRoutes(config) {
|
|
1971
1968
|
const routesDir = join(config.appDir, "routes");
|
|
1972
|
-
console.log(routesDir);
|
|
1973
1969
|
const files = await readdir(routesDir, { recursive: true });
|
|
1974
1970
|
const routes = [];
|
|
1975
1971
|
for (const file of files) {
|
|
@@ -2096,6 +2092,7 @@ export {
|
|
|
2096
2092
|
createRouteFromModule,
|
|
2097
2093
|
createRoute,
|
|
2098
2094
|
createReadableStreamFromAsyncGenerator,
|
|
2095
|
+
createLayout,
|
|
2099
2096
|
createAPIRoute,
|
|
2100
2097
|
buildRoutes,
|
|
2101
2098
|
StreamResponse,
|
package/package.json
CHANGED
package/src/assets.ts
CHANGED
|
@@ -101,7 +101,7 @@ function md5(content: string): string {
|
|
|
101
101
|
*/
|
|
102
102
|
async function copyPreactToPublicFolder() {
|
|
103
103
|
const sourceFile = resolve(PWD, '../', './src/clientjs/preact.ts');
|
|
104
|
-
|
|
104
|
+
await Bun.build({
|
|
105
105
|
entrypoints: [sourceFile],
|
|
106
106
|
outdir: './public/_hs/js',
|
|
107
107
|
minify: true,
|
package/src/server.ts
CHANGED
|
@@ -15,6 +15,8 @@ const CWD = process.cwd();
|
|
|
15
15
|
*/
|
|
16
16
|
export type THSResponseTypes = HSHtml | Response | string | null;
|
|
17
17
|
export type THSRouteHandler = (context: Context) => THSResponseTypes | Promise<THSResponseTypes>;
|
|
18
|
+
export type THSAPIResponseTypes = Response | Record<any, any> | void;
|
|
19
|
+
export type THSAPIRouteHandler = (context: Context) => THSResponseTypes | Promise<THSResponseTypes>;
|
|
18
20
|
|
|
19
21
|
export type THSRoute = {
|
|
20
22
|
_kind: 'hsRoute';
|
|
@@ -100,8 +102,8 @@ export function createRoute(handler?: THSRouteHandler): THSRoute {
|
|
|
100
102
|
* Create new API Route
|
|
101
103
|
* API Route handlers should return a JSON object or a Response
|
|
102
104
|
*/
|
|
103
|
-
export function createAPIRoute(handler?:
|
|
104
|
-
let _handlers: Record<string,
|
|
105
|
+
export function createAPIRoute(handler?: THSAPIRouteHandler): THSRoute {
|
|
106
|
+
let _handlers: Record<string, THSAPIRouteHandler> = {};
|
|
105
107
|
|
|
106
108
|
if (handler) {
|
|
107
109
|
_handlers['GET'] = handler;
|
|
@@ -109,23 +111,23 @@ export function createAPIRoute(handler?: THSRouteHandler): THSRoute {
|
|
|
109
111
|
|
|
110
112
|
const api: THSRoute = {
|
|
111
113
|
_kind: 'hsRoute',
|
|
112
|
-
get(handler:
|
|
114
|
+
get(handler: THSAPIRouteHandler) {
|
|
113
115
|
_handlers['GET'] = handler;
|
|
114
116
|
return api;
|
|
115
117
|
},
|
|
116
|
-
post(handler:
|
|
118
|
+
post(handler: THSAPIRouteHandler) {
|
|
117
119
|
_handlers['POST'] = handler;
|
|
118
120
|
return api;
|
|
119
121
|
},
|
|
120
|
-
put(handler:
|
|
122
|
+
put(handler: THSAPIRouteHandler) {
|
|
121
123
|
_handlers['PUT'] = handler;
|
|
122
124
|
return api;
|
|
123
125
|
},
|
|
124
|
-
delete(handler:
|
|
126
|
+
delete(handler: THSAPIRouteHandler) {
|
|
125
127
|
_handlers['DELETE'] = handler;
|
|
126
128
|
return api;
|
|
127
129
|
},
|
|
128
|
-
patch(handler:
|
|
130
|
+
patch(handler: THSAPIRouteHandler) {
|
|
129
131
|
_handlers['PATCH'] = handler;
|
|
130
132
|
return api;
|
|
131
133
|
},
|
|
@@ -202,6 +204,14 @@ export function isRunnableRoute(route: unknown): boolean {
|
|
|
202
204
|
return typeof route === 'object' && 'run' in route;
|
|
203
205
|
}
|
|
204
206
|
|
|
207
|
+
/**
|
|
208
|
+
* Create a layout for a Hyperspan app. Passthrough for now.
|
|
209
|
+
* Future intent is to be able to conditionally render a layout for full page content vs. partial content.
|
|
210
|
+
*/
|
|
211
|
+
export function createLayout<T>(layout: (props: T) => HSHtml | Promise<HSHtml>) {
|
|
212
|
+
return layout;
|
|
213
|
+
}
|
|
214
|
+
|
|
205
215
|
/**
|
|
206
216
|
* Basic error handling
|
|
207
217
|
* @TODO: Should check for and load user-customizeable template with special name (app/__error.ts ?)
|
|
@@ -242,7 +252,6 @@ const ROUTE_SEGMENT = /(\[[a-zA-Z_\.]+\])/g;
|
|
|
242
252
|
export async function buildRoutes(config: THSServerConfig): Promise<THSRouteMap[]> {
|
|
243
253
|
// Walk all pages and add them as routes
|
|
244
254
|
const routesDir = join(config.appDir, 'routes');
|
|
245
|
-
console.log(routesDir);
|
|
246
255
|
const files = await readdir(routesDir, { recursive: true });
|
|
247
256
|
const routes: THSRouteMap[] = [];
|
|
248
257
|
|