@forge/events 2.1.6 → 2.1.7-experimental-04cc2b9

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/CHANGELOG.md CHANGED
@@ -1,5 +1,35 @@
1
1
  # @forge/events
2
2
 
3
+ ## 2.1.7-experimental-04cc2b9
4
+
5
+ ### Major Changes
6
+
7
+ - d9ef926: Adds support for TypeScript 5
8
+
9
+ ### Patch Changes
10
+
11
+ - Updated dependencies [561f8f4]
12
+ - Updated dependencies [d9ef926]
13
+ - @forge/api@7.2.2-experimental-04cc2b9
14
+
15
+ ## 2.1.7
16
+
17
+ ### Patch Changes
18
+
19
+ - @forge/api@7.2.2
20
+
21
+ ## 2.1.7-next.1
22
+
23
+ ### Patch Changes
24
+
25
+ - @forge/api@7.2.2-next.1
26
+
27
+ ## 2.1.7-next.0
28
+
29
+ ### Patch Changes
30
+
31
+ - @forge/api@7.2.2-next.0
32
+
3
33
  ## 2.1.6
4
34
 
5
35
  ### Patch Changes
@@ -1,8 +1,8 @@
1
1
  export interface AppEvent {
2
2
  key: string;
3
3
  }
4
- export declare type AppEventPublishResult = AppEventPublishSuccess | AppEventPublishError;
5
- export declare type AppEventPublishSuccess = {
4
+ export type AppEventPublishResult = AppEventPublishSuccess | AppEventPublishError;
5
+ export type AppEventPublishSuccess = {
6
6
  type: 'success';
7
7
  failedEvents: AppEventPublishFailure[];
8
8
  };
@@ -15,7 +15,7 @@ export interface AppEventPublishError {
15
15
  errorType: AppEventErrorType;
16
16
  errorMessage: string;
17
17
  }
18
- export declare type AppEventErrorType = 'VALIDATION_ERROR' | 'AUTHENTICATION_ERROR' | 'AUTHORIZATION_ERROR' | 'RATE_LIMIT' | 'SERVICE_ERROR' | 'SERVICE_UNAVAILABLE' | `OTHER`;
18
+ export type AppEventErrorType = 'VALIDATION_ERROR' | 'AUTHENTICATION_ERROR' | 'AUTHORIZATION_ERROR' | 'RATE_LIMIT' | 'SERVICE_ERROR' | 'SERVICE_UNAVAILABLE' | `OTHER`;
19
19
  export declare const appEvents: {
20
20
  publish(events: AppEvent | AppEvent[]): Promise<AppEventPublishResult>;
21
21
  };
@@ -1 +1 @@
1
- {"version":3,"file":"appEvents.d.ts","sourceRoot":"","sources":["../src/appEvents.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,oBAAY,qBAAqB,GAAG,sBAAsB,GAAG,oBAAoB,CAAC;AASlF,oBAAY,sBAAsB,GAAG;IACnC,IAAI,EAAE,SAAS,CAAC;IAEhB,YAAY,EAAE,sBAAsB,EAAE,CAAC;CACxC,CAAC;AAKF,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,QAAQ,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACtB;AAMD,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,iBAAiB,CAAC;IAC7B,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,oBAAY,iBAAiB,GACzB,kBAAkB,GAClB,sBAAsB,GACtB,qBAAqB,GACrB,YAAY,GACZ,eAAe,GACf,qBAAqB,GACrB,OAAO,CAAC;AAsBZ,eAAO,MAAM,SAAS;oBACE,QAAQ,GAAG,QAAQ,EAAE,GAAG,QAAQ,qBAAqB,CAAC;CAwB7E,CAAC"}
1
+ {"version":3,"file":"appEvents.d.ts","sourceRoot":"","sources":["../src/appEvents.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,MAAM,qBAAqB,GAAG,sBAAsB,GAAG,oBAAoB,CAAC;AASlF,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,EAAE,SAAS,CAAC;IAEhB,YAAY,EAAE,sBAAsB,EAAE,CAAC;CACxC,CAAC;AAKF,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,QAAQ,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACtB;AAMD,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,iBAAiB,CAAC;IAC7B,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,iBAAiB,GACzB,kBAAkB,GAClB,sBAAsB,GACtB,qBAAqB,GACrB,YAAY,GACZ,eAAe,GACf,qBAAqB,GACrB,OAAO,CAAC;AAsBZ,eAAO,MAAM,SAAS;oBACE,QAAQ,GAAG,QAAQ,EAAE,GAAG,OAAO,CAAC,qBAAqB,CAAC;CAwB7E,CAAC"}
@@ -9,4 +9,4 @@ var InvocationErrorCode;
9
9
  InvocationErrorCode["FUNCTION_PLATFORM_RATE_LIMITED"] = "FUNCTION_PLATFORM_RATE_LIMITED";
10
10
  InvocationErrorCode["FUNCTION_UPSTREAM_RATE_LIMITED"] = "FUNCTION_UPSTREAM_RATE_LIMITED";
11
11
  InvocationErrorCode["FUNCTION_RETRY_REQUEST"] = "FUNCTION_RETRY_REQUEST";
12
- })(InvocationErrorCode = exports.InvocationErrorCode || (exports.InvocationErrorCode = {}));
12
+ })(InvocationErrorCode || (exports.InvocationErrorCode = InvocationErrorCode = {}));
@@ -1,6 +1,6 @@
1
1
  import { FetchMethod } from '@forge/api';
