@h3ravel/http 10.0.0 → 11.1.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/dist/index.js CHANGED
@@ -1,361 +1,313 @@
1
- var __defProp = Object.defineProperty;
2
- var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
-
4
- // src/Middleware.ts
5
- var Middleware = class {
6
- static {
7
- __name(this, "Middleware");
8
- }
9
- };
10
-
11
- // src/Request.ts
12
- import { getQuery, getRouterParams, readBody } from "h3";
1
+ import { HttpContext } from "@h3ravel/shared";
2
+ import { H3, getQuery, getRouterParams, html, readBody, redirect, serve } from "h3";
3
+ import { ServiceProvider } from "@h3ravel/core";
13
4
  import { safeDot } from "@h3ravel/support";
14
- var Request = class {
15
- static {
16
- __name(this, "Request");
17
- }
18
- app;
19
- /**
20
- * Gets route parameters.
21
- * @returns An object containing route parameters.
22
- */
23
- params;
24
- /**
25
- * Gets query parameters.
26
- * @returns An object containing query parameters.
27
- */
28
- query;
29
- /**
30
- * Gets the request headers.
31
- * @returns An object containing request headers.
32
- */
33
- headers;
34
- /**
35
- * The current H3 H3Event instance
36
- */
37
- event;
38
- constructor(event, app) {
39
- this.app = app;
40
- this.event = event;
41
- this.query = getQuery(this.event);
42
- this.params = getRouterParams(this.event);
43
- this.headers = this.event.req.headers;
44
- }
45
- /**
46
- * Get all input data (query + body).
47
- */
48
- async all() {
49
- let data = {
50
- ...getRouterParams(this.event),
51
- ...getQuery(this.event)
52
- };
53
- if (this.event.req.method === "POST") {
54
- data = Object.assign({}, data, Object.fromEntries((await this.event.req.formData()).entries()));
55
- } else if (this.event.req.method === "PUT") {
56
- data = Object.fromEntries(Object.entries(await readBody(this.event)));
57
- }
58
- return data;
59
- }
60
- /**
61
- * Get a single input field from query or body.
62
- */
63
- async input(key, defaultValue) {
64
- const data = await this.all();
65
- return data[key] ?? defaultValue;
66
- }
67
- getEvent(key) {
68
- return safeDot(this.event, key);
69
- }
70
- };
71
-
72
- // src/Response.ts
73
- import { safeDot as safeDot2 } from "@h3ravel/support";
74
- import { html, redirect } from "h3";
75
- var Response = class {
76
- static {
77
- __name(this, "Response");
78
- }
79
- app;
80
- /**
81
- * The current H3 H3Event instance
82
- */
83
- event;
84
- statusCode = 200;
85
- headers = {};
86
- constructor(event, app) {
87
- this.app = app;
88
- this.event = event;
89
- }
90
- /**
91
- * Set HTTP status code.
92
- */
93
- setStatusCode(code) {
94
- this.statusCode = code;
95
- this.event.res.status = code;
96
- return this;
97
- }
98
- /**
99
- * Set a header.
100
- */
101
- setHeader(name, value) {
102
- this.headers[name] = value;
103
- return this;
104
- }
105
- html(content) {
106
- this.applyHeaders();
107
- return html(this.event, content);
108
- }
109
- /**
110
- * Send a JSON response.
111
- */
112
- json(data) {
113
- this.setHeader("content-type", "application/json; charset=utf-8");
114
- this.applyHeaders();
115
- return data;
116
- }
117
- /**
118
- * Send plain text.
119
- */
120
- text(data) {
121
- this.setHeader("content-type", "text/plain; charset=utf-8");
122
- this.applyHeaders();
123
- return data;
124
- }
125
- /**
126
- * Redirect to another URL.
127
- */
128
- redirect(url, status = 302) {
129
- this.setStatusCode(status);
130
- return redirect(this.event, url, this.statusCode);
131
- }
132
- /**
133
- * Apply headers before sending response.
134
- */
135
- applyHeaders() {
136
- Object.entries(this.headers).forEach(([key, value]) => {
137
- this.event.res.headers.set(key, value);
138
- });
139
- }
140
- getEvent(key) {
141
- return safeDot2(this.event, key);
142
- }
143
- };
144
5
 
145
- // src/Contracts/HttpContract.ts
146
- import { HttpContext } from "@h3ravel/shared";
6
+ //#region src/Middleware.ts
7
+ var Middleware = class {};
147
8
 
