@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,20 +0,0 @@
1
- const path = require('path')
2
- const fs = require('fs')
3
-
4
- const tsConfigPaths = require('tsconfig-paths')
5
- const appTsConfigPath = path.join(process.cwd(), 'tsconfig.json')
6
- const tsConfig = require(path.join(__dirname, 'tsconfig.json'))
7
-
8
- require('ts-node').register({
9
- project : fs.existsSync(appTsConfigPath) ? appTsConfigPath : path.join(__dirname, 'tsconfig.json'),
10
- transpileOnly : true,
11
- skipIgnore : true,
12
- preferTsExts : true,
13
- })
14
-
15
- tsConfigPaths.register({
16
- baseUrl : __dirname,
17
- paths : tsConfig.compilerOptions.paths
18
- })
19
-
20
- require('./benchmark')
package/benchmark.ts DELETED
@@ -1,47 +0,0 @@
1
- // clinic flame -- node -r ts-node/register -r tsconfig-paths/register benchmark.js
2
-
3
- import 'reflect-metadata'
4
- import '@Typetron/Support'
5
- import { Handler, Http, Request } from './Router/Http'
6
- import { Container } from './Container'
7
- import { Get } from './Router'
8
- import Method = Http.Method
9
-
10
- class Controller {
11
- @Get()
12
- read() {
13
- return 'Hello world!!!'
14
- }
15
- }
16
-
17
- async function main() {
18
-
19
- const app = new Container()
20
- const handler = app.get(Handler)
21
-
22
- handler.addRoute('', Method.GET, Controller, 'read', 'read')
23
-
24
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
25
- // @ts-ignore
26
- // const request = await Request.capture({
27
- // url: 'http://localhost:3000',
28
- // method: 'GET',
29
- // headers: {}
30
- // })
31
- // await handler.handle(app, request)
32
-
33
- console.time('test')
34
- for (let i = 0; i < 1_000_000_0; i++) {
35
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
36
- // @ts-ignore
37
- const request = await Request.capture({
38
- url: 'http://localhost:3000',
39
- method: 'GET',
40
- headers: {}
41
- })
42
- await handler.handle(app, request)
43
- }
44
- console.timeEnd('test')
45
- }
46
-
47
- main()
@@ -1,110 +0,0 @@
1
- import { suite, test } from '@testdeck/mocha'
2
- import { CacheItem, DatabaseStore } from '@Typetron/Cache'
3
- import { expect } from 'chai'
4
- import { createHash } from 'crypto'
5
- import { Connection, Query, SqliteDriver } from '@Typetron/Database'
6
- import { Storage } from '@Typetron/Storage'
7
-
8
- const tableName = 'cache'
9
- const databaseFilePath = './tests/Cache/database.sqlite'
10
-
11
- @suite
12
- class DatabaseStoreTest {
13
-
14
- databaseStore = new DatabaseStore(tableName)
15
-
16
- static async before() {
17
- Query.connection = new Connection(new SqliteDriver(databaseFilePath))
18
- }
19
-
20
- static async after() {
21
- await new Storage().deleteDirectory(databaseFilePath)
22
- }
23
-
24
- private getCacheRecord(name: string) {
25
- const cacheKeyHash = createHash('sha1').update(name).digest('hex')
26
- return Query.table<CacheItem<unknown>>(tableName).where('name', cacheKeyHash).first()
27
- }
28
-
29
- @test
30
- async returnsUndefinedIfRecordDoesntExist() {
31
- const value = await this.databaseStore.get('tests')
32
- expect(value).to.be.undefined
33
- }
34
-
35
- @test
36
- async testPutCreatesRecord() {
37
- const contents = 'test'
38
-
39
- await this.databaseStore.set('foo', contents)
40
-
41
- const cacheRecord = await this.getCacheRecord('foo')
42
- expect(cacheRecord).to.exist
43
- expect((cacheRecord as CacheItem<any>).value).to.be.equal(JSON.stringify(contents))
44
- }
45
-
46
- @test
47
- async testExpirationValueIsWrittenInCacheRecord() {
48
- const durationInSeconds = 60
49
- const expirationTime = Date.now() + durationInSeconds * 1000
50
-
51
- await this.databaseStore.set('expireTest', 'value', durationInSeconds)
52
- const cacheRecord = await this.getCacheRecord('expireTest')
53
-
54
- expect(cacheRecord).to.exist
55
- expect(new Date((cacheRecord as CacheItem<unknown>).date ?? Infinity).getTime()).to.be.closeTo(expirationTime, 1000) // Allowing a 1-second difference
56
- }
57
-
58
- @test
59
- async testCacheValueIsUndefinedIfExpired() {
60
- const durationInSeconds = -60 // Setting a past expiration
61
-
62
- await this.databaseStore.set('anotherExpiredTest', 'value', durationInSeconds)
63
-
64
- const value = await this.databaseStore.get('anotherExpiredTest')
65
- expect(value).to.be.undefined
66
-
67
- const cacheRecord = await this.getCacheRecord('anotherExpiredTest')
68
- expect(cacheRecord).to.be.undefined
69
- }
70
-
71
- @test
72
- async testDeleteMethodDeletesRecordFromDatabase() {
73
- await this.databaseStore.set('deleteTest', 'value')
74
-
75
- await this.databaseStore.delete('deleteTest')
76
-
77
- const cacheRecord = await this.getCacheRecord('deleteTest')
78
- expect(cacheRecord).to.be.undefined
79
- }
80
-
81
- @test
82
- async testFlushMethodDeletesAllRecords() {
83
- await this.databaseStore.set('flushTest', 'value')
84
-
85
- await this.databaseStore.flush()
86
-
87
- const allRecords = await Query.table(tableName).get()
88
- expect(allRecords.length).to.be.equal(0)
89
- }
90
-
91
- @test
92
- async testRememberMethodCreatesRecordIfNotExists() {
93
- const value = await this.databaseStore.remember('rememberTest', 'defaultValue', 60)
94
-
95
- expect(value).to.equal('defaultValue')
96
-
97
- const cacheRecord = await this.getCacheRecord('rememberTest')
98
- expect(cacheRecord).to.exist
99
- expect((cacheRecord as CacheItem<any>).value).to.be.equal(JSON.stringify('defaultValue'))
100
- }
101
-
102
- @test
103
- async testRememberMethodReturnsExistingValue() {
104
- await this.databaseStore.set('rememberTest2', 'existingValue')
105
-
106
- const value = await this.databaseStore.remember('rememberTest2', 'defaultValue', 60)
107
-
108
- expect(value).to.equal('existingValue')
109
- }
110
- }
@@ -1,93 +0,0 @@
1
- import { suite, test } from '@testdeck/mocha'
2
- import { FileStore } from '@Typetron/Cache'
3
- import { Storage } from '@Typetron/Storage'
4
- import { expect } from 'chai'
5
-
6
- const directory = './tests/Cache/.cache'
7
-
8
- @suite
9
- class FileStoreTest {
10
- storage = new Storage()
11
- fileStore = new FileStore(this.storage, directory)
12
-
13
- static async after() {
14
- const storage = new Storage()
15
- if (await storage.exists(directory)) {
16
- await storage.deleteDirectory(directory)
17
- }
18
- }
19
-
20
- @test
21
- async returnsUndefinedIfKeyDoesNotExist() {
22
- const value = await this.fileStore.get('nonexistentKey')
23
- expect(value).to.be.undefined
24
- }
25
-
26
- @test
27
- async canStoreAndRetrieveData() {
28
- await this.fileStore.set('testKey', 'testValue')
29
- const value = await this.fileStore.get('testKey')
30
- expect(value).to.equal('testValue')
31
- }
32
-
33
- @test
34
- async canDeleteData() {
35
- await this.fileStore.set('testKey', 'testValue')
36
- await this.fileStore.delete('testKey')
37
- const value = await this.fileStore.get('testKey')
38
- expect(value).to.be.undefined
39
- }
40
-
41
- @test
42
- async canFlushAllData() {
43
- await this.fileStore.set('key1', 'value1')
44
- await this.fileStore.set('key2', 'value2')
45
- await this.fileStore.flush()
46
- const value1 = await this.fileStore.get('key1')
47
- const value2 = await this.fileStore.get('key2')
48
- expect(value1).to.be.undefined
49
- expect(value2).to.be.undefined
50
- }
51
-
52
- @test
53
- async respectsExpiration() {
54
- await this.fileStore.set('expiringKey', 'expiringValue', 0.01)
55
- await new Promise(resolve => setTimeout(resolve, 11))
56
- const value = await this.fileStore.get('expiringKey')
57
- expect(value).to.be.undefined
58
- }
59
-
60
- @test
61
- async canCheckIfKeyExists() {
62
- await this.fileStore.set('testKey', 'testValue')
63
- const exists = await this.fileStore.has('testKey')
64
- expect(exists).to.be.true
65
- const nonExistent = await this.fileStore.has('nonexistentKey')
66
- expect(nonExistent).to.be.false
67
- }
68
-
69
- @test
70
- async canRememberValue() {
71
- const value = await this.fileStore.remember('rememberKey', 'rememberValue', 0.01)
72
- expect(value).to.equal('rememberValue')
73
- await new Promise(resolve => setTimeout(resolve, 11))
74
- const expiredValue = await this.fileStore.get('rememberKey')
75
- expect(expiredValue).to.be.undefined
76
- }
77
-
78
- @test
79
- async getMethodCanAcceptNonFunctionAndFunctionAsDefaultValue() {
80
- const value1 = await this.fileStore.get('nonexistentKey', 'defaultValue')
81
- expect(value1).to.equal('defaultValue')
82
- const value2 = await this.fileStore.get('nonexistentKey', () => 'defaultValue')
83
- expect(value2).to.equal('defaultValue')
84
- }
85
-
86
- @test
87
- async rememberMethodCanAcceptNonFunctionAndFunctionAsDefaultValue() {
88
- const value1 = await this.fileStore.remember('nonexistentKey', 'defaultValue', 0.01)
89
- expect(value1).to.equal('defaultValue')
90
- const value2 = await this.fileStore.remember('nonexistentKey2', () => 'defaultValue', 0.01)
91
- expect(value2).to.equal('defaultValue')
92
- }
93
- }
@@ -1,92 +0,0 @@
1
- import { suite, test } from '@testdeck/mocha'
2
- import { MemoryStore } from '@Typetron/Cache'
3
- import { expect } from 'chai'
4
-
5
- @suite
6
- class MemoryStoreTest {
7
- memoryStore = new MemoryStore()
8
-
9
- @test
10
- async returnsUndefinedIfKeyDoesNotExist() {
11
- const value = await this.memoryStore.get('nonexistentKey')
12
- expect(value).to.be.undefined
13
- }
14
-
15
- @test
16
- async canStoreAndRetrieveData() {
17
- await this.memoryStore.set('testKey', 'testValue')
18
- expect(this.memoryStore.cache.has('testKey')).to.be.true
19
- const value = await this.memoryStore.get('testKey')
20
- expect(value).to.equal('testValue')
21
- }
22
-
23
- @test
24
- async canDeleteData() {
25
- await this.memoryStore.set('testKey', 'testValue')
26
- await this.memoryStore.delete('testKey')
27
- const value = await this.memoryStore.get('testKey')
28
- expect(value).to.be.undefined
29
- }
30
-
31
- @test
32
- async canFlushAllData() {
33
- await this.memoryStore.set('key1', 'value1')
34
- await this.memoryStore.set('key2', 'value2')
35
- await this.memoryStore.flush()
36
- const value1 = await this.memoryStore.get('key1')
37
- const value2 = await this.memoryStore.get('key2')
38
- expect(value1).to.be.undefined
39
- expect(value2).to.be.undefined
40
- }
41
-
42
- @test
43
- async respectsExpiration() {
44
- await this.memoryStore.set('expiringKey', 'expiringValue', 0.01)
45
- await new Promise(resolve => setTimeout(resolve, 11))
46
- const value = await this.memoryStore.get('expiringKey')
47
- expect(value).to.be.undefined
48
- }
49
-
50
- @test
51
- async canCheckIfKeyExists() {
52
- await this.memoryStore.set('testKey', 'testValue')
53
- const exists = await this.memoryStore.has('testKey')
54
- expect(exists).to.be.true
55
- const nonExistent = await this.memoryStore.has('nonexistentKey')
56
- expect(nonExistent).to.be.false
57
- }
58
-
59
- @test
60
- async canRememberValue() {
61
- const value = await this.memoryStore.remember('rememberKey', 'rememberValue', 0.01)
62
- expect(value).to.equal('rememberValue')
63
- expect(this.memoryStore.cache.has('rememberKey')).to.be.true
64
- await new Promise(resolve => setTimeout(resolve, 11))
65
- const expiredValue = await this.memoryStore.get('rememberKey')
66
- expect(expiredValue).to.be.undefined
67
- }
68
-
69
- @test
70
- async getMethodCanAcceptNonFunctionAndFunctionAsDefaultValue() {
71
- // Non-function default value
72
- const value1 = await this.memoryStore.get('nonexistentKey', 'defaultValue')
73
- expect(value1).to.equal('defaultValue')
74
-
75
- // Function default value
76
- const value2 = await this.memoryStore.get('nonexistentKey', () => 'defaultValue')
77
- expect(value2).to.equal('defaultValue')
78
- }
79
-
80
- @test
81
- async rememberMethodCanAcceptNonFunctionAndFunctionAsDefaultValue() {
82
- // Non-function default value
83
- const value1 = await this.memoryStore.remember('nonexistentKey', 'defaultValue', 0.01)
84
- expect(value1).to.equal('defaultValue')
85
- expect(this.memoryStore.cache.has('nonexistentKey')).to.be.true
86
-
87
- // Function default value
88
- const value2 = await this.memoryStore.remember('nonexistentKey2', () => 'defaultValue', 0.01)
89
- expect(value2).to.equal('defaultValue')
90
- expect(this.memoryStore.cache.has('nonexistentKey2')).to.be.true
91
- }
92
- }
@@ -1,336 +0,0 @@
1
- import { expect } from 'chai'
2
- import { suite, test } from '@testdeck/mocha'
3
- import { BaseResolver, Container, Inject, Injectable, Scope } from '../../Container'
4
- import { ServiceIdentifier } from '../../Container/Contracts'
5
-
6
- @suite
7
- class ContainerTest {
8
- @test
9
- givesSingletonContainer() {
10
- const container = Container.getInstance()
11
- expect(container).instanceOf(Container)
12
- expect(Container.getInstance()).to.be.equal(container)
13
- expect(Container.getInstance()).instanceOf(Container)
14
- }
15
-
16
- @test
17
- overwritesSingletonContainer() {
18
- const container = Container.setInstance(new Container)
19
- expect(container).equal(Container.getInstance())
20
- const container2 = new Container
21
- Container.setInstance(container2)
22
- expect(container).not.equal(Container.getInstance())
23
- expect(container2).equal(Container.getInstance())
24
- }
25
-
26
- @test
27
- createsInstance() {
28
- const container = new Container()
29
-
30
- @Injectable()
31
- class Request {}
32
-
33
- expect(container.get(Request)).instanceOf(Request)
34
- }
35
-
36
- // @test
37
- // bindsCallbacks() {
38
- // class Dependency {}
39
- //
40
- // const container = new Container;
41
- //
42
- // @Injectable() // not possible right now
43
- // function myFunction(dependency: Dependency) {
44
- // return dependency;
45
- // };
46
- // expect(container.call(myFunction())).to.be.instanceOf(Dependency);
47
- // }
48
-
49
- @test
50
- singletonScope() {
51
- class Request {}
52
-
53
- const container = new Container()
54
- const request = container.get(Request)
55
- expect(request).to.be.equal(container.get(Request))
56
- }
57
-
58
- @test
59
- transientScope() {
60
- @Injectable(Scope.TRANSIENT)
61
- class Request {}
62
-
63
- const container = new Container()
64
- const request1 = container.get(Request)
65
- const request2 = container.get(Request)
66
- expect(request1).not.to.be.equal(request2)
67
- }
68
-
69
- @test
70
- requestScope() {
71
- @Injectable(Scope.REQUEST)
72
- class Request {}
73
-
74
- const container = new Container()
75
- const childContainer = container.createChildContainer()
76
- const request = childContainer.get(Request)
77
- expect(container.getInstances().size).to.be.equal(0)
78
- expect(childContainer.getInstances().size).to.be.equal(2)
79
- expect(request).to.be.instanceof(Request)
80
- }
81
-
82
- // @test
83
- // requestScopeWithSingletonDependencyFromParenContainer() {
84
- // @Injectable(Scope.REQUEST)
85
- // class Request {}
86
- //
87
- // class Controller {
88
- // @Inject()
89
- // request: Request;
90
- // }
91
- //
92
- // const container = new Container();
93
- // const childContainer = container.createChildContainer();
94
- // const controller = childContainer.get(Controller);
95
- // expect(Object.values(container.getInstances())).to.have.length(0);
96
- // expect(Object.values(childContainer.getInstances())).to.have.length(1);
97
- // expect(Object.values(childContainer.getInstances())[0]).to.be.instanceof(Request);
98
- // }
99
-
100
- @test
101
- bindsStringToImplementation() {
102
- @Injectable(Scope.TRANSIENT)
103
- class Request {}
104
-
105
- const container = new Container()
106
- const request = container.get(Request)
107
- container.set('request', request)
108
-
109
- expect(request).to.be.equal(container.get('request'))
110
- }
111
-
112
- @test
113
- bindsImplementationsWithTheSameName() {
114
- const namespaceA = {
115
- Request: class Request {}
116
- }
117
- const namespaceB = {
118
- Request: class Request {}
119
- }
120
- const namespaceC = {
121
- Request: class Request {}
122
- }
123
-
124
- const container = new Container()
125
- const requestA = container.get(namespaceA.Request)
126
- const requestB = container.get(namespaceB.Request)
127
- const requestC = container.get(namespaceC.Request)
128
- expect(requestA).to.be.instanceOf(namespaceA.Request)
129
- expect(requestB).to.be.instanceOf(namespaceB.Request)
130
- expect(requestC).to.be.instanceOf(namespaceC.Request)
131
- }
132
-
133
- @test
134
- bindsClassToInterface() {
135
- abstract class StorageInterface {}
136
-
137
- class DiskStorage implements StorageInterface {}
138
-
139
- class CloudStorage implements StorageInterface {}
140
-
141
- const container = new Container()
142
- container.set(StorageInterface, new DiskStorage)
143
- expect(container.get(StorageInterface)).to.be.instanceOf(DiskStorage)
144
- container.set(StorageInterface, new CloudStorage())
145
- expect(container.get(StorageInterface)).to.be.instanceOf(CloudStorage)
146
- }
147
-
148
- @test
149
- throwsExceptionIfCannotResolve() {
150
- const container = new Container
151
- expect(() => container.get('DoesNotExist')).to.throw(`No instance found for 'DoesNotExist'`)
152
- }
153
-
154
- @test
155
- throwsExceptionIfCannotFindAnAbstractName() {
156
- const container = new Container
157
- const x = {} as typeof Container
158
- expect(() => container.get(x)).to.throw(`Cannot get abstract name for ${x}`)
159
- }
160
-
161
- @test
162
- resolvesDependenciesFromClassProperties() {
163
- const container = new Container()
164
-
165
- @Injectable()
166
- class UserRepository {
167
- }
168
-
169
- @Injectable()
170
- class AuthService {
171
- @Inject()
172
- userRepository: UserRepository
173
- }
174
-
175
- @Injectable()
176
- class UserController {
177
- @Inject()
178
- authService: AuthService
179
- }
180
-
181
- const userController = container.get(UserController)
182
- expect(userController).instanceOf(UserController)
183
- expect(userController.authService).instanceOf(AuthService)
184
- expect(userController.authService.userRepository).instanceOf(UserRepository)
185
- }
186
-
187
- @test
188
- resolvesDependenciesFromConstructorParameters() {
189
- const container = new Container
190
-
191
- @Injectable()
192
- class UserRepository {
193
- }
194
-
195
- @Injectable()
196
- class AuthService {
197
- constructor(public userRepository: UserRepository) {
198
- }
199
- }
200
-
201
- @Injectable()
202
- class UserController {
203
- constructor(public authService: AuthService) {
204
- }
205
- }
206
-
207
- const userController = container.get(UserController)
208
- expect(userController).instanceOf(UserController)
209
- expect(userController.authService).instanceOf(AuthService)
210
- expect(userController.authService.userRepository).instanceOf(UserRepository)
211
- }
212
-
213
- // @test
214
- // async throwsExceptionIfDependencyCannotBeResolved() {
215
- // const container = new Container;
216
- //
217
- // @Injectable()
218
- // class UserController {
219
- // constructor(public userRepository: object) {
220
- // }
221
- // }
222
- //
223
- // await expect(() => container.get(UserController)).to.throw(`No binding found for parameter 0 in 'UserController'`);
224
- // }
225
-
226
- @test
227
- createsChildContainer() {
228
- const container = new Container()
229
- const childContainer = container.createChildContainer()
230
- expect(childContainer).to.be.instanceOf(Container)
231
- expect(childContainer).not.to.equal(container)
232
- }
233
-
234
- @test
235
- childContainerGetsObjectFromParentContainer() {
236
- class Storage {}
237
-
238
- const container = new Container()
239
- const childContainer = container.createChildContainer()
240
-
241
- const storage = container.get(Storage)
242
- expect(childContainer.get(Storage)).to.equal(storage)
243
- }
244
-
245
- @test
246
- dependenciesHaveTheScopeSingleton() {
247
- class Request {}
248
-
249
- const container = new Container()
250
- const childContainer = container.createChildContainer()
251
-
252
- const request = childContainer.get(Request)
253
- expect(childContainer.get(Request)).to.equal(request)
254
- }
255
-
256
- @test
257
- async resolvesAsyncDependencies() {
258
- class User {}
259
-
260
- class Request {
261
- @Inject()
262
- user: User
263
- }
264
-
265
- class UserResolver extends BaseResolver {
266
- canResolve<T>(abstract: ServiceIdentifier<T>): boolean {
267
- return abstract === User
268
- }
269
-
270
- async resolve<T>(abstract: ServiceIdentifier<T>, parameters: object[]): Promise<T> {
271
- await new Promise(resolve => setTimeout(resolve, 1))
272
- return new User as T
273
- }
274
- }
275
-
276
- const container = new Container()
277
- container.resolvers.unshift(new UserResolver(container))
278
-
279
- const request = container.get(Request)
280
- expect(request).to.be.instanceof(Promise)
281
- const resolvedRequest = await container.get(Request)
282
- expect(resolvedRequest).to.be.instanceof(Request)
283
- }
284
-
285
- @test
286
- async injectsDependencyUsingStringAlias() {
287
- class SomeClass {
288
- @Inject('theCode')
289
- code: number
290
- }
291
-
292
- const container = new Container()
293
- container.set('theCode', 123)
294
-
295
- const instance = container.get(SomeClass)
296
-
297
- expect(instance.code).to.be.equal(123)
298
-
299
- }
300
-
301
- // @test
302
- // async customDecorators() {
303
- // class Database {
304
- // debug = false;
305
- //
306
- // async init() {
307
- // this.debug = true;
308
- // }
309
- // }
310
- //
311
- // function CustomDecorator() {
312
- // return function (target: Object, targetKey: string) {
313
- // // @ts-ignore
314
- // console.log('thi ->', this);
315
- // const metadata = InjectableMetadata.get(target.constructor);
316
- // metadata.dependencies[targetKey] = AuthUserIdentifier;
317
- // metadata.scope = Scope.REQUEST;
318
- // InjectableMetadata.set(metadata, target.constructor);
319
- // };
320
- // // return Container.createPropertyDecorator(container => {
321
- // //
322
- // // });
323
- // }
324
- //
325
- // class Controller {
326
- // @CustomDecorator()
327
- // database: Database;
328
- // }
329
- //
330
- // const container = new Container();
331
- // const controller = await container.get(Controller);
332
- //
333
- // expect(controller.database).to.be.instanceof(Database);
334
- // expect(controller.database.debug).to.equal(true);
335
- // }
336
- }