@typetron/framework 0.5.3 → 0.5.4

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/.eslintrc-old.js +208 -0
  2. package/Cache/Cache.ts +13 -0
  3. package/Cache/Stores/DatabaseStore.ts +120 -0
  4. package/Cache/Stores/FileStore.ts +69 -0
  5. package/Cache/Stores/MemoryStore.ts +71 -0
  6. package/Cache/index.ts +5 -0
  7. package/Cache/types.ts +4 -0
  8. package/Container/ClassResolver.ts +106 -0
  9. package/Container/Container.ts +144 -0
  10. package/Container/Contracts.ts +3 -0
  11. package/Container/Decorators.ts +20 -0
  12. package/Container/Metadata.ts +16 -0
  13. package/Container/Resolver.ts +27 -0
  14. package/Container/index.ts +5 -0
  15. package/Database/Clauses/Where.ts +0 -0
  16. package/Database/Connection.ts +52 -0
  17. package/Database/Decorators.ts +142 -0
  18. package/Database/Drivers/DatabaseDriver.ts +37 -0
  19. package/Database/Drivers/MySQL/Alter/index.ts +55 -0
  20. package/Database/Drivers/MySQL/ColumnDefinition.ts +16 -0
  21. package/Database/Drivers/MySQL/Create.ts +47 -0
  22. package/Database/Drivers/MySQL/MysqlDriver.ts +123 -0
  23. package/Database/Drivers/MySQL/Schema.ts +82 -0
  24. package/Database/Drivers/MySQL/index.ts +13 -0
  25. package/Database/Drivers/SQL/Schema.ts +73 -0
  26. package/Database/Drivers/SQL/Statements/Alter.ts +22 -0
  27. package/Database/Drivers/SQL/Statements/BaseStatement.ts +55 -0
  28. package/Database/Drivers/SQL/Statements/Delete.ts +20 -0
  29. package/Database/Drivers/SQL/Statements/Insert.ts +24 -0
  30. package/Database/Drivers/SQL/Statements/Select.ts +55 -0
  31. package/Database/Drivers/SQL/Statements/Update.ts +33 -0
  32. package/Database/Drivers/SQL/index.ts +8 -0
  33. package/Database/Drivers/SQLite/Create.ts +45 -0
  34. package/Database/Drivers/SQLite/Schema.ts +54 -0
  35. package/Database/Drivers/SQLite/SqliteDriver.ts +144 -0
  36. package/Database/Drivers/SQLite/index.ts +15 -0
  37. package/Database/Drivers/SchemaContract.ts +11 -0
  38. package/Database/Drivers/Statement.ts +16 -0
  39. package/Database/Drivers/index.ts +4 -0
  40. package/Database/Entity.ts +377 -0
  41. package/Database/EntityNotFoundError.ts +5 -0
  42. package/Database/EntityProxyHandler.ts +43 -0
  43. package/Database/EntityQuery.ts +197 -0
  44. package/Database/Expression.ts +3 -0
  45. package/Database/Fields.ts +816 -0
  46. package/Database/Helpers.ts +12 -0
  47. package/Database/List.ts +71 -0
  48. package/Database/Migrations/Migration.ts +10 -0
  49. package/Database/Migrations/MigrationHistory.ts +20 -0
  50. package/Database/Migrations/Migrator.ts +122 -0
  51. package/Database/Migrations/index.ts +3 -0
  52. package/Database/ORM/BaseRelationship.ts +10 -0
  53. package/Database/Query.ts +374 -0
  54. package/Database/Seeders/Seeder.ts +3 -0
  55. package/Database/Seeders/SeederManager.ts +27 -0
  56. package/Database/Seeders/index.ts +2 -0
  57. package/Database/StringExpression.ts +9 -0
  58. package/Database/Types.ts +165 -0
  59. package/Database/index.ts +23 -0
  60. package/Encryption/index.ts +51 -0
  61. package/Forms/Decorators.ts +29 -0
  62. package/Forms/Form.ts +70 -0
  63. package/Forms/FormFields.ts +36 -0
  64. package/Forms/index.ts +3 -0
  65. package/Framework/App.ts +10 -0
  66. package/Framework/Application.ts +118 -0
  67. package/Framework/Auth/Auth.ts +122 -0
  68. package/Framework/Auth/Authenticatable.ts +9 -0
  69. package/Framework/Auth/User.ts +27 -0
  70. package/Framework/Auth/index.ts +29 -0
  71. package/Framework/Config/AppConfig.ts +25 -0
  72. package/Framework/Config/AuthConfig.ts +9 -0
  73. package/Framework/Config/BaseConfig.ts +9 -0
  74. package/Framework/Config/CacheConfig.ts +38 -0
  75. package/Framework/Config/DatabaseConfig.ts +21 -0
  76. package/Framework/Config/MailConfig.ts +30 -0
  77. package/Framework/Config/index.ts +6 -0
  78. package/Framework/Middleware/AuthMiddleware.ts +31 -0
  79. package/Framework/Middleware/CorsMiddleware.ts +32 -0
  80. package/Framework/Middleware/StaticAssetsMiddleware.ts +76 -0
  81. package/Framework/Middleware/index.ts +2 -0
  82. package/Framework/Provider.ts +9 -0
  83. package/Framework/Providers/CacheProvider.ts +28 -0
  84. package/Framework/Providers/DatabaseProvider.ts +36 -0
  85. package/Framework/Providers/MailProvider.ts +31 -0
  86. package/Framework/Providers/WebsocketsProvider.ts +120 -0
  87. package/Framework/Resolvers/AuthResolver.ts +23 -0
  88. package/Framework/Resolvers/EntityResolver.ts +41 -0
  89. package/Framework/Resolvers/FormResolver.ts +37 -0
  90. package/Framework/RootDir.ts +1 -0
  91. package/Framework/index.ts +8 -0
  92. package/Frontend/Angular/index.ts +24 -0
  93. package/Frontend/Websockets/index.ts +86 -0
  94. package/Mail/MailAddress.ts +4 -0
  95. package/Mail/MailTransport.ts +6 -0
  96. package/Mail/Mailable.ts +16 -0
  97. package/Mail/Mailer.ts +27 -0
  98. package/Mail/PendingMail.ts +68 -0
  99. package/Mail/SentMessage.ts +20 -0
  100. package/Mail/Transports/MemoryTransport.ts +13 -0
  101. package/Mail/Transports/SendGridTransport.ts +95 -0
  102. package/Mail/index.ts +3 -0
  103. package/Models/Model.ts +41 -0
  104. package/Models/index.ts +54 -0
  105. package/Router/BaseController.ts +7 -0
  106. package/Router/Decorators.ts +224 -0
  107. package/Router/Guard.ts +10 -0
  108. package/Router/Http/Contracts.ts +4 -0
  109. package/Router/Http/ErrorHandler.ts +45 -0
  110. package/Router/Http/ErrorHandlerInterface.ts +6 -0
  111. package/Router/Http/Errors/HttpError.ts +15 -0
  112. package/Router/Http/Handler.ts +183 -0
  113. package/Router/Http/HttpRoute.ts +110 -0
  114. package/Router/Http/Middleware.ts +7 -0
  115. package/Router/Http/Request.ts +225 -0
  116. package/Router/Http/Response.ts +35 -0
  117. package/Router/Http/index.ts +85 -0
  118. package/Router/Metadata.ts +34 -0
  119. package/Router/Middleware.ts +16 -0
  120. package/Router/Request.ts +65 -0
  121. package/Router/Route.ts +16 -0
  122. package/Router/RouteNotFoundError.ts +5 -0
  123. package/Router/Router.ts +35 -0
  124. package/Router/Servers/index.ts +6 -0
  125. package/Router/Servers/node.ts +49 -0
  126. package/Router/Servers/uNetworking.ts +151 -0
  127. package/Router/Websockets/Handler.ts +82 -0
  128. package/Router/Websockets/Middleware.ts +7 -0
  129. package/Router/Websockets/Request.ts +3 -0
  130. package/Router/Websockets/WebsocketRoute.ts +61 -0
  131. package/Router/Websockets/index.ts +57 -0
  132. package/Router/Websockets/types.ts +23 -0
  133. package/Router/index.ts +6 -0
  134. package/Storage/File.ts +30 -0
  135. package/Storage/Image.ts +19 -0
  136. package/Storage/InvalidImage.ts +3 -0
  137. package/Storage/Storage.ts +98 -0
  138. package/Storage/index.ts +4 -0
  139. package/Storage/utils.ts +18 -0
  140. package/Support/Array.ts +184 -0
  141. package/Support/Math.ts +12 -0
  142. package/Support/Metadata.ts +31 -0
  143. package/Support/String.ts +38 -0
  144. package/Support/index.ts +19 -0
  145. package/Support/utils.ts +7 -0
  146. package/Testing/TestCase.ts +193 -0
  147. package/Validation/Rule.ts +9 -0
  148. package/Validation/RuleInterface.ts +10 -0
  149. package/Validation/Rules/Email.ts +20 -0
  150. package/Validation/Rules/FileExtension.ts +21 -0
  151. package/Validation/Rules/MaxLength.ts +17 -0
  152. package/Validation/Rules/MinLength.ts +18 -0
  153. package/Validation/Rules/Optional.ts +18 -0
  154. package/Validation/Rules/Required.ts +29 -0
  155. package/Validation/Validator.ts +7 -0
  156. package/Validation/index.ts +12 -0
  157. package/benchmark-index.js +20 -0
  158. package/benchmark.ts +47 -0
  159. package/package.json +7 -3
  160. package/tests/Cache/DatabaseStoreTest.ts +110 -0
  161. package/tests/Cache/FileStoreTest.ts +93 -0
  162. package/tests/Cache/MemoryStoreTest.ts +92 -0
  163. package/tests/Container/ContainerTest.ts +336 -0
  164. package/tests/Database/Drivers/MySQL/AlterTest.ts +100 -0
  165. package/tests/Database/Drivers/MySQL/CreateTest.ts +39 -0
  166. package/tests/Database/Drivers/MysqlDriverTest.ts +140 -0
  167. package/tests/Database/Drivers/SqliteDriverTest.ts +126 -0
  168. package/tests/Database/Entities/Article.ts +21 -0
  169. package/tests/Database/Entities/Profile.ts +21 -0
  170. package/tests/Database/Entities/Role.ts +15 -0
  171. package/tests/Database/Entities/User.ts +35 -0
  172. package/tests/Database/EntityRelationshipsTest.ts +475 -0
  173. package/tests/Database/EntityTest.ts +202 -0
  174. package/tests/Database/Migrations/RunnerTest.ts +96 -0
  175. package/tests/Database/Migrations/migrations/1.createUserTable.ts +12 -0
  176. package/tests/Database/Migrations/migrations/2.createArticlesTable.ts +12 -0
  177. package/tests/Database/QueryTest.ts +573 -0
  178. package/tests/Database/SchemaTest.ts +32 -0
  179. package/tests/Database/Seeders/RunnerTest.ts +30 -0
  180. package/tests/Database/Seeders/seeders/RandomSeeder.ts +10 -0
  181. package/tests/Database/utils.ts +16 -0
  182. package/tests/Forms/FormsTest.ts +59 -0
  183. package/tests/Framework/Middleware/StaticAssetsMiddlewareTest.ts +129 -0
  184. package/tests/Framework/Resolvers/EntityResolverTest.ts +48 -0
  185. package/tests/Framework/Router/RouterTest.ts +33 -0
  186. package/tests/Mail/MailerTest.ts +76 -0
  187. package/tests/Model/ModelTest.ts +183 -0
  188. package/tests/Router/HttpHandlerTest.ts +72 -0
  189. package/tests/Router/RequestTest.ts +77 -0
  190. package/tests/Router/WebSocketsHandlerTest.ts +51 -0
  191. package/tests/Storage/StorageTest.ts +97 -0
  192. package/tests/Support/ArrayTest.ts +167 -0
  193. package/tests/Support/StringTest.ts +18 -0
  194. package/tests/Validation/RulesTest.ts +54 -0
  195. package/types.d.ts +8 -0