148
- // src/Middleware/LogRequests.ts
9
+ //#endregion
10
+ //#region src/Middleware/LogRequests.ts
149
11
  var LogRequests = class extends Middleware {
150
- static {
151
- __name(this, "LogRequests");
152
- }
153
- async handle({ request }, next) {
154
- const url = request.getEvent("url");
155
- console.log(`[${request.getEvent("method")}] ${url.pathname + url.search}`);
156
- return next();
157
- }
12
+ async handle({ request }, next) {
13
+ const url = request.getEvent("url");
14
+ console.log(`[${request.getEvent("method")}] ${url.pathname + url.search}`);
15
+ return next();
16
+ }
158
17
  };
159
18
 
160
- // src/Providers/HttpServiceProvider.ts
161
- import { H3, serve } from "h3";
162
- import { ServiceProvider } from "@h3ravel/core";
19
+ //#endregion
20
+ //#region src/Providers/HttpServiceProvider.ts
21
+ /**
22
+ * Sets up HTTP kernel and request lifecycle.
23
+ *
24
+ * Register Request, Response, and Middleware classes.
25
+ * Configure global middleware stack.
26
+ * Boot HTTP kernel.
27
+ *
28
+ * Auto-Registered
29
+ */
163
30
  var HttpServiceProvider = class extends ServiceProvider {
164
- static {
165
- __name(this, "HttpServiceProvider");
166
- }
167
- static priority = 998;
168
- register() {
169
- this.app.singleton("http.app", () => {
170
- return new H3();
171
- });
172
- this.app.singleton("http.serve", () => serve);
173
- }
31
+ static priority = 998;
32
+ register() {
33
+ this.app.singleton("http.app", () => {
34
+ return new H3();
35
+ });
36
+ this.app.singleton("http.serve", () => serve);
37
+ }
174
38
  };
175
39
 
