db-json-cli 1.0.5 → 2.0.1
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/.next/BUILD_ID +1 -0
- package/.next/app-build-manifest.json +26 -0
- package/.next/app-path-routes-manifest.json +1 -0
- package/.next/build-manifest.json +32 -0
- package/.next/cache/webpack/client-production/0.pack +0 -0
- package/.next/cache/webpack/client-production/1.pack +0 -0
- package/.next/cache/webpack/client-production/2.pack +0 -0
- package/.next/cache/webpack/client-production/3.pack +0 -0
- package/.next/cache/webpack/client-production/4.pack +0 -0
- package/.next/cache/webpack/client-production/index.pack +0 -0
- package/.next/cache/webpack/client-production/index.pack.old +0 -0
- package/.next/cache/webpack/edge-server-production/0.pack +0 -0
- package/.next/cache/webpack/edge-server-production/index.pack +0 -0
- package/.next/cache/webpack/server-production/0.pack +0 -0
- package/.next/cache/webpack/server-production/1.pack +0 -0
- package/.next/cache/webpack/server-production/2.pack +0 -0
- package/.next/cache/webpack/server-production/3.pack +0 -0
- package/.next/cache/webpack/server-production/index.pack +0 -0
- package/.next/cache/webpack/server-production/index.pack.old +0 -0
- package/.next/export-marker.json +1 -0
- package/.next/images-manifest.json +1 -0
- package/.next/next-minimal-server.js.nft.json +1 -0
- package/.next/next-server.js.nft.json +1 -0
- package/.next/package.json +1 -0
- package/.next/prerender-manifest.json +1 -0
- package/.next/react-loadable-manifest.json +1 -0
- package/.next/required-server-files.json +1 -0
- package/.next/routes-manifest.json +1 -0
- package/.next/server/app/_not-found/page.js +1 -0
- package/.next/server/app/_not-found/page.js.nft.json +1 -0
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -0
- package/.next/server/app/_not-found.html +1 -0
- package/.next/server/app/_not-found.meta +6 -0
- package/.next/server/app/_not-found.rsc +9 -0
- package/.next/server/app/api/[resource]/[id]/route.js +1 -0
- package/.next/server/app/api/[resource]/[id]/route.js.nft.json +1 -0
- package/.next/server/app/api/[resource]/route.js +1 -0
- package/.next/server/app/api/[resource]/route.js.nft.json +1 -0
- package/.next/server/app/api/info/route.js +1 -0
- package/.next/server/app/api/info/route.js.nft.json +1 -0
- package/.next/server/app/api/info.body +1 -0
- package/.next/server/app/api/info.meta +1 -0
- package/.next/server/app/api/login/route.js +1 -0
- package/.next/server/app/api/login/route.js.nft.json +1 -0
- package/.next/server/app/api/register/route.js +1 -0
- package/.next/server/app/api/register/route.js.nft.json +1 -0
- package/.next/server/app/index.html +1 -0
- package/.next/server/app/index.meta +5 -0
- package/.next/server/app/index.rsc +7 -0
- package/.next/server/app/page.js +1 -0
- package/.next/server/app/page.js.nft.json +1 -0
- package/.next/server/app/page_client-reference-manifest.js +1 -0
- package/.next/server/app-paths-manifest.json +9 -0
- package/.next/server/chunks/276.js +2 -0
- package/.next/server/chunks/471.js +2 -0
- package/.next/server/chunks/610.js +12 -0
- package/.next/server/chunks/682.js +6 -0
- package/.next/server/chunks/944.js +1 -0
- package/.next/server/chunks/font-manifest.json +1 -0
- package/.next/server/font-manifest.json +1 -0
- package/.next/server/functions-config-manifest.json +1 -0
- package/.next/server/interception-route-rewrite-manifest.js +1 -0
- package/.next/server/middleware-build-manifest.js +1 -0
- package/.next/server/middleware-manifest.json +6 -0
- package/.next/server/middleware-react-loadable-manifest.js +1 -0
- package/.next/server/next-font-manifest.js +1 -0
- package/.next/server/next-font-manifest.json +1 -0
- package/.next/server/pages/404.html +1 -0
- package/.next/server/pages/500.html +1 -0
- package/.next/server/pages/_app.js +1 -0
- package/.next/server/pages/_app.js.nft.json +1 -0
- package/.next/server/pages/_document.js +1 -0
- package/.next/server/pages/_document.js.nft.json +1 -0
- package/.next/server/pages/_error.js +1 -0
- package/.next/server/pages/_error.js.nft.json +1 -0
- package/.next/server/pages-manifest.json +1 -0
- package/.next/server/server-reference-manifest.js +1 -0
- package/.next/server/server-reference-manifest.json +1 -0
- package/.next/server/webpack-runtime.js +1 -0
- package/.next/static/chunks/117-9bcfe95f89d4b2e1.js +2 -0
- package/.next/static/chunks/29-984b7c92c950b64f.js +1 -0
- package/.next/static/chunks/app/_not-found/page-32c70da5a397ed57.js +1 -0
- package/.next/static/chunks/app/layout-cbd3ebdc4ecc5247.js +1 -0
- package/.next/static/chunks/app/page-448ab87af648362a.js +1 -0
- package/.next/static/chunks/fd9d1056-9f91b5e418130764.js +1 -0
- package/.next/static/chunks/framework-f66176bb897dc684.js +1 -0
- package/.next/static/chunks/main-a3aef5995f5a9328.js +1 -0
- package/.next/static/chunks/main-app-9982ced3bf7037dc.js +1 -0
- package/.next/static/chunks/pages/_app-72b849fbd24ac258.js +1 -0
- package/.next/static/chunks/pages/_error-7ba65e1336b92748.js +1 -0
- package/.next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
- package/.next/static/chunks/webpack-35b091ca5c5192ac.js +1 -0
- package/.next/static/vSEQaRlm1A99jSM80ZjFU/_buildManifest.js +1 -0
- package/.next/static/vSEQaRlm1A99jSM80ZjFU/_ssgManifest.js +1 -0
- package/.next/trace +2 -0
- package/.next/types/app/api/[resource]/[id]/route.ts +343 -0
- package/.next/types/app/api/[resource]/route.ts +343 -0
- package/.next/types/app/api/info/route.ts +343 -0
- package/.next/types/app/api/login/route.ts +343 -0
- package/.next/types/app/api/register/route.ts +343 -0
- package/.next/types/app/layout.ts +79 -0
- package/.next/types/app/page.ts +79 -0
- package/.next/types/package.json +1 -0
- package/app/api/[resource]/[id]/route.js +34 -0
- package/app/api/[resource]/route.js +74 -0
- package/app/api/info/route.js +26 -0
- package/app/api/login/route.js +27 -0
- package/app/api/register/route.js +32 -0
- package/app/layout.jsx +7 -0
- package/app/page.jsx +321 -0
- package/bin/cli.js +37 -0
- package/jsconfig.json +8 -0
- package/{src → lib}/auth.js +13 -11
- package/lib/db.js +47 -0
- package/next.config.js +21 -0
- package/package.json +24 -13
- package/bin/db-json-cli.js +0 -30
- package/src/index.ejs +0 -261
- package/src/server.js +0 -146
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
// File: D:\잡동사니\db-json-cli\app\api\register\route.js
|
|
2
|
+
import * as entry from '../../../../../app/api/register/route.js'
|
|
3
|
+
import type { NextRequest } from 'next/server.js'
|
|
4
|
+
|
|
5
|
+
type TEntry = typeof import('../../../../../app/api/register/route.js')
|
|
6
|
+
|
|
7
|
+
// Check that the entry is a valid entry
|
|
8
|
+
checkFields<Diff<{
|
|
9
|
+
GET?: Function
|
|
10
|
+
HEAD?: Function
|
|
11
|
+
OPTIONS?: Function
|
|
12
|
+
POST?: Function
|
|
13
|
+
PUT?: Function
|
|
14
|
+
DELETE?: Function
|
|
15
|
+
PATCH?: Function
|
|
16
|
+
config?: {}
|
|
17
|
+
generateStaticParams?: Function
|
|
18
|
+
revalidate?: RevalidateRange<TEntry> | false
|
|
19
|
+
dynamic?: 'auto' | 'force-dynamic' | 'error' | 'force-static'
|
|
20
|
+
dynamicParams?: boolean
|
|
21
|
+
fetchCache?: 'auto' | 'force-no-store' | 'only-no-store' | 'default-no-store' | 'default-cache' | 'only-cache' | 'force-cache'
|
|
22
|
+
preferredRegion?: 'auto' | 'global' | 'home' | string | string[]
|
|
23
|
+
runtime?: 'nodejs' | 'experimental-edge' | 'edge'
|
|
24
|
+
maxDuration?: number
|
|
25
|
+
|
|
26
|
+
}, TEntry, ''>>()
|
|
27
|
+
|
|
28
|
+
// Check the prop type of the entry function
|
|
29
|
+
if ('GET' in entry) {
|
|
30
|
+
checkFields<
|
|
31
|
+
Diff<
|
|
32
|
+
ParamCheck<Request | NextRequest>,
|
|
33
|
+
{
|
|
34
|
+
__tag__: 'GET'
|
|
35
|
+
__param_position__: 'first'
|
|
36
|
+
__param_type__: FirstArg<MaybeField<TEntry, 'GET'>>
|
|
37
|
+
},
|
|
38
|
+
'GET'
|
|
39
|
+
>
|
|
40
|
+
>()
|
|
41
|
+
checkFields<
|
|
42
|
+
Diff<
|
|
43
|
+
ParamCheck<PageParams>,
|
|
44
|
+
{
|
|
45
|
+
__tag__: 'GET'
|
|
46
|
+
__param_position__: 'second'
|
|
47
|
+
__param_type__: SecondArg<MaybeField<TEntry, 'GET'>>
|
|
48
|
+
},
|
|
49
|
+
'GET'
|
|
50
|
+
>
|
|
51
|
+
>()
|
|
52
|
+
|
|
53
|
+
checkFields<
|
|
54
|
+
Diff<
|
|
55
|
+
{
|
|
56
|
+
__tag__: 'GET',
|
|
57
|
+
__return_type__: Response | void | never | Promise<Response | void | never>
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
__tag__: 'GET',
|
|
61
|
+
__return_type__: ReturnType<MaybeField<TEntry, 'GET'>>
|
|
62
|
+
},
|
|
63
|
+
'GET'
|
|
64
|
+
>
|
|
65
|
+
>()
|
|
66
|
+
}
|
|
67
|
+
// Check the prop type of the entry function
|
|
68
|
+
if ('HEAD' in entry) {
|
|
69
|
+
checkFields<
|
|
70
|
+
Diff<
|
|
71
|
+
ParamCheck<Request | NextRequest>,
|
|
72
|
+
{
|
|
73
|
+
__tag__: 'HEAD'
|
|
74
|
+
__param_position__: 'first'
|
|
75
|
+
__param_type__: FirstArg<MaybeField<TEntry, 'HEAD'>>
|
|
76
|
+
},
|
|
77
|
+
'HEAD'
|
|
78
|
+
>
|
|
79
|
+
>()
|
|
80
|
+
checkFields<
|
|
81
|
+
Diff<
|
|
82
|
+
ParamCheck<PageParams>,
|
|
83
|
+
{
|
|
84
|
+
__tag__: 'HEAD'
|
|
85
|
+
__param_position__: 'second'
|
|
86
|
+
__param_type__: SecondArg<MaybeField<TEntry, 'HEAD'>>
|
|
87
|
+
},
|
|
88
|
+
'HEAD'
|
|
89
|
+
>
|
|
90
|
+
>()
|
|
91
|
+
|
|
92
|
+
checkFields<
|
|
93
|
+
Diff<
|
|
94
|
+
{
|
|
95
|
+
__tag__: 'HEAD',
|
|
96
|
+
__return_type__: Response | void | never | Promise<Response | void | never>
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
__tag__: 'HEAD',
|
|
100
|
+
__return_type__: ReturnType<MaybeField<TEntry, 'HEAD'>>
|
|
101
|
+
},
|
|
102
|
+
'HEAD'
|
|
103
|
+
>
|
|
104
|
+
>()
|
|
105
|
+
}
|
|
106
|
+
// Check the prop type of the entry function
|
|
107
|
+
if ('OPTIONS' in entry) {
|
|
108
|
+
checkFields<
|
|
109
|
+
Diff<
|
|
110
|
+
ParamCheck<Request | NextRequest>,
|
|
111
|
+
{
|
|
112
|
+
__tag__: 'OPTIONS'
|
|
113
|
+
__param_position__: 'first'
|
|
114
|
+
__param_type__: FirstArg<MaybeField<TEntry, 'OPTIONS'>>
|
|
115
|
+
},
|
|
116
|
+
'OPTIONS'
|
|
117
|
+
>
|
|
118
|
+
>()
|
|
119
|
+
checkFields<
|
|
120
|
+
Diff<
|
|
121
|
+
ParamCheck<PageParams>,
|
|
122
|
+
{
|
|
123
|
+
__tag__: 'OPTIONS'
|
|
124
|
+
__param_position__: 'second'
|
|
125
|
+
__param_type__: SecondArg<MaybeField<TEntry, 'OPTIONS'>>
|
|
126
|
+
},
|
|
127
|
+
'OPTIONS'
|
|
128
|
+
>
|
|
129
|
+
>()
|
|
130
|
+
|
|
131
|
+
checkFields<
|
|
132
|
+
Diff<
|
|
133
|
+
{
|
|
134
|
+
__tag__: 'OPTIONS',
|
|
135
|
+
__return_type__: Response | void | never | Promise<Response | void | never>
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
__tag__: 'OPTIONS',
|
|
139
|
+
__return_type__: ReturnType<MaybeField<TEntry, 'OPTIONS'>>
|
|
140
|
+
},
|
|
141
|
+
'OPTIONS'
|
|
142
|
+
>
|
|
143
|
+
>()
|
|
144
|
+
}
|
|
145
|
+
// Check the prop type of the entry function
|
|
146
|
+
if ('POST' in entry) {
|
|
147
|
+
checkFields<
|
|
148
|
+
Diff<
|
|
149
|
+
ParamCheck<Request | NextRequest>,
|
|
150
|
+
{
|
|
151
|
+
__tag__: 'POST'
|
|
152
|
+
__param_position__: 'first'
|
|
153
|
+
__param_type__: FirstArg<MaybeField<TEntry, 'POST'>>
|
|
154
|
+
},
|
|
155
|
+
'POST'
|
|
156
|
+
>
|
|
157
|
+
>()
|
|
158
|
+
checkFields<
|
|
159
|
+
Diff<
|
|
160
|
+
ParamCheck<PageParams>,
|
|
161
|
+
{
|
|
162
|
+
__tag__: 'POST'
|
|
163
|
+
__param_position__: 'second'
|
|
164
|
+
__param_type__: SecondArg<MaybeField<TEntry, 'POST'>>
|
|
165
|
+
},
|
|
166
|
+
'POST'
|
|
167
|
+
>
|
|
168
|
+
>()
|
|
169
|
+
|
|
170
|
+
checkFields<
|
|
171
|
+
Diff<
|
|
172
|
+
{
|
|
173
|
+
__tag__: 'POST',
|
|
174
|
+
__return_type__: Response | void | never | Promise<Response | void | never>
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
__tag__: 'POST',
|
|
178
|
+
__return_type__: ReturnType<MaybeField<TEntry, 'POST'>>
|
|
179
|
+
},
|
|
180
|
+
'POST'
|
|
181
|
+
>
|
|
182
|
+
>()
|
|
183
|
+
}
|
|
184
|
+
// Check the prop type of the entry function
|
|
185
|
+
if ('PUT' in entry) {
|
|
186
|
+
checkFields<
|
|
187
|
+
Diff<
|
|
188
|
+
ParamCheck<Request | NextRequest>,
|
|
189
|
+
{
|
|
190
|
+
__tag__: 'PUT'
|
|
191
|
+
__param_position__: 'first'
|
|
192
|
+
__param_type__: FirstArg<MaybeField<TEntry, 'PUT'>>
|
|
193
|
+
},
|
|
194
|
+
'PUT'
|
|
195
|
+
>
|
|
196
|
+
>()
|
|
197
|
+
checkFields<
|
|
198
|
+
Diff<
|
|
199
|
+
ParamCheck<PageParams>,
|
|
200
|
+
{
|
|
201
|
+
__tag__: 'PUT'
|
|
202
|
+
__param_position__: 'second'
|
|
203
|
+
__param_type__: SecondArg<MaybeField<TEntry, 'PUT'>>
|
|
204
|
+
},
|
|
205
|
+
'PUT'
|
|
206
|
+
>
|
|
207
|
+
>()
|
|
208
|
+
|
|
209
|
+
checkFields<
|
|
210
|
+
Diff<
|
|
211
|
+
{
|
|
212
|
+
__tag__: 'PUT',
|
|
213
|
+
__return_type__: Response | void | never | Promise<Response | void | never>
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
__tag__: 'PUT',
|
|
217
|
+
__return_type__: ReturnType<MaybeField<TEntry, 'PUT'>>
|
|
218
|
+
},
|
|
219
|
+
'PUT'
|
|
220
|
+
>
|
|
221
|
+
>()
|
|
222
|
+
}
|
|
223
|
+
// Check the prop type of the entry function
|
|
224
|
+
if ('DELETE' in entry) {
|
|
225
|
+
checkFields<
|
|
226
|
+
Diff<
|
|
227
|
+
ParamCheck<Request | NextRequest>,
|
|
228
|
+
{
|
|
229
|
+
__tag__: 'DELETE'
|
|
230
|
+
__param_position__: 'first'
|
|
231
|
+
__param_type__: FirstArg<MaybeField<TEntry, 'DELETE'>>
|
|
232
|
+
},
|
|
233
|
+
'DELETE'
|
|
234
|
+
>
|
|
235
|
+
>()
|
|
236
|
+
checkFields<
|
|
237
|
+
Diff<
|
|
238
|
+
ParamCheck<PageParams>,
|
|
239
|
+
{
|
|
240
|
+
__tag__: 'DELETE'
|
|
241
|
+
__param_position__: 'second'
|
|
242
|
+
__param_type__: SecondArg<MaybeField<TEntry, 'DELETE'>>
|
|
243
|
+
},
|
|
244
|
+
'DELETE'
|
|
245
|
+
>
|
|
246
|
+
>()
|
|
247
|
+
|
|
248
|
+
checkFields<
|
|
249
|
+
Diff<
|
|
250
|
+
{
|
|
251
|
+
__tag__: 'DELETE',
|
|
252
|
+
__return_type__: Response | void | never | Promise<Response | void | never>
|
|
253
|
+
},
|
|
254
|
+
{
|
|
255
|
+
__tag__: 'DELETE',
|
|
256
|
+
__return_type__: ReturnType<MaybeField<TEntry, 'DELETE'>>
|
|
257
|
+
},
|
|
258
|
+
'DELETE'
|
|
259
|
+
>
|
|
260
|
+
>()
|
|
261
|
+
}
|
|
262
|
+
// Check the prop type of the entry function
|
|
263
|
+
if ('PATCH' in entry) {
|
|
264
|
+
checkFields<
|
|
265
|
+
Diff<
|
|
266
|
+
ParamCheck<Request | NextRequest>,
|
|
267
|
+
{
|
|
268
|
+
__tag__: 'PATCH'
|
|
269
|
+
__param_position__: 'first'
|
|
270
|
+
__param_type__: FirstArg<MaybeField<TEntry, 'PATCH'>>
|
|
271
|
+
},
|
|
272
|
+
'PATCH'
|
|
273
|
+
>
|
|
274
|
+
>()
|
|
275
|
+
checkFields<
|
|
276
|
+
Diff<
|
|
277
|
+
ParamCheck<PageParams>,
|
|
278
|
+
{
|
|
279
|
+
__tag__: 'PATCH'
|
|
280
|
+
__param_position__: 'second'
|
|
281
|
+
__param_type__: SecondArg<MaybeField<TEntry, 'PATCH'>>
|
|
282
|
+
},
|
|
283
|
+
'PATCH'
|
|
284
|
+
>
|
|
285
|
+
>()
|
|
286
|
+
|
|
287
|
+
checkFields<
|
|
288
|
+
Diff<
|
|
289
|
+
{
|
|
290
|
+
__tag__: 'PATCH',
|
|
291
|
+
__return_type__: Response | void | never | Promise<Response | void | never>
|
|
292
|
+
},
|
|
293
|
+
{
|
|
294
|
+
__tag__: 'PATCH',
|
|
295
|
+
__return_type__: ReturnType<MaybeField<TEntry, 'PATCH'>>
|
|
296
|
+
},
|
|
297
|
+
'PATCH'
|
|
298
|
+
>
|
|
299
|
+
>()
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
// Check the arguments and return type of the generateStaticParams function
|
|
303
|
+
if ('generateStaticParams' in entry) {
|
|
304
|
+
checkFields<Diff<{ params: PageParams }, FirstArg<MaybeField<TEntry, 'generateStaticParams'>>, 'generateStaticParams'>>()
|
|
305
|
+
checkFields<Diff<{ __tag__: 'generateStaticParams', __return_type__: any[] | Promise<any[]> }, { __tag__: 'generateStaticParams', __return_type__: ReturnType<MaybeField<TEntry, 'generateStaticParams'>> }>>()
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
type PageParams = any
|
|
309
|
+
export interface PageProps {
|
|
310
|
+
params?: any
|
|
311
|
+
searchParams?: any
|
|
312
|
+
}
|
|
313
|
+
export interface LayoutProps {
|
|
314
|
+
children?: React.ReactNode
|
|
315
|
+
|
|
316
|
+
params?: any
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
// =============
|
|
320
|
+
// Utility types
|
|
321
|
+
type RevalidateRange<T> = T extends { revalidate: any } ? NonNegative<T['revalidate']> : never
|
|
322
|
+
|
|
323
|
+
// If T is unknown or any, it will be an empty {} type. Otherwise, it will be the same as Omit<T, keyof Base>.
|
|
324
|
+
type OmitWithTag<T, K extends keyof any, _M> = Omit<T, K>
|
|
325
|
+
type Diff<Base, T extends Base, Message extends string = ''> = 0 extends (1 & T) ? {} : OmitWithTag<T, keyof Base, Message>
|
|
326
|
+
|
|
327
|
+
type FirstArg<T extends Function> = T extends (...args: [infer T, any]) => any ? unknown extends T ? any : T : never
|
|
328
|
+
type SecondArg<T extends Function> = T extends (...args: [any, infer T]) => any ? unknown extends T ? any : T : never
|
|
329
|
+
type MaybeField<T, K extends string> = T extends { [k in K]: infer G } ? G extends Function ? G : never : never
|
|
330
|
+
|
|
331
|
+
type ParamCheck<T> = {
|
|
332
|
+
__tag__: string
|
|
333
|
+
__param_position__: string
|
|
334
|
+
__param_type__: T
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
function checkFields<_ extends { [k in keyof any]: never }>() {}
|
|
338
|
+
|
|
339
|
+
// https://github.com/sindresorhus/type-fest
|
|
340
|
+
type Numeric = number | bigint
|
|
341
|
+
type Zero = 0 | 0n
|
|
342
|
+
type Negative<T extends Numeric> = T extends Zero ? never : `${T}` extends `-${string}` ? T : never
|
|
343
|
+
type NonNegative<T extends Numeric> = T extends Zero ? T : Negative<T> extends never ? T : '__invalid_negative_number__'
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
// File: D:\잡동사니\db-json-cli\app\layout.jsx
|
|
2
|
+
import * as entry from '../../../app/layout.js'
|
|
3
|
+
import type { ResolvingMetadata, ResolvingViewport } from 'next/dist/lib/metadata/types/metadata-interface.js'
|
|
4
|
+
|
|
5
|
+
type TEntry = typeof import('../../../app/layout.js')
|
|
6
|
+
|
|
7
|
+
// Check that the entry is a valid entry
|
|
8
|
+
checkFields<Diff<{
|
|
9
|
+
default: Function
|
|
10
|
+
config?: {}
|
|
11
|
+
generateStaticParams?: Function
|
|
12
|
+
revalidate?: RevalidateRange<TEntry> | false
|
|
13
|
+
dynamic?: 'auto' | 'force-dynamic' | 'error' | 'force-static'
|
|
14
|
+
dynamicParams?: boolean
|
|
15
|
+
fetchCache?: 'auto' | 'force-no-store' | 'only-no-store' | 'default-no-store' | 'default-cache' | 'only-cache' | 'force-cache'
|
|
16
|
+
preferredRegion?: 'auto' | 'global' | 'home' | string | string[]
|
|
17
|
+
runtime?: 'nodejs' | 'experimental-edge' | 'edge'
|
|
18
|
+
maxDuration?: number
|
|
19
|
+
|
|
20
|
+
metadata?: any
|
|
21
|
+
generateMetadata?: Function
|
|
22
|
+
viewport?: any
|
|
23
|
+
generateViewport?: Function
|
|
24
|
+
|
|
25
|
+
}, TEntry, ''>>()
|
|
26
|
+
|
|
27
|
+
// Check the prop type of the entry function
|
|
28
|
+
checkFields<Diff<LayoutProps, FirstArg<TEntry['default']>, 'default'>>()
|
|
29
|
+
|
|
30
|
+
// Check the arguments and return type of the generateMetadata function
|
|
31
|
+
if ('generateMetadata' in entry) {
|
|
32
|
+
checkFields<Diff<LayoutProps, FirstArg<MaybeField<TEntry, 'generateMetadata'>>, 'generateMetadata'>>()
|
|
33
|
+
checkFields<Diff<ResolvingMetadata, SecondArg<MaybeField<TEntry, 'generateMetadata'>>, 'generateMetadata'>>()
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Check the arguments and return type of the generateViewport function
|
|
37
|
+
if ('generateViewport' in entry) {
|
|
38
|
+
checkFields<Diff<LayoutProps, FirstArg<MaybeField<TEntry, 'generateViewport'>>, 'generateViewport'>>()
|
|
39
|
+
checkFields<Diff<ResolvingViewport, SecondArg<MaybeField<TEntry, 'generateViewport'>>, 'generateViewport'>>()
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Check the arguments and return type of the generateStaticParams function
|
|
43
|
+
if ('generateStaticParams' in entry) {
|
|
44
|
+
checkFields<Diff<{ params: PageParams }, FirstArg<MaybeField<TEntry, 'generateStaticParams'>>, 'generateStaticParams'>>()
|
|
45
|
+
checkFields<Diff<{ __tag__: 'generateStaticParams', __return_type__: any[] | Promise<any[]> }, { __tag__: 'generateStaticParams', __return_type__: ReturnType<MaybeField<TEntry, 'generateStaticParams'>> }>>()
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
type PageParams = any
|
|
49
|
+
export interface PageProps {
|
|
50
|
+
params?: any
|
|
51
|
+
searchParams?: any
|
|
52
|
+
}
|
|
53
|
+
export interface LayoutProps {
|
|
54
|
+
children?: React.ReactNode
|
|
55
|
+
|
|
56
|
+
params?: any
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// =============
|
|
60
|
+
// Utility types
|
|
61
|
+
type RevalidateRange<T> = T extends { revalidate: any } ? NonNegative<T['revalidate']> : never
|
|
62
|
+
|
|
63
|
+
// If T is unknown or any, it will be an empty {} type. Otherwise, it will be the same as Omit<T, keyof Base>.
|
|
64
|
+
type OmitWithTag<T, K extends keyof any, _M> = Omit<T, K>
|
|
65
|
+
type Diff<Base, T extends Base, Message extends string = ''> = 0 extends (1 & T) ? {} : OmitWithTag<T, keyof Base, Message>
|
|
66
|
+
|
|
67
|
+
type FirstArg<T extends Function> = T extends (...args: [infer T, any]) => any ? unknown extends T ? any : T : never
|
|
68
|
+
type SecondArg<T extends Function> = T extends (...args: [any, infer T]) => any ? unknown extends T ? any : T : never
|
|
69
|
+
type MaybeField<T, K extends string> = T extends { [k in K]: infer G } ? G extends Function ? G : never : never
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
function checkFields<_ extends { [k in keyof any]: never }>() {}
|
|
74
|
+
|
|
75
|
+
// https://github.com/sindresorhus/type-fest
|
|
76
|
+
type Numeric = number | bigint
|
|
77
|
+
type Zero = 0 | 0n
|
|
78
|
+
type Negative<T extends Numeric> = T extends Zero ? never : `${T}` extends `-${string}` ? T : never
|
|
79
|
+
type NonNegative<T extends Numeric> = T extends Zero ? T : Negative<T> extends never ? T : '__invalid_negative_number__'
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
// File: D:\잡동사니\db-json-cli\app\page.jsx
|
|
2
|
+
import * as entry from '../../../app/page.js'
|
|
3
|
+
import type { ResolvingMetadata, ResolvingViewport } from 'next/dist/lib/metadata/types/metadata-interface.js'
|
|
4
|
+
|
|
5
|
+
type TEntry = typeof import('../../../app/page.js')
|
|
6
|
+
|
|
7
|
+
// Check that the entry is a valid entry
|
|
8
|
+
checkFields<Diff<{
|
|
9
|
+
default: Function
|
|
10
|
+
config?: {}
|
|
11
|
+
generateStaticParams?: Function
|
|
12
|
+
revalidate?: RevalidateRange<TEntry> | false
|
|
13
|
+
dynamic?: 'auto' | 'force-dynamic' | 'error' | 'force-static'
|
|
14
|
+
dynamicParams?: boolean
|
|
15
|
+
fetchCache?: 'auto' | 'force-no-store' | 'only-no-store' | 'default-no-store' | 'default-cache' | 'only-cache' | 'force-cache'
|
|
16
|
+
preferredRegion?: 'auto' | 'global' | 'home' | string | string[]
|
|
17
|
+
runtime?: 'nodejs' | 'experimental-edge' | 'edge'
|
|
18
|
+
maxDuration?: number
|
|
19
|
+
|
|
20
|
+
metadata?: any
|
|
21
|
+
generateMetadata?: Function
|
|
22
|
+
viewport?: any
|
|
23
|
+
generateViewport?: Function
|
|
24
|
+
|
|
25
|
+
}, TEntry, ''>>()
|
|
26
|
+
|
|
27
|
+
// Check the prop type of the entry function
|
|
28
|
+
checkFields<Diff<PageProps, FirstArg<TEntry['default']>, 'default'>>()
|
|
29
|
+
|
|
30
|
+
// Check the arguments and return type of the generateMetadata function
|
|
31
|
+
if ('generateMetadata' in entry) {
|
|
32
|
+
checkFields<Diff<PageProps, FirstArg<MaybeField<TEntry, 'generateMetadata'>>, 'generateMetadata'>>()
|
|
33
|
+
checkFields<Diff<ResolvingMetadata, SecondArg<MaybeField<TEntry, 'generateMetadata'>>, 'generateMetadata'>>()
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Check the arguments and return type of the generateViewport function
|
|
37
|
+
if ('generateViewport' in entry) {
|
|
38
|
+
checkFields<Diff<PageProps, FirstArg<MaybeField<TEntry, 'generateViewport'>>, 'generateViewport'>>()
|
|
39
|
+
checkFields<Diff<ResolvingViewport, SecondArg<MaybeField<TEntry, 'generateViewport'>>, 'generateViewport'>>()
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Check the arguments and return type of the generateStaticParams function
|
|
43
|
+
if ('generateStaticParams' in entry) {
|
|
44
|
+
checkFields<Diff<{ params: PageParams }, FirstArg<MaybeField<TEntry, 'generateStaticParams'>>, 'generateStaticParams'>>()
|
|
45
|
+
checkFields<Diff<{ __tag__: 'generateStaticParams', __return_type__: any[] | Promise<any[]> }, { __tag__: 'generateStaticParams', __return_type__: ReturnType<MaybeField<TEntry, 'generateStaticParams'>> }>>()
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
type PageParams = any
|
|
49
|
+
export interface PageProps {
|
|
50
|
+
params?: any
|
|
51
|
+
searchParams?: any
|
|
52
|
+
}
|
|
53
|
+
export interface LayoutProps {
|
|
54
|
+
children?: React.ReactNode
|
|
55
|
+
|
|
56
|
+
params?: any
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// =============
|
|
60
|
+
// Utility types
|
|
61
|
+
type RevalidateRange<T> = T extends { revalidate: any } ? NonNegative<T['revalidate']> : never
|
|
62
|
+
|
|
63
|
+
// If T is unknown or any, it will be an empty {} type. Otherwise, it will be the same as Omit<T, keyof Base>.
|
|
64
|
+
type OmitWithTag<T, K extends keyof any, _M> = Omit<T, K>
|
|
65
|
+
type Diff<Base, T extends Base, Message extends string = ''> = 0 extends (1 & T) ? {} : OmitWithTag<T, keyof Base, Message>
|
|
66
|
+
|
|
67
|
+
type FirstArg<T extends Function> = T extends (...args: [infer T, any]) => any ? unknown extends T ? any : T : never
|
|
68
|
+
type SecondArg<T extends Function> = T extends (...args: [any, infer T]) => any ? unknown extends T ? any : T : never
|
|
69
|
+
type MaybeField<T, K extends string> = T extends { [k in K]: infer G } ? G extends Function ? G : never : never
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
function checkFields<_ extends { [k in keyof any]: never }>() {}
|
|
74
|
+
|
|
75
|
+
// https://github.com/sindresorhus/type-fest
|
|
76
|
+
type Numeric = number | bigint
|
|
77
|
+
type Zero = 0 | 0n
|
|
78
|
+
type Negative<T extends Numeric> = T extends Zero ? never : `${T}` extends `-${string}` ? T : never
|
|
79
|
+
type NonNegative<T extends Numeric> = T extends Zero ? T : Negative<T> extends never ? T : '__invalid_negative_number__'
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type": "module"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { NextResponse } from "next/server";
|
|
2
|
+
import { getDB } from "@/lib/db";
|
|
3
|
+
import { authMiddleware } from "@/lib/auth";
|
|
4
|
+
|
|
5
|
+
export async function GET(request, { params }) {
|
|
6
|
+
try {
|
|
7
|
+
const { resource, id } = params;
|
|
8
|
+
const db = await getDB();
|
|
9
|
+
|
|
10
|
+
if (!db[resource]) {
|
|
11
|
+
return NextResponse.json({ message: "Resource not found" }, { status: 404 });
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
// Check if private
|
|
15
|
+
const isPrivate = db.rules?.[resource] === "private";
|
|
16
|
+
if (isPrivate) {
|
|
17
|
+
const user = authMiddleware(request);
|
|
18
|
+
if (!user) {
|
|
19
|
+
return NextResponse.json({ message: "No token" }, { status: 401 });
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const itemId = Number(id);
|
|
24
|
+
const item = db[resource].find((i) => i.id === itemId);
|
|
25
|
+
|
|
26
|
+
if (!item) {
|
|
27
|
+
return NextResponse.json({ message: "Not found" }, { status: 404 });
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
return NextResponse.json(item);
|
|
31
|
+
} catch (error) {
|
|
32
|
+
return NextResponse.json({ message: "Failed to fetch item" }, { status: 500 });
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { NextResponse } from "next/server";
|
|
2
|
+
import { getDB, saveDB } from "@/lib/db";
|
|
3
|
+
import { authMiddleware } from "@/lib/auth";
|
|
4
|
+
|
|
5
|
+
export async function GET(request, { params }) {
|
|
6
|
+
try {
|
|
7
|
+
const { resource } = params;
|
|
8
|
+
const db = await getDB();
|
|
9
|
+
|
|
10
|
+
if (!db[resource]) {
|
|
11
|
+
return NextResponse.json({ message: "Resource not found" }, { status: 404 });
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
// Check if private
|
|
15
|
+
const isPrivate = db.rules?.[resource] === "private";
|
|
16
|
+
if (isPrivate) {
|
|
17
|
+
const user = authMiddleware(request);
|
|
18
|
+
if (!user) {
|
|
19
|
+
return NextResponse.json({ message: "No token" }, { status: 401 });
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// Filter by range
|
|
24
|
+
const { searchParams } = new URL(request.url);
|
|
25
|
+
const from = searchParams.get("from");
|
|
26
|
+
const to = searchParams.get("to");
|
|
27
|
+
|
|
28
|
+
let data = db[resource];
|
|
29
|
+
if (from && to) {
|
|
30
|
+
const fromNum = Number(from);
|
|
31
|
+
const toNum = Number(to);
|
|
32
|
+
data = data.filter((item) => item.id >= fromNum && item.id <= toNum);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return NextResponse.json(data);
|
|
36
|
+
} catch (error) {
|
|
37
|
+
return NextResponse.json({ message: "Failed to fetch data" }, { status: 500 });
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export async function POST(request, { params }) {
|
|
42
|
+
try {
|
|
43
|
+
const { resource } = params;
|
|
44
|
+
const db = await getDB();
|
|
45
|
+
|
|
46
|
+
if (!db[resource]) {
|
|
47
|
+
return NextResponse.json({ message: "Resource not found" }, { status: 404 });
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Check if private
|
|
51
|
+
const isPrivate = db.rules?.[resource] === "private";
|
|
52
|
+
if (isPrivate) {
|
|
53
|
+
const user = authMiddleware(request);
|
|
54
|
+
if (!user) {
|
|
55
|
+
return NextResponse.json({ message: "No token" }, { status: 401 });
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const newItem = await request.json();
|
|
60
|
+
if (!newItem || typeof newItem !== "object") {
|
|
61
|
+
return NextResponse.json({ message: "Invalid body" }, { status: 400 });
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const id = db[resource].length ? Math.max(...db[resource].map((i) => i.id)) + 1 : 1;
|
|
65
|
+
const item = { id, ...newItem };
|
|
66
|
+
|
|
67
|
+
db[resource].push(item);
|
|
68
|
+
await saveDB(db);
|
|
69
|
+
|
|
70
|
+
return NextResponse.json(item);
|
|
71
|
+
} catch (error) {
|
|
72
|
+
return NextResponse.json({ message: "Failed to create item" }, { status: 500 });
|
|
73
|
+
}
|
|
74
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { NextResponse } from "next/server";
|
|
2
|
+
import { getDB } from "@/lib/db";
|
|
3
|
+
|
|
4
|
+
export async function GET() {
|
|
5
|
+
try {
|
|
6
|
+
const db = await getDB();
|
|
7
|
+
const routeList = [];
|
|
8
|
+
|
|
9
|
+
Object.keys(db).forEach((key) => {
|
|
10
|
+
if (["users", "rules"].includes(key)) return;
|
|
11
|
+
const isPrivate = db.rules?.[key] === "private";
|
|
12
|
+
routeList.push({
|
|
13
|
+
key,
|
|
14
|
+
count: db[key].length,
|
|
15
|
+
permission: isPrivate ? "private" : "public",
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
return NextResponse.json({
|
|
20
|
+
routeList,
|
|
21
|
+
port: process.env.PORT || 4000,
|
|
22
|
+
});
|
|
23
|
+
} catch (error) {
|
|
24
|
+
return NextResponse.json({ message: "Failed to load DB info" }, { status: 500 });
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { NextResponse } from "next/server";
|
|
2
|
+
import { getDB } from "@/lib/db";
|
|
3
|
+
import { comparePassword, generateTokens } from "@/lib/auth";
|
|
4
|
+
|
|
5
|
+
export async function POST(request) {
|
|
6
|
+
try {
|
|
7
|
+
const { email, password } = await request.json();
|
|
8
|
+
|
|
9
|
+
const db = await getDB();
|
|
10
|
+
const user = db.users.find((u) => u.email === email);
|
|
11
|
+
|
|
12
|
+
if (!user) {
|
|
13
|
+
return NextResponse.json({ message: "Invalid credentials" }, { status: 401 });
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const valid = await comparePassword(password, user.password);
|
|
17
|
+
|
|
18
|
+
if (!valid) {
|
|
19
|
+
return NextResponse.json({ message: "Invalid credentials" }, { status: 401 });
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const tokens = generateTokens({ id: user.id, email: user.email });
|
|
23
|
+
return NextResponse.json(tokens);
|
|
24
|
+
} catch (error) {
|
|
25
|
+
return NextResponse.json({ message: "Login failed" }, { status: 500 });
|
|
26
|
+
}
|
|
27
|
+
}
|