@mojojs/core 0.24.0 → 0.27.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 (60) hide show
  1. package/README.md +6 -3
  2. package/lib/app.d.ts +9 -5
  3. package/lib/app.js +20 -13
  4. package/lib/app.js.map +1 -1
  5. package/lib/body.d.ts +10 -13
  6. package/lib/body.js +19 -26
  7. package/lib/body.js.map +1 -1
  8. package/lib/cli/get.js +2 -24
  9. package/lib/cli/get.js.map +1 -1
  10. package/lib/context.d.ts +5 -5
  11. package/lib/context.js +5 -6
  12. package/lib/context.js.map +1 -1
  13. package/lib/headers.d.ts +34 -0
  14. package/lib/headers.js +97 -0
  15. package/lib/headers.js.map +1 -0
  16. package/lib/mock/request.js +0 -1
  17. package/lib/mock/request.js.map +1 -1
  18. package/lib/plugins/default-conditions.d.ts +5 -0
  19. package/lib/plugins/{header-conditions.js → default-conditions.js} +3 -3
  20. package/lib/plugins/default-conditions.js.map +1 -0
  21. package/lib/plugins/default-helpers.js +122 -0
  22. package/lib/plugins/default-helpers.js.map +1 -1
  23. package/lib/renderer.js +1 -1
  24. package/lib/renderer.js.map +1 -1
  25. package/lib/server/request.d.ts +44 -4
  26. package/lib/server/request.js +40 -15
  27. package/lib/server/request.js.map +1 -1
  28. package/lib/server/response.d.ts +47 -7
  29. package/lib/server/response.js +57 -46
  30. package/lib/server/response.js.map +1 -1
  31. package/lib/server.d.ts +3 -1
  32. package/lib/server.js +39 -3
  33. package/lib/server.js.map +1 -1
  34. package/lib/static.js +7 -7
  35. package/lib/static.js.map +1 -1
  36. package/lib/types.d.ts +7 -5
  37. package/lib/user-agent/response.d.ts +23 -9
  38. package/lib/user-agent/response.js +7 -13
  39. package/lib/user-agent/response.js.map +1 -1
  40. package/lib/user-agent/test.js +2 -2
  41. package/lib/user-agent/test.js.map +1 -1
  42. package/lib/user-agent/transport/http.js +8 -1
  43. package/lib/user-agent/transport/http.js.map +1 -1
  44. package/lib/user-agent/transport/ws.js +10 -2
  45. package/lib/user-agent/transport/ws.js.map +1 -1
  46. package/lib/user-agent.js +3 -3
  47. package/lib/user-agent.js.map +1 -1
  48. package/lib/websocket.d.ts +1 -1
  49. package/lib/websocket.js +6 -6
  50. package/lib/websocket.js.map +1 -1
  51. package/package.json +1 -1
  52. package/vendor/views/mojo/debug.html.mt +5 -4
  53. package/lib/plugins/exception-helpers.d.ts +0 -5
  54. package/lib/plugins/exception-helpers.js +0 -101
  55. package/lib/plugins/exception-helpers.js.map +0 -1
  56. package/lib/plugins/header-conditions.d.ts +0 -5
  57. package/lib/plugins/header-conditions.js.map +0 -1
  58. package/lib/plugins/view-helpers.d.ts +0 -5
  59. package/lib/plugins/view-helpers.js +0 -33
  60. package/lib/plugins/view-helpers.js.map +0 -1
