@kaspernj/api-maker 1.0.125 → 1.0.128
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/.eslintrc.js +39 -33
- package/__tests__/cable-connection-pool.test.js +4 -4
- package/__tests__/custom-error.test.js +13 -0
- package/__tests__/model-name.test.js +16 -10
- package/__tests__/routes-native.test.js +15 -33
- package/__tests__/support/task.js +5 -5
- package/__tests__/support/user.js +5 -5
- package/index.js +0 -4
- package/package.json +7 -6
- package/src/api.cjs +15 -15
- package/src/base-model.cjs +82 -81
- package/src/cable-connection-pool.cjs +11 -11
- package/src/cable-subscription-pool.cjs +34 -34
- package/src/cable-subscription.cjs +2 -2
- package/src/can-can-loader.jsx +7 -7
- package/src/can-can.cjs +17 -16
- package/src/collection.cjs +36 -36
- package/src/command-submit-data.cjs +10 -11
- package/src/commands-pool.cjs +13 -13
- package/src/custom-error.cjs +20 -14
- package/src/deserializer.cjs +7 -7
- package/src/devise.cjs +15 -15
- package/src/error-logger.cjs +9 -9
- package/src/event-connection.jsx +6 -6
- package/src/event-created.jsx +8 -8
- package/src/event-destroyed.jsx +6 -6
- package/src/event-emitter-listener.jsx +6 -6
- package/src/event-listener.jsx +8 -8
- package/src/event-model-class.jsx +6 -6
- package/src/event-updated.jsx +10 -10
- package/src/instance-of-class-name.cjs +5 -7
- package/src/key-value-store.cjs +21 -18
- package/src/logger.cjs +4 -4
- package/src/merge.cjs +4 -4
- package/src/model-events.cjs +6 -5
- package/src/model-name.cjs +6 -5
- package/src/model-prop-type.cjs +11 -13
- package/src/model-recipes-loader.cjs +4 -4
- package/src/model-recipes-model-loader.cjs +39 -14
- package/src/models-response-reader.cjs +10 -10
- package/src/money-formatter.cjs +11 -11
- package/src/params.cjs +7 -7
- package/src/preloaded.cjs +6 -6
- package/src/resource-route.cjs +14 -12
- package/src/resource-routes.jsx +9 -4
- package/src/result.cjs +7 -7
- package/src/routes-native.cjs +6 -6
- package/src/routes.cjs +1 -1
- package/src/serializer.cjs +9 -9
- package/src/services.cjs +3 -3
- package/src/session-status-updater.cjs +14 -14
- package/src/source-maps-loader.cjs +11 -11
- package/src/translated-collections.cjs +2 -1
- package/src/updated-attribute.jsx +17 -14
- package/src/validation-error.cjs +5 -8
- package/src/validation-errors.cjs +16 -16
- package/src/event-location-changed.jsx +0 -21
- package/src/history-listener.jsx +0 -20
|
@@ -1,30 +1,30 @@
|
|
|
1
1
|
const ModelEvents = require("./model-events.cjs")
|
|
2
2
|
const PropTypes = require("prop-types")
|
|
3
|
-
const
|
|
3
|
+
const propTypesExact = require("prop-types-exact")
|
|
4
4
|
const React = require("react")
|
|
5
5
|
|
|
6
6
|
export default class ApiMakerEventModelClass extends React.PureComponent {
|
|
7
|
-
static propTypes =
|
|
7
|
+
static propTypes = propTypesExact({
|
|
8
8
|
event: PropTypes.string.isRequired,
|
|
9
9
|
modelClass: PropTypes.func.isRequired,
|
|
10
10
|
onCall: PropTypes.func.isRequired
|
|
11
11
|
})
|
|
12
12
|
|
|
13
|
-
componentDidMount() {
|
|
13
|
+
componentDidMount () {
|
|
14
14
|
this.connect()
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
componentWillUnmount() {
|
|
17
|
+
componentWillUnmount () {
|
|
18
18
|
if (this.connection) {
|
|
19
19
|
this.connection.unsubscribe()
|
|
20
20
|
}
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
-
connect() {
|
|
23
|
+
connect () {
|
|
24
24
|
this.connection = ModelEvents.connectModelClass(this.props.modelClass, this.props.event, this.props.onCall)
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
-
render() {
|
|
27
|
+
render () {
|
|
28
28
|
return null
|
|
29
29
|
}
|
|
30
30
|
}
|
package/src/event-updated.jsx
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
const debounce = require("debounce")
|
|
2
2
|
const ModelEvents = require("./model-events.cjs")
|
|
3
3
|
const PropTypes = require("prop-types")
|
|
4
|
-
const
|
|
4
|
+
const propTypesExact = require("prop-types-exact")
|
|
5
5
|
const React = require("react")
|
|
6
6
|
|
|
7
7
|
export default class ApiMakerEventUpdated extends React.PureComponent {
|
|
@@ -9,7 +9,7 @@ export default class ApiMakerEventUpdated extends React.PureComponent {
|
|
|
9
9
|
active: true
|
|
10
10
|
}
|
|
11
11
|
|
|
12
|
-
static propTypes =
|
|
12
|
+
static propTypes = propTypesExact({
|
|
13
13
|
active: PropTypes.bool.isRequired,
|
|
14
14
|
debounce: PropTypes.oneOfType([
|
|
15
15
|
PropTypes.bool,
|
|
@@ -20,16 +20,16 @@ export default class ApiMakerEventUpdated extends React.PureComponent {
|
|
|
20
20
|
onUpdated: PropTypes.func.isRequired
|
|
21
21
|
})
|
|
22
22
|
|
|
23
|
-
constructor(props) {
|
|
23
|
+
constructor (props) {
|
|
24
24
|
super(props)
|
|
25
25
|
this.onConnected = this.onConnected.bind(this)
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
-
componentDidMount() {
|
|
28
|
+
componentDidMount () {
|
|
29
29
|
this.connect()
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
-
componentWillUnmount() {
|
|
32
|
+
componentWillUnmount () {
|
|
33
33
|
if (this.connectUpdated) {
|
|
34
34
|
this.connectUpdated.unsubscribe()
|
|
35
35
|
}
|
|
@@ -39,7 +39,7 @@ export default class ApiMakerEventUpdated extends React.PureComponent {
|
|
|
39
39
|
}
|
|
40
40
|
}
|
|
41
41
|
|
|
42
|
-
connect() {
|
|
42
|
+
connect () {
|
|
43
43
|
const {model, onConnected} = this.props
|
|
44
44
|
|
|
45
45
|
this.connectUpdated = ModelEvents.connectUpdated(model, (...args) => this.onUpdated(...args))
|
|
@@ -49,7 +49,7 @@ export default class ApiMakerEventUpdated extends React.PureComponent {
|
|
|
49
49
|
}
|
|
50
50
|
}
|
|
51
51
|
|
|
52
|
-
debounce() {
|
|
52
|
+
debounce () {
|
|
53
53
|
if (!this.debounceInstance) {
|
|
54
54
|
if (typeof this.props.debounce == "number") {
|
|
55
55
|
this.debounceInstance = debounce(this.props.onUpdated, this.props.debounce)
|
|
@@ -61,11 +61,11 @@ export default class ApiMakerEventUpdated extends React.PureComponent {
|
|
|
61
61
|
return this.debounceInstance
|
|
62
62
|
}
|
|
63
63
|
|
|
64
|
-
onConnected() {
|
|
64
|
+
onConnected () {
|
|
65
65
|
this.props.onConnected()
|
|
66
66
|
}
|
|
67
67
|
|
|
68
|
-
onUpdated(...args) {
|
|
68
|
+
onUpdated (...args) {
|
|
69
69
|
if (!this.props.active) {
|
|
70
70
|
return
|
|
71
71
|
}
|
|
@@ -77,7 +77,7 @@ export default class ApiMakerEventUpdated extends React.PureComponent {
|
|
|
77
77
|
}
|
|
78
78
|
}
|
|
79
79
|
|
|
80
|
-
render() {
|
|
80
|
+
render () {
|
|
81
81
|
return null
|
|
82
82
|
}
|
|
83
83
|
}
|
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
const {digg} = require("diggerize")
|
|
2
2
|
|
|
3
|
-
const instanceOfClassName = (expectedClassName) => {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
const className = digg(prop, "constructor", "name")
|
|
3
|
+
const instanceOfClassName = (expectedClassName) => (props, propName, componentName) => {
|
|
4
|
+
const prop = digg(props, propName)
|
|
5
|
+
const className = digg(prop, "constructor", "name")
|
|
7
6
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
}
|
|
7
|
+
if (className != expectedClassName) {
|
|
8
|
+
return new Error(`Invalid prop '${propName}' passed to '${componentName}'. Expected a class name of '${expectedClassName}' but got '${className}'.`)
|
|
11
9
|
}
|
|
12
10
|
}
|
|
13
11
|
|
package/src/key-value-store.cjs
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
const Params = require("./params.cjs")
|
|
2
2
|
|
|
3
3
|
module.exports = class KeyValueStore {
|
|
4
|
-
static current() {
|
|
4
|
+
static current () {
|
|
5
5
|
if (!global.currentKeyValueStore)
|
|
6
6
|
global.currentKeyValueStore = new KeyValueStore()
|
|
7
7
|
|
|
8
8
|
return global.currentKeyValueStore
|
|
9
9
|
}
|
|
10
10
|
|
|
11
|
-
static
|
|
12
|
-
return
|
|
11
|
+
static get (key) {
|
|
12
|
+
return KeyValueStore.current().get(key)
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
-
static
|
|
16
|
-
return
|
|
15
|
+
static set (key, value) {
|
|
16
|
+
return KeyValueStore.current().set(key, value)
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
-
static async getCachedParams(paramName, args = {}) {
|
|
19
|
+
static async getCachedParams (paramName, args = {}) {
|
|
20
20
|
const oldQuery = await KeyValueStore.get(paramName)
|
|
21
21
|
const params = Params.parse()
|
|
22
22
|
|
|
@@ -29,34 +29,37 @@ module.exports = class KeyValueStore {
|
|
|
29
29
|
}
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
-
static
|
|
33
|
-
return
|
|
32
|
+
static setCachedParams (paramName, qParams) {
|
|
33
|
+
return KeyValueStore.set(paramName, qParams)
|
|
34
34
|
}
|
|
35
35
|
|
|
36
|
-
constructor() {
|
|
36
|
+
constructor () {
|
|
37
37
|
this.database = new Dexie("KeyValueStoreDatabase")
|
|
38
38
|
this.database.version(1).stores({
|
|
39
39
|
keyValues: "++id, key, value"
|
|
40
40
|
})
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
-
async get(key) {
|
|
44
|
-
const row = await this.database.keyValues
|
|
43
|
+
async get (key) {
|
|
44
|
+
const row = await this.database.keyValues
|
|
45
|
+
.where("key")
|
|
46
|
+
.equals(key)
|
|
47
|
+
.first()
|
|
45
48
|
|
|
46
49
|
if (row)
|
|
47
50
|
return row.value
|
|
48
51
|
}
|
|
49
52
|
|
|
50
|
-
async set(key, value) {
|
|
51
|
-
const row = await this.database.keyValues
|
|
53
|
+
async set (key, value) {
|
|
54
|
+
const row = await this.database.keyValues
|
|
55
|
+
.where("key")
|
|
56
|
+
.equals(key)
|
|
57
|
+
.first()
|
|
52
58
|
|
|
53
59
|
if (row) {
|
|
54
|
-
await this.database.keyValues.update(row.id, {value
|
|
60
|
+
await this.database.keyValues.update(row.id, {value})
|
|
55
61
|
} else {
|
|
56
|
-
await this.database.keyValues.add({
|
|
57
|
-
key: key,
|
|
58
|
-
value: value
|
|
59
|
-
})
|
|
62
|
+
await this.database.keyValues.add({key, value})
|
|
60
63
|
}
|
|
61
64
|
|
|
62
65
|
return true
|
package/src/logger.cjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
module.exports = class ApiMakerLogger {
|
|
2
|
-
static current() {
|
|
2
|
+
static current () {
|
|
3
3
|
if (!global.apiMakerLogger) {
|
|
4
4
|
global.apiMakerLogger = new ApiMakerLogger()
|
|
5
5
|
// global.apiMakerLogger.setDebug(true)
|
|
@@ -8,16 +8,16 @@ module.exports = class ApiMakerLogger {
|
|
|
8
8
|
return global.apiMakerLogger
|
|
9
9
|
}
|
|
10
10
|
|
|
11
|
-
static log(message) {
|
|
11
|
+
static log (message) {
|
|
12
12
|
ApiMakerLogger.current().log(message)
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
-
log(message) {
|
|
15
|
+
log (message) {
|
|
16
16
|
if (this.debug)
|
|
17
17
|
console.log("ApiMaker", message)
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
setDebug(value) {
|
|
20
|
+
setDebug (value) {
|
|
21
21
|
this.debug = value
|
|
22
22
|
}
|
|
23
23
|
}
|
package/src/merge.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
const isPlainObject = (input) => {
|
|
2
2
|
if (input && typeof input === "object" && !Array.isArray(input)) {
|
|
3
3
|
return true
|
|
4
4
|
}
|
|
@@ -6,7 +6,7 @@ function isPlainObject(input) {
|
|
|
6
6
|
return false
|
|
7
7
|
}
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
const merge = (firstObject, ...objects) => {
|
|
10
10
|
for (const object of objects) {
|
|
11
11
|
mergeObjectsInto(firstObject, object)
|
|
12
12
|
}
|
|
@@ -14,7 +14,7 @@ function merge(firstObject, ...objects) {
|
|
|
14
14
|
return firstObject
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
const mergeArraysInto = (mergeIntoValue, ...arrays) => {
|
|
18
18
|
for (const array of arrays) {
|
|
19
19
|
for (const value of array) {
|
|
20
20
|
if (!mergeIntoValue.includes(value)) {
|
|
@@ -24,7 +24,7 @@ function mergeArraysInto(mergeIntoValue, ...arrays) {
|
|
|
24
24
|
}
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
-
|
|
27
|
+
const mergeObjectsInto = (mergeInto, object) => {
|
|
28
28
|
for (const key in object) {
|
|
29
29
|
const value = object[key]
|
|
30
30
|
|
package/src/model-events.cjs
CHANGED
|
@@ -1,35 +1,36 @@
|
|
|
1
1
|
const CableConnectionPool = require("./cable-connection-pool.cjs")
|
|
2
|
+
const {digg} = require("diggerize")
|
|
2
3
|
|
|
3
4
|
module.exports = class ModelEvents {
|
|
4
|
-
static connect(model, eventName, callback) {
|
|
5
|
+
static connect (model, eventName, callback) {
|
|
5
6
|
const modelClassName = digg(model.modelClassData(), "name")
|
|
6
7
|
const cableSubscription = CableConnectionPool.current().connectEvent(modelClassName, model.primaryKey(), eventName, callback)
|
|
7
8
|
|
|
8
9
|
return cableSubscription
|
|
9
10
|
}
|
|
10
11
|
|
|
11
|
-
static connectModelClass(modelClass, eventName, callback) {
|
|
12
|
+
static connectModelClass (modelClass, eventName, callback) {
|
|
12
13
|
const modelClassName = digg(modelClass.modelClassData(), "name")
|
|
13
14
|
const cableSubscription = CableConnectionPool.current().connectModelClassEvent(modelClassName, eventName, callback)
|
|
14
15
|
|
|
15
16
|
return cableSubscription
|
|
16
17
|
}
|
|
17
18
|
|
|
18
|
-
static connectCreated(modelClass, callback) {
|
|
19
|
+
static connectCreated (modelClass, callback) {
|
|
19
20
|
const modelClassName = digg(modelClass.modelClassData(), "name")
|
|
20
21
|
const cableSubscription = CableConnectionPool.current().connectCreated(modelClassName, callback)
|
|
21
22
|
|
|
22
23
|
return cableSubscription
|
|
23
24
|
}
|
|
24
25
|
|
|
25
|
-
static connectDestroyed(model, callback) {
|
|
26
|
+
static connectDestroyed (model, callback) {
|
|
26
27
|
const modelClassName = digg(model.modelClassData(), "name")
|
|
27
28
|
const cableSubscription = CableConnectionPool.current().connectDestroyed(modelClassName, model.primaryKey(), callback)
|
|
28
29
|
|
|
29
30
|
return cableSubscription
|
|
30
31
|
}
|
|
31
32
|
|
|
32
|
-
static connectUpdated(model, callback) {
|
|
33
|
+
static connectUpdated (model, callback) {
|
|
33
34
|
const modelClassName = digg(model.modelClassData(), "name")
|
|
34
35
|
const cableSubscription = CableConnectionPool.current().connectUpdate(modelClassName, model.primaryKey(), callback)
|
|
35
36
|
|
package/src/model-name.cjs
CHANGED
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
module.exports = class ModelName {
|
|
2
|
-
constructor(data) {
|
|
2
|
+
constructor (data) {
|
|
3
3
|
this.data = data
|
|
4
4
|
}
|
|
5
5
|
|
|
6
|
-
human(args) {
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
human (args) {
|
|
7
|
+
let argsToUse = args
|
|
8
|
+
|
|
9
|
+
if (!argsToUse) argsToUse = {count: 1}
|
|
9
10
|
|
|
10
11
|
let countKey
|
|
11
12
|
|
|
12
|
-
if (
|
|
13
|
+
if (argsToUse.count > 1 || argsToUse.count < 0) {
|
|
13
14
|
countKey = "other"
|
|
14
15
|
} else {
|
|
15
16
|
countKey = "one"
|
package/src/model-prop-type.cjs
CHANGED
|
@@ -2,7 +2,7 @@ const {digg} = require("diggerize")
|
|
|
2
2
|
const Inflection = require("inflection")
|
|
3
3
|
|
|
4
4
|
module.exports = class ApiMakerModelPropType {
|
|
5
|
-
static ofModel(modelClass) {
|
|
5
|
+
static ofModel (modelClass) {
|
|
6
6
|
const modelPropTypeInstance = new ApiMakerModelPropType()
|
|
7
7
|
|
|
8
8
|
modelPropTypeInstance.withModelType(modelClass)
|
|
@@ -10,13 +10,13 @@ module.exports = class ApiMakerModelPropType {
|
|
|
10
10
|
return modelPropTypeInstance
|
|
11
11
|
}
|
|
12
12
|
|
|
13
|
-
constructor() {
|
|
13
|
+
constructor () {
|
|
14
14
|
this.isNotRequired = this.isNotRequired.bind(this)
|
|
15
15
|
this.isRequired = this.isRequired.bind(this)
|
|
16
16
|
this._withLoadedAssociations = {}
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
-
isNotRequired(props, propName, _componentName) {
|
|
19
|
+
isNotRequired (props, propName, _componentName) {
|
|
20
20
|
const model = props[propName]
|
|
21
21
|
|
|
22
22
|
if (model) {
|
|
@@ -24,7 +24,7 @@ module.exports = class ApiMakerModelPropType {
|
|
|
24
24
|
}
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
-
isRequired(props, propName, _componentName) {
|
|
27
|
+
isRequired (props, propName, _componentName) {
|
|
28
28
|
const model = props[propName]
|
|
29
29
|
|
|
30
30
|
if (!model) return new Error(`${propName} was required but not given`)
|
|
@@ -32,21 +32,21 @@ module.exports = class ApiMakerModelPropType {
|
|
|
32
32
|
return this.validate({model, propName})
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
-
previous() {
|
|
35
|
+
previous () {
|
|
36
36
|
if (!this._previousModelPropType) throw new Error("No previous model prop type set")
|
|
37
37
|
|
|
38
38
|
return this._previousModelPropType
|
|
39
39
|
}
|
|
40
40
|
|
|
41
|
-
setPreviousModelPropType(previousModelPropType) {
|
|
41
|
+
setPreviousModelPropType (previousModelPropType) {
|
|
42
42
|
this._previousModelPropType = previousModelPropType
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
-
withModelType(modelClass) {
|
|
45
|
+
withModelType (modelClass) {
|
|
46
46
|
this._withModelType = modelClass
|
|
47
47
|
}
|
|
48
48
|
|
|
49
|
-
validate({model, propName}) {
|
|
49
|
+
validate ({model, propName}) {
|
|
50
50
|
if (this._withModelType && this._withModelType.name != model.constructor.name)
|
|
51
51
|
return new Error(`Expected ${propName} to be of type ${this._withModelType.name} but it wasn't: ${model.constructor.name}`)
|
|
52
52
|
|
|
@@ -69,8 +69,6 @@ module.exports = class ApiMakerModelPropType {
|
|
|
69
69
|
|
|
70
70
|
const associationCache = digg(model.relationshipsCache, underscoreAssociationName)
|
|
71
71
|
|
|
72
|
-
let associationModel
|
|
73
|
-
|
|
74
72
|
// Find a model to run sub-model-prop-type-validations on
|
|
75
73
|
if (Array.isArray(associationCache)) {
|
|
76
74
|
for (const preloadedModel of associationCache) {
|
|
@@ -103,13 +101,13 @@ module.exports = class ApiMakerModelPropType {
|
|
|
103
101
|
}
|
|
104
102
|
}
|
|
105
103
|
|
|
106
|
-
withLoadedAbilities(arrayOfAbilities) {
|
|
104
|
+
withLoadedAbilities (arrayOfAbilities) {
|
|
107
105
|
this._withLoadedAbilities = arrayOfAbilities
|
|
108
106
|
|
|
109
107
|
return this
|
|
110
108
|
}
|
|
111
109
|
|
|
112
|
-
withLoadedAssociation(associationName) {
|
|
110
|
+
withLoadedAssociation (associationName) {
|
|
113
111
|
const associationModelPropType = new ApiMakerModelPropType()
|
|
114
112
|
|
|
115
113
|
associationModelPropType.setPreviousModelPropType(this)
|
|
@@ -118,7 +116,7 @@ module.exports = class ApiMakerModelPropType {
|
|
|
118
116
|
return associationModelPropType
|
|
119
117
|
}
|
|
120
118
|
|
|
121
|
-
withLoadedAttributes(arrayOfAttributes) {
|
|
119
|
+
withLoadedAttributes (arrayOfAttributes) {
|
|
122
120
|
this._withLoadedAttributes = arrayOfAttributes
|
|
123
121
|
|
|
124
122
|
return this
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
const {digs} = require("diggerize")
|
|
1
|
+
const {digg, digs} = require("diggerize")
|
|
2
2
|
const ModelRecipesModelLoader = require("./model-recipes-model-loader.cjs")
|
|
3
3
|
|
|
4
4
|
module.exports = class ModelRecipesLoader {
|
|
5
|
-
constructor({recipes}) {
|
|
5
|
+
constructor ({recipes}) {
|
|
6
6
|
this.modelClasses = {}
|
|
7
7
|
this.recipes = recipes
|
|
8
8
|
}
|
|
9
9
|
|
|
10
|
-
getModelClass(name) {
|
|
10
|
+
getModelClass (name) {
|
|
11
11
|
return digg(this, "modelClasses", name)
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
-
load() {
|
|
14
|
+
load () {
|
|
15
15
|
const {recipes} = digs(this, "recipes")
|
|
16
16
|
const {models} = digs(recipes, "models")
|
|
17
17
|
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
const BaseModel = require("./base-model.cjs")
|
|
2
2
|
const Collection = require("./collection.cjs")
|
|
3
|
-
const {digg} = require("diggerize")
|
|
3
|
+
const {digg, digs} = require("diggerize")
|
|
4
4
|
const inflection = require("inflection")
|
|
5
5
|
|
|
6
6
|
module.exports = class ApiMakerModelRecipesModelLoader {
|
|
7
|
-
constructor({modelRecipe, modelRecipesLoader}) {
|
|
7
|
+
constructor ({modelRecipe, modelRecipesLoader}) {
|
|
8
8
|
if (!modelRecipe) throw new Error("No 'modelRecipe' was given")
|
|
9
9
|
|
|
10
10
|
this.modelRecipesLoader = modelRecipesLoader
|
|
11
11
|
this.modelRecipe = modelRecipe
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
-
createClass() {
|
|
14
|
+
createClass () {
|
|
15
15
|
const {modelRecipe} = digs(this, "modelRecipe")
|
|
16
16
|
const {
|
|
17
17
|
attributes,
|
|
@@ -42,14 +42,17 @@ module.exports = class ApiMakerModelRecipesModelLoader {
|
|
|
42
42
|
return ModelClass
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
-
addAttributeMethodsToModelClass(ModelClass, attributes) {
|
|
45
|
+
addAttributeMethodsToModelClass (ModelClass, attributes) {
|
|
46
46
|
for (const attributeName in attributes) {
|
|
47
47
|
const attribute = attributes[attributeName]
|
|
48
48
|
const {name} = digs(attribute, "name")
|
|
49
49
|
const methodName = inflection.camelize(name, true)
|
|
50
50
|
const hasMethodName = inflection.camelize(`has_${name}`, true)
|
|
51
51
|
|
|
52
|
-
ModelClass.prototype[methodName] = function () {
|
|
52
|
+
ModelClass.prototype[methodName] = function () {
|
|
53
|
+
return this.readAttributeUnderscore(attributeName)
|
|
54
|
+
}
|
|
55
|
+
|
|
53
56
|
ModelClass.prototype[hasMethodName] = function () {
|
|
54
57
|
const value = this[methodName]()
|
|
55
58
|
|
|
@@ -58,7 +61,7 @@ module.exports = class ApiMakerModelRecipesModelLoader {
|
|
|
58
61
|
}
|
|
59
62
|
}
|
|
60
63
|
|
|
61
|
-
addCollectionCommandsToModelClass(ModelClass, collectionCommands) {
|
|
64
|
+
addCollectionCommandsToModelClass (ModelClass, collectionCommands) {
|
|
62
65
|
for (const collectionCommandName in collectionCommands) {
|
|
63
66
|
const methodName = inflection.camelize(collectionCommandName, true)
|
|
64
67
|
|
|
@@ -76,7 +79,7 @@ module.exports = class ApiMakerModelRecipesModelLoader {
|
|
|
76
79
|
}
|
|
77
80
|
}
|
|
78
81
|
|
|
79
|
-
addMemberCommandsToModelClass(ModelClass, memberCommands) {
|
|
82
|
+
addMemberCommandsToModelClass (ModelClass, memberCommands) {
|
|
80
83
|
for (const memberCommandName in memberCommands) {
|
|
81
84
|
const methodName = inflection.camelize(memberCommandName, true)
|
|
82
85
|
|
|
@@ -95,7 +98,7 @@ module.exports = class ApiMakerModelRecipesModelLoader {
|
|
|
95
98
|
}
|
|
96
99
|
}
|
|
97
100
|
|
|
98
|
-
addRelationshipsToModelClass(ModelClass, modelClassData, relationships) {
|
|
101
|
+
addRelationshipsToModelClass (ModelClass, modelClassData, relationships) {
|
|
99
102
|
const {modelRecipesLoader} = digs(this, "modelRecipesLoader")
|
|
100
103
|
|
|
101
104
|
for (const relationshipName in relationships) {
|
|
@@ -170,13 +173,13 @@ module.exports = class ApiMakerModelRecipesModelLoader {
|
|
|
170
173
|
}
|
|
171
174
|
}
|
|
172
175
|
|
|
173
|
-
defineBelongsToGetMethod({ModelClass, modelMethodName, relationshipName}) {
|
|
176
|
+
defineBelongsToGetMethod ({ModelClass, modelMethodName, relationshipName}) {
|
|
174
177
|
ModelClass.prototype[modelMethodName] = function () {
|
|
175
178
|
return this._readBelongsToReflection({reflectionName: relationshipName})
|
|
176
179
|
}
|
|
177
180
|
}
|
|
178
181
|
|
|
179
|
-
defineBelongsToLoadMethod({foreignKey, klassPrimaryKey, ModelClass, modelRecipesLoader, loadMethodName, optionsPrimaryKey, relationshipName, resourceName}) {
|
|
182
|
+
defineBelongsToLoadMethod ({foreignKey, klassPrimaryKey, ModelClass, modelRecipesLoader, loadMethodName, optionsPrimaryKey, relationshipName, resourceName}) {
|
|
180
183
|
ModelClass.prototype[loadMethodName] = function () {
|
|
181
184
|
const foreignKeyMethodName = inflection.camelize(foreignKey, true)
|
|
182
185
|
|
|
@@ -196,7 +199,19 @@ module.exports = class ApiMakerModelRecipesModelLoader {
|
|
|
196
199
|
}
|
|
197
200
|
}
|
|
198
201
|
|
|
199
|
-
defineHasManyGetMethod({
|
|
202
|
+
defineHasManyGetMethod ({
|
|
203
|
+
activeRecordName,
|
|
204
|
+
className,
|
|
205
|
+
foreignKey,
|
|
206
|
+
ModelClass,
|
|
207
|
+
modelMethodName,
|
|
208
|
+
modelRecipesLoader,
|
|
209
|
+
optionsAs,
|
|
210
|
+
optionsPrimaryKey,
|
|
211
|
+
optionsThrough,
|
|
212
|
+
relationshipName,
|
|
213
|
+
resourceName
|
|
214
|
+
}) {
|
|
200
215
|
ModelClass.prototype[modelMethodName] = function () {
|
|
201
216
|
const id = this.primaryKey()
|
|
202
217
|
const modelClass = modelRecipesLoader.getModelClass(resourceName)
|
|
@@ -243,7 +258,7 @@ module.exports = class ApiMakerModelRecipesModelLoader {
|
|
|
243
258
|
}
|
|
244
259
|
}
|
|
245
260
|
|
|
246
|
-
defineHasManyLoadMethod({foreignKey, loadMethodName, ModelClass, modelClassData, modelRecipesLoader, optionsThrough, relationshipName, resourceName}) {
|
|
261
|
+
defineHasManyLoadMethod ({foreignKey, loadMethodName, ModelClass, modelClassData, modelRecipesLoader, optionsThrough, relationshipName, resourceName}) {
|
|
247
262
|
ModelClass.prototype[loadMethodName] = function () {
|
|
248
263
|
const id = this.primaryKey()
|
|
249
264
|
const modelClass = modelRecipesLoader.getModelClass(resourceName)
|
|
@@ -284,13 +299,23 @@ module.exports = class ApiMakerModelRecipesModelLoader {
|
|
|
284
299
|
}
|
|
285
300
|
}
|
|
286
301
|
|
|
287
|
-
defineHasOneGetMethd({ModelClass, modelMethodName, relationshipName}) {
|
|
302
|
+
defineHasOneGetMethd ({ModelClass, modelMethodName, relationshipName}) {
|
|
288
303
|
ModelClass.prototype[modelMethodName] = function () {
|
|
289
304
|
return this._readHasOneReflection({reflectionName: relationshipName})
|
|
290
305
|
}
|
|
291
306
|
}
|
|
292
307
|
|
|
293
|
-
defineHasOneLoadMethod({
|
|
308
|
+
defineHasOneLoadMethod ({
|
|
309
|
+
activeRecordPrimaryKey,
|
|
310
|
+
foreignKey,
|
|
311
|
+
loadMethodName,
|
|
312
|
+
ModelClass,
|
|
313
|
+
modelClassData,
|
|
314
|
+
modelRecipesLoader,
|
|
315
|
+
optionsThrough,
|
|
316
|
+
relationshipName,
|
|
317
|
+
resourceName
|
|
318
|
+
}) {
|
|
294
319
|
ModelClass.prototype[loadMethodName] = function () {
|
|
295
320
|
const primaryKeyMethodName = inflection.camelize(activeRecordPrimaryKey, true)
|
|
296
321
|
|
|
@@ -3,36 +3,36 @@ const inflection = require("inflection")
|
|
|
3
3
|
const Preloaded = require("./preloaded.cjs")
|
|
4
4
|
|
|
5
5
|
module.exports = class ModelsResponseReader {
|
|
6
|
-
static first(response) {
|
|
6
|
+
static first (response) {
|
|
7
7
|
return ModelsResponseReader.collection(response)[0]
|
|
8
8
|
}
|
|
9
9
|
|
|
10
|
-
static collection(response) {
|
|
11
|
-
const reader = new ModelsResponseReader({response
|
|
10
|
+
static collection (response) {
|
|
11
|
+
const reader = new ModelsResponseReader({response})
|
|
12
12
|
return reader.models()
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
-
constructor(args) {
|
|
15
|
+
constructor (args) {
|
|
16
16
|
this.collection = args.collection
|
|
17
17
|
this.response = args.response
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
models() {
|
|
20
|
+
models () {
|
|
21
21
|
const preloaded = new Preloaded(this.response)
|
|
22
22
|
const models = []
|
|
23
23
|
|
|
24
|
-
for(const modelType in this.response.data) {
|
|
24
|
+
for (const modelType in this.response.data) {
|
|
25
25
|
const modelClassName = inflection.classify(modelType)
|
|
26
|
-
const
|
|
27
|
-
const collectionName =
|
|
26
|
+
const ModelClass = digg(require("@kaspernj/api-maker/src/models"), modelClassName)
|
|
27
|
+
const collectionName = ModelClass.modelClassData().collectionName
|
|
28
28
|
|
|
29
|
-
for(const modelId of this.response.data[modelType]) {
|
|
29
|
+
for (const modelId of this.response.data[modelType]) {
|
|
30
30
|
const modelData = this.response.preloaded[collectionName][modelId]
|
|
31
31
|
|
|
32
32
|
if (!modelData)
|
|
33
33
|
throw new Error(`Couldn't find model data for ${collectionName}(${modelId})`)
|
|
34
34
|
|
|
35
|
-
const model = new
|
|
35
|
+
const model = new ModelClass({
|
|
36
36
|
collection: this.collection,
|
|
37
37
|
data: modelData,
|
|
38
38
|
isNewRecord: false
|