@typetron/framework 0.5.0 → 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 (197) hide show
  1. package/build/Database/EntityProxyHandler.js +2 -2
  2. package/build/Database/EntityProxyHandler.js.map +1 -1
  3. package/package.json +4 -7
  4. package/.eslintrc-old.js +0 -208
  5. package/Cache/Cache.ts +0 -13
  6. package/Cache/Stores/DatabaseStore.ts +0 -120
  7. package/Cache/Stores/FileStore.ts +0 -69
  8. package/Cache/Stores/MemoryStore.ts +0 -71
  9. package/Cache/index.ts +0 -5
  10. package/Cache/types.ts +0 -4
  11. package/Container/ClassResolver.ts +0 -106
  12. package/Container/Container.ts +0 -144
  13. package/Container/Contracts.ts +0 -3
  14. package/Container/Decorators.ts +0 -20
  15. package/Container/Metadata.ts +0 -16
  16. package/Container/Resolver.ts +0 -27
  17. package/Container/index.ts +0 -5
  18. package/Database/Clauses/Where.ts +0 -0
  19. package/Database/Connection.ts +0 -52
  20. package/Database/Decorators.ts +0 -142
  21. package/Database/Drivers/DatabaseDriver.ts +0 -37
  22. package/Database/Drivers/MySQL/Alter/index.ts +0 -55
  23. package/Database/Drivers/MySQL/ColumnDefinition.ts +0 -16
  24. package/Database/Drivers/MySQL/Create.ts +0 -47
  25. package/Database/Drivers/MySQL/MysqlDriver.ts +0 -123
  26. package/Database/Drivers/MySQL/Schema.ts +0 -82
  27. package/Database/Drivers/MySQL/index.ts +0 -13
  28. package/Database/Drivers/SQL/Schema.ts +0 -73
  29. package/Database/Drivers/SQL/Statements/Alter.ts +0 -22
  30. package/Database/Drivers/SQL/Statements/BaseStatement.ts +0 -55
  31. package/Database/Drivers/SQL/Statements/Delete.ts +0 -20
  32. package/Database/Drivers/SQL/Statements/Insert.ts +0 -24
  33. package/Database/Drivers/SQL/Statements/Select.ts +0 -55
  34. package/Database/Drivers/SQL/Statements/Update.ts +0 -33
  35. package/Database/Drivers/SQL/index.ts +0 -8
  36. package/Database/Drivers/SQLite/Create.ts +0 -45
  37. package/Database/Drivers/SQLite/Schema.ts +0 -54
  38. package/Database/Drivers/SQLite/SqliteDriver.ts +0 -144
  39. package/Database/Drivers/SQLite/index.ts +0 -15
  40. package/Database/Drivers/SchemaContract.ts +0 -11
  41. package/Database/Drivers/Statement.ts +0 -16
  42. package/Database/Drivers/index.ts +0 -4
  43. package/Database/Entity.ts +0 -377
  44. package/Database/EntityNotFoundError.ts +0 -5
  45. package/Database/EntityProxyHandler.ts +0 -43
  46. package/Database/EntityQuery.ts +0 -197
  47. package/Database/Expression.ts +0 -3
  48. package/Database/Fields.ts +0 -816
  49. package/Database/Helpers.ts +0 -12
  50. package/Database/List.ts +0 -71
  51. package/Database/Migrations/Migration.ts +0 -10
  52. package/Database/Migrations/MigrationHistory.ts +0 -20
  53. package/Database/Migrations/Migrator.ts +0 -122
  54. package/Database/Migrations/index.ts +0 -3
  55. package/Database/ORM/BaseRelationship.ts +0 -10
  56. package/Database/Query.ts +0 -374
  57. package/Database/Seeders/Seeder.ts +0 -3
  58. package/Database/Seeders/SeederManager.ts +0 -27
  59. package/Database/Seeders/index.ts +0 -2
  60. package/Database/StringExpression.ts +0 -9
  61. package/Database/Types.ts +0 -165
  62. package/Database/index.ts +0 -23
  63. package/Encryption/index.ts +0 -51
  64. package/Forms/Decorators.ts +0 -29
  65. package/Forms/Form.ts +0 -70
  66. package/Forms/FormFields.ts +0 -36
  67. package/Forms/index.ts +0 -3
  68. package/Framework/App.ts +0 -10
  69. package/Framework/Application.ts +0 -118
  70. package/Framework/Auth/Auth.ts +0 -122
  71. package/Framework/Auth/Authenticatable.ts +0 -9
  72. package/Framework/Auth/User.ts +0 -27
  73. package/Framework/Auth/index.ts +0 -29
  74. package/Framework/Config/AppConfig.ts +0 -25
  75. package/Framework/Config/AuthConfig.ts +0 -9
  76. package/Framework/Config/BaseConfig.ts +0 -9
  77. package/Framework/Config/CacheConfig.ts +0 -38
  78. package/Framework/Config/DatabaseConfig.ts +0 -21
  79. package/Framework/Config/MailConfig.ts +0 -30
  80. package/Framework/Config/index.ts +0 -6
  81. package/Framework/Middleware/AuthMiddleware.ts +0 -31
  82. package/Framework/Middleware/CorsMiddleware.ts +0 -32
  83. package/Framework/Middleware/StaticAssetsMiddleware.ts +0 -76
  84. package/Framework/Middleware/index.ts +0 -2
  85. package/Framework/Provider.ts +0 -9
  86. package/Framework/Providers/CacheProvider.ts +0 -28
  87. package/Framework/Providers/DatabaseProvider.ts +0 -36
  88. package/Framework/Providers/MailProvider.ts +0 -31
  89. package/Framework/Providers/WebsocketsProvider.ts +0 -120
  90. package/Framework/Resolvers/AuthResolver.ts +0 -23
  91. package/Framework/Resolvers/EntityResolver.ts +0 -41
  92. package/Framework/Resolvers/FormResolver.ts +0 -37
  93. package/Framework/RootDir.ts +0 -1
  94. package/Framework/index.ts +0 -8
  95. package/Frontend/Angular/index.ts +0 -24
  96. package/Frontend/Websockets/index.ts +0 -86
  97. package/Mail/MailAddress.ts +0 -4
  98. package/Mail/MailTransport.ts +0 -6
  99. package/Mail/Mailable.ts +0 -16
  100. package/Mail/Mailer.ts +0 -27
  101. package/Mail/PendingMail.ts +0 -68
  102. package/Mail/SentMessage.ts +0 -20
  103. package/Mail/Transports/MemoryTransport.ts +0 -13
  104. package/Mail/Transports/SendGridTransport.ts +0 -95
  105. package/Mail/index.ts +0 -3
  106. package/Models/Model.ts +0 -41
  107. package/Models/index.ts +0 -54
  108. package/Router/BaseController.ts +0 -7
  109. package/Router/Decorators.ts +0 -224
  110. package/Router/Guard.ts +0 -10
  111. package/Router/Http/Contracts.ts +0 -4
  112. package/Router/Http/ErrorHandler.ts +0 -45
  113. package/Router/Http/ErrorHandlerInterface.ts +0 -6
  114. package/Router/Http/Errors/HttpError.ts +0 -15
  115. package/Router/Http/Handler.ts +0 -183
  116. package/Router/Http/HttpRoute.ts +0 -110
  117. package/Router/Http/Middleware.ts +0 -7
  118. package/Router/Http/Request.ts +0 -225
  119. package/Router/Http/Response.ts +0 -35
  120. package/Router/Http/index.ts +0 -85
  121. package/Router/Metadata.ts +0 -34
  122. package/Router/Middleware.ts +0 -16
  123. package/Router/Request.ts +0 -65
  124. package/Router/Route.ts +0 -16
  125. package/Router/RouteNotFoundError.ts +0 -5
  126. package/Router/Router.ts +0 -35
  127. package/Router/Servers/index.ts +0 -6
  128. package/Router/Servers/node.ts +0 -49
  129. package/Router/Servers/uNetworking.ts +0 -151
  130. package/Router/Websockets/Handler.ts +0 -82
  131. package/Router/Websockets/Middleware.ts +0 -7
  132. package/Router/Websockets/Request.ts +0 -3
  133. package/Router/Websockets/WebsocketRoute.ts +0 -61
  134. package/Router/Websockets/index.ts +0 -57
  135. package/Router/Websockets/types.ts +0 -23
  136. package/Router/index.ts +0 -6
  137. package/Storage/File.ts +0 -30
  138. package/Storage/Image.ts +0 -19
  139. package/Storage/InvalidImage.ts +0 -3
  140. package/Storage/Storage.ts +0 -98
  141. package/Storage/index.ts +0 -4
  142. package/Storage/utils.ts +0 -18
  143. package/Support/Array.ts +0 -184
  144. package/Support/Math.ts +0 -12
  145. package/Support/Metadata.ts +0 -31
  146. package/Support/String.ts +0 -38
  147. package/Support/index.ts +0 -19
  148. package/Support/utils.ts +0 -7
  149. package/Testing/TestCase.ts +0 -193
  150. package/Validation/Rule.ts +0 -9
  151. package/Validation/RuleInterface.ts +0 -10
  152. package/Validation/Rules/Email.ts +0 -20
  153. package/Validation/Rules/FileExtension.ts +0 -21
  154. package/Validation/Rules/MaxLength.ts +0 -17
  155. package/Validation/Rules/MinLength.ts +0 -18
  156. package/Validation/Rules/Optional.ts +0 -18
  157. package/Validation/Rules/Required.ts +0 -29
  158. package/Validation/Validator.ts +0 -7
  159. package/Validation/index.ts +0 -12
  160. package/benchmark-index.js +0 -20
  161. package/benchmark.ts +0 -47
  162. package/tests/Cache/DatabaseStoreTest.ts +0 -110
  163. package/tests/Cache/FileStoreTest.ts +0 -93
  164. package/tests/Cache/MemoryStoreTest.ts +0 -92
  165. package/tests/Container/ContainerTest.ts +0 -336
  166. package/tests/Database/Drivers/MySQL/AlterTest.ts +0 -100
  167. package/tests/Database/Drivers/MySQL/CreateTest.ts +0 -39
  168. package/tests/Database/Drivers/MysqlDriverTest.ts +0 -140
  169. package/tests/Database/Drivers/SqliteDriverTest.ts +0 -126
  170. package/tests/Database/Entities/Article.ts +0 -21
  171. package/tests/Database/Entities/Profile.ts +0 -21
  172. package/tests/Database/Entities/Role.ts +0 -15
  173. package/tests/Database/Entities/User.ts +0 -35
  174. package/tests/Database/EntityRelationshipsTest.ts +0 -475
  175. package/tests/Database/EntityTest.ts +0 -202
  176. package/tests/Database/Migrations/RunnerTest.ts +0 -96
  177. package/tests/Database/Migrations/migrations/1.createUserTable.ts +0 -12
  178. package/tests/Database/Migrations/migrations/2.createArticlesTable.ts +0 -12
  179. package/tests/Database/QueryTest.ts +0 -573
  180. package/tests/Database/SchemaTest.ts +0 -32
  181. package/tests/Database/Seeders/RunnerTest.ts +0 -30
  182. package/tests/Database/Seeders/seeders/RandomSeeder.ts +0 -10
  183. package/tests/Database/utils.ts +0 -16
  184. package/tests/Forms/FormsTest.ts +0 -59
  185. package/tests/Framework/Middleware/StaticAssetsMiddlewareTest.ts +0 -129
  186. package/tests/Framework/Resolvers/EntityResolverTest.ts +0 -48
  187. package/tests/Framework/Router/RouterTest.ts +0 -33
  188. package/tests/Mail/MailerTest.ts +0 -76
  189. package/tests/Model/ModelTest.ts +0 -183
  190. package/tests/Router/HttpHandlerTest.ts +0 -72
  191. package/tests/Router/RequestTest.ts +0 -77
  192. package/tests/Router/WebSocketsHandlerTest.ts +0 -51
  193. package/tests/Storage/StorageTest.ts +0 -97
  194. package/tests/Support/ArrayTest.ts +0 -167
  195. package/tests/Support/StringTest.ts +0 -18
  196. package/tests/Validation/RulesTest.ts +0 -54
  197. 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
- }