@@ -0,0 +1,51 @@
1
+ import { suite, test } from '@testdeck/mocha'
2
+ import { Handler } from '../../Router/Websockets'
3
+ import { expect } from 'chai'
4
+ import { Container } from '@Typetron/Container'
5
+ import { Action, Body, Controller } from '../../Router'
6
+ import { Request } from '../../Router/Request'
7
+
8
+ @suite
9
+ class WebSocketsHandlerTest {
10
+
11
+ @test
12
+ 'gives error when two actions have the same path'() {
13
+ const container = new Container()
14
+
15
+ class Controller {
16
+ list() {}
17
+ }
18
+
19
+ const router = container.get(Handler)
20
+ router.addAction('list', Controller, 'list')
21
+
22
+ expect(() => router.addAction('list', Controller, 'index')).to.throw(`There is already an action with the same name: 'list'`)
23
+ }
24
+
25
+ @test
26
+ async 'returns the value from the @Body'() {
27
+ const container = Container.getInstance()
28
+
29
+ @Controller()
30
+ class MyController {
31
+ @Action()
32
+ list(@Body() value: string) {
33
+ return value
34
+ }
35
+
36
+ @Action()
37
+ create(@Body() value: string) {
38
+ return value
39
+ }
40
+ }
41
+
42
+ const router = container.get(Handler)
43
+
44
+ const listContent = await router.handle(container, new Request('list', 'test'))
45
+ expect(listContent.body).to.be.equal('test')
46
+
47
+ const createContent = await router.handle(container, new Request('create'))
48
+ expect(createContent.body).to.be.equal(undefined)
49
+ }
50
+
51
+ }
@@ -0,0 +1,97 @@
1
+ import { suite, test } from '@testdeck/mocha'
2
+ import { File, Storage } from '../../Storage'
3
+ import { expect } from 'chai'
4
+ import * as path from 'path'
5
+
6
+ const directory = './tests/Storage/.storage'
7
+
8
+ @suite
9
+ class StorageTest {
10
+ storage = new Storage()
11
+
12
+ @test
13
+ async canReadFiles() {
14
+ const file = new File('testFile.txt')
15
+ file.directory = directory
16
+ // Create the file before trying to save it
17
+ await this.storage.put(path.join(directory, file.name), 'test content')
18
+
19
+ const content = await this.storage.read(path.join(directory, file.name))
20
+ expect(content).to.be.instanceOf(Buffer)
21
+ expect(content.toString()).to.equal('test content')
22
+ }
23
+
24
+ @test
25
+ async canCheckIfFileExists() {
26
+ const file = new File('testFile.txt')
27
+ file.directory = directory
28
+ // Create the file before trying to save it
29
+ await this.storage.put(path.join(directory, file.name), 'test content')
30
+
31
+ const exists = await this.storage.exists(path.join(directory, file.name))
32
+ expect(exists).to.be.true
33
+ }
34
+
35
+ @test
36
+ async canSaveFiles() {
37
+ const file = new File('testFile.txt')
38
+ file.directory = directory
39
+ // Create the file before trying to save it
40
+ await this.storage.put(path.join(directory, file.name), 'test content')
41
+ const savedFile = await this.storage.save(file, './tests/Storage/.storage/alternative.txt')
42
+ expect(savedFile).to.be.instanceOf(File)
43
+ expect(savedFile.name).to.equal(file.name)
44
+ expect(await this.storage.exists(savedFile.path)).to.be.true
45
+ }
46
+
47
+ @test
48
+ async canWriteToFile() {
49
+ const filePath = path.join(directory, 'testFile.txt')
50
+ const file = await this.storage.put(filePath, 'test content')
51
+ expect(file).to.be.instanceOf(File)
52
+ expect(file.name).to.equal('testFile.txt')
53
+ const content = await this.storage.read(path.join(directory, file.name))
54
+ expect(content).to.be.instanceOf(Buffer)
55
+ expect(content.toString()).to.equal('test content')
56
+ }
57
+
58
+ @test
59
+ async canCreateDirectory() {
60
+ await this.storage.makeDirectory(directory)
61
+ const exists = await this.storage.exists(directory)
62
+ expect(exists).to.be.true
63
+ }
64
+
65
+ @test
66
+ async canDeleteDirectory() {
67
+ await this.storage.makeDirectory(directory)
68
+ await this.storage.deleteDirectory(directory)
69
+ const exists = await this.storage.exists(directory)
70
+ expect(exists).to.be.false
71
+ }
72
+
73
+ @test
74
+ async canDeleteFile() {
75
+ const file = new File('testFile.txt')
76
+ file.directory = directory
77
+ // Create the file before trying to save it
78
+ await this.storage.put(path.join(directory, file.name), 'test content')
79
+
80
+ await this.storage.delete(path.join(directory, file.name))
81
+ const exists = await this.storage.exists(path.join(directory, file.name))
82
+ expect(exists).to.be.false
83
+ }
84
+
85
+ @test
86
+ async cannotDeleteWithoutFileName() {
87
+ try {
88
+ // Attempt to delete a directory instead of a file
89
+ await this.storage.delete(directory)
90
+ throw new Error('Expected an error to be thrown, but none was thrown.')
91
+ } catch (unknownError) {
92
+ const error = unknownError as Error
93
+ expect(error).to.be.instanceOf(Error)
94
+ expect(error.message).to.equal('Can not delete because this path leads to a directory and not a file.')
95
+ }
96
+ }
97
+ }
@@ -0,0 +1,167 @@
1
+ import { expect } from 'chai'
2
+ import { suite, test } from '@testdeck/mocha'
3
+ import '../../Support'
4
+
5
+ interface User {
6
+ name: string;
7
+ age: number;
8
+ admin: boolean;
9
+ }
10
+
11
+ @suite
12
+ class ArrayTest {
13
+
14
+ joe = {
15
+ name: 'Joe',
16
+ age: 20,
17
+ admin: false
18
+ }
19
+ doe = {
20
+ name: 'Doe',
21
+ age: 21,
22
+ admin: true
23
+ }
24
+
25
+ users: User[] = []
26
+
27
+ before() {
28
+ this.users = [this.joe, this.doe]
29
+ }
30
+
31
+ @test
32
+ empty() {
33
+ expect([].empty()).to.be.equal(true)
34
+ expect([1].empty()).to.be.equal(false)
35
+ }
36
+
37
+ @test
38
+ findWhere() {
39
+ expect(this.users.findWhere('name', 'Joe')).to.be.equal(this.joe)
40
+ }
41
+
42
+ @test
43
+ pluck() {
44
+ expect(this.users.pluck('name')).to.have.members([this.joe.name, this.doe.name])
45
+ }
46
+
47
+ @test
48
+ remove() {
49
+ this.users.remove(this.joe)
50
+ expect(this.users).to.have.members([this.doe])
51
+ }
52
+
53
+ @test
54
+ removeMany() {
55
+ this.users.remove(this.joe, this.doe)
56
+ expect(this.users).to.have.length(0)
57
+ }
58
+
59
+ @test
60
+ where() {
61
+ expect(this.users.where('name', this.joe.name)).to.have.members([this.joe])
62
+ expect([this.joe].where('admin', false)).to.have.length(1)
63
+ }
64
+
65
+ @test
66
+ whereNot() {
67
+ expect(this.users.whereNot('name', this.joe.name)).to.have.members([this.doe])
68
+ expect([this.doe].whereNot('admin', false)).to.have.length(1)
69
+ }
70
+
71
+ @test
72
+ whereWithDefaultValue() {
73
+ expect(this.users.where('admin')).to.have.members([this.doe])
74
+ }
75
+
76
+ @test
77
+ whereIn() {
78
+ expect(this.users.whereIn('name', [this.joe.name, this.doe.name])).to.have.members([this.joe, this.doe])
79
+ }
80
+
81
+ @test
82
+ whereNotIn() {
83
+ expect(this.users.whereNotIn('name', [this.joe.name])).to.have.members([this.doe])
84
+ }
85
+
86
+ @test
87
+ first() {
88
+ expect(this.users.first()).to.be.equal(this.joe)
89
+ }
90
+
91
+ @test
92
+ groupBy() {
93
+ expect(this.users.groupBy('age')).to.deep.equal({
94
+ 20: [this.joe],
95
+ 21: [this.doe],
96
+ })
97
+ }
98
+
99
+ @test
100
+ groupByCallback() {
101
+ expect(this.users.groupBy(user => user.age)).to.deep.equal({
102
+ 20: [this.joe],
103
+ 21: [this.doe],
104
+ })
105
+ }
106
+
107
+ @test
108
+ uniqueValue() {
109
+ const data = [1, 1, 2, 3]
110
+ expect(data.unique()).to.be.deep.equal([1, 2, 3])
111
+ }
112
+
113
+ @test
114
+ uniqueValueBasedOnKey() {
115
+ const data = [
116
+ {id: 1},
117
+ {id: 1},
118
+ ]
119
+ expect(data.unique('id')).to.be.deep.equal([{id: 1}])
120
+ }
121
+
122
+ @test
123
+ uniqueValueBasedOnCallback() {
124
+ const data = [
125
+ {age: 20},
126
+ {age: 20},
127
+ {age: 30},
128
+ ]
129
+ expect(data.unique(item => item.age)).to.be.deep.equal([{age: 20}, {age: 30}])
130
+ }
131
+
132
+ @test
133
+ sumNumbers() {
134
+ expect([1, 2, 3].sum()).to.be.equal(6)
135
+ }
136
+
137
+ @test
138
+ sumObjectProperties() {
139
+ expect(this.users.sum('age')).to.be.equal(this.joe.age + this.doe.age)
140
+ }
141
+
142
+ @test
143
+ sumCallback() {
144
+ expect(this.users.sum(user => user.age)).to.be.equal(this.joe.age + this.doe.age)
145
+ }
146
+
147
+ @test
148
+ whenNotEmpty() {
149
+ let index = false;
150
+ [1].whenNotEmpty(() => index = true)
151
+ expect(index).to.be.equal(true)
152
+ }
153
+
154
+ @test
155
+ whenNotEmptyPassesTheArrayInTheCallback() {
156
+ let index = false;
157
+ [1, 2, 3].filter(i => i >= 2).whenNotEmpty(values => index = values.length === 2)
158
+ expect(index).to.be.equal(true)
159
+ }
160
+
161
+ @test
162
+ whenEmpty() {
163
+ let index = false;
164
+ [].whenEmpty(() => index = true)
165
+ expect(index).to.be.equal(true)
166
+ }
167
+ }
@@ -0,0 +1,18 @@
1
+ import { expect } from 'chai'
2
+ import { suite, test } from '@testdeck/mocha'
3
+
4
+ @suite
5
+ class StringTest {
6
+ @test
7
+ shouldLimitStringAddingThreeDotsAtTheEnd() {
8
+ expect('text'.limit(3)).to.be.equal('...')
9
+ expect('texts'.limit(4)).to.be.equal('t...')
10
+ expect('text'.limit(5)).to.be.equal('text')
11
+ }
12
+
13
+ @test
14
+ shouldLimitStringWithCustomEnding() {
15
+ expect('Testing this text'.limit(12, ' More...')).to.be.equal('Test More...')
16
+ }
17
+
18
+ }
@@ -0,0 +1,54 @@
1
+ import { suite, test } from '@testdeck/mocha'
2
+ import { Email } from '../../Validation'
3
+ import { expect } from 'chai'
4
+
5
+ @suite
6
+ class RulesTest {
7
+ @test
8
+ shouldLimitStringAddingThreeDotsAtTheEnd() {
9
+ const validEmails = [
10
+ 'email@example.com',
11
+ 'firstname.lastname@example.com',
12
+ 'email@subdomain.example.com',
13
+ 'firstname+lastname@example.com',
14
+ 'email@123.123.123.123',
15
+ 'email@[123.123.123.123]',
16
+ '"email"@example.com',
17
+ '1234567890@example.com',
18
+ 'email@example-one.com',
19
+ '_______@example.com',
20
+ 'email@example.name',
21
+ 'email@example.museum',
22
+ 'email@example.co.jp',
23
+ 'firstname-lastname@example.com',
24
+ ]
25
+ const invalidEmails = [
26
+ 'plainaddress',
27
+ '#@%^%#$@#$@#.com',
28
+ '@example.com',
29
+ 'Joe Smith <email@example.com>',
30
+ 'email.example.com',
31
+ 'email@example@example.com',
32
+ '.email@example.com',
33
+ 'email.@example.com',
34
+ 'email..email@example.com',
35
+ 'あいうえお@example.com',
36
+ 'email@example.com (Joe Smith)',
37
+ 'email@example',
38
+ 'email@-example.com',
39
+ 'email@example..com',
40
+ 'Abc..123@example.com',
41
+ ]
42
+
43
+ const rule = new (Email())
44
+
45
+ validEmails.forEach(email => {
46
+ expect(rule.passes('', email), email).to.be.equal(true)
47
+ })
48
+
49
+ invalidEmails.forEach(email => {
50
+ expect(rule.passes('', email), email).to.be.equal(false)
51
+ })
52
+ }
53
+
54
+ }
package/types.d.ts ADDED
@@ -0,0 +1,8 @@
1
+ declare module 'fast-url-parser' {
2
+ export function parse(url: string): Url
3
+
4
+ type Url = URL & {
5
+ format(): string
6
+ query: string
7
+ }
8
+ }