@typetron/framework 0.5.2 → 0.5.3

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 (195) hide show
  1. package/package.json +3 -6
  2. package/.eslintrc-old.js +0 -208
  3. package/Cache/Cache.ts +0 -13
  4. package/Cache/Stores/DatabaseStore.ts +0 -120
  5. package/Cache/Stores/FileStore.ts +0 -69
  6. package/Cache/Stores/MemoryStore.ts +0 -71
  7. package/Cache/index.ts +0 -5
  8. package/Cache/types.ts +0 -4
  9. package/Container/ClassResolver.ts +0 -106
  10. package/Container/Container.ts +0 -144
  11. package/Container/Contracts.ts +0 -3
  12. package/Container/Decorators.ts +0 -20
  13. package/Container/Metadata.ts +0 -16
  14. package/Container/Resolver.ts +0 -27
  15. package/Container/index.ts +0 -5
  16. package/Database/Clauses/Where.ts +0 -0
  17. package/Database/Connection.ts +0 -52
  18. package/Database/Decorators.ts +0 -142
  19. package/Database/Drivers/DatabaseDriver.ts +0 -37
  20. package/Database/Drivers/MySQL/Alter/index.ts +0 -55
  21. package/Database/Drivers/MySQL/ColumnDefinition.ts +0 -16
  22. package/Database/Drivers/MySQL/Create.ts +0 -47
  23. package/Database/Drivers/MySQL/MysqlDriver.ts +0 -123
  24. package/Database/Drivers/MySQL/Schema.ts +0 -82
  25. package/Database/Drivers/MySQL/index.ts +0 -13
  26. package/Database/Drivers/SQL/Schema.ts +0 -73
  27. package/Database/Drivers/SQL/Statements/Alter.ts +0 -22
  28. package/Database/Drivers/SQL/Statements/BaseStatement.ts +0 -55
  29. package/Database/Drivers/SQL/Statements/Delete.ts +0 -20
  30. package/Database/Drivers/SQL/Statements/Insert.ts +0 -24
  31. package/Database/Drivers/SQL/Statements/Select.ts +0 -55
  32. package/Database/Drivers/SQL/Statements/Update.ts +0 -33
  33. package/Database/Drivers/SQL/index.ts +0 -8
  34. package/Database/Drivers/SQLite/Create.ts +0 -45
  35. package/Database/Drivers/SQLite/Schema.ts +0 -54
  36. package/Database/Drivers/SQLite/SqliteDriver.ts +0 -144
  37. package/Database/Drivers/SQLite/index.ts +0 -15
  38. package/Database/Drivers/SchemaContract.ts +0 -11
  39. package/Database/Drivers/Statement.ts +0 -16
  40. package/Database/Drivers/index.ts +0 -4
  41. package/Database/Entity.ts +0 -377
  42. package/Database/EntityNotFoundError.ts +0 -5
  43. package/Database/EntityProxyHandler.ts +0 -43
  44. package/Database/EntityQuery.ts +0 -197
  45. package/Database/Expression.ts +0 -3
  46. package/Database/Fields.ts +0 -816
  47. package/Database/Helpers.ts +0 -12
  48. package/Database/List.ts +0 -71
  49. package/Database/Migrations/Migration.ts +0 -10
  50. package/Database/Migrations/MigrationHistory.ts +0 -20
  51. package/Database/Migrations/Migrator.ts +0 -122
  52. package/Database/Migrations/index.ts +0 -3
  53. package/Database/ORM/BaseRelationship.ts +0 -10
  54. package/Database/Query.ts +0 -374
  55. package/Database/Seeders/Seeder.ts +0 -3
  56. package/Database/Seeders/SeederManager.ts +0 -27
  57. package/Database/Seeders/index.ts +0 -2
  58. package/Database/StringExpression.ts +0 -9
  59. package/Database/Types.ts +0 -165
  60. package/Database/index.ts +0 -23
  61. package/Encryption/index.ts +0 -51
  62. package/Forms/Decorators.ts +0 -29
  63. package/Forms/Form.ts +0 -70
  64. package/Forms/FormFields.ts +0 -36
  65. package/Forms/index.ts +0 -3
  66. package/Framework/App.ts +0 -10
  67. package/Framework/Application.ts +0 -118
  68. package/Framework/Auth/Auth.ts +0 -122
  69. package/Framework/Auth/Authenticatable.ts +0 -9
  70. package/Framework/Auth/User.ts +0 -27
  71. package/Framework/Auth/index.ts +0 -29
  72. package/Framework/Config/AppConfig.ts +0 -25
  73. package/Framework/Config/AuthConfig.ts +0 -9
  74. package/Framework/Config/BaseConfig.ts +0 -9
  75. package/Framework/Config/CacheConfig.ts +0 -38
  76. package/Framework/Config/DatabaseConfig.ts +0 -21
  77. package/Framework/Config/MailConfig.ts +0 -30
  78. package/Framework/Config/index.ts +0 -6
  79. package/Framework/Middleware/AuthMiddleware.ts +0 -31
  80. package/Framework/Middleware/CorsMiddleware.ts +0 -32
  81. package/Framework/Middleware/StaticAssetsMiddleware.ts +0 -76
  82. package/Framework/Middleware/index.ts +0 -2
  83. package/Framework/Provider.ts +0 -9
  84. package/Framework/Providers/CacheProvider.ts +0 -28
  85. package/Framework/Providers/DatabaseProvider.ts +0 -36
  86. package/Framework/Providers/MailProvider.ts +0 -31
  87. package/Framework/Providers/WebsocketsProvider.ts +0 -120
  88. package/Framework/Resolvers/AuthResolver.ts +0 -23
  89. package/Framework/Resolvers/EntityResolver.ts +0 -41
  90. package/Framework/Resolvers/FormResolver.ts +0 -37
  91. package/Framework/RootDir.ts +0 -1
  92. package/Framework/index.ts +0 -8
  93. package/Frontend/Angular/index.ts +0 -24
  94. package/Frontend/Websockets/index.ts +0 -86
  95. package/Mail/MailAddress.ts +0 -4
  96. package/Mail/MailTransport.ts +0 -6
  97. package/Mail/Mailable.ts +0 -16
  98. package/Mail/Mailer.ts +0 -27
  99. package/Mail/PendingMail.ts +0 -68
  100. package/Mail/SentMessage.ts +0 -20
  101. package/Mail/Transports/MemoryTransport.ts +0 -13
  102. package/Mail/Transports/SendGridTransport.ts +0 -95
  103. package/Mail/index.ts +0 -3
  104. package/Models/Model.ts +0 -41
  105. package/Models/index.ts +0 -54
  106. package/Router/BaseController.ts +0 -7
  107. package/Router/Decorators.ts +0 -224
  108. package/Router/Guard.ts +0 -10
  109. package/Router/Http/Contracts.ts +0 -4
  110. package/Router/Http/ErrorHandler.ts +0 -45
  111. package/Router/Http/ErrorHandlerInterface.ts +0 -6
  112. package/Router/Http/Errors/HttpError.ts +0 -15
  113. package/Router/Http/Handler.ts +0 -183
  114. package/Router/Http/HttpRoute.ts +0 -110
  115. package/Router/Http/Middleware.ts +0 -7
  116. package/Router/Http/Request.ts +0 -225
  117. package/Router/Http/Response.ts +0 -35
  118. package/Router/Http/index.ts +0 -85
  119. package/Router/Metadata.ts +0 -34
  120. package/Router/Middleware.ts +0 -16
  121. package/Router/Request.ts +0 -65
  122. package/Router/Route.ts +0 -16
  123. package/Router/RouteNotFoundError.ts +0 -5
  124. package/Router/Router.ts +0 -35
  125. package/Router/Servers/index.ts +0 -6
  126. package/Router/Servers/node.ts +0 -49
  127. package/Router/Servers/uNetworking.ts +0 -151
  128. package/Router/Websockets/Handler.ts +0 -82
  129. package/Router/Websockets/Middleware.ts +0 -7
  130. package/Router/Websockets/Request.ts +0 -3
  131. package/Router/Websockets/WebsocketRoute.ts +0 -61
  132. package/Router/Websockets/index.ts +0 -57
  133. package/Router/Websockets/types.ts +0 -23
  134. package/Router/index.ts +0 -6
  135. package/Storage/File.ts +0 -30
  136. package/Storage/Image.ts +0 -19
  137. package/Storage/InvalidImage.ts +0 -3
  138. package/Storage/Storage.ts +0 -98
  139. package/Storage/index.ts +0 -4
  140. package/Storage/utils.ts +0 -18
  141. package/Support/Array.ts +0 -184
  142. package/Support/Math.ts +0 -12
  143. package/Support/Metadata.ts +0 -31
  144. package/Support/String.ts +0 -38
  145. package/Support/index.ts +0 -19
  146. package/Support/utils.ts +0 -7
  147. package/Testing/TestCase.ts +0 -193
  148. package/Validation/Rule.ts +0 -9
  149. package/Validation/RuleInterface.ts +0 -10
  150. package/Validation/Rules/Email.ts +0 -20
  151. package/Validation/Rules/FileExtension.ts +0 -21
  152. package/Validation/Rules/MaxLength.ts +0 -17
  153. package/Validation/Rules/MinLength.ts +0 -18
  154. package/Validation/Rules/Optional.ts +0 -18
  155. package/Validation/Rules/Required.ts +0 -29
  156. package/Validation/Validator.ts +0 -7
  157. package/Validation/index.ts +0 -12
  158. package/benchmark-index.js +0 -20
  159. package/benchmark.ts +0 -47
  160. package/tests/Cache/DatabaseStoreTest.ts +0 -110
  161. package/tests/Cache/FileStoreTest.ts +0 -93
  162. package/tests/Cache/MemoryStoreTest.ts +0 -92
  163. package/tests/Container/ContainerTest.ts +0 -336
  164. package/tests/Database/Drivers/MySQL/AlterTest.ts +0 -100
  165. package/tests/Database/Drivers/MySQL/CreateTest.ts +0 -39
  166. package/tests/Database/Drivers/MysqlDriverTest.ts +0 -140
  167. package/tests/Database/Drivers/SqliteDriverTest.ts +0 -126
  168. package/tests/Database/Entities/Article.ts +0 -21
  169. package/tests/Database/Entities/Profile.ts +0 -21
  170. package/tests/Database/Entities/Role.ts +0 -15
  171. package/tests/Database/Entities/User.ts +0 -35
  172. package/tests/Database/EntityRelationshipsTest.ts +0 -475
  173. package/tests/Database/EntityTest.ts +0 -202
  174. package/tests/Database/Migrations/RunnerTest.ts +0 -96
  175. package/tests/Database/Migrations/migrations/1.createUserTable.ts +0 -12
  176. package/tests/Database/Migrations/migrations/2.createArticlesTable.ts +0 -12
  177. package/tests/Database/QueryTest.ts +0 -573
  178. package/tests/Database/SchemaTest.ts +0 -32
  179. package/tests/Database/Seeders/RunnerTest.ts +0 -30
  180. package/tests/Database/Seeders/seeders/RandomSeeder.ts +0 -10
  181. package/tests/Database/utils.ts +0 -16
  182. package/tests/Forms/FormsTest.ts +0 -59
  183. package/tests/Framework/Middleware/StaticAssetsMiddlewareTest.ts +0 -129
  184. package/tests/Framework/Resolvers/EntityResolverTest.ts +0 -48
  185. package/tests/Framework/Router/RouterTest.ts +0 -33
  186. package/tests/Mail/MailerTest.ts +0 -76
  187. package/tests/Model/ModelTest.ts +0 -183
  188. package/tests/Router/HttpHandlerTest.ts +0 -72
  189. package/tests/Router/RequestTest.ts +0 -77
  190. package/tests/Router/WebSocketsHandlerTest.ts +0 -51
  191. package/tests/Storage/StorageTest.ts +0 -97
  192. package/tests/Support/ArrayTest.ts +0 -167
  193. package/tests/Support/StringTest.ts +0 -18
  194. package/tests/Validation/RulesTest.ts +0 -54
  195. package/types.d.ts +0 -8
