@dma-sdk/hubspot 1.0.1 → 1.0.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/dist/constants/api-path.d.ts +6 -0
- package/dist/constants/api-path.js +9 -0
- package/dist/constants/{types.d.ts → data-types.d.ts} +1 -1
- package/dist/constants/{types.js → data-types.js} +2 -2
- package/dist/constants/object-types.d.ts +1 -0
- package/dist/constants/object-types.js +4 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +22 -0
- package/dist/interfaces/input/subscriptions.d.ts +9 -0
- package/dist/interfaces/input/subscriptions.js +2 -0
- package/dist/interfaces/output/subscriptions.d.ts +8 -0
- package/dist/interfaces/output/subscriptions.js +2 -0
- package/dist/{hubspot-service.d.ts → services/hubspot-service.d.ts} +9 -4
- package/dist/{hubspot-service.js → services/hubspot-service.js} +21 -13
- package/dist/utils/type-converter.js +4 -4
- package/package.json +2 -2
- package/src/constants/api-path.ts +6 -0
- package/src/constants/data-types.ts +23 -0
- package/src/constants/object-types.ts +1 -0
- package/src/index.ts +6 -0
- package/src/interfaces/input/subscriptions.ts +9 -0
- package/src/interfaces/output/subscriptions.ts +8 -0
- package/src/{hubspot-service.ts → services/hubspot-service.ts} +37 -16
- package/src/utils/type-converter.ts +4 -5
- package/tsconfig.json +1 -1
- package/src/constants/types.ts +0 -23
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ApiMethods = void 0;
|
|
4
|
+
exports.ApiMethods = {
|
|
5
|
+
getUserInfoByToken: '/oauth/v1/access-tokens',
|
|
6
|
+
refreshToken: '/oauth/v1/token',
|
|
7
|
+
createObjectProperties: (objectType) => '/crm/v3/properties/{objectType}/batch/create'.replace('{objectType}', objectType),
|
|
8
|
+
subscriptions: (appId) => '/webhooks/v3/{appId}/subscriptions'.replace('{appId}', appId),
|
|
9
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const HsObjectTypes: {};
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export * from './services/hubspot-service';
|
|
2
|
+
export * from './constants/data-types';
|
|
3
|
+
export * from './constants/object-types';
|
|
4
|
+
export * from './interfaces/input/subscriptions';
|
|
5
|
+
export * from './interfaces/output/subscriptions';
|
|
6
|
+
export * from './types/auth/hs-signature-data';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./services/hubspot-service"), exports);
|
|
18
|
+
__exportStar(require("./constants/data-types"), exports);
|
|
19
|
+
__exportStar(require("./constants/object-types"), exports);
|
|
20
|
+
__exportStar(require("./interfaces/input/subscriptions"), exports);
|
|
21
|
+
__exportStar(require("./interfaces/output/subscriptions"), exports);
|
|
22
|
+
__exportStar(require("./types/auth/hs-signature-data"), exports);
|
|
@@ -1,12 +1,14 @@
|
|
|
1
|
-
import { HubspotUser } from '
|
|
1
|
+
import { HubspotUser } from '../interfaces/user';
|
|
2
2
|
import { Configuration, Filter } from '@hubspot/api-client/lib/codegen/crm/objects';
|
|
3
3
|
import { SimplePublicObjectInputForCreate } from '@hubspot/api-client/lib/codegen/crm/objects/taxes/models/all';
|
|
4
4
|
import { SimplePublicObject } from '@hubspot/api-client/lib/codegen/crm/objects/tasks/models/all';
|
|
5
5
|
import { LabelsBetweenObjectPair } from '@hubspot/api-client/lib/codegen/crm/associations/v4';
|
|
6
6
|
import { TokenResponseIF } from '@hubspot/api-client/lib/codegen/oauth';
|
|
7
|
-
import { TokenResponse } from '
|
|
7
|
+
import { TokenResponse } from '../interfaces/token';
|
|
8
8
|
import { CollectionResponsePropertyNoPaging, PropertyCreate, PropertyGroup, PropertyGroupCreate } from '@hubspot/api-client/lib/codegen/crm/properties';
|
|
9
|
-
import { HubspotSignatureData } from '
|
|
9
|
+
import { HubspotSignatureData } from '../types/auth/hs-signature-data';
|
|
10
|
+
import { CreateSubscriptionInput } from '../interfaces/input/subscriptions';
|
|
11
|
+
import { CreateSubscriptionOutput } from '../interfaces/output/subscriptions';
|
|
10
12
|
export declare class HubspotService {
|
|
11
13
|
static HS_BASE_URL: string;
|
|
12
14
|
static readonly hubspotObjectType: {
|
|
@@ -41,7 +43,6 @@ export declare class HubspotService {
|
|
|
41
43
|
private hsClientId;
|
|
42
44
|
private hsClientSecret;
|
|
43
45
|
private typeConvert;
|
|
44
|
-
private apiMethods;
|
|
45
46
|
constructor(hsRedirectUriOauth: string, hsClientId: string, hsClientSecret: string);
|
|
46
47
|
exchangeCodeForTokens(params: {
|
|
47
48
|
code: string;
|
|
@@ -84,5 +85,9 @@ export declare class HubspotService {
|
|
|
84
85
|
}, convertionMap: {
|
|
85
86
|
[propertyName: string]: PropertyCreate;
|
|
86
87
|
}): Record<string, any>;
|
|
88
|
+
createEventSubscription(properties: {
|
|
89
|
+
commandInput: CreateSubscriptionInput;
|
|
90
|
+
devApiKey: string;
|
|
91
|
+
}): Promise<CreateSubscriptionOutput>;
|
|
87
92
|
private fetchApi;
|
|
88
93
|
}
|
|
@@ -2,20 +2,16 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.HubspotService = void 0;
|
|
4
4
|
const api_client_1 = require("@hubspot/api-client");
|
|
5
|
-
const type_converter_1 = require("
|
|
6
|
-
const
|
|
5
|
+
const type_converter_1 = require("../utils/type-converter");
|
|
6
|
+
const data_types_1 = require("../constants/data-types");
|
|
7
7
|
const api_client_2 = require("@hubspot/api-client");
|
|
8
8
|
const fetch_1 = require("@dma-sdk/utils/src/fetch");
|
|
9
|
+
const api_path_1 = require("../constants/api-path");
|
|
9
10
|
// Per ogni metodo che viene creato, è fondamentale che
|
|
10
|
-
// il client venga inizializzato con il token di accesso
|
|
11
|
+
// il client venga inizializzato con il token di accesso o l'api key
|
|
11
12
|
// altrimenti non funzionerà correttamente.
|
|
12
13
|
class HubspotService {
|
|
13
14
|
constructor(hsRedirectUriOauth, hsClientId, hsClientSecret) {
|
|
14
|
-
this.apiMethods = {
|
|
15
|
-
getUserInfoByToken: '/oauth/v1/access-tokens',
|
|
16
|
-
refreshToken: '/oauth/v1/token',
|
|
17
|
-
createObjectProperties: '/crm/v3/properties/{objectType}/batch/create',
|
|
18
|
-
};
|
|
19
15
|
;
|
|
20
16
|
(this.hsRedirectUriOauth = hsRedirectUriOauth),
|
|
21
17
|
(this.hsClientId = hsClientId),
|
|
@@ -29,7 +25,7 @@ class HubspotService {
|
|
|
29
25
|
async getUserInfoByToken(accessToken) {
|
|
30
26
|
const response = await this.client.apiRequest({
|
|
31
27
|
method: 'GET',
|
|
32
|
-
path: `${
|
|
28
|
+
path: `${api_path_1.ApiMethods.getUserInfoByToken}/${accessToken}`,
|
|
33
29
|
});
|
|
34
30
|
const jsonBody = await response.json();
|
|
35
31
|
const userAttributes = {
|
|
@@ -147,7 +143,7 @@ class HubspotService {
|
|
|
147
143
|
inputs: properties
|
|
148
144
|
})
|
|
149
145
|
};
|
|
150
|
-
const response = await this.fetchApi(
|
|
146
|
+
const response = await this.fetchApi(api_path_1.ApiMethods.createObjectProperties(objectType), options);
|
|
151
147
|
return await response.json();
|
|
152
148
|
}
|
|
153
149
|
async createPropertyGroup(objectType, group, accessToken) {
|
|
@@ -157,10 +153,9 @@ class HubspotService {
|
|
|
157
153
|
convertPropertyValues(properties, convertionMap) {
|
|
158
154
|
let convertedProps = {};
|
|
159
155
|
Object.entries(properties).forEach(([key, value]) => {
|
|
160
|
-
var _a;
|
|
161
156
|
if (value === undefined)
|
|
162
157
|
return;
|
|
163
|
-
const convertionFunc = this.typeConvert[
|
|
158
|
+
const convertionFunc = this.typeConvert[convertionMap[key]?.type];
|
|
164
159
|
if (convertionFunc === undefined) {
|
|
165
160
|
convertedProps[key] = value;
|
|
166
161
|
return;
|
|
@@ -169,6 +164,19 @@ class HubspotService {
|
|
|
169
164
|
});
|
|
170
165
|
return convertedProps;
|
|
171
166
|
}
|
|
167
|
+
async createEventSubscription(properties) {
|
|
168
|
+
const { appId, event } = properties.commandInput;
|
|
169
|
+
const devApiKey = properties.devApiKey;
|
|
170
|
+
const options = {
|
|
171
|
+
method: 'POST',
|
|
172
|
+
headers: {
|
|
173
|
+
'Content-Type': 'application/json'
|
|
174
|
+
},
|
|
175
|
+
body: JSON.stringify(event)
|
|
176
|
+
};
|
|
177
|
+
const response = await this.fetchApi(api_path_1.ApiMethods.subscriptions(appId), options, { hapikey: devApiKey });
|
|
178
|
+
return await response.json();
|
|
179
|
+
}
|
|
172
180
|
async fetchApi(endpoint, options, queryParams) {
|
|
173
181
|
return await (0, fetch_1.fetchApi)(HubspotService.HS_BASE_URL, endpoint, options, queryParams);
|
|
174
182
|
}
|
|
@@ -179,4 +187,4 @@ HubspotService.hubspotObjectType = {
|
|
|
179
187
|
contacts: 'contacts',
|
|
180
188
|
notes: 'notes',
|
|
181
189
|
};
|
|
182
|
-
HubspotService.hubspotPropertyTypes =
|
|
190
|
+
HubspotService.hubspotPropertyTypes = data_types_1.HsDataTypes;
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.typeConverter = void 0;
|
|
4
|
-
const
|
|
4
|
+
const data_types_1 = require("../constants/data-types");
|
|
5
5
|
exports.typeConverter = {
|
|
6
|
-
[
|
|
6
|
+
[data_types_1.HsDataTypes.date]: (data) => {
|
|
7
7
|
return (new Date(data)).setUTCHours(0, 0, 0, 0);
|
|
8
8
|
},
|
|
9
|
-
[
|
|
9
|
+
[data_types_1.HsDataTypes.datetime]: (data) => {
|
|
10
10
|
return new Date(data).getTime();
|
|
11
11
|
},
|
|
12
|
-
[
|
|
12
|
+
[data_types_1.HsDataTypes.number]: (data) => {
|
|
13
13
|
return (typeof data === "number") ? data : parseFloat(data);
|
|
14
14
|
}
|
|
15
15
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dma-sdk/hubspot",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.3",
|
|
4
4
|
"description": "DMA SDK – Hubspot service",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -16,4 +16,4 @@
|
|
|
16
16
|
"devDependencies": {
|
|
17
17
|
"typescript": "^5.2.0"
|
|
18
18
|
}
|
|
19
|
-
}
|
|
19
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export const ApiMethods = {
|
|
2
|
+
getUserInfoByToken: '/oauth/v1/access-tokens',
|
|
3
|
+
refreshToken: '/oauth/v1/token',
|
|
4
|
+
createObjectProperties: (objectType: string) => '/crm/v3/properties/{objectType}/batch/create'.replace('{objectType}', objectType),
|
|
5
|
+
subscriptions: (appId: string) => '/webhooks/v3/{appId}/subscriptions'.replace('{appId}', appId),
|
|
6
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export const HsDataTypes = {
|
|
2
|
+
string: "string",
|
|
3
|
+
number: "number",
|
|
4
|
+
boolean: "bool",
|
|
5
|
+
date: "date",
|
|
6
|
+
datetime: "datetime",
|
|
7
|
+
single_select: "enumeration",
|
|
8
|
+
multiple_select: "enumeration",
|
|
9
|
+
checkbox: "bool",
|
|
10
|
+
calculation: "calculation_equation",
|
|
11
|
+
phone_number: "phone_number",
|
|
12
|
+
user: "hubspot_user",
|
|
13
|
+
file: "file",
|
|
14
|
+
score: "score",
|
|
15
|
+
currency: "currency",
|
|
16
|
+
rich_text: "rich_text",
|
|
17
|
+
owner: "owner",
|
|
18
|
+
location: "location",
|
|
19
|
+
json: "json",
|
|
20
|
+
percentage: "number",
|
|
21
|
+
ip_address: "ip_address",
|
|
22
|
+
video: "video"
|
|
23
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const HsObjectTypes = {}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export * from './services/hubspot-service';
|
|
2
|
+
export * from './constants/data-types';
|
|
3
|
+
export * from './constants/object-types';
|
|
4
|
+
export * from './interfaces/input/subscriptions';
|
|
5
|
+
export * from './interfaces/output/subscriptions';
|
|
6
|
+
export * from './types/auth/hs-signature-data';
|
|
@@ -1,21 +1,24 @@
|
|
|
1
1
|
import { Client as HubspotClient } from '@hubspot/api-client'
|
|
2
|
-
import { HubspotUser } from '
|
|
2
|
+
import { HubspotUser } from '../interfaces/user'
|
|
3
3
|
import { Configuration, Filter } from '@hubspot/api-client/lib/codegen/crm/objects'
|
|
4
4
|
import { SimplePublicObjectInputForCreate } from '@hubspot/api-client/lib/codegen/crm/objects/taxes/models/all'
|
|
5
5
|
import { SimplePublicObject } from '@hubspot/api-client/lib/codegen/crm/objects/tasks/models/all'
|
|
6
6
|
import { LabelsBetweenObjectPair } from '@hubspot/api-client/lib/codegen/crm/associations/v4'
|
|
7
7
|
import { TokenResponseIF } from '@hubspot/api-client/lib/codegen/oauth'
|
|
8
|
-
import { typeConverter } from '
|
|
9
|
-
import { HubspotTypeConverter } from '
|
|
10
|
-
import {
|
|
8
|
+
import { typeConverter } from '../utils/type-converter'
|
|
9
|
+
import { HubspotTypeConverter } from '../interfaces/hubspot-type-converter'
|
|
10
|
+
import { HsDataTypes } from '../constants/data-types'
|
|
11
11
|
import { Signature } from '@hubspot/api-client'
|
|
12
|
-
import { TokenResponse } from '
|
|
12
|
+
import { TokenResponse } from '../interfaces/token'
|
|
13
13
|
import { CollectionResponsePropertyNoPaging, PropertyCreate, PropertyGroup, PropertyGroupCreate } from '@hubspot/api-client/lib/codegen/crm/properties'
|
|
14
|
-
import { HubspotSignatureData } from '
|
|
14
|
+
import { HubspotSignatureData } from '../types/auth/hs-signature-data'
|
|
15
15
|
import { fetchApi } from '@dma-sdk/utils/src/fetch'
|
|
16
|
+
import { ApiMethods } from '../constants/api-path'
|
|
17
|
+
import { CreateSubscriptionInput } from '../interfaces/input/subscriptions'
|
|
18
|
+
import { CreateSubscriptionOutput } from '../interfaces/output/subscriptions'
|
|
16
19
|
|
|
17
20
|
// Per ogni metodo che viene creato, è fondamentale che
|
|
18
|
-
// il client venga inizializzato con il token di accesso
|
|
21
|
+
// il client venga inizializzato con il token di accesso o l'api key
|
|
19
22
|
// altrimenti non funzionerà correttamente.
|
|
20
23
|
|
|
21
24
|
export class HubspotService {
|
|
@@ -24,7 +27,7 @@ export class HubspotService {
|
|
|
24
27
|
contacts: 'contacts',
|
|
25
28
|
notes: 'notes',
|
|
26
29
|
}
|
|
27
|
-
public static readonly hubspotPropertyTypes =
|
|
30
|
+
public static readonly hubspotPropertyTypes = HsDataTypes
|
|
28
31
|
|
|
29
32
|
private client: HubspotClient
|
|
30
33
|
private hsRedirectUriOauth: string
|
|
@@ -32,12 +35,6 @@ export class HubspotService {
|
|
|
32
35
|
private hsClientSecret: string
|
|
33
36
|
private typeConvert: HubspotTypeConverter
|
|
34
37
|
|
|
35
|
-
private apiMethods = {
|
|
36
|
-
getUserInfoByToken: '/oauth/v1/access-tokens',
|
|
37
|
-
refreshToken: '/oauth/v1/token',
|
|
38
|
-
createObjectProperties: '/crm/v3/properties/{objectType}/batch/create',
|
|
39
|
-
}
|
|
40
|
-
|
|
41
38
|
|
|
42
39
|
constructor(hsRedirectUriOauth: string, hsClientId: string, hsClientSecret: string) {
|
|
43
40
|
;(this.hsRedirectUriOauth = hsRedirectUriOauth),
|
|
@@ -61,7 +58,7 @@ export class HubspotService {
|
|
|
61
58
|
async getUserInfoByToken(accessToken: string): Promise<HubspotUser> {
|
|
62
59
|
const response = await this.client.apiRequest({
|
|
63
60
|
method: 'GET',
|
|
64
|
-
path: `${
|
|
61
|
+
path: `${ApiMethods.getUserInfoByToken}/${accessToken}`,
|
|
65
62
|
})
|
|
66
63
|
|
|
67
64
|
const jsonBody = await response.json()
|
|
@@ -272,7 +269,7 @@ export class HubspotService {
|
|
|
272
269
|
})
|
|
273
270
|
};
|
|
274
271
|
|
|
275
|
-
const response = await this.fetchApi(
|
|
272
|
+
const response = await this.fetchApi(ApiMethods.createObjectProperties(objectType), options)
|
|
276
273
|
return await response.json()
|
|
277
274
|
}
|
|
278
275
|
|
|
@@ -300,6 +297,30 @@ export class HubspotService {
|
|
|
300
297
|
|
|
301
298
|
return convertedProps
|
|
302
299
|
}
|
|
300
|
+
|
|
301
|
+
public async createEventSubscription(properties: {
|
|
302
|
+
commandInput: CreateSubscriptionInput,
|
|
303
|
+
devApiKey: string,
|
|
304
|
+
}): Promise<CreateSubscriptionOutput> {
|
|
305
|
+
const { appId, event } = properties.commandInput
|
|
306
|
+
const devApiKey = properties.devApiKey
|
|
307
|
+
|
|
308
|
+
const options = {
|
|
309
|
+
method: 'POST',
|
|
310
|
+
headers: {
|
|
311
|
+
'Content-Type': 'application/json'
|
|
312
|
+
},
|
|
313
|
+
body: JSON.stringify(event)
|
|
314
|
+
};
|
|
315
|
+
|
|
316
|
+
const response = await this.fetchApi(
|
|
317
|
+
ApiMethods.subscriptions(appId),
|
|
318
|
+
options,
|
|
319
|
+
{ hapikey: devApiKey }
|
|
320
|
+
)
|
|
321
|
+
|
|
322
|
+
return await response.json()
|
|
323
|
+
}
|
|
303
324
|
|
|
304
325
|
private async fetchApi(endpoint: string, options: {}, queryParams?: {}): Promise<any> {
|
|
305
326
|
return await fetchApi(HubspotService.HS_BASE_URL, endpoint, options, queryParams)
|
|
@@ -1,17 +1,16 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { HsDataTypes } from "../constants/data-types";
|
|
2
2
|
import { HubspotTypeConverter } from "../interfaces/hubspot-type-converter";
|
|
3
|
-
import { string } from "zod";
|
|
4
3
|
|
|
5
4
|
export const typeConverter: HubspotTypeConverter = {
|
|
6
|
-
[
|
|
5
|
+
[HsDataTypes.date]:
|
|
7
6
|
(data: string) => {
|
|
8
7
|
return (new Date(data)).setUTCHours(0, 0, 0, 0);
|
|
9
8
|
},
|
|
10
|
-
[
|
|
9
|
+
[HsDataTypes.datetime]:
|
|
11
10
|
(data: string) => {
|
|
12
11
|
return new Date(data).getTime();
|
|
13
12
|
},
|
|
14
|
-
[
|
|
13
|
+
[HsDataTypes.number]:
|
|
15
14
|
(data: string | number) => {
|
|
16
15
|
return (typeof data === "number") ? data : parseFloat(data);
|
|
17
16
|
}
|
package/tsconfig.json
CHANGED
package/src/constants/types.ts
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
export const hsDataTypes = {
|
|
2
|
-
string: "string",
|
|
3
|
-
number: "number",
|
|
4
|
-
boolean: "bool",
|
|
5
|
-
date: "date",
|
|
6
|
-
datetime: "datetime",
|
|
7
|
-
single_select: "enumeration",
|
|
8
|
-
multiple_select: "enumeration",
|
|
9
|
-
checkbox: "bool",
|
|
10
|
-
calculation: "calculation_equation",
|
|
11
|
-
phone_number: "phone_number",
|
|
12
|
-
user: "hubspot_user",
|
|
13
|
-
file: "file",
|
|
14
|
-
score: "score",
|
|
15
|
-
currency: "currency",
|
|
16
|
-
rich_text: "rich_text",
|
|
17
|
-
owner: "owner",
|
|
18
|
-
location: "location",
|
|
19
|
-
json: "json",
|
|
20
|
-
percentage: "number",
|
|
21
|
-
ip_address: "ip_address",
|
|
22
|
-
video: "video"
|
|
23
|
-
};
|