@loopback/repository-tests 0.20.2 → 0.21.2
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/LICENSE +2 -2
- package/dist/crud/create-retrieve.suite.js +1 -1
- package/dist/crud/create-retrieve.suite.js.map +1 -1
- package/dist/crud/freeform-properties.suite.js +2 -2
- package/dist/crud/freeform-properties.suite.js.map +1 -1
- package/dist/crud/nested-model-properties.suite.js +1 -1
- package/dist/crud/nested-model-properties.suite.js.map +1 -1
- package/dist/crud/relations/acceptance/belongs-to.inclusion-resolver.polymorphic.relation.acceptance.d.ts +2 -0
- package/dist/crud/relations/acceptance/belongs-to.inclusion-resolver.polymorphic.relation.acceptance.js +170 -0
- package/dist/crud/relations/acceptance/belongs-to.inclusion-resolver.polymorphic.relation.acceptance.js.map +1 -0
- package/dist/crud/relations/acceptance/belongs-to.inclusion-resolver.relation.acceptance.js +1 -1
- package/dist/crud/relations/acceptance/belongs-to.inclusion-resolver.relation.acceptance.js.map +1 -1
- package/dist/crud/relations/acceptance/belongs-to.polymorphic.relation.acceptance.d.ts +2 -0
- package/dist/crud/relations/acceptance/belongs-to.polymorphic.relation.acceptance.js +55 -0
- package/dist/crud/relations/acceptance/belongs-to.polymorphic.relation.acceptance.js.map +1 -0
- package/dist/crud/relations/acceptance/belongs-to.relation.acceptance.js +1 -1
- package/dist/crud/relations/acceptance/belongs-to.relation.acceptance.js.map +1 -1
- package/dist/crud/relations/acceptance/has-many-inclusion-resolver.relation.acceptance.js +1 -1
- package/dist/crud/relations/acceptance/has-many-inclusion-resolver.relation.acceptance.js.map +1 -1
- package/dist/crud/relations/acceptance/has-many-through-inclusion-resolver.acceptance.js +1 -1
- package/dist/crud/relations/acceptance/has-many-through-inclusion-resolver.acceptance.js.map +1 -1
- package/dist/crud/relations/acceptance/has-many-through-inclusion-resolver.polymorphic.acceptance.d.ts +2 -0
- package/dist/crud/relations/acceptance/has-many-through-inclusion-resolver.polymorphic.acceptance.js +170 -0
- package/dist/crud/relations/acceptance/has-many-through-inclusion-resolver.polymorphic.acceptance.js.map +1 -0
- package/dist/crud/relations/acceptance/has-many-through.relation.acceptance.js +1 -1
- package/dist/crud/relations/acceptance/has-many-through.relation.acceptance.js.map +1 -1
- package/dist/crud/relations/acceptance/has-many-through.relation.polymorphic.acceptance.d.ts +2 -0
- package/dist/crud/relations/acceptance/has-many-through.relation.polymorphic.acceptance.js +361 -0
- package/dist/crud/relations/acceptance/has-many-through.relation.polymorphic.acceptance.js.map +1 -0
- package/dist/crud/relations/acceptance/has-many.relation.acceptance.js +1 -1
- package/dist/crud/relations/acceptance/has-many.relation.acceptance.js.map +1 -1
- package/dist/crud/relations/acceptance/has-one.inclusion-resolver.acceptance.js +1 -1
- package/dist/crud/relations/acceptance/has-one.inclusion-resolver.acceptance.js.map +1 -1
- package/dist/crud/relations/acceptance/has-one.inclusion-resolver.polymorphic.acceptance.d.ts +2 -0
- package/dist/crud/relations/acceptance/has-one.inclusion-resolver.polymorphic.acceptance.js +161 -0
- package/dist/crud/relations/acceptance/has-one.inclusion-resolver.polymorphic.acceptance.js.map +1 -0
- package/dist/crud/relations/acceptance/has-one.relation.acceptance.js +1 -1
- package/dist/crud/relations/acceptance/has-one.relation.acceptance.js.map +1 -1
- package/dist/crud/relations/acceptance/has-one.relation.polymorphic.acceptance.d.ts +2 -0
- package/dist/crud/relations/acceptance/has-one.relation.polymorphic.acceptance.js +190 -0
- package/dist/crud/relations/acceptance/has-one.relation.polymorphic.acceptance.js.map +1 -0
- package/dist/crud/relations/acceptance/multi-relations-inclusion-resolver.relation.acceptance.js +1 -1
- package/dist/crud/relations/acceptance/multi-relations-inclusion-resolver.relation.acceptance.js.map +1 -1
- package/dist/crud/relations/fixtures/models/address.model.js +1 -1
- package/dist/crud/relations/fixtures/models/address.model.js.map +1 -1
- package/dist/crud/relations/fixtures/models/cart-item.model.js +1 -1
- package/dist/crud/relations/fixtures/models/cart-item.model.js.map +1 -1
- package/dist/crud/relations/fixtures/models/contact.model.d.ts +18 -0
- package/dist/crud/relations/fixtures/models/contact.model.js +49 -0
- package/dist/crud/relations/fixtures/models/contact.model.js.map +1 -0
- package/dist/crud/relations/fixtures/models/customer-cart-item-link.model.js +1 -1
- package/dist/crud/relations/fixtures/models/customer-cart-item-link.model.js.map +1 -1
- package/dist/crud/relations/fixtures/models/customer-promotion-link.model.d.ts +14 -0
- package/dist/crud/relations/fixtures/models/customer-promotion-link.model.js +46 -0
- package/dist/crud/relations/fixtures/models/customer-promotion-link.model.js.map +1 -0
- package/dist/crud/relations/fixtures/models/customer.model.d.ts +16 -3
- package/dist/crud/relations/fixtures/models/customer.model.js +28 -10
- package/dist/crud/relations/fixtures/models/customer.model.js.map +1 -1
- package/dist/crud/relations/fixtures/models/index.d.ts +6 -0
- package/dist/crud/relations/fixtures/models/index.js +7 -1
- package/dist/crud/relations/fixtures/models/index.js.map +1 -1
- package/dist/crud/relations/fixtures/models/order.model.js +1 -1
- package/dist/crud/relations/fixtures/models/order.model.js.map +1 -1
- package/dist/crud/relations/fixtures/models/payment-method.model.d.ts +47 -0
- package/dist/crud/relations/fixtures/models/payment-method.model.js +87 -0
- package/dist/crud/relations/fixtures/models/payment-method.model.js.map +1 -0
- package/dist/crud/relations/fixtures/models/promotion.model.d.ts +27 -0
- package/dist/crud/relations/fixtures/models/promotion.model.js +54 -0
- package/dist/crud/relations/fixtures/models/promotion.model.js.map +1 -0
- package/dist/crud/relations/fixtures/models/shipment.model.js +1 -1
- package/dist/crud/relations/fixtures/models/shipment.model.js.map +1 -1
- package/dist/crud/relations/fixtures/models/stakeholder.model.d.ts +7 -0
- package/dist/crud/relations/fixtures/models/stakeholder.model.js +38 -0
- package/dist/crud/relations/fixtures/models/stakeholder.model.js.map +1 -0
- package/dist/crud/relations/fixtures/models/supplier.model.d.ts +15 -0
- package/dist/crud/relations/fixtures/models/supplier.model.js +23 -0
- package/dist/crud/relations/fixtures/models/supplier.model.js.map +1 -0
- package/dist/crud/relations/fixtures/models/user-link.model.js +1 -1
- package/dist/crud/relations/fixtures/models/user-link.model.js.map +1 -1
- package/dist/crud/relations/fixtures/models/user.model.js +1 -1
- package/dist/crud/relations/fixtures/models/user.model.js.map +1 -1
- package/dist/crud/relations/fixtures/repositories/address.repository.js +1 -1
- package/dist/crud/relations/fixtures/repositories/address.repository.js.map +1 -1
- package/dist/crud/relations/fixtures/repositories/cart-item.repository.js +1 -1
- package/dist/crud/relations/fixtures/repositories/cart-item.repository.js.map +1 -1
- package/dist/crud/relations/fixtures/repositories/contact.repository.d.ts +30 -0
- package/dist/crud/relations/fixtures/repositories/contact.repository.js +21 -0
- package/dist/crud/relations/fixtures/repositories/contact.repository.js.map +1 -0
- package/dist/crud/relations/fixtures/repositories/customer-cart-item-link.repository.js +1 -1
- package/dist/crud/relations/fixtures/repositories/customer-cart-item-link.repository.js.map +1 -1
- package/dist/crud/relations/fixtures/repositories/customer-promotion-link.repository.d.ts +26 -0
- package/dist/crud/relations/fixtures/repositories/customer-promotion-link.repository.js +18 -0
- package/dist/crud/relations/fixtures/repositories/customer-promotion-link.repository.js.map +1 -0
- package/dist/crud/relations/fixtures/repositories/customer.repository.d.ts +9 -2
- package/dist/crud/relations/fixtures/repositories/customer.repository.js +8 -2
- package/dist/crud/relations/fixtures/repositories/customer.repository.js.map +1 -1
- package/dist/crud/relations/fixtures/repositories/index.d.ts +6 -1
- package/dist/crud/relations/fixtures/repositories/index.js +7 -2
- package/dist/crud/relations/fixtures/repositories/index.js.map +1 -1
- package/dist/crud/relations/fixtures/repositories/order.repository.js +1 -1
- package/dist/crud/relations/fixtures/repositories/order.repository.js.map +1 -1
- package/dist/crud/relations/fixtures/repositories/payment-method.repository.d.ts +77 -0
- package/dist/crud/relations/fixtures/repositories/payment-method.repository.js +45 -0
- package/dist/crud/relations/fixtures/repositories/payment-method.repository.js.map +1 -0
- package/dist/crud/relations/fixtures/repositories/promotion.repository.d.ts +49 -0
- package/dist/crud/relations/fixtures/repositories/promotion.repository.js +25 -0
- package/dist/crud/relations/fixtures/repositories/promotion.repository.js.map +1 -0
- package/dist/crud/relations/fixtures/repositories/shipment.repository.js +1 -1
- package/dist/crud/relations/fixtures/repositories/shipment.repository.js.map +1 -1
- package/dist/crud/relations/fixtures/repositories/supplier.repository.d.ts +28 -0
- package/dist/crud/relations/fixtures/repositories/supplier.repository.js +21 -0
- package/dist/crud/relations/fixtures/repositories/supplier.repository.js.map +1 -0
- package/dist/crud/relations/fixtures/repositories/user-link.repository.js +1 -1
- package/dist/crud/relations/fixtures/repositories/user-link.repository.js.map +1 -1
- package/dist/crud/relations/fixtures/repositories/user.repository.js +1 -1
- package/dist/crud/relations/fixtures/repositories/user.repository.js.map +1 -1
- package/dist/crud/relations/helpers.d.ts +9 -1
- package/dist/crud/relations/helpers.js +86 -11
- package/dist/crud/relations/helpers.js.map +1 -1
- package/dist/crud/replace-by-id.suite.js +1 -1
- package/dist/crud/replace-by-id.suite.js.map +1 -1
- package/dist/crud/transactions.suite.js +1 -1
- package/dist/crud/transactions.suite.js.map +1 -1
- package/dist/crud-test-suite.js +1 -1
- package/dist/crud-test-suite.js.map +1 -1
- package/dist/helpers.repository-tests.d.ts +1 -1
- package/dist/helpers.repository-tests.js +1 -1
- package/dist/helpers.repository-tests.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/types.repository-tests.js +1 -1
- package/dist/types.repository-tests.js.map +1 -1
- package/package.json +14 -14
- package/src/crud/create-retrieve.suite.ts +1 -1
- package/src/crud/freeform-properties.suite.ts +10 -6
- package/src/crud/nested-model-properties.suite.ts +1 -1
- package/src/crud/relations/acceptance/belongs-to.inclusion-resolver.polymorphic.relation.acceptance.ts +221 -0
- package/src/crud/relations/acceptance/belongs-to.inclusion-resolver.relation.acceptance.ts +1 -1
- package/src/crud/relations/acceptance/belongs-to.polymorphic.relation.acceptance.ts +88 -0
- package/src/crud/relations/acceptance/belongs-to.relation.acceptance.ts +1 -1
- package/src/crud/relations/acceptance/has-many-inclusion-resolver.relation.acceptance.ts +1 -1
- package/src/crud/relations/acceptance/has-many-through-inclusion-resolver.acceptance.ts +1 -1
- package/src/crud/relations/acceptance/has-many-through-inclusion-resolver.polymorphic.acceptance.ts +255 -0
- package/src/crud/relations/acceptance/has-many-through.relation.acceptance.ts +2 -2
- package/src/crud/relations/acceptance/has-many-through.relation.polymorphic.acceptance.ts +494 -0
- package/src/crud/relations/acceptance/has-many.relation.acceptance.ts +1 -1
- package/src/crud/relations/acceptance/has-one.inclusion-resolver.acceptance.ts +1 -1
- package/src/crud/relations/acceptance/has-one.inclusion-resolver.polymorphic.acceptance.ts +208 -0
- package/src/crud/relations/acceptance/has-one.relation.acceptance.ts +1 -1
- package/src/crud/relations/acceptance/has-one.relation.polymorphic.acceptance.ts +328 -0
- package/src/crud/relations/acceptance/multi-relations-inclusion-resolver.relation.acceptance.ts +1 -1
- package/src/crud/relations/fixtures/models/address.model.ts +1 -1
- package/src/crud/relations/fixtures/models/cart-item.model.ts +1 -1
- package/src/crud/relations/fixtures/models/contact.model.ts +56 -0
- package/src/crud/relations/fixtures/models/customer-cart-item-link.model.ts +1 -1
- package/src/crud/relations/fixtures/models/customer-promotion-link.model.ts +52 -0
- package/src/crud/relations/fixtures/models/customer.model.ts +40 -10
- package/src/crud/relations/fixtures/models/index.ts +7 -1
- package/src/crud/relations/fixtures/models/order.model.ts +1 -1
- package/src/crud/relations/fixtures/models/payment-method.model.ts +118 -0
- package/src/crud/relations/fixtures/models/promotion.model.ts +67 -0
- package/src/crud/relations/fixtures/models/shipment.model.ts +1 -1
- package/src/crud/relations/fixtures/models/stakeholder.model.ts +33 -0
- package/src/crud/relations/fixtures/models/supplier.model.ts +35 -0
- package/src/crud/relations/fixtures/models/user-link.model.ts +1 -1
- package/src/crud/relations/fixtures/models/user.model.ts +1 -1
- package/src/crud/relations/fixtures/repositories/address.repository.ts +1 -1
- package/src/crud/relations/fixtures/repositories/cart-item.repository.ts +1 -1
- package/src/crud/relations/fixtures/repositories/contact.repository.ts +44 -0
- package/src/crud/relations/fixtures/repositories/customer-cart-item-link.repository.ts +1 -1
- package/src/crud/relations/fixtures/repositories/customer-promotion-link.repository.ts +20 -0
- package/src/crud/relations/fixtures/repositories/customer.repository.ts +48 -1
- package/src/crud/relations/fixtures/repositories/index.ts +7 -2
- package/src/crud/relations/fixtures/repositories/order.repository.ts +1 -1
- package/src/crud/relations/fixtures/repositories/payment-method.repository.ts +118 -0
- package/src/crud/relations/fixtures/repositories/promotion.repository.ts +37 -0
- package/src/crud/relations/fixtures/repositories/shipment.repository.ts +1 -1
- package/src/crud/relations/fixtures/repositories/supplier.repository.ts +40 -0
- package/src/crud/relations/fixtures/repositories/user-link.repository.ts +1 -1
- package/src/crud/relations/fixtures/repositories/user.repository.ts +1 -1
- package/src/crud/relations/helpers.ts +201 -31
- package/src/crud/replace-by-id.suite.ts +1 -1
- package/src/crud/transactions.suite.ts +1 -1
- package/src/crud-test-suite.ts +1 -1
- package/src/helpers.repository-tests.ts +2 -2
- package/src/index.ts +1 -1
- package/src/types.repository-tests.ts +1 -1
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
// Copyright IBM Corp. and LoopBack contributors 2019. All Rights Reserved.
|
|
2
|
+
// Node module: @loopback/repository-tests
|
|
3
|
+
// This file is licensed under the MIT License.
|
|
4
|
+
// License text available at https://opensource.org/licenses/MIT
|
|
5
|
+
|
|
6
|
+
import {Getter} from '@loopback/core';
|
|
7
|
+
import {
|
|
8
|
+
BelongsToAccessor,
|
|
9
|
+
BelongsToDefinition,
|
|
10
|
+
createBelongsToAccessor,
|
|
11
|
+
createHasOneRepositoryFactory,
|
|
12
|
+
HasOneDefinition,
|
|
13
|
+
HasOneRepositoryFactory,
|
|
14
|
+
juggler,
|
|
15
|
+
} from '@loopback/repository';
|
|
16
|
+
import {CrudRepositoryCtor} from '../../../..';
|
|
17
|
+
import {
|
|
18
|
+
CardInfo,
|
|
19
|
+
CardInfoRelations,
|
|
20
|
+
Cash,
|
|
21
|
+
CashRelations,
|
|
22
|
+
CreditCard,
|
|
23
|
+
CreditCardRelations,
|
|
24
|
+
Customer,
|
|
25
|
+
} from '../models';
|
|
26
|
+
|
|
27
|
+
export function createCreditCardRepo(repoClass: CrudRepositoryCtor) {
|
|
28
|
+
return class CreditCardRepository extends repoClass<
|
|
29
|
+
CreditCard,
|
|
30
|
+
typeof CreditCard.prototype.id,
|
|
31
|
+
CreditCardRelations
|
|
32
|
+
> {
|
|
33
|
+
public readonly customer: BelongsToAccessor<
|
|
34
|
+
Customer,
|
|
35
|
+
typeof CreditCard.prototype.id
|
|
36
|
+
>;
|
|
37
|
+
|
|
38
|
+
public readonly cardInfo: HasOneRepositoryFactory<
|
|
39
|
+
CardInfo,
|
|
40
|
+
typeof CreditCard.prototype.id
|
|
41
|
+
>;
|
|
42
|
+
|
|
43
|
+
constructor(
|
|
44
|
+
db: juggler.DataSource,
|
|
45
|
+
customerRepositoryGetter: Getter<typeof repoClass.prototype>,
|
|
46
|
+
cardInfoRepositoryGetter: Getter<typeof repoClass.prototype>,
|
|
47
|
+
) {
|
|
48
|
+
super(CreditCard, db);
|
|
49
|
+
// create a belongsto relation from this public method
|
|
50
|
+
const customerMeta = this.entityClass.definition.relations['customer'];
|
|
51
|
+
this.customer = createBelongsToAccessor(
|
|
52
|
+
customerMeta as BelongsToDefinition,
|
|
53
|
+
customerRepositoryGetter,
|
|
54
|
+
this,
|
|
55
|
+
);
|
|
56
|
+
const cardInfoMeta = this.entityClass.definition.relations['cardInfo'];
|
|
57
|
+
this.cardInfo = createHasOneRepositoryFactory(
|
|
58
|
+
cardInfoMeta as HasOneDefinition,
|
|
59
|
+
cardInfoRepositoryGetter,
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export function createCashRepo(repoClass: CrudRepositoryCtor) {
|
|
66
|
+
return class CashRepository extends repoClass<
|
|
67
|
+
Cash,
|
|
68
|
+
typeof Cash.prototype.id,
|
|
69
|
+
CashRelations
|
|
70
|
+
> {
|
|
71
|
+
public readonly customer: BelongsToAccessor<
|
|
72
|
+
Customer,
|
|
73
|
+
typeof Cash.prototype.id
|
|
74
|
+
>;
|
|
75
|
+
|
|
76
|
+
constructor(
|
|
77
|
+
db: juggler.DataSource,
|
|
78
|
+
customerRepositoryGetter: Getter<typeof repoClass.prototype>,
|
|
79
|
+
) {
|
|
80
|
+
super(Cash, db);
|
|
81
|
+
// create a belongsto relation from this public method
|
|
82
|
+
const customerMeta = this.entityClass.definition.relations['customer'];
|
|
83
|
+
this.customer = createBelongsToAccessor(
|
|
84
|
+
customerMeta as BelongsToDefinition,
|
|
85
|
+
customerRepositoryGetter,
|
|
86
|
+
this,
|
|
87
|
+
);
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export function createCardInfoRepo(repoClass: CrudRepositoryCtor) {
|
|
93
|
+
return class CardInfoRepository extends repoClass<
|
|
94
|
+
CardInfo,
|
|
95
|
+
typeof CardInfo.prototype.id,
|
|
96
|
+
CardInfoRelations
|
|
97
|
+
> {
|
|
98
|
+
public readonly creditCard: BelongsToAccessor<
|
|
99
|
+
CreditCard,
|
|
100
|
+
typeof CardInfo.prototype.id
|
|
101
|
+
>;
|
|
102
|
+
|
|
103
|
+
constructor(
|
|
104
|
+
db: juggler.DataSource,
|
|
105
|
+
creditCardRepositoryGetter: Getter<typeof repoClass.prototype>,
|
|
106
|
+
) {
|
|
107
|
+
super(CardInfo, db);
|
|
108
|
+
// create a belongsto relation from this public method
|
|
109
|
+
const creditCardMeta =
|
|
110
|
+
this.entityClass.definition.relations['creditCard'];
|
|
111
|
+
this.creditCard = createBelongsToAccessor(
|
|
112
|
+
creditCardMeta as BelongsToDefinition,
|
|
113
|
+
creditCardRepositoryGetter,
|
|
114
|
+
this,
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// Copyright IBM Corp. and LoopBack contributors 2019. All Rights Reserved.
|
|
2
|
+
// Node module: @loopback/repository-tests
|
|
3
|
+
// This file is licensed under the MIT License.
|
|
4
|
+
// License text available at https://opensource.org/licenses/MIT
|
|
5
|
+
|
|
6
|
+
import {juggler} from '@loopback/repository';
|
|
7
|
+
import {CrudRepositoryCtor} from '../../../..';
|
|
8
|
+
import {
|
|
9
|
+
FreeDelivery,
|
|
10
|
+
FreeDeliveryRelations,
|
|
11
|
+
HalfPrice,
|
|
12
|
+
HalfPriceRelations,
|
|
13
|
+
} from '../models';
|
|
14
|
+
|
|
15
|
+
export function createFreeDeliveryRepo(repoClass: CrudRepositoryCtor) {
|
|
16
|
+
return class FreeDeliveryRepository extends repoClass<
|
|
17
|
+
FreeDelivery,
|
|
18
|
+
typeof FreeDelivery.prototype.id,
|
|
19
|
+
FreeDeliveryRelations
|
|
20
|
+
> {
|
|
21
|
+
constructor(db: juggler.DataSource) {
|
|
22
|
+
super(FreeDelivery, db);
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function createHalfPriceRepo(repoClass: CrudRepositoryCtor) {
|
|
28
|
+
return class HalfPriceRepository extends repoClass<
|
|
29
|
+
HalfPrice,
|
|
30
|
+
typeof HalfPrice.prototype.id,
|
|
31
|
+
HalfPriceRelations
|
|
32
|
+
> {
|
|
33
|
+
constructor(db: juggler.DataSource) {
|
|
34
|
+
super(HalfPrice, db);
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Copyright IBM Corp. 2019. All Rights Reserved.
|
|
1
|
+
// Copyright IBM Corp. and LoopBack contributors 2019. All Rights Reserved.
|
|
2
2
|
// Node module: @loopback/repository-tests
|
|
3
3
|
// This file is licensed under the MIT License.
|
|
4
4
|
// License text available at https://opensource.org/licenses/MIT
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
// Copyright IBM Corp. and LoopBack contributors 2019,2020. All Rights Reserved.
|
|
2
|
+
// Node module: @loopback/repository-tests
|
|
3
|
+
// This file is licensed under the MIT License.
|
|
4
|
+
// License text available at https://opensource.org/licenses/MIT
|
|
5
|
+
|
|
6
|
+
import {Getter} from '@loopback/core';
|
|
7
|
+
import {
|
|
8
|
+
createHasOneRepositoryFactory,
|
|
9
|
+
HasOneDefinition,
|
|
10
|
+
HasOneRepositoryFactory,
|
|
11
|
+
juggler,
|
|
12
|
+
} from '@loopback/repository';
|
|
13
|
+
import {CrudRepositoryCtor} from '../../../../types.repository-tests';
|
|
14
|
+
import {Contact, Supplier, SupplierRelations} from '../models';
|
|
15
|
+
|
|
16
|
+
// create the SupplierRepo by calling this func so that it can be extended from CrudRepositoryCtor
|
|
17
|
+
export function createSupplierRepo(repoClass: CrudRepositoryCtor) {
|
|
18
|
+
return class SupplierRepository extends repoClass<
|
|
19
|
+
Supplier,
|
|
20
|
+
typeof Supplier.prototype.id,
|
|
21
|
+
SupplierRelations
|
|
22
|
+
> {
|
|
23
|
+
public readonly contact: HasOneRepositoryFactory<
|
|
24
|
+
Contact,
|
|
25
|
+
typeof Supplier.prototype.id
|
|
26
|
+
>;
|
|
27
|
+
|
|
28
|
+
constructor(
|
|
29
|
+
db: juggler.DataSource,
|
|
30
|
+
contactRepositoryGetter: Getter<typeof repoClass.prototype>,
|
|
31
|
+
) {
|
|
32
|
+
super(Supplier, db);
|
|
33
|
+
const contactMeta = this.entityClass.definition.relations['contact'];
|
|
34
|
+
this.contact = createHasOneRepositoryFactory(
|
|
35
|
+
contactMeta as HasOneDefinition,
|
|
36
|
+
contactRepositoryGetter,
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Copyright IBM Corp. 2020. All Rights Reserved.
|
|
1
|
+
// Copyright IBM Corp. and LoopBack contributors 2020. All Rights Reserved.
|
|
2
2
|
// Node module: @loopback/repository-tests
|
|
3
3
|
// This file is licensed under the MIT License.
|
|
4
4
|
// License text available at https://opensource.org/licenses/MIT
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Copyright IBM Corp. 2020. All Rights Reserved.
|
|
1
|
+
// Copyright IBM Corp. and LoopBack contributors 2020. All Rights Reserved.
|
|
2
2
|
// Node module: @loopback/repository-tests
|
|
3
3
|
// This file is licensed under the MIT License.
|
|
4
4
|
// License text available at https://opensource.org/licenses/MIT
|
|
@@ -1,23 +1,39 @@
|
|
|
1
|
-
// Copyright IBM Corp. 2019,2020. All Rights Reserved.
|
|
1
|
+
// Copyright IBM Corp. and LoopBack contributors 2019,2020. All Rights Reserved.
|
|
2
2
|
// Node module: @loopback/repository-tests
|
|
3
3
|
// This file is licensed under the MIT License.
|
|
4
4
|
// License text available at https://opensource.org/licenses/MIT
|
|
5
5
|
|
|
6
|
-
import {juggler} from '@loopback/repository';
|
|
6
|
+
import {Getter, juggler} from '@loopback/repository';
|
|
7
7
|
import {CrudFeatures, CrudRepositoryCtor} from '../..';
|
|
8
8
|
import {
|
|
9
9
|
Address,
|
|
10
10
|
AddressRepository,
|
|
11
|
+
CardInfo,
|
|
12
|
+
CardInfoRepository,
|
|
11
13
|
CartItem,
|
|
12
14
|
CartItemRepository,
|
|
15
|
+
Cash,
|
|
16
|
+
CashRepository,
|
|
17
|
+
Contact,
|
|
18
|
+
ContactRepository,
|
|
19
|
+
CreditCard,
|
|
20
|
+
CreditCardRepository,
|
|
13
21
|
Customer,
|
|
14
22
|
CustomerCartItemLink,
|
|
15
23
|
CustomerCartItemLinkRepository,
|
|
24
|
+
CustomerPromotionLink,
|
|
25
|
+
CustomerPromotionLinkRepository,
|
|
16
26
|
CustomerRepository,
|
|
27
|
+
FreeDelivery,
|
|
28
|
+
FreeDeliveryRepository,
|
|
29
|
+
HalfPrice,
|
|
30
|
+
HalfPriceRepository,
|
|
17
31
|
Order,
|
|
18
32
|
OrderRepository,
|
|
19
33
|
Shipment,
|
|
20
34
|
ShipmentRepository,
|
|
35
|
+
Supplier,
|
|
36
|
+
SupplierRepository,
|
|
21
37
|
User,
|
|
22
38
|
UserLink,
|
|
23
39
|
UserLinkRepository,
|
|
@@ -25,11 +41,19 @@ import {
|
|
|
25
41
|
} from './fixtures/models';
|
|
26
42
|
import {
|
|
27
43
|
createAddressRepo,
|
|
44
|
+
createCardInfoRepo,
|
|
28
45
|
createCartItemRepo,
|
|
46
|
+
createCashRepo,
|
|
47
|
+
createContactRepo,
|
|
48
|
+
createCreditCardRepo,
|
|
29
49
|
createCustomerCartItemLinkRepo,
|
|
50
|
+
createCustomerPromotionLinkRepo,
|
|
30
51
|
createCustomerRepo,
|
|
52
|
+
createFreeDeliveryRepo,
|
|
53
|
+
createHalfPriceRepo,
|
|
31
54
|
createOrderRepo,
|
|
32
55
|
createShipmentRepo,
|
|
56
|
+
createSupplierRepo,
|
|
33
57
|
createUserLinkRepo,
|
|
34
58
|
createUserRepo,
|
|
35
59
|
} from './fixtures/repositories';
|
|
@@ -42,8 +66,16 @@ export function givenBoundCrudRepositories(
|
|
|
42
66
|
Order.definition.properties.id.type = features.idType;
|
|
43
67
|
Address.definition.properties.id.type = features.idType;
|
|
44
68
|
Customer.definition.properties.id.type = features.idType;
|
|
69
|
+
Supplier.definition.properties.id.type = features.idType;
|
|
70
|
+
Contact.definition.properties.id.type = features.idType;
|
|
71
|
+
CreditCard.definition.properties.id.type = features.idType;
|
|
72
|
+
CardInfo.definition.properties.id.type = features.idType;
|
|
73
|
+
Cash.definition.properties.id.type = features.idType;
|
|
45
74
|
CartItem.definition.properties.id.type = features.idType;
|
|
46
75
|
CustomerCartItemLink.definition.properties.id.type = features.idType;
|
|
76
|
+
FreeDelivery.definition.properties.id.type = features.idType;
|
|
77
|
+
HalfPrice.definition.properties.id.type = features.idType;
|
|
78
|
+
CustomerPromotionLink.definition.properties.id.type = features.idType;
|
|
47
79
|
Shipment.definition.properties.id.type = features.idType;
|
|
48
80
|
User.definition.properties.id.type = features.idType;
|
|
49
81
|
UserLink.definition.properties.id.type = features.idType;
|
|
@@ -51,6 +83,10 @@ export function givenBoundCrudRepositories(
|
|
|
51
83
|
// this config for mongo connector to pass the test.
|
|
52
84
|
// however real-world applications might have such config for MongoDB
|
|
53
85
|
// setting it up to check if it works fine as well
|
|
86
|
+
Contact.definition.properties.stakeholderId.type = features.idType;
|
|
87
|
+
Contact.definition.properties.stakeholderId.mongodb = {
|
|
88
|
+
dataType: 'ObjectID',
|
|
89
|
+
};
|
|
54
90
|
Order.definition.properties.customerId.type = features.idType;
|
|
55
91
|
Order.definition.properties.customerId.mongodb = {
|
|
56
92
|
dataType: 'ObjectID',
|
|
@@ -59,12 +95,24 @@ export function givenBoundCrudRepositories(
|
|
|
59
95
|
Address.definition.properties.customerId.mongodb = {
|
|
60
96
|
dataType: 'ObjectID',
|
|
61
97
|
};
|
|
98
|
+
CreditCard.definition.properties.customerId.type = features.idType;
|
|
99
|
+
CreditCard.definition.properties.customerId.mongodb = {
|
|
100
|
+
dataType: 'ObjectID',
|
|
101
|
+
};
|
|
102
|
+
CardInfo.definition.properties.creditCardId.type = features.idType;
|
|
103
|
+
CardInfo.definition.properties.creditCardId.mongodb = {
|
|
104
|
+
dataType: 'ObjectID',
|
|
105
|
+
};
|
|
106
|
+
Cash.definition.properties.customerId.type = features.idType;
|
|
107
|
+
Cash.definition.properties.customerId.mongodb = {
|
|
108
|
+
dataType: 'ObjectID',
|
|
109
|
+
};
|
|
62
110
|
CustomerCartItemLink.definition.properties.customerId.type = features.idType;
|
|
63
111
|
CustomerCartItemLink.definition.properties.customerId.mongodb = {
|
|
64
112
|
dataType: 'ObjectID',
|
|
65
113
|
};
|
|
66
|
-
|
|
67
|
-
|
|
114
|
+
CustomerPromotionLink.definition.properties.customerId.type = features.idType;
|
|
115
|
+
CustomerPromotionLink.definition.properties.customerId.mongodb = {
|
|
68
116
|
dataType: 'ObjectID',
|
|
69
117
|
};
|
|
70
118
|
UserLink.definition.properties.followerId.type = features.idType;
|
|
@@ -75,33 +123,6 @@ export function givenBoundCrudRepositories(
|
|
|
75
123
|
UserLink.definition.properties.followeeId.mongodb = {
|
|
76
124
|
dataType: 'ObjectID',
|
|
77
125
|
};
|
|
78
|
-
// get the repository class and create a new instance of it
|
|
79
|
-
const customerRepoClass = createCustomerRepo(repositoryClass);
|
|
80
|
-
const customerRepo: CustomerRepository = new customerRepoClass(
|
|
81
|
-
db,
|
|
82
|
-
async () => orderRepo,
|
|
83
|
-
async () => addressRepo,
|
|
84
|
-
async () => cartItemRepo,
|
|
85
|
-
async () => customerCartItemLinkRepo,
|
|
86
|
-
);
|
|
87
|
-
|
|
88
|
-
// register the inclusionResolvers here for customerRepo
|
|
89
|
-
customerRepo.inclusionResolvers.set(
|
|
90
|
-
'orders',
|
|
91
|
-
customerRepo.orders.inclusionResolver,
|
|
92
|
-
);
|
|
93
|
-
customerRepo.inclusionResolvers.set(
|
|
94
|
-
'customers',
|
|
95
|
-
customerRepo.customers.inclusionResolver,
|
|
96
|
-
);
|
|
97
|
-
customerRepo.inclusionResolvers.set(
|
|
98
|
-
'address',
|
|
99
|
-
customerRepo.address.inclusionResolver,
|
|
100
|
-
);
|
|
101
|
-
customerRepo.inclusionResolvers.set(
|
|
102
|
-
'cartItems',
|
|
103
|
-
customerRepo.cartItems.inclusionResolver,
|
|
104
|
-
);
|
|
105
126
|
|
|
106
127
|
const orderRepoClass = createOrderRepo(repositoryClass);
|
|
107
128
|
const orderRepo: OrderRepository = new orderRepoClass(
|
|
@@ -132,6 +153,50 @@ export function givenBoundCrudRepositories(
|
|
|
132
153
|
async () => customerRepo,
|
|
133
154
|
);
|
|
134
155
|
|
|
156
|
+
const creditCardRepoClass = createCreditCardRepo(repositoryClass);
|
|
157
|
+
const cashRepoClass = createCashRepo(repositoryClass);
|
|
158
|
+
const creditCardRepo: CreditCardRepository = new creditCardRepoClass(
|
|
159
|
+
db,
|
|
160
|
+
async () => customerRepo,
|
|
161
|
+
async () => cardInfoRepo,
|
|
162
|
+
);
|
|
163
|
+
|
|
164
|
+
const cashRepo: CashRepository = new cashRepoClass(
|
|
165
|
+
db,
|
|
166
|
+
async () => customerRepo,
|
|
167
|
+
);
|
|
168
|
+
creditCardRepo.inclusionResolvers.set(
|
|
169
|
+
'customer',
|
|
170
|
+
creditCardRepo.customer.inclusionResolver,
|
|
171
|
+
);
|
|
172
|
+
creditCardRepo.inclusionResolvers.set(
|
|
173
|
+
'cardInfo',
|
|
174
|
+
creditCardRepo.cardInfo.inclusionResolver,
|
|
175
|
+
);
|
|
176
|
+
cashRepo.inclusionResolvers.set(
|
|
177
|
+
'customer',
|
|
178
|
+
cashRepo.customer.inclusionResolver,
|
|
179
|
+
);
|
|
180
|
+
const paymentMethodRepo: {
|
|
181
|
+
[repoType: string]: Getter<typeof repositoryClass.prototype>;
|
|
182
|
+
} = {
|
|
183
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
184
|
+
CreditCard: async () => creditCardRepo,
|
|
185
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
186
|
+
Cash: async () => cashRepo,
|
|
187
|
+
};
|
|
188
|
+
|
|
189
|
+
const cardInfoRepoClass = createCardInfoRepo(repositoryClass);
|
|
190
|
+
const cardInfoRepo: CardInfoRepository = new cardInfoRepoClass(
|
|
191
|
+
db,
|
|
192
|
+
async () => creditCardRepo,
|
|
193
|
+
);
|
|
194
|
+
|
|
195
|
+
cardInfoRepo.inclusionResolvers.set(
|
|
196
|
+
'creditCard',
|
|
197
|
+
cardInfoRepo.creditCard.inclusionResolver,
|
|
198
|
+
);
|
|
199
|
+
|
|
135
200
|
const cartItemRepoClass = createCartItemRepo(repositoryClass);
|
|
136
201
|
const cartItemRepo: CartItemRepository = new cartItemRepoClass(
|
|
137
202
|
db,
|
|
@@ -148,6 +213,28 @@ export function givenBoundCrudRepositories(
|
|
|
148
213
|
const customerCartItemLinkRepo: CustomerCartItemLinkRepository =
|
|
149
214
|
new customerCartItemLinkRepoClass(db);
|
|
150
215
|
|
|
216
|
+
const freeDeliveryRepoClass = createFreeDeliveryRepo(repositoryClass);
|
|
217
|
+
const freeDeliveryRepo: FreeDeliveryRepository = new freeDeliveryRepoClass(
|
|
218
|
+
db,
|
|
219
|
+
);
|
|
220
|
+
|
|
221
|
+
const halfPriceRepoClass = createHalfPriceRepo(repositoryClass);
|
|
222
|
+
const halfPriceRepo: HalfPriceRepository = new halfPriceRepoClass(db);
|
|
223
|
+
|
|
224
|
+
const promotionRepo: {
|
|
225
|
+
[repoType: string]: Getter<typeof repositoryClass.prototype>;
|
|
226
|
+
} = {
|
|
227
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
228
|
+
FreeDelivery: async () => freeDeliveryRepo,
|
|
229
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
230
|
+
HalfPrice: async () => halfPriceRepo,
|
|
231
|
+
};
|
|
232
|
+
|
|
233
|
+
const customerPromotionLinkRepoClass =
|
|
234
|
+
createCustomerPromotionLinkRepo(repositoryClass);
|
|
235
|
+
const customerPromotionLinkRepo: CustomerPromotionLinkRepository =
|
|
236
|
+
new customerPromotionLinkRepoClass(db);
|
|
237
|
+
|
|
151
238
|
const userRepoClass = createUserRepo(repositoryClass);
|
|
152
239
|
const userRepo: UserRepository = new userRepoClass(
|
|
153
240
|
db,
|
|
@@ -159,6 +246,81 @@ export function givenBoundCrudRepositories(
|
|
|
159
246
|
|
|
160
247
|
userRepo.inclusionResolvers.set('users', userRepo.users.inclusionResolver);
|
|
161
248
|
|
|
249
|
+
const supplierRepoClass = createSupplierRepo(repositoryClass);
|
|
250
|
+
const supplierRepo: SupplierRepository = new supplierRepoClass(
|
|
251
|
+
db,
|
|
252
|
+
async () => contactRepo,
|
|
253
|
+
);
|
|
254
|
+
|
|
255
|
+
// get the repository class and create a new instance of it
|
|
256
|
+
const customerRepoClass = createCustomerRepo(repositoryClass);
|
|
257
|
+
|
|
258
|
+
const customerRepo: CustomerRepository = new customerRepoClass(
|
|
259
|
+
db,
|
|
260
|
+
async () => orderRepo,
|
|
261
|
+
async () => addressRepo,
|
|
262
|
+
async () => cartItemRepo,
|
|
263
|
+
async () => customerCartItemLinkRepo,
|
|
264
|
+
promotionRepo,
|
|
265
|
+
async () => customerPromotionLinkRepo,
|
|
266
|
+
paymentMethodRepo,
|
|
267
|
+
async () => contactRepo,
|
|
268
|
+
);
|
|
269
|
+
|
|
270
|
+
const stakeholderRepo: {
|
|
271
|
+
[repoType: string]: Getter<typeof repositoryClass.prototype>;
|
|
272
|
+
} = {
|
|
273
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
274
|
+
Customer: async () => customerRepo,
|
|
275
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
276
|
+
Supplier: async () => supplierRepo,
|
|
277
|
+
};
|
|
278
|
+
|
|
279
|
+
const contactRepoClass = createContactRepo(repositoryClass);
|
|
280
|
+
const contactRepo: ContactRepository = new contactRepoClass(
|
|
281
|
+
db,
|
|
282
|
+
stakeholderRepo,
|
|
283
|
+
);
|
|
284
|
+
|
|
285
|
+
contactRepo.inclusionResolvers.set(
|
|
286
|
+
'stakeholder',
|
|
287
|
+
contactRepo.stakeholder.inclusionResolver,
|
|
288
|
+
);
|
|
289
|
+
|
|
290
|
+
// register the inclusionResolvers here for customerRepo
|
|
291
|
+
customerRepo.inclusionResolvers.set(
|
|
292
|
+
'orders',
|
|
293
|
+
customerRepo.orders.inclusionResolver,
|
|
294
|
+
);
|
|
295
|
+
customerRepo.inclusionResolvers.set(
|
|
296
|
+
'customers',
|
|
297
|
+
customerRepo.customers.inclusionResolver,
|
|
298
|
+
);
|
|
299
|
+
customerRepo.inclusionResolvers.set(
|
|
300
|
+
'address',
|
|
301
|
+
customerRepo.address.inclusionResolver,
|
|
302
|
+
);
|
|
303
|
+
customerRepo.inclusionResolvers.set(
|
|
304
|
+
'cartItems',
|
|
305
|
+
customerRepo.cartItems.inclusionResolver,
|
|
306
|
+
);
|
|
307
|
+
customerRepo.inclusionResolvers.set(
|
|
308
|
+
'promotions',
|
|
309
|
+
customerRepo.promotions.inclusionResolver,
|
|
310
|
+
);
|
|
311
|
+
customerRepo.inclusionResolvers.set(
|
|
312
|
+
'paymentMethod',
|
|
313
|
+
customerRepo.paymentMethod.inclusionResolver,
|
|
314
|
+
);
|
|
315
|
+
customerRepo.inclusionResolvers.set(
|
|
316
|
+
'contact',
|
|
317
|
+
customerRepo.contact.inclusionResolver,
|
|
318
|
+
);
|
|
319
|
+
supplierRepo.inclusionResolvers.set(
|
|
320
|
+
'contact',
|
|
321
|
+
supplierRepo.contact.inclusionResolver,
|
|
322
|
+
);
|
|
323
|
+
|
|
162
324
|
return {
|
|
163
325
|
customerRepo,
|
|
164
326
|
orderRepo,
|
|
@@ -166,7 +328,15 @@ export function givenBoundCrudRepositories(
|
|
|
166
328
|
addressRepo,
|
|
167
329
|
cartItemRepo,
|
|
168
330
|
customerCartItemLinkRepo,
|
|
331
|
+
freeDeliveryRepo,
|
|
332
|
+
halfPriceRepo,
|
|
333
|
+
customerPromotionLinkRepo,
|
|
169
334
|
userRepo,
|
|
170
335
|
userLinkRepo,
|
|
336
|
+
creditCardRepo,
|
|
337
|
+
cashRepo,
|
|
338
|
+
contactRepo,
|
|
339
|
+
supplierRepo,
|
|
340
|
+
cardInfoRepo,
|
|
171
341
|
};
|
|
172
342
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Copyright IBM Corp. 2019,2020. All Rights Reserved.
|
|
1
|
+
// Copyright IBM Corp. and LoopBack contributors 2019,2020. All Rights Reserved.
|
|
2
2
|
// Node module: @loopback/repository-tests
|
|
3
3
|
// This file is licensed under the MIT License.
|
|
4
4
|
// License text available at https://opensource.org/licenses/MIT
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Copyright IBM Corp. 2019,2020. All Rights Reserved.
|
|
1
|
+
// Copyright IBM Corp. and LoopBack contributors 2019,2020. All Rights Reserved.
|
|
2
2
|
// Node module: @loopback/repository-tests
|
|
3
3
|
// This file is licensed under the MIT License.
|
|
4
4
|
// License text available at https://opensource.org/licenses/MIT
|
package/src/crud-test-suite.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Copyright IBM Corp. 2019,2020. All Rights Reserved.
|
|
1
|
+
// Copyright IBM Corp. and LoopBack contributors 2019,2020. All Rights Reserved.
|
|
2
2
|
// Node module: @loopback/repository-tests
|
|
3
3
|
// This file is licensed under the MIT License.
|
|
4
4
|
// License text available at https://opensource.org/licenses/MIT
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Copyright IBM Corp. 2019,2020. All Rights Reserved.
|
|
1
|
+
// Copyright IBM Corp. and LoopBack contributors 2019,2020. All Rights Reserved.
|
|
2
2
|
// Node module: @loopback/repository-tests
|
|
3
3
|
// This file is licensed under the MIT License.
|
|
4
4
|
// License text available at https://opensource.org/licenses/MIT
|
|
@@ -37,7 +37,7 @@ export function withCrudCtx(
|
|
|
37
37
|
*/
|
|
38
38
|
export const deleteAllModelsInDefaultDataSource = withCrudCtx(ctx => {
|
|
39
39
|
ctx.dataSource.deleteAllModels();
|
|
40
|
-
});
|
|
40
|
+
}) as Mocha.Func;
|
|
41
41
|
|
|
42
42
|
/**
|
|
43
43
|
* A union type between string and number to use since MongoDB and MySQL use
|
package/src/index.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Copyright IBM Corp. 2019,2020. All Rights Reserved.
|
|
1
|
+
// Copyright IBM Corp. and LoopBack contributors 2019,2020. All Rights Reserved.
|
|
2
2
|
// Node module: @loopback/repository-tests
|
|
3
3
|
// This file is licensed under the MIT License.
|
|
4
4
|
// License text available at https://opensource.org/licenses/MIT
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Copyright IBM Corp. 2019. All Rights Reserved.
|
|
1
|
+
// Copyright IBM Corp. and LoopBack contributors 2019. All Rights Reserved.
|
|
2
2
|
// Node module: @loopback/repository-tests
|
|
3
3
|
// This file is licensed under the MIT License.
|
|
4
4
|
// License text available at https://opensource.org/licenses/MIT
|