@@ -1,225 +0,0 @@
1
- import { IncomingHttpHeaders, IncomingMessage } from 'http'
2
- import { Http } from '.'
3
- import { Parameters } from './Contracts'
4
- import * as querystring from 'querystring'
5
- import { ParsedUrlQuery } from 'querystring'
6
- import { File } from '../../Storage'
7
- import busboy, { FileInfo } from 'busboy'
8
- import * as os from 'os'
9
- import * as fs from 'fs'
10
- import * as Url from 'fast-url-parser'
11
- import { Readable } from 'stream'
12
- import { Request as BaseRequest } from '@Typetron/Router/Request'
13
-
14
- const cacheURLs = new Array<{url: string, instance: URL}>(100)
15
-
16
- export class Request extends BaseRequest {
17
- // static methodField = '_method'
18
-
19
- public parameters: Record<string, string | number> = {}
20
-
21
- declare protected raw: BaseRequest['raw'] & {
22
- urlOrUri: string,
23
- method: Http.Method,
24
- query?: string | ParsedUrlQuery,
25
- }
26
-
27
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
28
- // @ts-ignore
29
- protected details: BaseRequest['details'] & {
30
- url: string,
31
- uri: string,
32
- method: Http.Method,
33
- query: ParsedUrlQuery,
34
- } = {}
35
-
36
- getHeader: <T extends string | string[]>(name: keyof IncomingHttpHeaders | string) => T | undefined
37
-
38
- constructor(
39
- urlOrUri: string,
40
- method: Http.Method,
41
- query?: string | ParsedUrlQuery,
42
- cookies?: string | Parameters,
43
- body?: string | object,
44
- files?: Record<string, File | File[]>,
45
- ) {
46
- super(urlOrUri, body, cookies, files)
47
- this.raw.urlOrUri = urlOrUri
48
- this.raw.method = method
49
- this.raw.query = query
50
- }
51
-
52
- get headers(): IncomingHttpHeaders {
53
- return {}
54
- }
55
-
56
- get url(): string {
57
- return this.details.url ?? (() => {
58
- const url = Url.parse(this.raw.urlOrUri)
59
- return this.details.url = url.format()
60
- })()
61
- }
62
-
63
- get uri(): string {
64
- return this.details.uri ?? (() => {
65
- const url = cacheURLs[this.raw.urlOrUri.length]?.url === this.raw.urlOrUri
66
- ? cacheURLs[this.raw.urlOrUri.length].instance
67
- : (() => {
68
- cacheURLs[this.raw.urlOrUri.length] = {
69
- url: this.raw.urlOrUri,
70
- instance: Url.parse(this.raw.urlOrUri)
71
- }
72
- return cacheURLs[this.raw.urlOrUri.length].instance
73
- })()
74
-
75
- return this.details.uri = url.pathname ?? ''
76
- })()
77
- }
78
-
79
- get method(): Http.Method {
80
- return this.raw.method
81
- }
82
-
83
- get query(): ParsedUrlQuery {
84
- return this.details.query ?? (() => {
85
- return this.details.query = typeof this.raw.query === 'object'
86
- ? this.raw.query
87
- : querystring.parse(
88
- typeof this.raw.query === 'string'
89
- ? this.raw.query
90
- : Url.parse(this.raw.urlOrUri).query ?? ''
91
- )
92
- })()
93
- }
94
-
95
- get body() {
96
- return this.details.body ?? (() => {
97
- return this.details.body = this.raw.body
98
- })()
99
- }
100
-
101
- get cookies(): Parameters {
102
- return this.details.cookies ?? (() => {
103
- return {todo: 'parse cookies'}
104
- })()
105
- }
106
-
107
- static async loadMultipartContent(incomingMessage: IncomingMessage): Promise<[string | object, Record<string, File | File[]>]> {
108
-
109
- return new Promise((resolve, reject) => {
110
- const formDataParser = busboy({headers: incomingMessage.headers})
111
- const files: Record<string, File | File[]> = {}
112
- const content: Record<string, string> = {}
113
-
114
- formDataParser.on('file', function(fieldName: string, file: Readable, {filename, encoding, mimeType}: FileInfo) {
115
- const extension = filename.split('.').pop()
116
- const fileInstance = new File(`upload_${new Date().getTime().toString()}_${String.randomAlphaNum(9)}.${extension}`)
117
-
118
- fileInstance.originalName = filename
119
- fileInstance.directory = os.tmpdir()
120
- fileInstance.saved = true
121
-
122
- const stream = fs.createWriteStream(fileInstance.path)
123
- stream.on('error', reject)
124
-
125
- file.on('data', function(data) {
126
- stream.write(data)
127
- })
128
- file.on('end', function() {
129
- stream.end()
130
-
131
- const field = files[fieldName]
132
- files[fieldName] = field instanceof Array ? [...field, fileInstance] : field ? [field, fileInstance] : fileInstance
133
- })
134
- })
135
- formDataParser.on('field', function(fieldName, value) {
136
- content[fieldName] = value
137
- })
138
- formDataParser.on('finish', function() {
139
- resolve([content, files])
140
- })
141
-
142
- incomingMessage.pipe(formDataParser)
143
- })
144
- }
145
-
146
- set body(body: string | object | undefined) {
147
- this.details.body = body
148
- }
149
-
150
- get files() {
151
- return this.raw.files ?? {}
152
- }
153
-
154
- set files(files: Record<string, File | File[]>) {
155
- this.raw.files = files
156
- }
157
-
158
- // static async capture(message: IncomingMessage): Promise<Request> {
159
- // const request = new this(
160
- // message.url ?? '',
161
- // message.method as Http.Method || Http.Method.GET,
162
- // message.headers
163
- // )
164
- //
165
- // if (request.method !== Http.Method.GET) {
166
- // if (this.isMultipartRequest(message)) {
167
- // [request.body, request.files] = await Request.loadMultipartContent(message)
168
- // } else {
169
- // request.body = await Request.loadSimpleContent(message)
170
- // }
171
- //
172
- // // const overwrittenMethod = (request.body as Record<string, string | undefined>)[Request.methodField] || ''
173
- // // request.method = Http.Method[overwrittenMethod.toUpperCase() as Http.Method] || request.method
174
- // }
175
- //
176
- // return request
177
- // }
178
-
179
- private static isJSONRequest(incomingMessage: IncomingMessage): boolean {
180
- return Boolean(incomingMessage.headers['content-type']?.includes('application/json'))
181
- }
182
-
183
- static async loadSimpleContent(incomingMessage: IncomingMessage): Promise<string | object | undefined> {
184
- let rawData = ''
185
- incomingMessage.on('data', chunk => {
186
- rawData += chunk
187
- })
188
-
189
- return new Promise((resolve, reject) => {
190
- incomingMessage.on('end', async () => {
191
- try {
192
- if (this.isJSONRequest(incomingMessage)) {
193
- try {
194
- return resolve(JSON.parse(rawData))
195
- } catch (error) {
196
- resolve({})
197
- }
198
- }
199
-
200
- resolve(rawData)
201
- } catch (error) {
202
- if (error instanceof SyntaxError) {
203
- error.stack = `Value used: '${rawData}'\n at ` + error.stack
204
- reject(error)
205
- }
206
- resolve(rawData ? rawData : undefined)
207
- }
208
- })
209
- })
210
- }
211
-
212
- setHeadersLoader(loader: () => IncomingHttpHeaders): void {
213
- Object.defineProperty(this, 'headers', {
214
- get: function() {
215
- return loader()
216
- },
217
- enumerable: true,
218
- configurable: true
219
- })
220
- }
221
-
222
- isMultipartRequest() {
223
- return Boolean(this.getHeader('content-type')?.includes('multipart/form-data'))
224
- }
225
- }
@@ -1,35 +0,0 @@
1
- import { OutgoingHttpHeaders } from 'http'
2
- import { Http } from '.'
3
- import { Buffer } from 'buffer'
4
-
5
- type Content = unknown | undefined | number | string | object | Buffer
6
-
7
- export class Response<T = unknown> {
8
-
9
- constructor(
10
- public body: T,
11
- public status: Http.Status = Http.Status.OK,
12
- public headers: OutgoingHttpHeaders = {}
13
- ) {
14
- }
15
-
16
- static ok(content: string | object) {
17
- return new Response(content, Http.Status.OK)
18
- }
19
-
20
- static notFound(content: string | object) {
21
- return new Response(content, Http.Status.NOT_FOUND)
22
- }
23
-
24
- static badRequest(content: string | object) {
25
- return new Response(content, Http.Status.BAD_REQUEST)
26
- }
27
-
28
- setHeader(name: string, value: string) {
29
- this.headers[name] = value
30
- }
31
-
32
- setHeaders(headers: OutgoingHttpHeaders) {
33
- this.headers = headers
34
- }
35
- }
@@ -1,85 +0,0 @@
1
- export namespace Http {
2
- export enum Method {
3
- GET = 'GET',
4
- HEAD = 'HEAD',
5
- POST = 'POST',
6
- PUT = 'PUT',
7
- PATCH = 'PATCH',
8
- DELETE = 'DELETE',
9
- OPTIONS = 'OPTIONS',
10
- }
11
-
12
- export enum Status {
13
- CONTINUE = 100,
14
- SWITCHING_PROTOCOLS = 101,
15
- PROCESSING = 102, // RFC2518
16
- EARLY_HINTS = 103, // RFC8297
17
- OK = 200,
18
- CREATED = 201,
19
- ACCEPTED = 202,
20
- NON_AUTHORITATIVE_INFORMATION = 203,
21
- NO_CONTENT = 204,
22
- RESET_CONTENT = 205,
23
- PARTIAL_CONTENT = 206,
24
- MULTI_STATUS = 207, // RFC4918
25
- ALREADY_REPORTED = 208, // RFC5842
26
- IM_USED = 226, // RFC3229
27
- MULTIPLE_CHOICES = 300,
28
- MOVED_PERMANENTLY = 301,
29
- FOUND = 302,
30
- SEE_OTHER = 303,
31
- NOT_MODIFIED = 304,
32
- USE_PROXY = 305,
33
- RESERVED = 306,
34
- TEMPORARY_REDIRECT = 307,
35
- PERMANENTLY_REDIRECT = 308, // RFC7238
36
- BAD_REQUEST = 400,
37
- UNAUTHORIZED = 401,
38
- PAYMENT_REQUIRED = 402,
39
- FORBIDDEN = 403,
40
- NOT_FOUND = 404,
41
- METHOD_NOT_ALLOWED = 405,
42
- NOT_ACCEPTABLE = 406,
43
- PROXY_AUTHENTICATION_REQUIRED = 407,
44
- REQUEST_TIMEOUT = 408,
45
- CONFLICT = 409,
46
- GONE = 410,
47
- LENGTH_REQUIRED = 411,
48
- PRECONDITION_FAILED = 412,
49
- REQUEST_ENTITY_TOO_LARGE = 413,
50
- REQUEST_URI_TOO_LONG = 414,
51
- UNSUPPORTED_MEDIA_TYPE = 415,
52
- REQUESTED_RANGE_NOT_SATISFIABLE = 416,
53
- EXPECTATION_FAILED = 417,
54
- I_AM_A_TEAPOT = 418, // RFC2324
55
- MISDIRECTED_REQUEST = 421, // RFC7540
56
- UNPROCESSABLE_ENTITY = 422, // RFC4918
57
- LOCKED = 423, // RFC4918
58
- FAILED_DEPENDENCY = 424, // RFC4918
59
- RESERVED_FOR_WEBDAV_ADVANCED_COLLECTIONS_EXPIRED_PROPOSAL = 425, // RFC2817
60
- TOO_EARLY = 425, // RFC-ietf-httpbis-replay-04
61
- UPGRADE_REQUIRED = 426, // RFC2817
62
- PRECONDITION_REQUIRED = 428, // RFC6585
63
- TOO_MANY_REQUESTS = 429, // RFC6585
64
- REQUEST_HEADER_FIELDS_TOO_LARGE = 431, // RFC6585
65
- UNAVAILABLE_FOR_LEGAL_REASONS = 451,
66
- INTERNAL_SERVER_ERROR = 500,
67
- NOT_IMPLEMENTED = 501,
68
- BAD_GATEWAY = 502,
69
- SERVICE_UNAVAILABLE = 503,
70
- GATEWAY_TIMEOUT = 504,
71
- VERSION_NOT_SUPPORTED = 505,
72
- VARIANT_ALSO_NEGOTIATES_EXPERIMENTAL = 506, // RFC2295
73
- INSUFFICIENT_STORAGE = 507, // RFC4918
74
- LOOP_DETECTED = 508, // RFC5842
75
- NOT_EXTENDED = 510, // RFC2774
76
- NETWORK_AUTHENTICATION_REQUIRED = 511, // RFC6585
77
- }
78
- }
79
-
80
- export * from './ErrorHandler'
81
- export * from './ErrorHandlerInterface'
82
- export * from './Handler'
83
- export * from './Request'
84
- export * from './Response'
85
- export * from './Errors/HttpError'
@@ -1,34 +0,0 @@
1
- import { MetadataKey } from '../Support/Metadata'
2
- import { Abstract, Type } from '../Support'
3
- import { MiddlewareInterface } from './Middleware'
4
- import { Http } from './Http'
5
- import { Guard } from './Guard'
6
- import { Container } from '@Typetron/Container'
7
-
8
- export class MethodMetadata {
9
- middleware: Abstract<MiddlewareInterface>[] = []
10
- parametersTypes: (Type<(...args: any[]) => any> | FunctionConstructor)[]
11
- name: string
12
- parametersOverrides: ((container: Container) => any)[] = []
13
- guards: typeof Guard[] = []
14
- }
15
-
16
- export class ActionMetadata extends MethodMetadata {
17
- }
18
-
19
- export class RouteMetadata extends MethodMetadata {
20
- path: string
21
- method: Http.Method
22
- }
23
-
24
- export class ControllerOptions {
25
- prefix?: string
26
- }
27
-
28
- export class ControllerMetadata extends MetadataKey('framework:controller') {
29
- middleware: Abstract<MiddlewareInterface>[] = []
30
- routes: {[key: string]: RouteMetadata} = {}
31
- actions: {[key: string]: ActionMetadata} = {}
32
- methods: {[key: string]: MethodMetadata} = {}
33
- guards: typeof Guard[] = []
34
- }
@@ -1,16 +0,0 @@
1
- import { Response } from './Http'
2
- import { Request } from '@Typetron/Router/Request'
3
-
4
- export type RequestHandler = (request: Request) => Promise<Response>
5
-
6
- /**
7
- * @deprecated Please use the Middleware, HttpMiddleware or WebsocketMiddleware classes instead
8
- */
9
- export type MiddlewareInterface = {
10
- handle(request: Request, next: RequestHandler): Promise<Response>
11
- }
12
-
13
- export abstract class GlobalMiddleware {
14
- abstract handle(request: Request, next: RequestHandler): Promise<Response>
15
- }
16
-
package/Router/Request.ts DELETED
@@ -1,65 +0,0 @@
1
- import { File } from '../Storage'
2
-
3
- export class Request {
4
- public parameters: Record<string, string | number> = {}
5
-
6
- protected raw: {
7
- name: string,
8
- body?: string | object,
9
- cookies?: Record<string, string | undefined> | string,
10
- files?: Record<string, File | File[]>,
11
- }
12
-
13
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
14
- // @ts-ignore
15
- protected details: {
16
- name: string,
17
- body: string | object | undefined,
18
- cookies: Record<string, string | undefined>,
19
- files: Record<string, File | File[]>,
20
- } = {}
21
-
22
- constructor(
23
- name: string,
24
- body?: string | object,
25
- cookies?: string | Record<string, string | undefined>,
26
- files?: Record<string, File | File[]>,
27
- ) {
28
- this.raw = {
29
- name,
30
- cookies,
31
- body,
32
- files,
33
- }
34
- }
35
-
36
- get name(): string {
37
- return this.details.name ?? (() => {
38
- return this.details.name = this.raw.name
39
- })()
40
- }
41
-
42
- get body() {
43
- return this.details.body ?? (() => {
44
- return this.details.body = this.raw.body
45
- })()
46
- }
47
-
48
- set body(body: string | object | undefined) {
49
- this.details.body = body
50
- }
51
-
52
- get cookies(): Record<string, string | undefined> {
53
- return this.details.cookies ?? (() => {
54
- return {todo: 'parse cookies'}
55
- })()
56
- }
57
-
58
- get files() {
59
- return this.raw.files ?? {}
60
- }
61
-
62
- set files(files: Record<string, File | File[]>) {
63
- this.raw.files = files
64
- }
65
- }
package/Router/Route.ts DELETED
@@ -1,16 +0,0 @@
1
- import { Abstract, AnyFunction, Constructor, Type } from '../Support'
2
- import { GlobalMiddleware } from './Middleware'
3
- import { Guard } from './Guard'
4
-
5
- export abstract class Route {
6
- guards: (typeof Guard)[] = []
7
-
8
- constructor(
9
- public name = '',
10
- public controller: Constructor,
11
- public controllerMethod: string,
12
- public parametersTypes: (Type<AnyFunction> | FunctionConstructor)[] = [],
13
- public middleware: Abstract<GlobalMiddleware>[] = []
14
- ) {
15
- }
16
- }
@@ -1,5 +0,0 @@
1
- export class RouteNotFoundError extends Error {
2
- constructor(path: string) {
3
- super(`Route '${path}' not found`)
4
- }
5
- }
package/Router/Router.ts DELETED
@@ -1,35 +0,0 @@
1
- import { Container, Inject } from '../Container'
2
- import { Storage } from '../Storage'
3
- import { Abstract } from '../Support'
4
- import { GlobalMiddleware } from './Middleware'
5
- import { WebsocketRoute } from './Websockets/WebsocketRoute'
6
- import { HttpRoute } from '@Typetron/Router/Http/HttpRoute'
7
- import { HttpMiddleware } from '@Typetron/Router/Http/Middleware'
8
- import { WebsocketMiddleware } from '@Typetron/Router/Websockets/Middleware'
9
-
10
- export class Router {
11
-
12
- @Inject()
13
- app: Container
14
-
15
- routes: HttpRoute[] = []
16
- actions = new Map<string, WebsocketRoute>()
17
-
18
- middleware: {
19
- global: Abstract<GlobalMiddleware>[],
20
- http: Abstract<HttpMiddleware>[],
21
- websocket: Abstract<WebsocketMiddleware>[],
22
- } = {
23
- global: [],
24
- http: [],
25
- websocket: [],
26
- }
27
-
28
- public loadControllers(directory: string) {
29
- this.app.get(Storage)
30
- .files(directory, true)
31
- .whereIn('extension', ['ts'])
32
- .forEach(file => require(file.path))
33
- }
34
-
35
- }
@@ -1,6 +0,0 @@
1
- import { Request, Response } from '@Typetron/Router/Http'
2
-
3
- export * from './node'
4
- export * from './uNetworking'
5
-
6
- export type AppServer = (port: number, handler: (request: Request) => Promise<Response>) => void
@@ -1,49 +0,0 @@
1
- import { Http, Request, Response } from '@Typetron/Router/Http'
2
- import { createServer, IncomingHttpHeaders, IncomingMessage, ServerResponse } from 'http'
3
- import { Buffer } from 'buffer'
4
-
5
- export function nodeServer(port: number, handler: (request: Request) => Promise<Response>) {
6
- const server = createServer(async (incomingMessage: IncomingMessage, serverResponse: ServerResponse) => {
7
- const request = new Request(
8
- incomingMessage.url ?? '',
9
- incomingMessage.method as Http.Method || Http.Method.GET
10
- )
11
-
12
- request.setHeadersLoader(() => incomingMessage.headers)
13
- request.getHeader = <T extends string | string[] | undefined>(name: keyof IncomingHttpHeaders | string): T => {
14
- return incomingMessage.headers[String(name).toLowerCase()] as T
15
- }
16
-
17
- if (request.method.toLowerCase() !== Http.Method.GET.toLowerCase()) {
18
- if (request.isMultipartRequest()) {
19
- [request.body, request.files] = await Request.loadMultipartContent(incomingMessage)
20
- } else {
21
- request.body = await Request.loadSimpleContent(incomingMessage)
22
- }
23
-
24
- // const overwrittenMethod = (request.body as Record<string, string | undefined>)[Request.methodField] || ''
25
- // request.method = Http.Method[overwrittenMethod.toUpperCase() as Http.Method] || request.method
26
- }
27
-
28
- const response = await handler(request)
29
-
30
- let content = response.body
31
-
32
- if (!(content instanceof Buffer)) {
33
- if (content instanceof Object) {
34
- content = JSON.stringify(content)
35
- serverResponse.setHeader('Content-Type', 'application/json')
36
- }
37
- content = String(content ?? '')
38
- }
39
-
40
- for (const header in response.headers) {
41
- serverResponse.setHeader(header, response.headers[header] || '')
42
- }
43
-
44
- serverResponse.statusCode = response.status
45
- serverResponse.end(content)
46
- })
47
-
48
- server.listen(port)
49
- }