@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.
- package/build/Database/EntityProxyHandler.js +2 -2
- package/build/Database/EntityProxyHandler.js.map +1 -1
- package/package.json +4 -7
- package/.eslintrc-old.js +0 -208
- package/Cache/Cache.ts +0 -13
- package/Cache/Stores/DatabaseStore.ts +0 -120
- package/Cache/Stores/FileStore.ts +0 -69
- package/Cache/Stores/MemoryStore.ts +0 -71
- package/Cache/index.ts +0 -5
- package/Cache/types.ts +0 -4
- package/Container/ClassResolver.ts +0 -106
- package/Container/Container.ts +0 -144
- package/Container/Contracts.ts +0 -3
- package/Container/Decorators.ts +0 -20
- package/Container/Metadata.ts +0 -16
- package/Container/Resolver.ts +0 -27
- package/Container/index.ts +0 -5
- package/Database/Clauses/Where.ts +0 -0
- package/Database/Connection.ts +0 -52
- package/Database/Decorators.ts +0 -142
- package/Database/Drivers/DatabaseDriver.ts +0 -37
- package/Database/Drivers/MySQL/Alter/index.ts +0 -55
- package/Database/Drivers/MySQL/ColumnDefinition.ts +0 -16
- package/Database/Drivers/MySQL/Create.ts +0 -47
- package/Database/Drivers/MySQL/MysqlDriver.ts +0 -123
- package/Database/Drivers/MySQL/Schema.ts +0 -82
- package/Database/Drivers/MySQL/index.ts +0 -13
- package/Database/Drivers/SQL/Schema.ts +0 -73
- package/Database/Drivers/SQL/Statements/Alter.ts +0 -22
- package/Database/Drivers/SQL/Statements/BaseStatement.ts +0 -55
- package/Database/Drivers/SQL/Statements/Delete.ts +0 -20
- package/Database/Drivers/SQL/Statements/Insert.ts +0 -24
- package/Database/Drivers/SQL/Statements/Select.ts +0 -55
- package/Database/Drivers/SQL/Statements/Update.ts +0 -33
- package/Database/Drivers/SQL/index.ts +0 -8
- package/Database/Drivers/SQLite/Create.ts +0 -45
- package/Database/Drivers/SQLite/Schema.ts +0 -54
- package/Database/Drivers/SQLite/SqliteDriver.ts +0 -144
- package/Database/Drivers/SQLite/index.ts +0 -15
- package/Database/Drivers/SchemaContract.ts +0 -11
- package/Database/Drivers/Statement.ts +0 -16
- package/Database/Drivers/index.ts +0 -4
- package/Database/Entity.ts +0 -377
- package/Database/EntityNotFoundError.ts +0 -5
- package/Database/EntityProxyHandler.ts +0 -43
- package/Database/EntityQuery.ts +0 -197
- package/Database/Expression.ts +0 -3
- package/Database/Fields.ts +0 -816
- package/Database/Helpers.ts +0 -12
- package/Database/List.ts +0 -71
- package/Database/Migrations/Migration.ts +0 -10
- package/Database/Migrations/MigrationHistory.ts +0 -20
- package/Database/Migrations/Migrator.ts +0 -122
- package/Database/Migrations/index.ts +0 -3
- package/Database/ORM/BaseRelationship.ts +0 -10
- package/Database/Query.ts +0 -374
- package/Database/Seeders/Seeder.ts +0 -3
- package/Database/Seeders/SeederManager.ts +0 -27
- package/Database/Seeders/index.ts +0 -2
- package/Database/StringExpression.ts +0 -9
- package/Database/Types.ts +0 -165
- package/Database/index.ts +0 -23
- package/Encryption/index.ts +0 -51
- package/Forms/Decorators.ts +0 -29
- package/Forms/Form.ts +0 -70
- package/Forms/FormFields.ts +0 -36
- package/Forms/index.ts +0 -3
- package/Framework/App.ts +0 -10
- package/Framework/Application.ts +0 -118
- package/Framework/Auth/Auth.ts +0 -122
- package/Framework/Auth/Authenticatable.ts +0 -9
- package/Framework/Auth/User.ts +0 -27
- package/Framework/Auth/index.ts +0 -29
- package/Framework/Config/AppConfig.ts +0 -25
- package/Framework/Config/AuthConfig.ts +0 -9
- package/Framework/Config/BaseConfig.ts +0 -9
- package/Framework/Config/CacheConfig.ts +0 -38
- package/Framework/Config/DatabaseConfig.ts +0 -21
- package/Framework/Config/MailConfig.ts +0 -30
- package/Framework/Config/index.ts +0 -6
- package/Framework/Middleware/AuthMiddleware.ts +0 -31
- package/Framework/Middleware/CorsMiddleware.ts +0 -32
- package/Framework/Middleware/StaticAssetsMiddleware.ts +0 -76
- package/Framework/Middleware/index.ts +0 -2
- package/Framework/Provider.ts +0 -9
- package/Framework/Providers/CacheProvider.ts +0 -28
- package/Framework/Providers/DatabaseProvider.ts +0 -36
- package/Framework/Providers/MailProvider.ts +0 -31
- package/Framework/Providers/WebsocketsProvider.ts +0 -120
- package/Framework/Resolvers/AuthResolver.ts +0 -23
- package/Framework/Resolvers/EntityResolver.ts +0 -41
- package/Framework/Resolvers/FormResolver.ts +0 -37
- package/Framework/RootDir.ts +0 -1
- package/Framework/index.ts +0 -8
- package/Frontend/Angular/index.ts +0 -24
- package/Frontend/Websockets/index.ts +0 -86
- package/Mail/MailAddress.ts +0 -4
- package/Mail/MailTransport.ts +0 -6
- package/Mail/Mailable.ts +0 -16
- package/Mail/Mailer.ts +0 -27
- package/Mail/PendingMail.ts +0 -68
- package/Mail/SentMessage.ts +0 -20
- package/Mail/Transports/MemoryTransport.ts +0 -13
- package/Mail/Transports/SendGridTransport.ts +0 -95
- package/Mail/index.ts +0 -3
- package/Models/Model.ts +0 -41
- package/Models/index.ts +0 -54
- package/Router/BaseController.ts +0 -7
- package/Router/Decorators.ts +0 -224
- package/Router/Guard.ts +0 -10
- package/Router/Http/Contracts.ts +0 -4
- package/Router/Http/ErrorHandler.ts +0 -45
- package/Router/Http/ErrorHandlerInterface.ts +0 -6
- package/Router/Http/Errors/HttpError.ts +0 -15
- package/Router/Http/Handler.ts +0 -183
- package/Router/Http/HttpRoute.ts +0 -110
- package/Router/Http/Middleware.ts +0 -7
- package/Router/Http/Request.ts +0 -225
- package/Router/Http/Response.ts +0 -35
- package/Router/Http/index.ts +0 -85
- package/Router/Metadata.ts +0 -34
- package/Router/Middleware.ts +0 -16
- package/Router/Request.ts +0 -65
- package/Router/Route.ts +0 -16
- package/Router/RouteNotFoundError.ts +0 -5
- package/Router/Router.ts +0 -35
- package/Router/Servers/index.ts +0 -6
- package/Router/Servers/node.ts +0 -49
- package/Router/Servers/uNetworking.ts +0 -151
- package/Router/Websockets/Handler.ts +0 -82
- package/Router/Websockets/Middleware.ts +0 -7
- package/Router/Websockets/Request.ts +0 -3
- package/Router/Websockets/WebsocketRoute.ts +0 -61
- package/Router/Websockets/index.ts +0 -57
- package/Router/Websockets/types.ts +0 -23
- package/Router/index.ts +0 -6
- package/Storage/File.ts +0 -30
- package/Storage/Image.ts +0 -19
- package/Storage/InvalidImage.ts +0 -3
- package/Storage/Storage.ts +0 -98
- package/Storage/index.ts +0 -4
- package/Storage/utils.ts +0 -18
- package/Support/Array.ts +0 -184
- package/Support/Math.ts +0 -12
- package/Support/Metadata.ts +0 -31
- package/Support/String.ts +0 -38
- package/Support/index.ts +0 -19
- package/Support/utils.ts +0 -7
- package/Testing/TestCase.ts +0 -193
- package/Validation/Rule.ts +0 -9
- package/Validation/RuleInterface.ts +0 -10
- package/Validation/Rules/Email.ts +0 -20
- package/Validation/Rules/FileExtension.ts +0 -21
- package/Validation/Rules/MaxLength.ts +0 -17
- package/Validation/Rules/MinLength.ts +0 -18
- package/Validation/Rules/Optional.ts +0 -18
- package/Validation/Rules/Required.ts +0 -29
- package/Validation/Validator.ts +0 -7
- package/Validation/index.ts +0 -12
- package/benchmark-index.js +0 -20
- package/benchmark.ts +0 -47
- package/tests/Cache/DatabaseStoreTest.ts +0 -110
- package/tests/Cache/FileStoreTest.ts +0 -93
- package/tests/Cache/MemoryStoreTest.ts +0 -92
- package/tests/Container/ContainerTest.ts +0 -336
- package/tests/Database/Drivers/MySQL/AlterTest.ts +0 -100
- package/tests/Database/Drivers/MySQL/CreateTest.ts +0 -39
- package/tests/Database/Drivers/MysqlDriverTest.ts +0 -140
- package/tests/Database/Drivers/SqliteDriverTest.ts +0 -126
- package/tests/Database/Entities/Article.ts +0 -21
- package/tests/Database/Entities/Profile.ts +0 -21
- package/tests/Database/Entities/Role.ts +0 -15
- package/tests/Database/Entities/User.ts +0 -35
- package/tests/Database/EntityRelationshipsTest.ts +0 -475
- package/tests/Database/EntityTest.ts +0 -202
- package/tests/Database/Migrations/RunnerTest.ts +0 -96
- package/tests/Database/Migrations/migrations/1.createUserTable.ts +0 -12
- package/tests/Database/Migrations/migrations/2.createArticlesTable.ts +0 -12
- package/tests/Database/QueryTest.ts +0 -573
- package/tests/Database/SchemaTest.ts +0 -32
- package/tests/Database/Seeders/RunnerTest.ts +0 -30
- package/tests/Database/Seeders/seeders/RandomSeeder.ts +0 -10
- package/tests/Database/utils.ts +0 -16
- package/tests/Forms/FormsTest.ts +0 -59
- package/tests/Framework/Middleware/StaticAssetsMiddlewareTest.ts +0 -129
- package/tests/Framework/Resolvers/EntityResolverTest.ts +0 -48
- package/tests/Framework/Router/RouterTest.ts +0 -33
- package/tests/Mail/MailerTest.ts +0 -76
- package/tests/Model/ModelTest.ts +0 -183
- package/tests/Router/HttpHandlerTest.ts +0 -72
- package/tests/Router/RequestTest.ts +0 -77
- package/tests/Router/WebSocketsHandlerTest.ts +0 -51
- package/tests/Storage/StorageTest.ts +0 -97
- package/tests/Support/ArrayTest.ts +0 -167
- package/tests/Support/StringTest.ts +0 -18
- package/tests/Validation/RulesTest.ts +0 -54
- package/types.d.ts +0 -8
package/benchmark-index.js
DELETED
|
@@ -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
|
-
}
|