2
2
  import { QueueParams } from './types';
3
- export declare type JobStats = {
3
+ export type JobStats = {
4
4
  success: number;
5
5
  inProgress: number;
6
6
  failed: number;
@@ -1 +1 @@
1
- {"version":3,"file":"jobProgress.d.ts","sourceRoot":"","sources":["../src/jobProgress.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,WAAW,EAAE,MAAM,YAAY,CAAC;AAQlE,OAAO,EAAqC,WAAW,EAAE,MAAM,SAAS,CAAC;AAEzE,oBAAY,QAAQ,GAAG;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,qBAAa,WAAW;IAEpB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAFT,WAAW,EAAE,WAAW,EACxB,EAAE,EAAE,MAAM,EACV,SAAS,GAAE,WAAqC;IAG7D,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC;IAe7B,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;CAY9B"}
1
+ {"version":3,"file":"jobProgress.d.ts","sourceRoot":"","sources":["../src/jobProgress.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,WAAW,EAAE,MAAM,YAAY,CAAC;AAQlE,OAAO,EAAqC,WAAW,EAAE,MAAM,SAAS,CAAC;AAEzE,MAAM,MAAM,QAAQ,GAAG;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,qBAAa,WAAW;IAEpB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAFT,WAAW,EAAE,WAAW,EACxB,EAAE,EAAE,MAAM,EACV,SAAS,GAAE,WAAqC;IAG7D,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC;IAe7B,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;CAY9B"}
@@ -1 +1 @@
1
- {"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../src/queries.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEtD,eAAO,MAAM,SAAS,6EAA6E,CAAC;AACpG,eAAO,MAAM,cAAc,2EAA2E,CAAC;AACvG,eAAO,MAAM,eAAe,4EAA4E,CAAC;AAEzG,eAAO,MAAM,IAAI,aAAoB,MAAM,QAAQ,OAAO,aAAa,WAAW,KAAG,QAAQ,WAAW,CAUvG,CAAC"}
1
+ {"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../src/queries.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEtD,eAAO,MAAM,SAAS,6EAA6E,CAAC;AACpG,eAAO,MAAM,cAAc,2EAA2E,CAAC;AACvG,eAAO,MAAM,eAAe,4EAA4E,CAAC;AAEzG,eAAO,MAAM,IAAI,GAAU,UAAU,MAAM,EAAE,MAAM,OAAO,EAAE,WAAW,WAAW,KAAG,OAAO,CAAC,WAAW,CAUvG,CAAC"}
package/out/types.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export declare type Payload = Record<string, unknown>;
1
+ export type Payload = Record<string, unknown>;
2
2
  export interface QueueParams {
3
3
  key: string;
4
4
  }
@@ -18,7 +18,7 @@ export interface PushEvent<T extends Body = Body> {
18
18
  delayInSeconds?: number;
19
19
  concurrency?: Concurrency;
20
20
  }
21
- export declare type Body = Record<string, unknown>;
21
+ export type Body = Record<string, unknown>;
22
22
  export interface Concurrency {
23
23
  key: string;
24
24
  limit: number;
@@ -46,6 +46,6 @@ export interface RetentionWindow {
46
46
  startTime: string;
47
47
  remainingTimeMs: number;
48
48
  }
49
- export declare type GetStatsRequest = APIRequest;
50
- export declare type CancelJobRequest = APIRequest;
49
+ export type GetStatsRequest = APIRequest;
50
+ export type CancelJobRequest = APIRequest;
51
51
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,oBAAY,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE9C,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,WAAW,CAAC,CAAC,SAAS,IAAI,GAAG,IAAI,CAAE,SAAQ,UAAU;IACpE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,SAAS,CAAC,CAAC,SAAS,IAAI,GAAG,IAAI;IAC9C,IAAI,EAAE,CAAC,CAAC;IACR,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED,oBAAY,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE3C,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW,CAAC,CAAC,SAAS,IAAI,GAAG,IAAI;IAChD,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;CACrB;AAED,MAAM,WAAW,UAAU,CAAC,CAAC,SAAS,IAAI,GAAG,IAAI,CAAE,SAAQ,SAAS,CAAC,CAAC,CAAC;IACrE,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,GAAG,CAAC;IACf,eAAe,CAAC,EAAE,eAAe,CAAC;CACnC;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,oBAAY,eAAe,GAAG,UAAU,CAAC;AACzC,oBAAY,gBAAgB,GAAG,UAAU,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE9C,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,WAAW,CAAC,CAAC,SAAS,IAAI,GAAG,IAAI,CAAE,SAAQ,UAAU;IACpE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,SAAS,CAAC,CAAC,SAAS,IAAI,GAAG,IAAI;IAC9C,IAAI,EAAE,CAAC,CAAC;IACR,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED,MAAM,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE3C,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW,CAAC,CAAC,SAAS,IAAI,GAAG,IAAI;IAChD,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;CACrB;AAED,MAAM,WAAW,UAAU,CAAC,CAAC,SAAS,IAAI,GAAG,IAAI,CAAE,SAAQ,SAAS,CAAC,CAAC,CAAC;IACrE,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,GAAG,CAAC;IACf,eAAe,CAAC,EAAE,eAAe,CAAC;CACnC;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,eAAe,GAAG,UAAU,CAAC;AACzC,MAAM,MAAM,gBAAgB,GAAG,UAAU,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../src/validators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAezC,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAMtG,eAAO,MAAM,gBAAgB,cAAe,MAAM,SAIjD,CAAC;AAEF,eAAO,MAAM,oBAAoB,UAAW,UAAU,IAAI,CAAC,SAI1D,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,IAAI,GAAG,IAAI,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,EAAE,CA6B5G;AAED,eAAO,MAAM,uBAAuB,oBAAqB,eAAe,SAKvE,CAAC;AAEF,eAAO,MAAM,wBAAwB,qBAAsB,gBAAgB,SAK1E,CAAC;AAEF,eAAO,MAAM,mBAAmB,aAAoB,WAAW,yBAAyB,MAAM,kBA6B7F,CAAC;AAEF,eAAO,MAAM,uBAAuB,gBAAuB,WAAW,YAAY,WAAW,UAAU,UAAU,kBAkChH,CAAC;AAEF,eAAO,MAAM,2BAA2B,aAAoB,WAAW,mBAAmB,eAAe,kBAMxG,CAAC;AAEF,eAAO,MAAM,4BAA4B,aAAoB,WAAW,oBAAoB,eAAe,kBAM1G,CAAC"}
1
+ {"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../src/validators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAezC,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAMtG,eAAO,MAAM,gBAAgB,GAAI,WAAW,MAAM,SAIjD,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAI,OAAO,SAAS,CAAC,IAAI,CAAC,SAI1D,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,IAAI,GAAG,IAAI,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,EAAE,CA6B5G;AAED,eAAO,MAAM,uBAAuB,GAAI,iBAAiB,eAAe,SAKvE,CAAC;AAEF,eAAO,MAAM,wBAAwB,GAAI,kBAAkB,gBAAgB,SAK1E,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAU,UAAU,WAAW,EAAE,uBAAuB,MAAM,kBA6B7F,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAAU,aAAa,WAAW,EAAE,UAAU,WAAW,EAAE,QAAQ,UAAU,kBAkChH,CAAC;AAEF,eAAO,MAAM,2BAA2B,GAAU,UAAU,WAAW,EAAE,iBAAiB,eAAe,kBAMxG,CAAC;AAEF,eAAO,MAAM,4BAA4B,GAAU,UAAU,WAAW,EAAE,kBAAkB,eAAe,kBAM1G,CAAC"}
package/out/validators.js CHANGED
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.validateCancelJobAPIResponse = exports.validateGetStatsAPIResponse = exports.validatePushAPIResponse = exports.validateAPIResponse = exports.validateCancelJobRequest = exports.validateGetStatsPayload = exports.validatePushEvents = exports.validatePushSettings = exports.validateQueueKey = void 0;
3
+ exports.validateCancelJobAPIResponse = exports.validateGetStatsAPIResponse = exports.validatePushAPIResponse = exports.validateAPIResponse = exports.validateCancelJobRequest = exports.validateGetStatsPayload = exports.validatePushSettings = exports.validateQueueKey = void 0;
4
+ exports.validatePushEvents = validatePushEvents;
4
5
  const errors_1 = require("./errors");
5
6
  const text_1 = require("./text");
6
7
  const VALID_QUEUE_NAME_PATTERN = /^[a-zA-Z0-9-_]+$/;
@@ -41,7 +42,6 @@ function validatePushEvents(arg) {
41
42
  }
42
43
  return events;
43
44
  }
44
- exports.validatePushEvents = validatePushEvents;
45
45
  const validateGetStatsPayload = (getStatsRequest) => {
46
46
  if (!getStatsRequest.jobId) {
47
47
  throw new errors_1.JobDoesNotExistError(text_1.Text.error.jobIdEmpty);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@forge/events",
3
- "version": "2.1.6",
3
+ "version": "2.1.7-experimental-04cc2b9",
4
4
  "description": "Forge Async Event methods",
5
5
  "author": "Atlassian",
6
6
  "license": "SEE LICENSE IN LICENSE.txt",
@@ -12,12 +12,21 @@
12
12
  "compile": "tsc -b -v"
13
13
  },
14
14
  "devDependencies": {
15
- "@types/node": "20.19.1"
15
+ "@types/node": "20.19.1",
16
+ "typescript": "5.9.2"
16
17
  },
17
18
  "dependencies": {
18
- "@forge/api": "7.2.1"
19
+ "@forge/api": "7.2.2-experimental-04cc2b9"
19
20
  },
20
21
  "publishConfig": {
21
22
  "registry": "https://packages.atlassian.com/api/npm/npm-public/"
23
+ },
24
+ "peerDependencies": {
25
+ "typescript": ">=5.0.0"
26
+ },
27
+ "peerDependenciesMeta": {
28
+ "typescript": {
29
+ "optional": true
30
+ }
22
31
  }
23
32
  }