176
- // src/Resources/JsonResource.ts
40
+ //#endregion
41
+ //#region src/Request.ts
42
+ var Request = class {
43
+ /**
44
+ * Gets route parameters.
45
+ * @returns An object containing route parameters.
46
+ */
47
+ params;
48
+ /**
49
+ * Gets query parameters.
50
+ * @returns An object containing query parameters.
51
+ */
52
+ query;
53
+ /**
54
+ * Gets the request headers.
55
+ * @returns An object containing request headers.
56
+ */
57
+ headers;
58
+ /**
59
+ * The current H3 H3Event instance
60
+ */
61
+ event;
62
+ constructor(event, app) {
63
+ this.app = app;
64
+ this.event = event;
65
+ this.query = getQuery(this.event);
66
+ this.params = getRouterParams(this.event);
67
+ this.headers = this.event.req.headers;
68
+ }
69
+ /**
70
+ * Get all input data (query + body).
71
+ */
72
+ async all() {
73
+ let data = {
74
+ ...getRouterParams(this.event),
75
+ ...getQuery(this.event)
76
+ };
77
+ if (this.event.req.method === "POST") data = Object.assign({}, data, Object.fromEntries((await this.event.req.formData()).entries()));
78
+ else if (this.event.req.method === "PUT") data = Object.fromEntries(Object.entries(await readBody(this.event)));
79
+ return data;
80
+ }
81
+ /**
82
+ * Get a single input field from query or body.
83
+ */
84
+ async input(key, defaultValue) {
85
+ return (await this.all())[key] ?? defaultValue;
86
+ }
87
+ getEvent(key) {
88
+ return safeDot(this.event, key);
89
+ }
90
+ };
91
+
92
+ //#endregion
93
+ //#region src/Resources/JsonResource.ts
94
+ /**
95
+ * Class to render API resource
96
+ */
177
97
  var JsonResource = class {
178
- static {
179
- __name(this, "JsonResource");
180
- }
181
- event;
182
- /**
183
- * The request instance
184
- */
185
- request;
186
- /**
187
- * The response instance
188
- */
189
- response;
190
- /**
191
- * The data to send to the client
192
- */
193
- resource;
194
- /**
195
- * The final response data object
196
- */
197
- body = {
198
- data: {}
199
- };
200
- /**
201
- * Flag to track if response should be sent automatically
202
- */
203
- shouldSend = false;
204
- /**
205
- * Flag to track if response has been sent
206
- */
207
- responseSent = false;
208
- /**
209
- * @param req The request instance
210
- * @param res The response instance
211
- * @param rsc The data to send to the client
212
- */
213
- constructor(event, rsc) {
214
- this.event = event;
215
- this.request = event.req;
216
- this.response = event.res;
217
- this.resource = rsc;
218
- for (const key of Object.keys(rsc)) {
219
- if (!(key in this)) {
220
- Object.defineProperty(this, key, {
221
- enumerable: true,
222
- configurable: true,
223
- get: () => this.resource[key],
224
- set: (value) => {
225
- this.resource[key] = value;
226
- }
227
- });
228
- }
229
- }
230
- }
231
- /**
232
- * Return the data in the expected format
233
- *
234
- * @returns
235
- */
236
- data() {
237
- return this.resource;
238
- }
239
- /**
240
- * Build the response object
241
- * @returns this
242
- */
243
- json() {
244
- this.shouldSend = true;
245
- this.response.status = 200;
246
- const resource = this.data();
247
- let data = Array.isArray(resource) ? [
248
- ...resource
249
- ] : {
250
- ...resource
251
- };
252
- if (typeof data.data !== "undefined") {
253
- data = data.data;
254
- }
255
- if (!Array.isArray(resource)) {
256
- delete data.pagination;
257
- }
258
- this.body = {
259
- data
260
- };
261
- if (!Array.isArray(resource) && resource.pagination) {
262
- const meta = this.body.meta ?? {};
263
- meta.pagination = resource.pagination;
264
- this.body.meta = meta;
265
- }
266
- if (this.resource.pagination && !this.body.meta?.pagination) {
267
- const meta = this.body.meta ?? {};
268
- meta.pagination = this.resource.pagination;
269
- this.body.meta = meta;
270
- }
271
- return this;
272
- }
273
- /**
274
- * Add context data to the response object
275
- * @param data Context data
276
- * @returns this
277
- */
278
- additional(data) {
279
- this.shouldSend = true;
280
- delete data.data;
281
- delete data.pagination;
282
- this.body = {
283
- ...this.body,
284
- ...data
285
- };
286
- return this;
287
- }
288
- /**
289
- * Send the output to the client
290
- * @returns this
291
- */
292
- send() {
293
- this.shouldSend = false;
294
- if (!this.responseSent) {
295
- this.#send();
296
- }
297
- return this;
298
- }
299
- /**
300
- * Set the status code for this response
301
- * @param code Status code
302
- * @returns this
303
- */
304
- status(code) {
305
- this.response.status = code;
306
- return this;
307
- }
308
- /**
309
- * Private method to send the response
310
- */
311
- #send() {
312
- if (!this.responseSent) {
313
- this.event.context.this.response.json(this.body);
314
- this.responseSent = true;
315
- }
316
- }
317
- /**
318
- * Check if send should be triggered automatically
319
- */
320
- checkSend() {
321
- if (this.shouldSend && !this.responseSent) {
322
- this.#send();
323
- }
324
- }
98
+ /**
99
+ * The request instance
100
+ */
101
+ request;
102
+ /**
103
+ * The response instance
104
+ */
105
+ response;
106
+ /**
107
+ * The data to send to the client
108
+ */
109
+ resource;
110
+ /**
111
+ * The final response data object
112
+ */
113
+ body = { data: {} };
114
+ /**
115
+ * Flag to track if response should be sent automatically
116
+ */
117
+ shouldSend = false;
118
+ /**
119
+ * Flag to track if response has been sent
120
+ */
121
+ responseSent = false;
122
+ /**
123
+ * @param req The request instance
124
+ * @param res The response instance
125
+ * @param rsc The data to send to the client
126
+ */
127
+ constructor(event, rsc) {
128
+ this.event = event;
129
+ this.request = event.req;
130
+ this.response = event.res;
131
+ this.resource = rsc;
132
+ for (const key of Object.keys(rsc)) if (!(key in this)) Object.defineProperty(this, key, {
133
+ enumerable: true,
134
+ configurable: true,
135
+ get: () => this.resource[key],
136
+ set: (value) => {
137
+ this.resource[key] = value;
138
+ }
139
+ });
140
+ }
141
+ /**
142
+ * Return the data in the expected format
143
+ *
144
+ * @returns
145
+ */
146
+ data() {
147
+ return this.resource;
148
+ }
149
+ /**
150
+ * Build the response object
151
+ * @returns this
152
+ */
153
+ json() {
154
+ this.shouldSend = true;
155
+ this.response.status = 200;
156
+ const resource = this.data();
157
+ let data = Array.isArray(resource) ? [...resource] : { ...resource };
158
+ if (typeof data.data !== "undefined") data = data.data;
159
+ if (!Array.isArray(resource)) delete data.pagination;
160
+ this.body = { data };
161
+ if (!Array.isArray(resource) && resource.pagination) {
162
+ const meta = this.body.meta ?? {};
163
+ meta.pagination = resource.pagination;
164
+ this.body.meta = meta;
165
+ }
166
+ if (this.resource.pagination && !this.body.meta?.pagination) {
167
+ const meta = this.body.meta ?? {};
168
+ meta.pagination = this.resource.pagination;
169
+ this.body.meta = meta;
170
+ }
171
+ return this;
172
+ }
173
+ /**
174
+ * Add context data to the response object
175
+ * @param data Context data
176
+ * @returns this
177
+ */
178
+ additional(data) {
179
+ this.shouldSend = true;
180
+ delete data.data;
181
+ delete data.pagination;
182
+ this.body = {
183
+ ...this.body,
184
+ ...data
185
+ };
186
+ return this;
187
+ }
188
+ /**
189
+ * Send the output to the client
190
+ * @returns this
191
+ */
192
+ send() {
193
+ this.shouldSend = false;
194
+ if (!this.responseSent) this.#send();
195
+ return this;
196
+ }
197
+ /**
198
+ * Set the status code for this response
199
+ * @param code Status code
200
+ * @returns this
201
+ */
202
+ status(code) {
203
+ this.response.status = code;
204
+ return this;
205
+ }
206
+ /**
207
+ * Private method to send the response
208
+ */
209
+ #send() {
210
+ if (!this.responseSent) {
211
+ this.event.context.this.response.json(this.body);
212
+ this.responseSent = true;
213
+ }
214
+ }
215
+ /**
216
+ * Check if send should be triggered automatically
217
+ */
218
+ checkSend() {
219
+ if (this.shouldSend && !this.responseSent) this.#send();
220
+ }
325
221
  };
