@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.
Files changed (46) hide show
  1. package/package.json +47 -63
  2. package/src/index.js +1 -4
  3. package/src/middlewares/index.js +2 -0
  4. package/src/middlewares/setupEnvironmentMiddleware.js +37 -0
  5. package/src/middlewares/trailingSlashMiddleware.js +103 -0
  6. package/src/server/index.js +86 -105
  7. package/src/server-only-utils/globImports.d.ts +73 -0
  8. package/src/server-only-utils/globImports.js +50 -0
  9. package/src/server-only-utils/index.js +1 -9
  10. package/README.md +0 -72
  11. package/src/code-splitter/directives.js +0 -5
  12. package/src/code-splitter/index.js +0 -1
  13. package/src/config/index.js +0 -13
  14. package/src/count.sh +0 -9
  15. package/src/entry-client/index.js +0 -45
  16. package/src/entry-server/index.js +0 -39
  17. package/src/prerender/index.js +0 -63
  18. package/src/server/api-handler.js +0 -22
  19. package/src/server/dev-server.js +0 -21
  20. package/src/server/response.js +0 -6
  21. package/src/server/setup-middleware.js +0 -21
  22. package/src/server-only-utils/glob-imports.js +0 -47
  23. package/src/server-only-utils/import-middlwares.js +0 -29
  24. package/src/server-only-utils/import-prerendered-routes.js +0 -11
  25. package/src/server-only-utils/index.d.ts.txt +0 -3
  26. package/src/server-only-utils/manifest-parser.js +0 -22
  27. package/src/server-only-utils/read-files.js +0 -20
  28. package/src/server-only-utils/renderDomToString.js +0 -8
  29. package/src/server-only-utils/renderToString.js +0 -8
  30. package/src/server-only-utils/resolve-static-routes.js +0 -64
  31. package/src/server-only-utils/write-to-dist.js +0 -24
  32. package/src/setup/files-content.js +0 -53
  33. package/src/setup/generate-hydration-map.js +0 -3
  34. package/src/setup/generate-routes.js +0 -22
  35. package/src/setup/index.js +0 -3
  36. package/src/setup/setup-ziko-folder.js +0 -16
  37. package/src/template.js +0 -14
  38. package/src/utils/api.js +0 -7
  39. package/src/utils/html-template.js +0 -19
  40. package/src/utils/index.js +0 -4
  41. package/src/utils/isAsync.js +0 -3
  42. package/src/utils/normalize-path.js +0 -21
  43. package/src/utils/routes-matcher.js +0 -216
  44. package/src/vite/index.js +0 -1
  45. package/src/vite/vite_setup.js +0 -37
  46. 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'
@@ -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
- }
package/types/global.d.ts DELETED
@@ -1,11 +0,0 @@
1
- export {};
2
-
3
- declare global {
4
- const Ziko: {
5
- locals? : {
6
- auth? : {}
7
- }
8
- };
9
- const use_server_only : unique symbol;
10
- const use_server_only_end : unique symbol;
11
- }