@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,144 +0,0 @@
1
- import { Constructor, Type } from '../Support'
2
- import { ClassResolver } from './ClassResolver'
3
- import { ServiceIdentifier } from './Contracts'
4
- import { InjectableMetadata, Scope } from './Metadata'
5
- import { Resolver } from './Resolver'
6
-
7
- export class Container {
8
- protected static instance: Container
9
-
10
- // TODO performance: get rid of this
11
- public resolvers: Resolver[] = [
12
- new ClassResolver(this)
13
- ]
14
-
15
- // tslint:disable-next-line:no-any
16
- protected instances = new Map<ServiceIdentifier<any>, any>()
17
-
18
- public parent?: Container
19
-
20
- static getInstance() {
21
- if (!Container.instance) {
22
- Container.instance = new Container()
23
- }
24
-
25
- return Container.instance
26
- }
27
-
28
- static setInstance(container: Container) {
29
- return Container.instance = container
30
- }
31
-
32
- getInstances() {
33
- return this.instances
34
- }
35
-
36
- set<T>(abstract: ServiceIdentifier<T>, concrete: T | Type<T> | (() => void)) {
37
- this.instances.set(abstract, concrete)
38
- }
39
-
40
- /**
41
- * @deprecated
42
- */
43
- forceSet<T>(abstract: ServiceIdentifier<T>, concrete: T | Type<T> | (() => any)) {
44
- this.set(abstract, concrete)
45
- }
46
-
47
- // tslint:disable-next-line:no-any
48
- get<T>(abstract: ServiceIdentifier<T>, parameters: any[] = []): T {
49
- const metadata = this.getMetadata(abstract)
50
-
51
- if (metadata.scope === Scope.TRANSIENT) {
52
- return this.getResolver(abstract, metadata).resolve(abstract, parameters) as T
53
- }
54
-
55
- let concrete = this.getInstance(abstract)
56
- if (concrete) {
57
- return concrete
58
- }
59
-
60
- // if (this.parent && metadata.scope !== Scope.REQUEST
61
- // && (concrete = this.parent.getInstance(abstract) ?? this.parent.get(abstract))
62
- // ) {
63
- // return concrete
64
- // }
65
-
66
- if (this.parent && metadata.scope !== Scope.REQUEST && (concrete = this.parent.getInstance(abstract))) {
67
- return concrete
68
- }
69
-
70
- if (typeof abstract === 'string') {
71
- const instance = this.getInstance<T>(abstract) as T
72
- if (!instance) {
73
- throw new Error(`No instance found for '${this.getAbstractName(abstract)}'`)
74
- }
75
- }
76
-
77
- const resolver = this.getResolver(abstract, metadata)
78
- concrete = resolver.resolve(abstract, parameters) as T
79
- this.set(abstract, concrete)
80
- return concrete
81
- }
82
-
83
- createChildContainer(): Container {
84
- const childContainer = new Container()
85
- childContainer.parent = this
86
- childContainer.set(Container, childContainer)
87
- // TODO performance: get rid of this
88
- childContainer.resolvers = this.resolvers.map(resolver => {
89
- return new (resolver.constructor as Constructor<Resolver>)(childContainer)
90
- })
91
- return childContainer
92
- }
93
-
94
- private getMetadata<T>(abstract: ServiceIdentifier<T>) {
95
- if (abstract instanceof Object) {
96
- return InjectableMetadata.get(abstract)
97
- }
98
- return new InjectableMetadata
99
- }
100
-
101
- private getAbstractName<T>(abstract: ServiceIdentifier<T>): string {
102
- if (typeof abstract === 'string') {
103
- return abstract
104
- }
105
- if (abstract === undefined) {
106
- throw new Error(`
107
- Cannot resolve a parameter having the value undefined.
108
- This might be due to circular dependencies in your app
109
- `)
110
- }
111
- if (typeof abstract === 'symbol') {
112
- return abstract.toString()
113
- }
114
- if ('name' in abstract) {
115
- return abstract.name
116
- }
117
- throw new Error(`Cannot get abstract name for ${abstract}`)
118
- }
119
-
120
- private getResolver<T>(abstract: ServiceIdentifier<T>, metadata: InjectableMetadata) {
121
- let resolver = metadata.resolver
122
- if (!resolver) {
123
- resolver = this.resolvers.find(item => item.canResolve(abstract))
124
- }
125
- if (!resolver) {
126
- throw new Error(`Resolver not found for '${this.getAbstractName(abstract)}'`)
127
- }
128
- this.setResolverForAbstract(abstract, resolver, metadata)
129
- resolver.container = this
130
- return resolver
131
- }
132
-
133
- private setResolverForAbstract<T>(abstract: ServiceIdentifier<T>, resolver: Resolver, metadata: InjectableMetadata) {
134
- if (typeof abstract === 'symbol') {
135
- return
136
- }
137
- metadata.resolver = resolver
138
- InjectableMetadata.set(metadata, abstract)
139
- }
140
-
141
- private getInstance<T>(abstract: ServiceIdentifier<T>): T | undefined {
142
- return this.instances.get(abstract) || this.parent?.getInstance(abstract)
143
- }
144
- }
@@ -1,3 +0,0 @@
1
- import { Abstract, Constructor } from '../Support'
2
-
3
- export type ServiceIdentifier<T> = string | Constructor<T> | Abstract<T> | symbol;
@@ -1,20 +0,0 @@
1
- import { ServiceIdentifier } from './Contracts'
2
- import { InjectableMetadata, Scope } from './Metadata'
3
-
4
- export function Injectable(scope: Scope = Scope.SINGLETON) {
5
- return function <T extends Function>(target: T) {
6
- const metadata = InjectableMetadata.get(target)
7
- metadata.scope = scope
8
- InjectableMetadata.set(metadata, target)
9
- }
10
- }
11
-
12
- export function Inject<T extends Object>(abstract?: ServiceIdentifier<T>) {
13
- return function (target: T, targetKey: string, index?: number) {
14
- const fieldType = Reflect.getMetadata('design:type', target, targetKey) as ServiceIdentifier<T>
15
- const metadata = InjectableMetadata.get(target.constructor)
16
- metadata.dependencies[targetKey] = abstract ?? fieldType
17
- InjectableMetadata.set(metadata, target.constructor)
18
- }
19
- }
20
-
@@ -1,16 +0,0 @@
1
- import { Resolver } from './Resolver'
2
- import { ServiceIdentifier } from './Contracts'
3
- import { MetadataKey } from '../Support/Metadata'
4
-
5
- export enum Scope {
6
- TRANSIENT = 'TRANSIENT',
7
- SINGLETON = 'SINGLETON',
8
- REQUEST = 'REQUEST',
9
- }
10
-
11
- export class InjectableMetadata extends MetadataKey('injectable') {
12
- resolver?: Resolver
13
-
14
- scope: Scope = Scope.SINGLETON
15
- dependencies: {[key: string]: ServiceIdentifier<{}>} = {}
16
- }
@@ -1,27 +0,0 @@
1
- import { Container } from './Container'
2
- import { ServiceIdentifier } from './Contracts'
3
-
4
- export interface Resolver {
5
- container: Container;
6
-
7
- canResolve<T>(abstract: ServiceIdentifier<T>): boolean;
8
-
9
- resolve<T>(abstract: ServiceIdentifier<T>, parameters: object[]): T | Promise<T>;
10
-
11
- reload<T>(abstract: ServiceIdentifier<T>, concrete: T, container?: Container): T;
12
- }
13
-
14
- export abstract class BaseResolver implements Resolver {
15
- constructor(public container: Container) {}
16
-
17
- abstract canResolve<T>(abstract: ServiceIdentifier<T>): boolean;
18
-
19
- abstract resolve<T>(abstract: ServiceIdentifier<T>, parameters: object[]): T | Promise<T>;
20
-
21
- /**
22
- * Used to update the dependencies that have the REQUEST scope
23
- */
24
- reload<T>(abstract: ServiceIdentifier<T>, concrete: T, container?: Container): T {
25
- return concrete
26
- }
27
- }
@@ -1,5 +0,0 @@
1
- export * from './Decorators'
2
- export * from './Container'
3
- export * from './ClassResolver'
4
- export * from './Resolver'
5
- export * from './Metadata'
File without changes
@@ -1,52 +0,0 @@
1
- import { Query } from './Query'
2
- import { DatabaseDriver } from './Drivers/DatabaseDriver'
3
- import { SqlValue } from './Types'
4
-
5
- export class Connection {
6
-
7
- constructor(public driver: DatabaseDriver) {}
8
-
9
- async run(query: Query): Promise<void> {
10
- return this.driver.run(query.toSQL(), query.getBindings())
11
- }
12
-
13
- async insertOne(query: Query): Promise<number> {
14
- return this.driver.insertOne(query.toSQL(), query.getBindings())
15
- }
16
-
17
- truncate(table: string) {
18
- return this.driver.truncate(table)
19
- }
20
-
21
- async get<T>(query: Query<T>): Promise<T[]> {
22
- return await this.driver.get<T>(query.toSQL(), query.getBindings()) as T[]
23
- }
24
-
25
- async first<T>(query: Query<T>): Promise<T | undefined> {
26
- return await this.driver.first(query.toSQL(), query.getBindings()) as T
27
- }
28
-
29
- async getRaw<T>(rawQuery: string, params: SqlValue[] = []): Promise<T[]> {
30
- return await this.driver.get(rawQuery, params) as T[]
31
- }
32
-
33
- async firstRaw<T>(rawQuery: string, params: SqlValue[] = []): Promise<T> {
34
- return await this.driver.first(rawQuery, params) as T
35
- }
36
-
37
- async runRaw(rawQuery: string, params: SqlValue[] = []): Promise<void> {
38
- return this.driver.run(rawQuery, params)
39
- }
40
-
41
- async tables() {
42
- return this.driver.tables()
43
- }
44
-
45
- async tableExists(table: string) {
46
- return this.driver.tableExists(table)
47
- }
48
-
49
- async tableColumns(table: string) {
50
- return this.driver.tableColumns(table)
51
- }
52
- }
@@ -1,142 +0,0 @@
1
- import { ChildObject, Constructor, KeysOfType } from '@Typetron/Support'
2
- import { Entity } from './Entity'
3
- import {
4
- BelongsTo,
5
- BelongsToMany,
6
- BelongsToManyField,
7
- BelongsToManyFieldOptions,
8
- ColumnField,
9
- HasMany,
10
- HasManyField,
11
- HasOne,
12
- HasOneField,
13
- JSONField,
14
- PrimaryField,
15
- RelationshipField
16
- } from './Fields'
17
- import { EntityConstructor } from './index'
18
- import { List } from './List'
19
- import { BaseRelationship } from './ORM/BaseRelationship'
20
-
21
- export const EntityMetadataKey = 'framework:entity'
22
-
23
- export type ID = number | string;
24
-
25
- export class EntityOptions<T extends Entity> {
26
- table?: string
27
- touch?: KeysOfType<T, Entity | List<T, Entity>>[]
28
- }
29
-
30
- export class EntityMetadata<T extends Entity, R extends Entity> extends EntityOptions<T> {
31
- columns: Record<string, ColumnField<T>> = {}
32
- relationships: Record<string, RelationshipField<T, R>> = {}
33
- inverseRelationships: Record<string, BelongsToManyField<T, R> | HasManyField<T, R> | HasOneField<T, R>> = {}
34
- createdAtColumn?: string
35
- updatedAtColumn?: string
36
-
37
- get allRelationships() {
38
- return {...this.relationships, ...this.inverseRelationships}
39
- }
40
-
41
- static get<T extends Entity, R extends Entity>(entity: T) {
42
- const metadata: EntityMetadata<T, R> = Reflect.getMetadata(EntityMetadataKey, entity) || new this()
43
- metadata.table = metadata?.table || entity.constructor.name.toLowerCase()
44
- return metadata
45
- }
46
- }
47
-
48
- export function Options<T extends Entity>(options: EntityOptions<T> = {}) {
49
- return (entity: object) => {
50
- const entityClass = entity as unknown as EntityConstructor<T>
51
- const metadata = EntityMetadata.get(entityClass.prototype)
52
- options.table = options.table || entityClass.name.toLowerCase()
53
- Object.assign(metadata, options)
54
- Reflect.defineMetadata(EntityMetadataKey, metadata, entityClass.prototype)
55
- }
56
- }
57
-
58
- function setField<T extends Entity>(entity: T, field: ColumnField<T>) {
59
- const entityMetadata = EntityMetadata.get(entity)
60
- entityMetadata.columns[field.property] = field
61
- Reflect.defineMetadata(EntityMetadataKey, entityMetadata, entity)
62
- }
63
-
64
- export function Column<T extends Entity>(column?: string | {type: any}, options?: {type: any}): PropertyDecorator {
65
- return function(entity: Object, name: string | symbol) {
66
- const actualColumn: string | undefined = typeof column === 'string' ? column : undefined
67
- const type = options?.type ?? Reflect.getMetadata('design:type', entity, name)
68
- const field = new ColumnField(entity.constructor as EntityConstructor<T>, String(name), () => type, actualColumn || String(name))
69
- setField(entity as T, field)
70
- }
71
- }
72
-
73
- export function JSONColumn<T extends Entity>(column?: string) {
74
- return function(entity: object, name: string) {
75
- const field = new JSONField(entity.constructor as EntityConstructor<T>, name, () => String, column || name)
76
- setField(entity as T, field)
77
- }
78
- }
79
-
80
- export function Enum<T extends Entity>(...values: string[]) {
81
- return function(entity: object, name: string) {
82
- }
83
- }
84
-
85
- export function PrimaryColumn<T extends Entity>(column?: string) {
86
- return function(entity: object, name: string) {
87
- const type = Reflect.getMetadata('design:type', entity, name)
88
- const field = new PrimaryField(entity.constructor as EntityConstructor<T>, name, () => type, column || name)
89
- setField(entity as T, field)
90
- }
91
- }
92
-
93
- export function CreatedAt<T extends Entity>(column?: string) {
94
- return function(entity: object, name: string) {
95
- Column(column)(entity as T, name)
96
- const entityMetadata = EntityMetadata.get(entity as T)
97
- entityMetadata.createdAtColumn = column || name
98
- Reflect.defineMetadata(EntityMetadataKey, entityMetadata, entity)
99
- }
100
- }
101
-
102
- export function UpdatedAt<T extends Entity>(column?: string) {
103
- return function(entity: object, name: string) {
104
- Column(column)(entity as T, name)
105
- const entityMetadata = EntityMetadata.get(entity as T)
106
- entityMetadata.updatedAtColumn = column || name
107
- Reflect.defineMetadata(EntityMetadataKey, entityMetadata, entity)
108
- }
109
- }
110
-
111
- type RelationshipsList = typeof BelongsTo | typeof HasOne | typeof HasMany | typeof BelongsToMany;
112
- const entityOptionsCache = new Map<Entity, Record<string, object>>()
113
-
114
- export function Relation<T extends Entity, R extends Entity>(
115
- type: () => Constructor<R>,
116
- // tslint:disable-next-line:no-any
117
- // inverseBy: KeysOfType<Omit<R, keyof Entity>, Entity | HasOne<any> | BelongsTo<any> | HasMany<any> | BelongsToMany<any>>,
118
- // tslint:disable-next-line:no-any
119
- // inverseBy: KeysOfType<R, Entity | HasOne<any> | BelongsTo<any> | HasMany<any> | BelongsToMany<any>>,
120
- // tslint:disable-next-line:no-any
121
- inverseBy: KeysOfType<ChildObject<R, Entity>, BaseRelationship<T>>,
122
- // options: Partial<RelationshipOptions> = {}
123
- ) {
124
- return function(entity: object, property: string) {
125
- let entityMetadata = EntityMetadata.get(entity as T)
126
- const fieldClass = Reflect.getMetadata('design:type', entity, property) as RelationshipsList
127
- const entityClass = entity.constructor as EntityConstructor<T>
128
-
129
- const options = entityOptionsCache.get(entity as T) || {}
130
- // @ts-ignore
131
- entityMetadata = fieldClass.relationship(entityMetadata, entityClass, property, type, inverseBy as string, options[property])
132
- Reflect.defineMetadata(EntityMetadataKey, entityMetadata, entity)
133
- }
134
- }
135
-
136
- export function BelongsToManyOptions<T extends Entity>(options: BelongsToManyFieldOptions) {
137
- return function(entity: object, property: string) {
138
- const entityOptions = entityOptionsCache.get(entity as T) || {}
139
- entityOptions[property] = options
140
- entityOptionsCache.set(entity as T, entityOptions)
141
- }
142
- }
@@ -1,37 +0,0 @@
1
- import { SqlValue } from '../Types'
2
- import { Statement } from './Statement'
3
- import { Constructor } from '@Typetron/Support'
4
- import { SchemaContract } from './SchemaContract'
5
- import { ColumnDefinitionOptions } from '@Typetron/Database/Drivers/SQL'
6
-
7
- interface StatementsList {
8
- create: Constructor<Statement>,
9
- select: Constructor<Statement>,
10
- insert: Constructor<Statement>,
11
- delete: Constructor<Statement>,
12
- update: Constructor<Statement>,
13
- alter: Constructor<Statement>,
14
- }
15
-
16
- export abstract class DatabaseDriver {
17
-
18
- abstract statements: StatementsList
19
-
20
- abstract schema: SchemaContract
21
-
22
- abstract run(query: string, params?: SqlValue[]): Promise<void>
23
-
24
- abstract truncate(table: string): Promise<void>
25
-
26
- abstract insertOne(query: string, params: SqlValue[]): Promise<number>
27
-
28
- abstract get<T>(query: string, params: SqlValue[]): Promise<T | T[]>
29
-
30
- abstract first<T>(query: string, params: SqlValue[]): Promise<T | undefined>
31
-
32
- abstract tables(): Promise<{name: string}[]>
33
-
34
- abstract tableExists(table: string): Promise<boolean>
35
-
36
- abstract tableColumns(table: string): Promise<ColumnDefinitionOptions[]>
37
- }
@@ -1,55 +0,0 @@
1
- import { ColumnDefinitionOptions } from '../../../Drivers/SQL'
2
- import { wrap } from '../../../Helpers'
3
- import { ColumnDefinition } from '@Typetron/Database/Drivers/MySQL/ColumnDefinition'
4
- import { Expression } from '@Typetron/Database'
5
-
6
- export enum Constraints {
7
- PrimaryKey = 'PRIMARY KEY',
8
- ForeignKey = 'FOREIGN KEY',
9
- }
10
-
11
- export abstract class AlterOption extends Expression {
12
- constructor(public column: ColumnDefinitionOptions) {super()}
13
-
14
- abstract toSQL(): string
15
- }
16
-
17
- export class AddColumn extends AlterOption {
18
- toSQL(): string {
19
- return `ADD ${new ColumnDefinition(this.column).toSQL()}`
20
- }
21
- }
22
-
23
- export class AddConstraint extends AlterOption {
24
-
25
- constructor(column: ColumnDefinitionOptions, public type: Constraints) {super(column)}
26
-
27
- toSQL(): string {
28
- return `ADD CONSTRAINT ${this.type} (${this.column.name})`
29
- }
30
- }
31
-
32
- export class ModifyColumn extends AlterOption {
33
- toSQL(): string {
34
- return `MODIFY ${new ColumnDefinition(this.column).toSQL()}`
35
- }
36
- }
37
-
38
- export class DropColumn extends Expression {
39
- constructor(public column: string) {super()}
40
-
41
- toSQL(): string {
42
- return `DROP COLUMN ${wrap(this.column)}`
43
- }
44
- }
45
-
46
- export class Alter extends Expression {
47
- constructor(public table: string, public alterOptions: Expression[]) {super()}
48
-
49
- toSQL() {
50
- return `
51
- ALTER TABLE ${wrap(this.table)}
52
- ${this.alterOptions.map(option => option.toSQL()).join(', \n')}
53
- `
54
- }
55
- }
@@ -1,16 +0,0 @@
1
- import { ColumnDefinitionOptions } from '../../Drivers/SQL'
2
- import { wrap } from '../../Helpers'
3
-
4
- export class ColumnDefinition {
5
- constructor(public options: ColumnDefinitionOptions) {}
6
-
7
- toSQL() {
8
- const sqlParts = [wrap(this.options.name), this.options.type]
9
-
10
- if (this.options.autoIncrement) {
11
- sqlParts.push('AUTO_INCREMENT')
12
- }
13
-
14
- return sqlParts.join(' ')
15
- }
16
- }
@@ -1,47 +0,0 @@
1
- import { BaseStatement } from '../SQL/Statements/BaseStatement'
2
- import { ColumnDefinitionOptions } from '../SQL'
3
- import { wrap } from '../../Helpers'
4
-
5
- export class Create extends BaseStatement {
6
-
7
- constructor(table: string, public columns: ColumnDefinitionOptions[] = []) {
8
- super({
9
- table,
10
- columns: [],
11
- joins: [],
12
- wheres: [],
13
- groups: [],
14
- orders: [],
15
- having: []
16
- })
17
- }
18
-
19
- toSQL() {
20
- const definitions: string[] = this.getColumnsSQL(this.columns)
21
-
22
- this.columns.where('primaryKey').whenNotEmpty(primaryColumns => {
23
- definitions.push(`PRIMARY KEY (${primaryColumns.pluck('name').join(', ')})`)
24
- })
25
-
26
- return `
27
- CREATE TABLE ${this.table}
28
- (
29
- ${definitions.join(', \n')}
30
- )
31
- `
32
- }
33
-
34
- private getColumnsSQL(columns: ColumnDefinitionOptions[]) {
35
- return columns.map(this.getColumnSQL)
36
- }
37
-
38
- private getColumnSQL(column: ColumnDefinitionOptions) {
39
- const sqlParts = [wrap(column.name), column.type]
40
-
41
- if (column.autoIncrement) {
42
- sqlParts.push('AUTO_INCREMENT')
43
- }
44
-
45
- return sqlParts.join(' ')
46
- }
47
- }