326
222
 
327
- // src/Resources/ApiResource.ts
223
+ //#endregion
224
+ //#region src/Resources/ApiResource.ts
328
225
  function ApiResource(instance) {
329
- return new Proxy(instance, {
330
- get(target, prop, receiver) {
331
- const value = Reflect.get(target, prop, receiver);
332
- if (typeof value === "function") {
333
- if (prop === "json" || prop === "additional") {
334
- return (...args) => {
335
- const result = value.apply(target, args);
336
- setImmediate(() => target["checkSend"]());
337
- return result;
338
- };
339
- } else if (prop === "send") {
340
- return (...args) => {
341
- target["shouldSend"] = false;
342
- return value.apply(target, args);
343
- };
344
- }
345
- }
346
- return value;
347
- }
348
- });
226
+ return new Proxy(instance, { get(target, prop, receiver) {
227
+ const value = Reflect.get(target, prop, receiver);
228
+ if (typeof value === "function") {
229
+ if (prop === "json" || prop === "additional") return (...args) => {
230
+ const result = value.apply(target, args);
231
+ setImmediate(() => target["checkSend"]());
232
+ return result;
233
+ };
234
+ else if (prop === "send") return (...args) => {
235
+ target["shouldSend"] = false;
236
+ return value.apply(target, args);
237
+ };
238
+ }
239
+ return value;
240
+ } });
349
241
  }
350
- __name(ApiResource, "ApiResource");
351
- export {
352
- ApiResource,
353
- HttpContext,
354
- HttpServiceProvider,
355
- JsonResource,
356
- LogRequests,
357
- Middleware,
358
- Request,
359
- Response
242
+
243
+ //#endregion
244
+ //#region src/Response.ts
245
+ var Response = class {
246
+ /**
247
+ * The current H3 H3Event instance
248
+ */
249
+ event;
250
+ statusCode = 200;
251
+ headers = {};
252
+ constructor(event, app) {
253
+ this.app = app;
254
+ this.event = event;
255
+ }
256
+ /**
257
+ * Set HTTP status code.
258
+ */
259
+ setStatusCode(code) {
260
+ this.statusCode = code;
261
+ this.event.res.status = code;
262
+ return this;
263
+ }
264
+ /**
265
+ * Set a header.
266
+ */
267
+ setHeader(name, value) {
268
+ this.headers[name] = value;
269
+ return this;
270
+ }
271
+ html(content) {
272
+ this.applyHeaders();
273
+ return html(this.event, content);
274
+ }
275
+ /**
276
+ * Send a JSON response.
277
+ */
278
+ json(data) {
279
+ this.setHeader("content-type", "application/json; charset=utf-8");
280
+ this.applyHeaders();
281
+ return data;
282
+ }
283
+ /**
284
+ * Send plain text.
285
+ */
286
+ text(data) {
287
+ this.setHeader("content-type", "text/plain; charset=utf-8");
288
+ this.applyHeaders();
289
+ return data;
290
+ }
291
+ /**
292
+ * Redirect to another URL.
293
+ */
294
+ redirect(url, status = 302) {
295
+ this.setStatusCode(status);
296
+ return redirect(this.event, url, this.statusCode);
297
+ }
298
+ /**
299
+ * Apply headers before sending response.
300
+ */
301
+ applyHeaders() {
302
+ Object.entries(this.headers).forEach(([key, value]) => {
303
+ this.event.res.headers.set(key, value);
304
+ });
305
+ }
306
+ getEvent(key) {
307
+ return safeDot(this.event, key);
308
+ }
360
309
  };
310
+
311
+ //#endregion
312
+ export { ApiResource, HttpContext, HttpServiceProvider, JsonResource, LogRequests, Middleware, Request, Response };
361
313
  //# sourceMappingURL=index.js.map