@@ -1,5 +0,0 @@
1
- import type { App } from '../app.js';
2
- /**
3
- * Exception helper plugin.
4
- */
5
- export default function exceptionHelpersPlugin(app: App): void;
@@ -1,101 +0,0 @@
1
- import { Logger } from '../logger.js';
2
- import { exceptionContext } from '../util.js';
3
- /**
4
- * Exception helper plugin.
5
- */
6
- export default function exceptionHelpersPlugin(app) {
7
- app.addHelper('exception', exception);
8
- app.addHelper('htmlException', htmlException);
9
- app.addHelper('htmlNotFound', htmlNotFound);
10
- app.addHelper('httpException', httpException);
11
- app.addHelper('jsonException', jsonException);
12
- app.addHelper('jsonNotFound', jsonNotFound);
13
- app.addHelper('txtException', txtException);
14
- app.addHelper('txtNotFound', txtNotFound);
15
- app.addHelper('notFound', notFound);
16
- app.addHelper('websocketException', websocketException);
17
- }
18
- async function exception(ctx, error) {
19
- if (ctx.isWebSocket)
20
- return ctx.websocketException(error);
21
- return ctx.httpException(error);
22
- }
23
- async function htmlException(ctx, error) {
24
- ctx.stash.exception = error;
25
- const mode = ctx.app.mode;
26
- if (await ctx.render({ view: `exception.${mode}`, maybe: true, status: 500 }))
27
- return true;
28
- if (await ctx.render({ view: 'exception', maybe: true, status: 500 }))
29
- return true;
30
- const view = mode === 'development' ? 'mojo/debug' : 'mojo/exception';
31
- return await ctx.render({ view, status: 500, stringFormatter: Logger.stringFormatter, exceptionContext });
32
- }
33
- async function htmlNotFound(ctx) {
34
- ctx.stash.exception = null;
35
- const mode = ctx.app.mode;
36
- if (await ctx.render({ view: `not-found.${mode}`, maybe: true, status: 404 }))
37
- return true;
38
- if (await ctx.render({ view: 'not-found', maybe: true, status: 404 }))
39
- return true;
40
- const view = mode === 'development' ? 'mojo/debug' : 'mojo/not-found';
41
- return await ctx.render({ view, status: 404, stringFormatter: Logger.stringFormatter });
42
- }
43
- async function httpException(ctx, error) {
44
- error = ensureError(error);
45
- ctx.log.error(error.stack);
46
- const exceptionFormat = ctx.exceptionFormat;
47
- if (exceptionFormat === 'txt')
48
- return ctx.txtException(error);
49
- if (exceptionFormat === 'json')
50
- return ctx.jsonException(error);
51
- return ctx.htmlException(error);
52
- }
53
- async function jsonException(ctx, error) {
54
- if (ctx.app.mode === 'development') {
55
- return await ctx.render({
56
- json: {
57
- error: {
58
- message: error.message,
59
- name: error.name,
60
- stack: error.stack ?? ''
61
- }
62
- },
63
- pretty: true,
64
- status: 500
65
- });
66
- }
67
- return await ctx.render({ json: { error: { message: 'Internal Server Error' } }, pretty: true, status: 500 });
68
- }
69
- async function jsonNotFound(ctx) {
70
- return await ctx.render({ json: { error: { message: 'Not Found' } }, pretty: true, status: 404 });
71
- }
72
- async function notFound(ctx) {
73
- const exceptionFormat = ctx.exceptionFormat;
74
- if (exceptionFormat === 'txt')
75
- return ctx.txtNotFound();
76
- if (exceptionFormat === 'json')
77
- return ctx.jsonNotFound();
78
- return ctx.htmlNotFound();
79
- }
80
- async function txtException(ctx, error) {
81
- if (ctx.app.mode === 'development') {
82
- return await ctx.render({ text: error.stack, status: 500 });
83
- }
84
- return await ctx.render({ text: 'Internal Server Error', status: 500 });
85
- }
86
- async function txtNotFound(ctx) {
87
- return await ctx.render({ text: 'Not Found', status: 404 });
88
- }
89
- async function websocketException(ctx, error) {
90
- error = ensureError(error);
91
- ctx.log.error(error.stack);
92
- const ws = ctx.ws;
93
- if (ws !== null && ctx.isEstablished)
94
- ws.close(1011);
95
- return true;
96
- }
97
- // If you see this then your code has thrown something that was not an Error object
98
- function ensureError(error) {
99
- return error instanceof Error ? error : new Error(error);
100
- }
101
- //# sourceMappingURL=exception-helpers.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"exception-helpers.js","sourceRoot":"","sources":["../../src/plugins/exception-helpers.ts"],"names":[],"mappings":"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"}
@@ -1,5 +0,0 @@
1
- import type { App } from '../app.js';
2
- /**
3
- * Header condition plugin.
4
- */
5
- export default function headerConditionsPlugin(app: App): void;
@@ -1 +0,0 @@
1
- {"version":3,"file":"header-conditions.js","sourceRoot":"","sources":["../../src/plugins/header-conditions.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,CAAC,OAAO,UAAU,sBAAsB,CAAC,GAAQ;IACrD,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;IAC1B,MAAM,CAAC,YAAY,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;IAChD,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,eAAe,CAAC,GAAgB,EAAE,WAAmC;IAC5E,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE;QACvD,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QAC5C,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK;YAAE,OAAO,KAAK,CAAC;KAC/C;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,aAAa,CAAC,GAAgB,EAAE,WAAmB;IAC1D,OAAO,eAAe,CAAC,GAAG,EAAE,EAAC,IAAI,EAAE,WAAW,EAAC,CAAC,CAAC;AACnD,CAAC"}
@@ -1,5 +0,0 @@
1
- import type { MojoApp } from '../types.js';
2
- /**
3
- * View helper plugin.
4
- */
5
- export default function viewHelpersPlugin(app: MojoApp): void;
@@ -1,33 +0,0 @@
1
- import { SafeString } from '../util.js';
2
- import DOM from '@mojojs/dom';
3
- /**
4
- * View helper plugin.
5
- */
6
- export default function viewHelpersPlugin(app) {
7
- app.addHelper('include', include);
8
- app.addHelper('linkTo', linkTo);
9
- app.addHelper('mojoFaviconTag', mojoFaviconTag);
10
- app.addHelper('scriptTag', scriptTag);
11
- app.addHelper('styleTag', styleTag);
12
- app.addHelper('tag', tag);
13
- }
14
- async function include(ctx, options, stash) {
15
- return await ctx.renderToString(options, stash);
16
- }
17
- function linkTo(ctx, target, attrs, content) {
18
- const href = ctx.urlFor(target);
19
- return ctx.tag('a', { href, ...attrs }, content);
20
- }
21
- function mojoFaviconTag(ctx) {
22
- return ctx.tag('link', { rel: 'icon', href: ctx.urlForFile('/mojo/favicon.ico') });
23
- }
24
- function scriptTag(ctx, target) {
25
- return ctx.tag('script', { src: ctx.urlForFile(target) });
26
- }
27
- function styleTag(ctx, target) {
28
- return ctx.tag('link', { rel: 'stylesheet', href: ctx.urlForFile(target) });
29
- }
30
- function tag(ctx, name, attrs = {}, content = '') {
31
- return new SafeString(DOM.newTag(name, attrs, content).toString());
32
- }
33
- //# sourceMappingURL=view-helpers.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"view-helpers.js","sourceRoot":"","sources":["../../src/plugins/view-helpers.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,UAAU,EAAC,MAAM,YAAY,CAAC;AACtC,OAAO,GAAG,MAAM,aAAa,CAAC;AAE9B;;GAEG;AACH,MAAM,CAAC,OAAO,UAAU,iBAAiB,CAAC,GAAY;IACpD,GAAG,CAAC,SAAS,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAElC,GAAG,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAChC,GAAG,CAAC,SAAS,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAC;IAChD,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IACtC,GAAG,CAAC,SAAS,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IACpC,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AAC5B,CAAC;AAED,KAAK,UAAU,OAAO,CAAC,GAAgB,EAAE,OAAsB,EAAE,KAA0B;IACzF,OAAO,MAAM,GAAG,CAAC,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,MAAM,CACb,GAAgB,EAChB,MAAc,EACd,KAA6B,EAC7B,OAA4B;IAE5B,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAChC,OAAO,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,EAAC,IAAI,EAAE,GAAG,KAAK,EAAC,EAAE,OAAO,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,cAAc,CAAC,GAAgB;IACtC,OAAO,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,EAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,UAAU,CAAC,mBAAmB,CAAC,EAAC,CAAC,CAAC;AACnF,CAAC;AAED,SAAS,SAAS,CAAC,GAAgB,EAAE,MAAc;IACjD,OAAO,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAC,GAAG,EAAE,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,EAAC,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,QAAQ,CAAC,GAAgB,EAAE,MAAc;IAChD,OAAO,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,EAAC,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,EAAC,CAAC,CAAC;AAC5E,CAAC;AAED,SAAS,GAAG,CACV,GAAgB,EAChB,IAAY,EACZ,QAAgC,EAAE,EAClC,UAA+B,EAAE;IAEjC,OAAO,IAAI,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AACrE,CAAC"}