@zikojs/server 0.1.0 → 0.4.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/package.json +47 -63
- package/src/index.js +1 -4
- package/src/middlewares/index.js +2 -0
- package/src/middlewares/setupEnvironmentMiddleware.js +37 -0
- package/src/middlewares/trailingSlashMiddleware.js +103 -0
- package/src/server/index.js +86 -105
- package/src/server-only-utils/globImports.d.ts +73 -0
- package/src/server-only-utils/globImports.js +50 -0
- package/src/server-only-utils/index.js +1 -9
- package/README.md +0 -72
- package/src/code-splitter/directives.js +0 -5
- package/src/code-splitter/index.js +0 -1
- package/src/config/index.js +0 -13
- package/src/count.sh +0 -9
- package/src/entry-client/index.js +0 -45
- package/src/entry-server/index.js +0 -39
- package/src/prerender/index.js +0 -63
- package/src/server/api-handler.js +0 -22
- package/src/server/dev-server.js +0 -21
- package/src/server/response.js +0 -6
- package/src/server/setup-middleware.js +0 -21
- package/src/server-only-utils/glob-imports.js +0 -47
- package/src/server-only-utils/import-middlwares.js +0 -29
- package/src/server-only-utils/import-prerendered-routes.js +0 -11
- package/src/server-only-utils/index.d.ts.txt +0 -3
- package/src/server-only-utils/manifest-parser.js +0 -22
- package/src/server-only-utils/read-files.js +0 -20
- package/src/server-only-utils/renderDomToString.js +0 -8
- package/src/server-only-utils/renderToString.js +0 -8
- package/src/server-only-utils/resolve-static-routes.js +0 -64
- package/src/server-only-utils/write-to-dist.js +0 -24
- package/src/setup/files-content.js +0 -53
- package/src/setup/generate-hydration-map.js +0 -3
- package/src/setup/generate-routes.js +0 -22
- package/src/setup/index.js +0 -3
- package/src/setup/setup-ziko-folder.js +0 -16
- package/src/template.js +0 -14
- package/src/utils/api.js +0 -7
- package/src/utils/html-template.js +0 -19
- package/src/utils/index.js +0 -4
- package/src/utils/isAsync.js +0 -3
- package/src/utils/normalize-path.js +0 -21
- package/src/utils/routes-matcher.js +0 -216
- package/src/vite/index.js +0 -1
- package/src/vite/vite_setup.js +0 -37
- package/types/global.d.ts +0 -11
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
export function normalize_path(inputPath, root = './src/pages', extensions = ['js', 'ts']) {
|
|
2
|
-
if(root.at(-1)==="/") root = root.slice(0, -1)
|
|
3
|
-
const normalizedPath = inputPath.replace(/\\/g, '/')
|
|
4
|
-
// .replace(/\[(\w+)\]/g, '$1/:$1');
|
|
5
|
-
const parts = normalizedPath.split('/');
|
|
6
|
-
const rootParts = root.split('/');
|
|
7
|
-
const rootIndex = parts.indexOf(rootParts[rootParts.length - 1]);
|
|
8
|
-
if (rootIndex !== -1) {
|
|
9
|
-
const subsequentParts = parts.slice(rootIndex + 1);
|
|
10
|
-
const lastPart = subsequentParts[subsequentParts.length - 1];
|
|
11
|
-
const isIndexFile = lastPart === 'index.js' || lastPart === 'index.ts';
|
|
12
|
-
const hasValidExtension = extensions.some(ext => lastPart === `.${ext}` || lastPart.endsWith(`.${ext}`));
|
|
13
|
-
if (isIndexFile) {
|
|
14
|
-
return '/' + (subsequentParts.length > 1 ? subsequentParts.slice(0, -1).join('/') : '');
|
|
15
|
-
}
|
|
16
|
-
if (hasValidExtension) {
|
|
17
|
-
return '/' + subsequentParts.join('/').replace(/\.(js|ts)$/, '');
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
return '';
|
|
21
|
-
}
|
|
@@ -1,216 +0,0 @@
|
|
|
1
|
-
function routesMatcher(mask, route) {
|
|
2
|
-
const maskSegments = mask.split("/").filter(Boolean);
|
|
3
|
-
const routeSegments = route.split("/").filter(Boolean);
|
|
4
|
-
|
|
5
|
-
let i = 0,
|
|
6
|
-
j = 0;
|
|
7
|
-
|
|
8
|
-
while (i < maskSegments.length && j < routeSegments.length) {
|
|
9
|
-
const maskSegment = maskSegments[i];
|
|
10
|
-
const routeSegment = routeSegments[j];
|
|
11
|
-
|
|
12
|
-
// Catch-all segment `[...param]`
|
|
13
|
-
if (maskSegment.startsWith("[...") && maskSegment.endsWith("]")) {
|
|
14
|
-
const remainingMaskSegments = maskSegments.length - i - 1;
|
|
15
|
-
|
|
16
|
-
if (remainingMaskSegments === 0) {
|
|
17
|
-
// Last segment, matches all remaining
|
|
18
|
-
return true;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
// Calculate minimum required route segments for remaining mask
|
|
22
|
-
let requiredSegments = 0;
|
|
23
|
-
for (let k = i + 1; k < maskSegments.length; k++) {
|
|
24
|
-
if (!maskSegments[k].endsWith("]+")) {
|
|
25
|
-
requiredSegments++;
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
const remainingRouteSegments = routeSegments.length - j;
|
|
30
|
-
if (remainingRouteSegments < requiredSegments) return false;
|
|
31
|
-
|
|
32
|
-
const segmentsToConsume = remainingRouteSegments - requiredSegments;
|
|
33
|
-
if (segmentsToConsume < 1) return false;
|
|
34
|
-
|
|
35
|
-
j += segmentsToConsume;
|
|
36
|
-
i++;
|
|
37
|
-
continue;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
// Optional `[param]+`
|
|
41
|
-
if (maskSegment.startsWith("[") && maskSegment.endsWith("]+")) {
|
|
42
|
-
if (routeSegment) j++;
|
|
43
|
-
i++;
|
|
44
|
-
continue;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
// Dynamic `[param]`
|
|
48
|
-
if (maskSegment.startsWith("[") && maskSegment.endsWith("]")) {
|
|
49
|
-
i++;
|
|
50
|
-
j++;
|
|
51
|
-
continue;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
// Must match static segment
|
|
55
|
-
if (maskSegment !== routeSegment) return false;
|
|
56
|
-
|
|
57
|
-
i++;
|
|
58
|
-
j++;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
// Handle optional parameters at the end
|
|
62
|
-
while (i < maskSegments.length) {
|
|
63
|
-
const seg = maskSegments[i];
|
|
64
|
-
if (seg.endsWith("]+")) {
|
|
65
|
-
i++;
|
|
66
|
-
continue;
|
|
67
|
-
}
|
|
68
|
-
return false;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
return i === maskSegments.length && j === routeSegments.length;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
function dynamicRoutesParser(mask, route) {
|
|
75
|
-
const maskSegments = mask.split("/").filter(Boolean);
|
|
76
|
-
const routeSegments = route.split("/").filter(Boolean);
|
|
77
|
-
const params = {};
|
|
78
|
-
|
|
79
|
-
let i = 0,
|
|
80
|
-
j = 0;
|
|
81
|
-
|
|
82
|
-
while (i < maskSegments.length && j < routeSegments.length) {
|
|
83
|
-
const maskSegment = maskSegments[i];
|
|
84
|
-
const routeSegment = routeSegments[j];
|
|
85
|
-
|
|
86
|
-
// Catch-all `[...param]`
|
|
87
|
-
if (maskSegment.startsWith("[...") && maskSegment.endsWith("]")) {
|
|
88
|
-
const paramName = maskSegment.slice(4, -1);
|
|
89
|
-
|
|
90
|
-
const remainingMaskSegments = maskSegments.length - i - 1;
|
|
91
|
-
if (remainingMaskSegments === 0) {
|
|
92
|
-
params[paramName] = routeSegments.slice(j).join("/");
|
|
93
|
-
break;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
let requiredSegments = 0;
|
|
97
|
-
for (let k = i + 1; k < maskSegments.length; k++) {
|
|
98
|
-
if (!maskSegments[k].endsWith("]+")) {
|
|
99
|
-
requiredSegments++;
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
const remainingRouteSegments = routeSegments.length - j;
|
|
104
|
-
const segmentsToConsume = remainingRouteSegments - requiredSegments;
|
|
105
|
-
|
|
106
|
-
if (segmentsToConsume >= 1) {
|
|
107
|
-
params[paramName] = routeSegments
|
|
108
|
-
.slice(j, j + segmentsToConsume)
|
|
109
|
-
.join("/");
|
|
110
|
-
j += segmentsToConsume;
|
|
111
|
-
} else {
|
|
112
|
-
return {};
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
i++;
|
|
116
|
-
continue;
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
// Optional `[param]+`
|
|
120
|
-
if (maskSegment.startsWith("[") && maskSegment.endsWith("]+")) {
|
|
121
|
-
const paramName = maskSegment.slice(1, -2);
|
|
122
|
-
if (routeSegment) {
|
|
123
|
-
params[paramName] = routeSegment;
|
|
124
|
-
j++;
|
|
125
|
-
}
|
|
126
|
-
i++;
|
|
127
|
-
continue;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
// Dynamic `[param]`
|
|
131
|
-
if (maskSegment.startsWith("[") && maskSegment.endsWith("]")) {
|
|
132
|
-
const paramName = maskSegment.slice(1, -1);
|
|
133
|
-
params[paramName] = routeSegment;
|
|
134
|
-
} else if (maskSegment !== routeSegment) {
|
|
135
|
-
return {};
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
i++;
|
|
139
|
-
j++;
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
return params;
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
function isDynamic(path) {
|
|
146
|
-
const DynamicPattern = /(:\w+|\[\.\.\.\w+\]|\[\w+\]\+?)/;
|
|
147
|
-
return DynamicPattern.test(path);
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
function routesGrouper(routeMap) {
|
|
152
|
-
const grouped = {
|
|
153
|
-
static: {},
|
|
154
|
-
dynamic: {},
|
|
155
|
-
};
|
|
156
|
-
|
|
157
|
-
for (const [path, value] of Object.entries(routeMap)) {
|
|
158
|
-
if (isDynamic(path)) {
|
|
159
|
-
const segments = path.split("/").filter(Boolean);
|
|
160
|
-
const optionalIndex = segments.findIndex(seg => seg.endsWith("]+"));
|
|
161
|
-
const hasInvalidOptional =
|
|
162
|
-
optionalIndex !== -1 && optionalIndex !== segments.length - 1;
|
|
163
|
-
|
|
164
|
-
if (hasInvalidOptional) {
|
|
165
|
-
throw new Error(
|
|
166
|
-
`Invalid optional param position in route: "${path}" — optional parameters can only appear at the end.`,
|
|
167
|
-
);
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
grouped.dynamic[path] = value;
|
|
171
|
-
} else {
|
|
172
|
-
grouped.static[path] = value;
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
return grouped;
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
export { routesMatcher, dynamicRoutesParser, isDynamic, routesGrouper };
|
|
181
|
-
|
|
182
|
-
// // DEMO
|
|
183
|
-
// console.log("=== EXISTING TESTS ===");
|
|
184
|
-
// console.log(routesMatcher("/user/[id]+", "/user")); // true
|
|
185
|
-
// console.log(routesMatcher("/user/[id]+", "/user/42")); // true
|
|
186
|
-
// console.log(routesMatcher("/blog/[...slug]", "/blog/a/b")); // true
|
|
187
|
-
// console.log(routesMatcher("/blog/[id]", "/blog")); // false
|
|
188
|
-
// console.log(routesMatcher("/product/:id", "/product/99")); // true
|
|
189
|
-
|
|
190
|
-
// console.log("\n=== PARSER TESTS ===");
|
|
191
|
-
// console.log(dynamicRoutesParser("/user/[id]+", "/user"));
|
|
192
|
-
// // 👉 {}
|
|
193
|
-
|
|
194
|
-
// console.log(dynamicRoutesParser("/user/[id]+", "/user/42"));
|
|
195
|
-
// // 👉 { id: "42" }
|
|
196
|
-
|
|
197
|
-
// console.log(dynamicRoutesParser("/blog/[...slug]", "/blog/2025/oct/post"));
|
|
198
|
-
// // 👉 { slug: "2025/oct/post" }
|
|
199
|
-
|
|
200
|
-
// console.log(
|
|
201
|
-
// dynamicRoutesParser("/product/[category]/[id]+", "/product/electronics"),
|
|
202
|
-
// );
|
|
203
|
-
// // 👉 { category: "electronics" }
|
|
204
|
-
|
|
205
|
-
// console.log("\n=== FIX TEST ===");
|
|
206
|
-
// console.log(dynamicRoutesParser("/[...slug]/[id]", "/sl1/sl2/9"));
|
|
207
|
-
// // 👉 { slug: "sl1/sl2", id: "9" }
|
|
208
|
-
|
|
209
|
-
// console.log(dynamicRoutesParser("/[slug]/[...id]", "/sl1/id1/id2"));
|
|
210
|
-
// // 👉 { slug: "sl1", id: "id1/id2" }
|
|
211
|
-
|
|
212
|
-
// console.log(dynamicRoutesParser("/blog/lang/[lang]/id/[id]", "/blog/lang/en/id/10"));
|
|
213
|
-
// // 👉 { lang: "en", id: "10" }
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
// // Only the last one that can be optional
|
package/src/vite/index.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from './vite_setup.js'
|
package/src/vite/vite_setup.js
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import { resolve } from 'path'
|
|
2
|
-
export function vite_setup({outDir = 'dist'} = {}){
|
|
3
|
-
const Target = process.env.TARGET;
|
|
4
|
-
const isClient = (Target === 'client')
|
|
5
|
-
const isServer = (Target === 'server')
|
|
6
|
-
if(isClient){
|
|
7
|
-
return {
|
|
8
|
-
build : {
|
|
9
|
-
modulePreload: false,
|
|
10
|
-
outDir : `${outDir}/.client`,
|
|
11
|
-
emptyOutDir: true,
|
|
12
|
-
manifest: true,
|
|
13
|
-
rollupOptions: {
|
|
14
|
-
input: {
|
|
15
|
-
main : resolve(process.cwd(), ".ziko/entry-client.js"),
|
|
16
|
-
index : resolve(process.cwd(), '.ziko/index.html')
|
|
17
|
-
},
|
|
18
|
-
output: {
|
|
19
|
-
entryFileNames: `assets/[name].[hash].js`,
|
|
20
|
-
chunkFileNames: `assets/[name].[hash].js`,
|
|
21
|
-
assetFileNames: `assets/[name].[hash].[ext]`,
|
|
22
|
-
},
|
|
23
|
-
},
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
if(isServer){
|
|
28
|
-
return {
|
|
29
|
-
build : {
|
|
30
|
-
outDir : `${outDir}/.server`,
|
|
31
|
-
ssr : resolve(process.cwd(), ".ziko/entry-server.js"),
|
|
32
|
-
copyPublicDir: false,
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
return {}
|
|
37
|
-
}
|