@bleedingdev/modern-js-runtime-utils 3.2.0-ultramodern.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 (109) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +26 -0
  3. package/dist/cjs/browser/deferreds.js +161 -0
  4. package/dist/cjs/browser/index.js +65 -0
  5. package/dist/cjs/browser/nestedRoutes.js +141 -0
  6. package/dist/cjs/merge.js +60 -0
  7. package/dist/cjs/node/fileReader.js +94 -0
  8. package/dist/cjs/node/index.js +99 -0
  9. package/dist/cjs/node/loaderContext/createLoaderCtx.js +51 -0
  10. package/dist/cjs/node/loaderContext/createRequestCtx.js +50 -0
  11. package/dist/cjs/node/loaderContext/index.js +41 -0
  12. package/dist/cjs/node/nestedRoutes.js +58 -0
  13. package/dist/cjs/node/sanitize.js +103 -0
  14. package/dist/cjs/node/serialize.js +49 -0
  15. package/dist/cjs/node/storer/container.js +72 -0
  16. package/dist/cjs/node/storer/index.js +44 -0
  17. package/dist/cjs/node/storer/storage.js +87 -0
  18. package/dist/cjs/parsed.js +46 -0
  19. package/dist/cjs/router.js +91 -0
  20. package/dist/cjs/rsc.js +58 -0
  21. package/dist/cjs/server/index.js +58 -0
  22. package/dist/cjs/server/nestedRoutes.js +49 -0
  23. package/dist/cjs/time.js +61 -0
  24. package/dist/cjs/universal/async_storage.js +58 -0
  25. package/dist/cjs/universal/async_storage.server.js +69 -0
  26. package/dist/cjs/universal/cache.js +381 -0
  27. package/dist/cjs/universal/request.js +86 -0
  28. package/dist/cjs/url.js +39 -0
  29. package/dist/esm/browser/deferreds.mjs +118 -0
  30. package/dist/esm/browser/index.mjs +2 -0
  31. package/dist/esm/browser/nestedRoutes.mjs +104 -0
  32. package/dist/esm/merge.mjs +26 -0
  33. package/dist/esm/node/fileReader.mjs +47 -0
  34. package/dist/esm/node/index.mjs +5 -0
  35. package/dist/esm/node/loaderContext/createLoaderCtx.mjs +14 -0
  36. package/dist/esm/node/loaderContext/createRequestCtx.mjs +16 -0
  37. package/dist/esm/node/loaderContext/index.mjs +4 -0
  38. package/dist/esm/node/nestedRoutes.mjs +1 -0
  39. package/dist/esm/node/sanitize.mjs +66 -0
  40. package/dist/esm/node/serialize.mjs +5 -0
  41. package/dist/esm/node/storer/container.mjs +38 -0
  42. package/dist/esm/node/storer/index.mjs +7 -0
  43. package/dist/esm/node/storer/storage.mjs +53 -0
  44. package/dist/esm/parsed.mjs +12 -0
  45. package/dist/esm/router.mjs +18 -0
  46. package/dist/esm/rsc.mjs +1 -0
  47. package/dist/esm/server/index.mjs +1 -0
  48. package/dist/esm/server/nestedRoutes.mjs +15 -0
  49. package/dist/esm/time.mjs +27 -0
  50. package/dist/esm/universal/async_storage.mjs +7 -0
  51. package/dist/esm/universal/async_storage.server.mjs +32 -0
  52. package/dist/esm/universal/cache.mjs +326 -0
  53. package/dist/esm/universal/request.mjs +40 -0
  54. package/dist/esm/url.mjs +5 -0
  55. package/dist/esm-node/browser/deferreds.mjs +119 -0
  56. package/dist/esm-node/browser/index.mjs +3 -0
  57. package/dist/esm-node/browser/nestedRoutes.mjs +105 -0
  58. package/dist/esm-node/merge.mjs +27 -0
  59. package/dist/esm-node/node/fileReader.mjs +48 -0
  60. package/dist/esm-node/node/index.mjs +6 -0
  61. package/dist/esm-node/node/loaderContext/createLoaderCtx.mjs +15 -0
  62. package/dist/esm-node/node/loaderContext/createRequestCtx.mjs +17 -0
  63. package/dist/esm-node/node/loaderContext/index.mjs +5 -0
  64. package/dist/esm-node/node/nestedRoutes.mjs +2 -0
  65. package/dist/esm-node/node/sanitize.mjs +67 -0
  66. package/dist/esm-node/node/serialize.mjs +6 -0
  67. package/dist/esm-node/node/storer/container.mjs +39 -0
  68. package/dist/esm-node/node/storer/index.mjs +8 -0
  69. package/dist/esm-node/node/storer/storage.mjs +54 -0
  70. package/dist/esm-node/parsed.mjs +13 -0
  71. package/dist/esm-node/router.mjs +19 -0
  72. package/dist/esm-node/rsc.mjs +2 -0
  73. package/dist/esm-node/server/index.mjs +2 -0
  74. package/dist/esm-node/server/nestedRoutes.mjs +16 -0
  75. package/dist/esm-node/time.mjs +28 -0
  76. package/dist/esm-node/universal/async_storage.mjs +25 -0
  77. package/dist/esm-node/universal/async_storage.server.mjs +33 -0
  78. package/dist/esm-node/universal/cache.mjs +327 -0
  79. package/dist/esm-node/universal/request.mjs +41 -0
  80. package/dist/esm-node/url.mjs +6 -0
  81. package/dist/types/browser/deferreds.d.ts +31 -0
  82. package/dist/types/browser/index.d.ts +2 -0
  83. package/dist/types/browser/nestedRoutes.d.ts +12 -0
  84. package/dist/types/merge.d.ts +6 -0
  85. package/dist/types/node/fileReader.d.ts +19 -0
  86. package/dist/types/node/index.d.ts +8 -0
  87. package/dist/types/node/loaderContext/createLoaderCtx.d.ts +7 -0
  88. package/dist/types/node/loaderContext/createRequestCtx.d.ts +16 -0
  89. package/dist/types/node/loaderContext/index.d.ts +4 -0
  90. package/dist/types/node/nestedRoutes.d.ts +1 -0
  91. package/dist/types/node/sanitize.d.ts +11 -0
  92. package/dist/types/node/serialize.d.ts +1 -0
  93. package/dist/types/node/storer/container.d.ts +27 -0
  94. package/dist/types/node/storer/index.d.ts +3 -0
  95. package/dist/types/node/storer/storage.d.ts +26 -0
  96. package/dist/types/parsed.d.ts +1 -0
  97. package/dist/types/router.d.ts +6 -0
  98. package/dist/types/rsc.d.ts +1 -0
  99. package/dist/types/server/index.d.ts +1 -0
  100. package/dist/types/server/nestedRoutes.d.ts +2 -0
  101. package/dist/types/time.d.ts +1 -0
  102. package/dist/types/universal/async_storage.d.ts +2 -0
  103. package/dist/types/universal/async_storage.server.d.ts +29 -0
  104. package/dist/types/universal/cache.d.ts +68 -0
  105. package/dist/types/universal/request.d.ts +17 -0
  106. package/dist/types/url.d.ts +11 -0
  107. package/package.json +197 -0
  108. package/rslib.config.mts +28 -0
  109. package/rstest.config.mts +26 -0
@@ -0,0 +1,68 @@
1
+ export declare const CacheSize: {
2
+ readonly KB: 1024;
3
+ readonly MB: number;
4
+ readonly GB: number;
5
+ };
6
+ export declare const CacheTime: {
7
+ readonly SECOND: 1000;
8
+ readonly MINUTE: number;
9
+ readonly HOUR: number;
10
+ readonly DAY: number;
11
+ readonly WEEK: number;
12
+ readonly MONTH: number;
13
+ };
14
+ export type CacheStatus = 'hit' | 'stale' | 'miss';
15
+ export interface CacheStatsInfo {
16
+ status: CacheStatus;
17
+ key: string;
18
+ params: any[];
19
+ result: any;
20
+ /**
21
+ * Cache miss reason:
22
+ * 1: Caching is disabled for the current request
23
+ * 2: Item not found in cache
24
+ * 3: Item found in cache but has expired
25
+ * 4: Failed to parse data from cache
26
+ * 5: Execution error
27
+ */
28
+ reason?: number;
29
+ }
30
+ export interface Container {
31
+ get: (key: string) => Promise<any | undefined | null>;
32
+ set: (key: string, value: any, options?: {
33
+ ttl?: number;
34
+ }) => Promise<any>;
35
+ has: (key: string) => Promise<boolean>;
36
+ delete: (key: string) => Promise<boolean>;
37
+ clear: () => Promise<void>;
38
+ }
39
+ interface CacheOptions<T extends (...args: any[]) => any> {
40
+ tag?: string | string[];
41
+ maxAge?: number;
42
+ revalidate?: number;
43
+ getKey?: (...args: Parameters<T>) => string;
44
+ customKey?: (options: {
45
+ params: Parameters<T>;
46
+ fn: T;
47
+ generatedKey: string;
48
+ }) => string;
49
+ onCache?: (info: CacheStatsInfo) => void;
50
+ unstable_shouldCache?: (info: {
51
+ params: Parameters<T>;
52
+ result: Awaited<ReturnType<T>>;
53
+ }) => boolean | Promise<boolean>;
54
+ }
55
+ interface CacheConfig {
56
+ maxSize?: number;
57
+ container?: Container;
58
+ unstable_shouldDisable?: ({ request, }: {
59
+ request: Request;
60
+ }) => boolean | Promise<boolean>;
61
+ }
62
+ export declare function configureCache(config: CacheConfig): void;
63
+ export declare function generateKey(args: unknown[]): string;
64
+ export declare function cache<T extends (...args: any[]) => Promise<any>>(fn: T, options?: CacheOptions<T>): T;
65
+ export declare function withRequestCache<T extends (req: Request, ...args: any[]) => Promise<any>>(handler: T): T;
66
+ export declare function revalidateTag(tag: string): Promise<void>;
67
+ export declare function clearStore(): Promise<void>;
68
+ export {};
@@ -0,0 +1,17 @@
1
+ export type Query = Record<string, string>;
2
+ export declare function parseQuery(req: Request): Query;
3
+ export type HeadersData = Record<string, string | undefined>;
4
+ export declare function parseHeaders(request: Request): HeadersData;
5
+ /**
6
+ * The function is modified based on
7
+ * https://github.com/honojs/hono/blob/main/src/utils/url.ts
8
+ *
9
+ * MIT Licensed
10
+ * https://github.com/honojs/hono/blob/main/LICENSE
11
+ *
12
+ */
13
+ export declare function getPathname(request: Request): string;
14
+ export declare function getHost(request: Request): string;
15
+ type Cookie = Record<string, string>;
16
+ export declare function parseCookie(req: Request): Cookie;
17
+ export {};
@@ -0,0 +1,11 @@
1
+ /**
2
+ * we use `pathname.replace(/\/+$/, '')` to remove the '/' with end.
3
+ *
4
+ * examples:
5
+ *
6
+ * pathname1: '/api', pathname2: '/api/',
7
+ * pathname1 as same as pathname2
8
+ *
9
+ * pathname3: '/', the nomalizeResult also as '/'
10
+ */
11
+ export declare function normalizePathname(pathname: string): string;
package/package.json ADDED
@@ -0,0 +1,197 @@
1
+ {
2
+ "name": "@bleedingdev/modern-js-runtime-utils",
3
+ "description": "A Progressive React Framework for modern web development.",
4
+ "homepage": "https://github.com/BleedingDev/ultramodern.js#readme",
5
+ "bugs": {
6
+ "url": "https://github.com/BleedingDev/ultramodern.js/issues"
7
+ },
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/BleedingDev/ultramodern.js.git",
11
+ "directory": "packages/toolkit/utils"
12
+ },
13
+ "license": "MIT",
14
+ "keywords": [
15
+ "react",
16
+ "framework",
17
+ "modern",
18
+ "modern.js"
19
+ ],
20
+ "version": "3.2.0-ultramodern.0",
21
+ "_comment": "Provide ESM and CJS exports, ESM is used by runtime package, for treeshaking",
22
+ "exports": {
23
+ "./router": {
24
+ "types": "./dist/types/router.d.ts",
25
+ "modern:source": "./src/router.ts",
26
+ "default": "./dist/esm/router.mjs"
27
+ },
28
+ "./router/rsc": {
29
+ "types": "./dist/types/rsc.d.ts",
30
+ "modern:source": "./src/rsc.ts",
31
+ "default": "./dist/esm/rsc.mjs"
32
+ },
33
+ "./browser": {
34
+ "types": "./dist/types/browser/index.d.ts",
35
+ "modern:source": "./src/browser/index.ts",
36
+ "default": "./dist/esm/browser/index.mjs"
37
+ },
38
+ "./node": {
39
+ "types": "./dist/types/node/index.d.ts",
40
+ "modern:source": "./src/node/index.ts",
41
+ "default": "./dist/esm/node/index.mjs"
42
+ },
43
+ "./server": {
44
+ "types": "./dist/types/server/index.d.ts",
45
+ "modern:source": "./src/server/index.ts",
46
+ "node": {
47
+ "module": "./dist/esm/server/index.mjs",
48
+ "import": "./dist/esm-node/server/index.mjs",
49
+ "require": "./dist/cjs/server/index.js"
50
+ },
51
+ "default": "./dist/esm/server/index.mjs"
52
+ },
53
+ "./time": {
54
+ "types": "./dist/types/time.d.ts",
55
+ "modern:source": "./src/time.ts",
56
+ "node": {
57
+ "module": "./dist/esm/time.mjs",
58
+ "import": "./dist/esm-node/time.mjs",
59
+ "require": "./dist/cjs/time.js"
60
+ },
61
+ "default": "./dist/esm/time.mjs"
62
+ },
63
+ "./universal/request": {
64
+ "types": "./dist/types/universal/request.d.ts",
65
+ "modern:source": "./src/universal/request.ts",
66
+ "default": "./dist/esm/universal/request.mjs"
67
+ },
68
+ "./parsed": {
69
+ "types": "./dist/types/parsed.d.ts",
70
+ "modern:source": "./src/parsed.ts",
71
+ "default": "./dist/esm/parsed.mjs"
72
+ },
73
+ "./storer": {
74
+ "types": "./dist/types/node/storer/index.d.ts",
75
+ "modern:source": "./src/node/storer/index.ts",
76
+ "node": {
77
+ "import": "./dist/esm-node/node/storer/index.mjs",
78
+ "require": "./dist/cjs/node/storer/index.js"
79
+ },
80
+ "default": "./dist/cjs/node/storer/index.js"
81
+ },
82
+ "./fileReader": {
83
+ "types": "./dist/types/node/fileReader.d.ts",
84
+ "modern:source": "./src/node/fileReader.ts",
85
+ "node": {
86
+ "import": "./dist/esm-node/node/fileReader.mjs",
87
+ "require": "./dist/cjs/node/fileReader.js"
88
+ },
89
+ "default": "./dist/cjs/node/fileReader.js"
90
+ },
91
+ "./url": {
92
+ "types": "./dist/types/url.d.ts",
93
+ "modern:source": "./src/url.ts",
94
+ "default": "./dist/esm/url.mjs"
95
+ },
96
+ "./merge": {
97
+ "types": "./dist/types/merge.d.ts",
98
+ "modern:source": "./src/merge.ts",
99
+ "default": "./dist/esm/merge.mjs"
100
+ },
101
+ "./cache": {
102
+ "types": "./dist/types/universal/cache.d.ts",
103
+ "modern:source": "./src/universal/cache.ts",
104
+ "node": {
105
+ "module": "./dist/esm/universal/cache.mjs",
106
+ "import": "./dist/esm-node/universal/cache.mjs",
107
+ "require": "./dist/cjs/universal/cache.js"
108
+ },
109
+ "default": "./dist/esm/universal/cache.mjs"
110
+ }
111
+ },
112
+ "publishConfig": {
113
+ "registry": "https://registry.npmjs.org/",
114
+ "access": "public"
115
+ },
116
+ "typesVersions": {
117
+ "*": {
118
+ "router": [
119
+ "./dist/types/router.d.ts"
120
+ ],
121
+ "router/rsc": [
122
+ "./dist/types/rsc.d.ts"
123
+ ],
124
+ "browser": [
125
+ "./dist/types/browser/index.d.ts"
126
+ ],
127
+ "node": [
128
+ "./dist/types/node/index.d.ts"
129
+ ],
130
+ "server": [
131
+ "./dist/types/server/index.d.ts"
132
+ ],
133
+ "universal/request": [
134
+ "./dist/types/universal/request.d.ts"
135
+ ],
136
+ "time": [
137
+ "./dist/types/time.d.ts"
138
+ ],
139
+ "parsed": [
140
+ "./dist/types/parsed.d.ts"
141
+ ],
142
+ "storer": [
143
+ "./dist/types/node/storer/index.d.ts"
144
+ ],
145
+ "fileReader": [
146
+ "./dist/types/node/fileReader.d.ts"
147
+ ],
148
+ "url": [
149
+ "./dist/types/url.d.ts"
150
+ ],
151
+ "merge": [
152
+ "./dist/types/merge.d.ts"
153
+ ],
154
+ "cache": [
155
+ "./dist/types/universal/cache.d.ts"
156
+ ]
157
+ }
158
+ },
159
+ "dependencies": {
160
+ "@swc/helpers": "^0.5.21",
161
+ "lru-cache": "^11.3.6",
162
+ "react-router": "7.15.1",
163
+ "serialize-javascript": "^7.0.5",
164
+ "@modern-js/utils": "npm:@bleedingdev/modern-js-utils@3.2.0-ultramodern.0",
165
+ "@modern-js/types": "npm:@bleedingdev/modern-js-types@3.2.0-ultramodern.0"
166
+ },
167
+ "peerDependencies": {
168
+ "react": "^19.2.6",
169
+ "react-dom": "^19.2.6"
170
+ },
171
+ "peerDependenciesMeta": {
172
+ "react": {
173
+ "optional": true
174
+ },
175
+ "react-dom": {
176
+ "optional": true
177
+ }
178
+ },
179
+ "devDependencies": {
180
+ "@rslib/core": "0.21.5",
181
+ "@types/ioredis-mock": "^8.2.7",
182
+ "@types/node": "^25.8.0",
183
+ "@types/serialize-javascript": "^5.0.4",
184
+ "@typescript/native-preview": "7.0.0-dev.20260516.1",
185
+ "ioredis-mock": "^8.13.1",
186
+ "react": "^19.2.6",
187
+ "react-dom": "^19.2.6",
188
+ "@scripts/rstest-config": "2.66.0"
189
+ },
190
+ "sideEffects": false,
191
+ "scripts": {
192
+ "dev": "rslib build --watch",
193
+ "build": "rslib build",
194
+ "test": "rstest --passWithNoTests"
195
+ },
196
+ "types": "./dist/types/index.d.ts"
197
+ }
@@ -0,0 +1,28 @@
1
+ import { rslibConfig } from '@modern-js/rslib';
2
+ import { defineConfig } from '@rslib/core';
3
+
4
+ export default defineConfig({
5
+ ...rslibConfig,
6
+ lib: rslibConfig.lib?.map(libConfig => {
7
+ const isWebTarget = libConfig.output?.target === 'web';
8
+
9
+ return {
10
+ ...libConfig,
11
+ ...(isWebTarget && {
12
+ source: {
13
+ define: {
14
+ ...(libConfig.source?.define || {}),
15
+ IS_WEB: 'true',
16
+ },
17
+ },
18
+ }),
19
+ output: {
20
+ ...libConfig.output,
21
+ externals: {
22
+ async_hooks: 'async_hooks',
23
+ './async_storage.server': './async_storage.server',
24
+ },
25
+ },
26
+ };
27
+ }),
28
+ });
@@ -0,0 +1,26 @@
1
+ import { withTestPreset } from '@scripts/rstest-config';
2
+
3
+ export default {
4
+ projects: [
5
+ withTestPreset({
6
+ name: 'runtime-utils-node',
7
+ root: __dirname,
8
+ testEnvironment: 'node',
9
+ exclude: [
10
+ 'tests/universal/cache-client.test.ts',
11
+ 'tests/browser/**/*.{test,spec}.{js,cjs,mjs,ts,tsx}',
12
+ ],
13
+ globals: true,
14
+ }),
15
+ withTestPreset({
16
+ name: 'runtime-utils-client',
17
+ root: __dirname,
18
+ testEnvironment: 'jsdom',
19
+ include: [
20
+ 'tests/universal/cache-client.test.ts',
21
+ 'tests/browser/**/*.{test,spec}.{js,cjs,mjs,ts,tsx}',
22
+ ],
23
+ globals: true,
24
+ }),
25
+ ],
26
+ };