diff --git a/.gitignore b/.gitignore index 2b7422568..7f0368e0b 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,5 @@ test/e2e/generated samples/generated samples/swagger-codegen-cli-v2.jar samples/swagger-codegen-cli-v3.jar +output +bin/generator.js diff --git a/bin/index.js b/bin/index.js index ed8b0889b..d0f3499c5 100755 --- a/bin/index.js +++ b/bin/index.js @@ -19,6 +19,12 @@ const params = program .option('--exportCore ', 'Write core files to disk', true) .option('--exportServices ', 'Write services to disk', true) .option('--exportModels ', 'Write models to disk', true) + .option( + '--exportKotlinModels ', + 'Write kotlin models to disk. If this option is set. Only Kotlin models will be generated.', + false + ) + .option('--kotlinPackageName ', 'Name of the package for the generated Kotlin models.', 'com.models') .option('--exportSchemas ', 'Write schemas to disk', false) .option('--indent ', 'Indentation options [4, 2, tabs]', '4') .option('--postfix ', 'Deprecated: Use --postfixServices instead. Service name postfix', 'Service') @@ -28,7 +34,7 @@ const params = program .parse(process.argv) .opts(); -const OpenAPI = require(path.resolve(__dirname, '../dist/index.js')); +const OpenAPI = require(path.resolve(__dirname, './generator.js')); if (OpenAPI) { OpenAPI.generate({ @@ -41,6 +47,8 @@ if (OpenAPI) { exportCore: JSON.parse(params.exportCore) === true, exportServices: JSON.parse(params.exportServices) === true, exportModels: JSON.parse(params.exportModels) === true, + exportKotlinModels: JSON.parse(params.exportModels) === true, + kotlinPackageName: params.kotlinPackageName, exportSchemas: JSON.parse(params.exportSchemas) === true, indent: params.indent, postfixServices: params.postfixServices ?? params.postfix, diff --git a/package.json b/package.json index f801755be..50c21a7fd 100644 --- a/package.json +++ b/package.json @@ -31,14 +31,14 @@ "email": "info@madebyferdi.com" } ], - "main": "dist/index.js", + "main": "bin/generator.js", "types": "types/index.d.ts", "bin": { "openapi": "bin/index.js" }, "files": [ "bin/index.js", - "dist/index.js", + "bin/generator.js", "types/index.d.ts" ], "scripts": { @@ -120,7 +120,7 @@ "typescript": "4.8.4", "zone.js": "0.11.8" }, - "overrides" : { + "overrides": { "rollup": "3.2.3" } } diff --git a/rollup.config.mjs b/rollup.config.mjs index df7373395..7d2897b96 100644 --- a/rollup.config.mjs +++ b/rollup.config.mjs @@ -34,10 +34,12 @@ const handlebarsPlugin = () => ({ notEquals: true, containsSpaces: true, union: true, + kotlinUnion: true, intersection: true, enumerator: true, escapeComment: true, escapeDescription: true, + rawValue: true, camelCase: true, }, }); @@ -68,7 +70,7 @@ export default { input: './src/index.ts', output: { exports: 'named', - file: './dist/index.js', + file: './bin/generator.js', format: 'cjs', }, external: ['camelcase', 'commander', 'fs-extra', 'handlebars', 'json-schema-ref-parser'], diff --git a/src/client/interfaces/Model.d.ts b/src/client/interfaces/Model.d.ts index 5f0318942..edf75580b 100644 --- a/src/client/interfaces/Model.d.ts +++ b/src/client/interfaces/Model.d.ts @@ -15,4 +15,5 @@ export interface Model extends Schema { enum: Enum[]; enums: Model[]; properties: Model[]; + referencedAsAllOf?: boolean; } diff --git a/src/index.ts b/src/index.ts index e63919085..bf4dddf64 100644 --- a/src/index.ts +++ b/src/index.ts @@ -22,6 +22,8 @@ export type Options = { exportCore?: boolean; exportServices?: boolean; exportModels?: boolean; + exportKotlinModels?: boolean; + kotlinPackageName?: string; exportSchemas?: boolean; indent?: Indent; postfixServices?: string; @@ -43,6 +45,8 @@ export type Options = { * @param exportCore Generate core client classes * @param exportServices Generate services * @param exportModels Generate models + * @param exportKotlinModels Generate models for Kotlin + * @param kotlinPackageName Kotlin package name * @param exportSchemas Generate schemas * @param indent Indentation options (4, 2 or tab) * @param postfixServices Service name postfix @@ -60,11 +64,13 @@ export const generate = async ({ exportCore = true, exportServices = true, exportModels = true, + exportKotlinModels = false, exportSchemas = false, indent = Indent.SPACE_4, postfixServices = 'Service', postfixModels = '', request, + kotlinPackageName = '', write = true, }: Options): Promise => { const openApi = isString(input) ? await getOpenApiSpec(input) : input; @@ -90,6 +96,8 @@ export const generate = async ({ exportCore, exportServices, exportModels, + exportKotlinModels, + kotlinPackageName, exportSchemas, indent, postfixServices, @@ -114,6 +122,8 @@ export const generate = async ({ exportCore, exportServices, exportModels, + exportKotlinModels, + kotlinPackageName, exportSchemas, indent, postfixServices, diff --git a/src/templates/exportKotlinModel.hbs b/src/templates/exportKotlinModel.hbs new file mode 100644 index 000000000..3cb9ec0ec --- /dev/null +++ b/src/templates/exportKotlinModel.hbs @@ -0,0 +1,11 @@ +package {{kotlinPackageName}} + +import kotlin.collections.* + +{{#equals export 'enum'}} +{{>exportKotlinEnum}} +{{else equals export 'all-of'}} +{{>exportKotlinClassWithSuper}} +{{else}} +{{>exportKotlinClass}} +{{/equals}} diff --git a/src/templates/partials/baseKotlin.hbs b/src/templates/partials/baseKotlin.hbs new file mode 100644 index 000000000..6864c8016 --- /dev/null +++ b/src/templates/partials/baseKotlin.hbs @@ -0,0 +1,12 @@ +{{~#equals base 'string'}} +{{~#equals format 'uuid'}}java.util.UUID +{{~else}}String{{/equals~}} +{{~else equals base 'number'}} +{{~#equals format 'integer'}}Int +{{~else equals format 'float'}}Float +{{~else equals format 'double'}}Double +{{~else}}Long +{{/equals~}} +{{~else equals base 'boolean'}}Boolean +{{~else}}{{base}} +{{/equals~}} diff --git a/src/templates/partials/exportKotlinClass.hbs b/src/templates/partials/exportKotlinClass.hbs new file mode 100644 index 000000000..03a5550f7 --- /dev/null +++ b/src/templates/partials/exportKotlinClass.hbs @@ -0,0 +1,76 @@ +{{#ifdef description deprecated}} +/** +{{#if description}} + * {{{escapeComment description}}} +{{/if}} +{{#if deprecated}} + * @deprecated +{{/if}} + */ +{{/ifdef}} +{{#if referencedAsAllOf}}open{{else}}data{{/if}} class {{{name}}} ( + {{#each properties}} + {{#ifdef description deprecated}} + /** + {{#if description}} + * {{{escapeComment description}}} + {{/if}} + {{#if deprecated}} + * @deprecated + {{/if}} + */ + {{/ifdef}} + {{#if ../referencedAsAllOf}}open {{/if}}var {{{name}}}: {{>typeKotlin parent=../name}}{{>isRequired}}{{#unless isRequired}} = null{{/unless}}, + {{/each}} +) +{{#if enums}} +{{#unless @root.useUnionTypes}} + +{{#each enums}} +{{#if description}} +/** +* {{{escapeComment description}}} +*/ +{{/if}} +enum class {{../name}}_{{{name}}} { +{{#each enum}} +{{{name}}}, +{{/each}} +} +{{~/each~}} +{{~/unless~}} +{{~/if~}} + +{{#if properties}} +{{#each properties}} +{{#if properties}} + +{{#ifdef description deprecated}} +/** +{{#if description}} +* {{{escapeComment description}}} +{{/if}} +{{#if deprecated}} +* @deprecated +{{/if}} +*/ +{{/ifdef}} +data class {{../name}}_{{{name}}} ( + {{#each properties}} + {{#ifdef description deprecated}} + /** + {{#if description}} + * {{{escapeComment description}}} + {{/if}} + {{#if deprecated}} + * @deprecated + {{/if}} + */ + {{/ifdef}} + var {{{name}}}: {{>typeKotlin parent=../name}}{{>isRequired}}{{#unless isRequired}} = null{{/unless}}, + {{/each}} +) + +{{~/if~}} +{{~/each~}} +{{~/if~}} diff --git a/src/templates/partials/exportKotlinClassWithSuper.hbs b/src/templates/partials/exportKotlinClassWithSuper.hbs new file mode 100644 index 000000000..b50f2795b --- /dev/null +++ b/src/templates/partials/exportKotlinClassWithSuper.hbs @@ -0,0 +1,87 @@ +{{#ifdef description deprecated}} +/** +{{#if description}} + * {{{escapeComment description}}} +{{/if}} +{{#if deprecated}} + * @deprecated +{{/if}} + */ +{{/ifdef}} +data class {{{name}}} ( + {{#each properties}} + {{#equals name "properties"}} + {{#each properties}} + {{#ifdef description deprecated}} + /** + {{#if description}} + * {{{escapeComment description}}} + {{/if}} + {{#if deprecated}} + * @deprecated + {{/if}} + */ + {{/ifdef}} + var {{{name}}}: {{>typeKotlin parent=../name}}{{>isRequired}}{{#unless isRequired}} = null{{/unless}}, + {{/each}} + {{/equals}} + {{/each}} +): {{#each imports}}{{this}}(){{/each}} +{{#if enums}} +{{#unless @root.useUnionTypes}} + +{{#each enums}} +{{#if description}} +/** +* {{{escapeComment description}}} +*/ +{{/if}} +enum class {{../name}}_{{{name}}} { +{{#each enum}} +{{{name}}}, +{{/each}} +} +{{~/each~}} +{{~/unless~}} +{{~/if~}} + + +{{#if properties}} +{{#each properties}} +{{#if properties}} +{{#notEquals name "properties"}} + +{{#ifdef description deprecated}} +/** +{{#if description}} +* {{{escapeComment description}}} +{{/if}} +{{#if deprecated}} +* @deprecated +{{/if}} +*/ +{{/ifdef}} +data class {{../name}}_{{{name}}} ( + {{#each properties}} + {{#equals name "properties"}} + {{#each properties}} + {{#ifdef description deprecated}} + /** + {{#if description}} + * {{{escapeComment description}}} + {{/if}} + {{#if deprecated}} + * @deprecated + {{/if}} + */ + {{/ifdef}} + var {{{name}}}: {{>typeKotlin parent=../name}}{{>isRequired}}{{#unless isRequired}} = null{{/unless}}, + {{/each}} + {{/equals}} + {{/each}} +) + +{{/notEquals}} +{{~/if~}} +{{~/each~}} +{{~/if~}} diff --git a/src/templates/partials/exportKotlinEnum.hbs b/src/templates/partials/exportKotlinEnum.hbs new file mode 100644 index 000000000..12b6a6597 --- /dev/null +++ b/src/templates/partials/exportKotlinEnum.hbs @@ -0,0 +1,20 @@ +{{#ifdef description deprecated}} +/** +{{#if description}} + * {{{escapeComment description}}} +{{/if}} +{{#if deprecated}} + * @deprecated +{{/if}} + */ +{{/ifdef}} +enum class {{{name}}} { + {{#each enum}} + {{#if description}} + /** + * {{{escapeComment description}}} + */ + {{/if}} + {{{rawValue value}}}, + {{/each}} +} diff --git a/src/templates/partials/typeKotlin.hbs b/src/templates/partials/typeKotlin.hbs new file mode 100644 index 000000000..6e829fc3d --- /dev/null +++ b/src/templates/partials/typeKotlin.hbs @@ -0,0 +1,19 @@ +{{#equals export 'interface'}} +{{>typeKotlinEnum}} +{{else equals export 'reference'}} +{{>typeKotlinReference}} +{{else equals export 'enum'}} +{{>typeKotlinEnum}} +{{else equals export 'array'}} +{{>typeKotlinArray}} +{{else equals export 'dictionary'}} +{{>typeKotlinDictionary}} +{{else equals export 'one-of'}} +typeUnionOneOf {{>typeKotlinUnion}} +{{else equals export 'any-of'}} +{{>typeKotlinUnion}} +{{else equals export 'all-of'}} +typeIntersection {{>typeIntersection}} +{{else}} +{{>typeKotlinReference}} +{{/equals}} diff --git a/src/templates/partials/typeKotlinArray.hbs b/src/templates/partials/typeKotlinArray.hbs new file mode 100644 index 000000000..0c82f24d6 --- /dev/null +++ b/src/templates/partials/typeKotlinArray.hbs @@ -0,0 +1,5 @@ +{{~#if link~}} +List<{{>typeKotlin link}}>{{>isNullable}} +{{~else~}} +List<{{>baseKotlin}}>{{>isNullable}} +{{~/if~}} diff --git a/src/templates/partials/typeKotlinDictionary.hbs b/src/templates/partials/typeKotlinDictionary.hbs new file mode 100644 index 000000000..91c1d971e --- /dev/null +++ b/src/templates/partials/typeKotlinDictionary.hbs @@ -0,0 +1,5 @@ +{{~#if link~}} +MaptypeKotlin link}}>{{>isNullable}} +{{~else~}} +MapbaseKotlin}}>{{>isNullable}} +{{~/if~}} diff --git a/src/templates/partials/typeKotlinEnum.hbs b/src/templates/partials/typeKotlinEnum.hbs new file mode 100644 index 000000000..3c0a4b970 --- /dev/null +++ b/src/templates/partials/typeKotlinEnum.hbs @@ -0,0 +1,2 @@ +{{parent}}_{{name}}{{>isNullable}} + diff --git a/src/templates/partials/typeKotlinReference.hbs b/src/templates/partials/typeKotlinReference.hbs new file mode 100644 index 000000000..6ced8ffcb --- /dev/null +++ b/src/templates/partials/typeKotlinReference.hbs @@ -0,0 +1 @@ +{{>baseKotlin}}{{>isNullable}} diff --git a/src/templates/partials/typeKotlinUnion.hbs b/src/templates/partials/typeKotlinUnion.hbs new file mode 100644 index 000000000..ab7aa8611 --- /dev/null +++ b/src/templates/partials/typeKotlinUnion.hbs @@ -0,0 +1 @@ +{{~#kotlinUnion properties parent}}{{this}}{{~/kotlinUnion}}{{>isNullable}} diff --git a/src/utils/registerHandlebarHelpers.spec.ts b/src/utils/registerHandlebarHelpers.spec.ts index f8347abdb..994a30bca 100644 --- a/src/utils/registerHandlebarHelpers.spec.ts +++ b/src/utils/registerHandlebarHelpers.spec.ts @@ -16,6 +16,7 @@ describe('registerHandlebarHelpers', () => { expect(helpers).toContain('notEquals'); expect(helpers).toContain('containsSpaces'); expect(helpers).toContain('union'); + expect(helpers).toContain('kotlinUnion'); expect(helpers).toContain('intersection'); expect(helpers).toContain('enumerator'); expect(helpers).toContain('escapeComment'); diff --git a/src/utils/registerHandlebarHelpers.ts b/src/utils/registerHandlebarHelpers.ts index 88f47c19b..26cafe8c7 100644 --- a/src/utils/registerHandlebarHelpers.ts +++ b/src/utils/registerHandlebarHelpers.ts @@ -55,6 +55,25 @@ export const registerHandlebarHelpers = (root: { } ); + Handlebars.registerHelper( + 'kotlinUnion', + function (this: any, properties: Model[], parent: string | undefined, options: Handlebars.HelperOptions) { + const type = Handlebars.partials['typeKotlin']; + const types = properties.map(property => type({ ...root, ...property, parent })); + const uniqueTypes = types.filter(unique); + let uniqueTypesString = uniqueTypes.join(' | '); + if (uniqueTypes.includes('null') && uniqueTypes.length === 2) { + uniqueTypesString = `${uniqueTypes.filter(type => type !== 'null')[0]}?`; + } else { + uniqueTypesString = uniqueTypes.join(' | '); + if (uniqueTypes.length > 1) { + uniqueTypesString = `(${uniqueTypesString})`; + } + } + return options.fn(uniqueTypesString); + } + ); + Handlebars.registerHelper( 'intersection', function (this: any, properties: Model[], parent: string | undefined, options: Handlebars.HelperOptions) { @@ -104,4 +123,13 @@ export const registerHandlebarHelpers = (root: { Handlebars.registerHelper('camelCase', function (value: string): string { return camelCase(value); }); + + Handlebars.registerHelper('json', function (this: any): string { + return JSON.stringify(this, null, 4); + }); + + console.log('registerHandlebarHelpers'); + Handlebars.registerHelper('rawValue', function (value: string): string { + return value.replace(RegExp("'", 'g'), ''); + }); }; diff --git a/src/utils/registerHandlebarTemplates.ts b/src/utils/registerHandlebarTemplates.ts index bf77cbdc1..80a7d29cf 100644 --- a/src/utils/registerHandlebarTemplates.ts +++ b/src/utils/registerHandlebarTemplates.ts @@ -52,14 +52,19 @@ import xhrGetResponseBody from '../templates/core/xhr/getResponseBody.hbs'; import xhrGetResponseHeader from '../templates/core/xhr/getResponseHeader.hbs'; import xhrRequest from '../templates/core/xhr/request.hbs'; import xhrSendRequest from '../templates/core/xhr/sendRequest.hbs'; +import templateExportKotlinModel from '../templates/exportKotlinModel.hbs'; import templateExportModel from '../templates/exportModel.hbs'; import templateExportSchema from '../templates/exportSchema.hbs'; import templateExportService from '../templates/exportService.hbs'; import templateIndex from '../templates/index.hbs'; import partialBase from '../templates/partials/base.hbs'; +import partialBaseKotlin from '../templates/partials/baseKotlin.hbs'; import partialExportComposition from '../templates/partials/exportComposition.hbs'; import partialExportEnum from '../templates/partials/exportEnum.hbs'; import partialExportInterface from '../templates/partials/exportInterface.hbs'; +import partialExportKotlinClass from '../templates/partials/exportKotlinClass.hbs'; +import partialExportKotlinClassWithSuper from '../templates/partials/exportKotlinClassWithSuper.hbs'; +import partialExportKotlinEnum from '../templates/partials/exportKotlinEnum.hbs'; import partialExportType from '../templates/partials/exportType.hbs'; import partialHeader from '../templates/partials/header.hbs'; import partialIsNullable from '../templates/partials/isNullable.hbs'; @@ -81,8 +86,14 @@ import partialTypeEnum from '../templates/partials/typeEnum.hbs'; import partialTypeGeneric from '../templates/partials/typeGeneric.hbs'; import partialTypeInterface from '../templates/partials/typeInterface.hbs'; import partialTypeIntersection from '../templates/partials/typeIntersection.hbs'; +import partialTypeKotlin from '../templates/partials/typeKotlin.hbs'; +import partialTypeKotlinArray from '../templates/partials/typeKotlinArray.hbs'; +import partialTypeKotlinDictionary from '../templates/partials/typeKotlinDictionary.hbs'; +import partialTypeKotlinEnum from '../templates/partials/typeKotlinEnum.hbs'; +import partialTypeKotlinReference from '../templates/partials/typeKotlinReference.hbs'; import partialTypeReference from '../templates/partials/typeReference.hbs'; import partialTypeUnion from '../templates/partials/typeUnion.hbs'; +import partialTypeKotlinUnion from '../templates/partials/typeKotlinUnion.hbs'; import { registerHandlebarHelpers } from './registerHandlebarHelpers'; export interface Templates { @@ -90,6 +101,7 @@ export interface Templates { client: Handlebars.TemplateDelegate; exports: { model: Handlebars.TemplateDelegate; + kotlinModel: Handlebars.TemplateDelegate; schema: Handlebars.TemplateDelegate; service: Handlebars.TemplateDelegate; }; @@ -122,6 +134,7 @@ export const registerHandlebarTemplates = (root: { client: Handlebars.template(templateClient), exports: { model: Handlebars.template(templateExportModel), + kotlinModel: Handlebars.template(templateExportKotlinModel), schema: Handlebars.template(templateExportSchema), service: Handlebars.template(templateExportService), }, @@ -139,7 +152,10 @@ export const registerHandlebarTemplates = (root: { // Partials for the generations of the models, services, etc. Handlebars.registerPartial('exportEnum', Handlebars.template(partialExportEnum)); + Handlebars.registerPartial('exportKotlinEnum', Handlebars.template(partialExportKotlinEnum)); Handlebars.registerPartial('exportInterface', Handlebars.template(partialExportInterface)); + Handlebars.registerPartial('exportKotlinClass', Handlebars.template(partialExportKotlinClass)); + Handlebars.registerPartial('exportKotlinClassWithSuper', Handlebars.template(partialExportKotlinClassWithSuper)); Handlebars.registerPartial('exportComposition', Handlebars.template(partialExportComposition)); Handlebars.registerPartial('exportType', Handlebars.template(partialExportType)); Handlebars.registerPartial('header', Handlebars.template(partialHeader)); @@ -156,15 +172,22 @@ export const registerHandlebarTemplates = (root: { Handlebars.registerPartial('schemaInterface', Handlebars.template(partialSchemaInterface)); Handlebars.registerPartial('schemaComposition', Handlebars.template(partialSchemaComposition)); Handlebars.registerPartial('type', Handlebars.template(partialType)); + Handlebars.registerPartial('typeKotlin', Handlebars.template(partialTypeKotlin)); Handlebars.registerPartial('typeArray', Handlebars.template(partialTypeArray)); + Handlebars.registerPartial('typeKotlinArray', Handlebars.template(partialTypeKotlinArray)); Handlebars.registerPartial('typeDictionary', Handlebars.template(partialTypeDictionary)); + Handlebars.registerPartial('typeKotlinDictionary', Handlebars.template(partialTypeKotlinDictionary)); Handlebars.registerPartial('typeEnum', Handlebars.template(partialTypeEnum)); + Handlebars.registerPartial('typeKotlinEnum', Handlebars.template(partialTypeKotlinEnum)); Handlebars.registerPartial('typeGeneric', Handlebars.template(partialTypeGeneric)); Handlebars.registerPartial('typeInterface', Handlebars.template(partialTypeInterface)); Handlebars.registerPartial('typeReference', Handlebars.template(partialTypeReference)); + Handlebars.registerPartial('typeKotlinReference', Handlebars.template(partialTypeKotlinReference)); Handlebars.registerPartial('typeUnion', Handlebars.template(partialTypeUnion)); + Handlebars.registerPartial('typeKotlinUnion', Handlebars.template(partialTypeKotlinUnion)); Handlebars.registerPartial('typeIntersection', Handlebars.template(partialTypeIntersection)); Handlebars.registerPartial('base', Handlebars.template(partialBase)); + Handlebars.registerPartial('baseKotlin', Handlebars.template(partialBaseKotlin)); // Generic functions used in 'request' file @see src/templates/core/request.hbs for more info Handlebars.registerPartial('functions/catchErrorCodes', Handlebars.template(functionCatchErrorCodes)); diff --git a/src/utils/writeClient.spec.ts b/src/utils/writeClient.spec.ts index 3c06a95a5..d618ff6b9 100644 --- a/src/utils/writeClient.spec.ts +++ b/src/utils/writeClient.spec.ts @@ -21,6 +21,7 @@ describe('writeClient', () => { client: () => 'client', exports: { model: () => 'model', + kotlinModel: () => 'kotlinModel', schema: () => 'schema', service: () => 'service', }, @@ -46,6 +47,8 @@ describe('writeClient', () => { true, true, true, + false, + '', true, Indent.SPACE_4, 'Service', diff --git a/src/utils/writeClient.ts b/src/utils/writeClient.ts index cea2f3d88..2d4707c7c 100644 --- a/src/utils/writeClient.ts +++ b/src/utils/writeClient.ts @@ -10,6 +10,7 @@ import type { Templates } from './registerHandlebarTemplates'; import { writeClientClass } from './writeClientClass'; import { writeClientCore } from './writeClientCore'; import { writeClientIndex } from './writeClientIndex'; +import { writeClientKotlinModels } from './writeClientKotlinModels'; import { writeClientModels } from './writeClientModels'; import { writeClientSchemas } from './writeClientSchemas'; import { writeClientServices } from './writeClientServices'; @@ -43,6 +44,8 @@ export const writeClient = async ( exportCore: boolean, exportServices: boolean, exportModels: boolean, + exportKotlinModels: boolean, + kotlinPackageName: string, exportSchemas: boolean, indent: Indent, postfixServices: string, @@ -51,11 +54,43 @@ export const writeClient = async ( request?: string ): Promise => { const outputPath = resolve(process.cwd(), output); + + await rmdir(outputPath); + await mkdir(outputPath); + const outputPathCore = resolve(outputPath, 'core'); const outputPathModels = resolve(outputPath, 'models'); const outputPathSchemas = resolve(outputPath, 'schemas'); const outputPathServices = resolve(outputPath, 'services'); + if (exportKotlinModels) { + console.log('Exporting Kotlin models'); + + const kotlinPackageNameSplit = kotlinPackageName.split('.'); + + const outputPathSrc = resolve(outputPath, 'src'); + const outputPathMain = resolve(outputPathSrc, 'main'); + const outputPathKotlin = resolve(outputPathMain, 'kotlin'); + + let output = outputPathKotlin; + for (const dir of kotlinPackageNameSplit) { + output = resolve(output, dir); + } + + await rmdir(output); + await mkdir(output); + await writeClientKotlinModels( + client.models, + templates, + output, + httpClient, + useUnionTypes, + indent, + kotlinPackageName + ); + return; + } + if (!isSubDirectory(process.cwd(), output)) { throw new Error(`Output folder is not a subdirectory of the current working directory`); } diff --git a/src/utils/writeClientClass.spec.ts b/src/utils/writeClientClass.spec.ts index 102f2eb57..c4d52469d 100644 --- a/src/utils/writeClientClass.spec.ts +++ b/src/utils/writeClientClass.spec.ts @@ -21,6 +21,7 @@ describe('writeClientClass', () => { client: () => 'client', exports: { model: () => 'model', + kotlinModel: () => 'kotlinModel', schema: () => 'schema', service: () => 'service', }, diff --git a/src/utils/writeClientCore.spec.ts b/src/utils/writeClientCore.spec.ts index 36990054e..4487fe9c1 100644 --- a/src/utils/writeClientCore.spec.ts +++ b/src/utils/writeClientCore.spec.ts @@ -23,6 +23,7 @@ describe('writeClientCore', () => { client: () => 'client', exports: { model: () => 'model', + kotlinModel: () => 'kotlinModel', schema: () => 'schema', service: () => 'service', }, diff --git a/src/utils/writeClientIndex.spec.ts b/src/utils/writeClientIndex.spec.ts index a74421115..e732341a2 100644 --- a/src/utils/writeClientIndex.spec.ts +++ b/src/utils/writeClientIndex.spec.ts @@ -19,6 +19,7 @@ describe('writeClientIndex', () => { client: () => 'client', exports: { model: () => 'model', + kotlinModel: () => 'kotlinModel', schema: () => 'schema', service: () => 'service', }, diff --git a/src/utils/writeClientKotlinModels.ts b/src/utils/writeClientKotlinModels.ts new file mode 100644 index 000000000..4734f96d9 --- /dev/null +++ b/src/utils/writeClientKotlinModels.ts @@ -0,0 +1,81 @@ +import { resolve } from 'path'; +import { Enum } from '../client/interfaces/Enum'; + +import type { Model } from '../client/interfaces/Model'; +import type { HttpClient } from '../HttpClient'; +import type { Indent } from '../Indent'; +import { writeFile } from './fileSystem'; +import { formatCode as f } from './formatCode'; +import { formatIndentation as i } from './formatIndentation'; +import type { Templates } from './registerHandlebarTemplates'; + +/** + * Generate Models using the Handlebar template and write to disk. + * @param models Array of Models to write + * @param templates The loaded handlebar templates + * @param outputPath Directory to write the generated files to + * @param httpClient The selected httpClient (fetch, xhr, node or axios) + * @param useUnionTypes Use union types instead of enums + * @param indent Indentation options (4, 2 or tab) + */ +export const writeClientKotlinModels = async ( + models: Model[], + templates: Templates, + outputPath: string, + httpClient: HttpClient, + useUnionTypes: boolean, + indent: Indent, + kotlinPackageName: string +): Promise => { + for (const model of models) { + if (model.export === 'all-of') { + const { realProps, realEnums, exportType } = getProperties(models, model); + + model.properties = realProps; + model.enum = realEnums; + model.export = exportType; + } + + const file = resolve(outputPath, `${model.name}.kt`); + const items = model.properties.length + model.enum.length + model.enums.length; + + if (items === 0) { + continue; + } + + const templateResult = templates.exports.kotlinModel({ + ...model, + kotlinPackageName, + }); + await writeFile(file, i(f(templateResult), indent)); + } +}; + +function getProperties(models: Model[], model: Model) { + const realProps: Model[] = []; + const realEnums: Enum[] = model.enum; + let exportType = model.export; + model.properties.forEach(prop => { + if (prop.name === '' && prop.export === 'reference') { + const inheritedType = models.find(m => m.name === prop.type); + if (inheritedType) { + const { realProps: inheritedProps, realEnums: inheritedEnums } = getProperties(models, inheritedType); + realProps.push(...inheritedProps); + realEnums.push(...inheritedEnums); + } + } else if (prop.export === 'all-of') { + const { realProps: inheritedProps, realEnums: inheritedEnums } = getProperties(models, prop); + realProps.push(...inheritedProps); + realEnums.push(...inheritedEnums); + } else if (prop.name === '' && prop.properties.length > 0) { + exportType = prop.export; + realProps.push(...prop.properties); + } else if (prop.export === 'enum' && prop.enum.length > 0) { + exportType = prop.export; + realEnums.push(...prop.enum); + } else { + realProps.push(prop); + } + }); + return { realProps, realEnums, exportType }; +} diff --git a/src/utils/writeClientModels.spec.ts b/src/utils/writeClientModels.spec.ts index e147c8e73..15883c5f3 100644 --- a/src/utils/writeClientModels.spec.ts +++ b/src/utils/writeClientModels.spec.ts @@ -36,6 +36,7 @@ describe('writeClientModels', () => { client: () => 'client', exports: { model: () => 'model', + kotlinModel: () => 'kotlinModel', schema: () => 'schema', service: () => 'service', }, diff --git a/src/utils/writeClientSchemas.spec.ts b/src/utils/writeClientSchemas.spec.ts index f71286232..58d00d994 100644 --- a/src/utils/writeClientSchemas.spec.ts +++ b/src/utils/writeClientSchemas.spec.ts @@ -36,6 +36,7 @@ describe('writeClientSchemas', () => { client: () => 'client', exports: { model: () => 'model', + kotlinModel: () => 'kotlinModel', schema: () => 'schema', service: () => 'service', }, diff --git a/src/utils/writeClientServices.spec.ts b/src/utils/writeClientServices.spec.ts index b7ebbfe6c..6c84d641a 100644 --- a/src/utils/writeClientServices.spec.ts +++ b/src/utils/writeClientServices.spec.ts @@ -24,6 +24,7 @@ describe('writeClientServices', () => { client: () => 'client', exports: { model: () => 'model', + kotlinModel: () => 'kotlinModel', schema: () => 'schema', service: () => 'service', }, diff --git a/test.json b/test.json new file mode 100644 index 000000000..cddd67abc --- /dev/null +++ b/test.json @@ -0,0 +1,4261 @@ +[ + { + "name": "CFDPosition", + "export": "all-of", + "type": "any", + "base": "any", + "template": null, + "link": null, + "description": "Details of account CFD holdings grouped by instrument", + "deprecated": false, + "isDefinition": true, + "isReadOnly": false, + "isNullable": false, + "isRequired": false, + "imports": ["Position"], + "enum": [], + "enums": [], + "properties": [ + { + "name": "", + "export": "reference", + "type": "Position", + "base": "Position", + "template": null, + "link": null, + "description": null, + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isNullable": false, + "isRequired": false, + "imports": ["Position"], + "enum": [], + "enums": [], + "properties": [] + }, + { + "name": "properties", + "export": "interface", + "type": "any", + "base": "any", + "template": null, + "link": null, + "description": "", + "isDefinition": false, + "isReadOnly": false, + "isNullable": false, + "isRequired": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [ + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "marginAmountInPrimaryCurrency", + "description": "Amount of capital (in primary account currency) required to cover the margin requirement for the position. (CFD positions only)", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": true + }, + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "marginPercentage", + "description": "Amount of capital (in primary account currency) required to cover the margin requirement for the position. (CFD positions only)", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": true + } + ] + } + ] + }, + { + "name": "OrderType", + "export": "enum", + "type": "string", + "base": "string", + "template": null, + "link": null, + "description": "The way in which the order is to be executed.", + "deprecated": false, + "isDefinition": true, + "isReadOnly": false, + "isNullable": false, + "isRequired": false, + "imports": [], + "enum": [ + { + "name": "MARKET", + "description": null, + "value": "'Market'", + "type": "string" + }, + { + "name": "LIMIT", + "description": null, + "value": "'Limit'", + "type": "string" + }, + { + "name": "STOP_ENTRY", + "description": null, + "value": "'StopEntry'", + "type": "string" + } + ], + "enums": [], + "properties": [] + }, + { + "name": "Direction", + "export": "enum", + "type": "string", + "base": "string", + "template": null, + "link": null, + "description": "Direction of the order.", + "deprecated": false, + "isDefinition": true, + "isReadOnly": false, + "isNullable": false, + "isRequired": false, + "imports": [], + "enum": [ + { + "name": "BUY", + "description": null, + "value": "'Buy'", + "type": "string" + }, + { + "name": "SELL", + "description": null, + "value": "'Sell'", + "type": "string" + } + ], + "enums": [], + "properties": [] + }, + { + "name": "ProductType", + "export": "enum", + "type": "string", + "base": "string", + "template": null, + "link": null, + "description": "The way in which the underlying instrument is to be traded.", + "deprecated": false, + "isDefinition": true, + "isReadOnly": false, + "isNullable": false, + "isRequired": false, + "imports": [], + "enum": [ + { + "name": "CFD", + "description": null, + "value": "'CFD'", + "type": "string" + }, + { + "name": "EQUITY", + "description": null, + "value": "'Equity'", + "type": "string" + }, + { + "name": "FX", + "description": null, + "value": "'FX'", + "type": "string" + } + ], + "enums": [], + "properties": [] + }, + { + "name": "TriggerSide", + "export": "enum", + "type": "string", + "base": "string", + "template": null, + "link": null, + "description": "The side of the market which is used to trigger the order - if empty, assume normal side (CFD StopEntry orders only)", + "deprecated": false, + "isDefinition": true, + "isReadOnly": false, + "isNullable": false, + "isRequired": false, + "imports": [], + "enum": [ + { + "name": "ASK", + "description": null, + "value": "'Ask'", + "type": "string" + }, + { + "name": "MID", + "description": null, + "value": "'Mid'", + "type": "string" + }, + { + "name": "BID", + "description": null, + "value": "'Bid'", + "type": "string" + } + ], + "enums": [], + "properties": [] + }, + { + "name": "TimeInForce", + "export": "enum", + "type": "string", + "base": "string", + "template": null, + "link": null, + "description": "Instruction to control how long the order remains active before it is executed or expires.", + "deprecated": false, + "isDefinition": true, + "isReadOnly": false, + "isNullable": false, + "isRequired": false, + "imports": [], + "enum": [ + { + "name": "DAY", + "description": null, + "value": "'Day'", + "type": "string" + }, + { + "name": "FILL_OR_KILL", + "description": null, + "value": "'FillOrKill'", + "type": "string" + }, + { + "name": "IMMEDIATE_OR_CANCEL", + "description": null, + "value": "'ImmediateOrCancel'", + "type": "string" + }, + { + "name": "GOOD_TILL_CANCEL", + "description": null, + "value": "'GoodTillCancel'", + "type": "string" + }, + { + "name": "GOOD_TILL_DATE", + "description": null, + "value": "'GoodTillDate'", + "type": "string" + } + ], + "enums": [], + "properties": [] + }, + { + "name": "OrderStatus", + "export": "enum", + "type": "string", + "base": "string", + "template": null, + "link": null, + "description": "Status of the order", + "deprecated": false, + "isDefinition": true, + "isReadOnly": false, + "isNullable": false, + "isRequired": false, + "imports": [], + "enum": [ + { + "name": "NEW", + "description": null, + "value": "'New'", + "type": "string" + }, + { + "name": "PARTIALLY_FILLED", + "description": null, + "value": "'PartiallyFilled'", + "type": "string" + }, + { + "name": "FILLED", + "description": null, + "value": "'Filled'", + "type": "string" + }, + { + "name": "CANCELED", + "description": null, + "value": "'Canceled'", + "type": "string" + }, + { + "name": "CANCELED_BY_USER", + "description": null, + "value": "'CanceledByUser'", + "type": "string" + }, + { + "name": "PENDING_CANCEL", + "description": null, + "value": "'PendingCancel'", + "type": "string" + }, + { + "name": "EXPIRED", + "description": null, + "value": "'Expired'", + "type": "string" + }, + { + "name": "STOPPED", + "description": null, + "value": "'Stopped'", + "type": "string" + }, + { + "name": "REJECTED", + "description": null, + "value": "'Rejected'", + "type": "string" + }, + { + "name": "FAILED", + "description": null, + "value": "'Failed'", + "type": "string" + }, + { + "name": "UNKNOWN", + "description": null, + "value": "'Unknown'", + "type": "string" + } + ], + "enums": [], + "properties": [] + }, + { + "name": "OrderPriceCondition", + "export": "enum", + "type": "string", + "base": "string", + "template": null, + "link": null, + "description": "Price condition of the order. It will only be populated if the order has a type of StopEntry, Limit", + "deprecated": false, + "isDefinition": true, + "isReadOnly": false, + "isNullable": false, + "isRequired": false, + "imports": [], + "enum": [ + { + "name": "LESS_OR_EQUAL", + "description": null, + "value": "'LessOrEqual'", + "type": "string" + }, + { + "name": "GREATER_OR_EQUAL", + "description": null, + "value": "'GreaterOrEqual'", + "type": "string" + } + ], + "enums": [], + "properties": [] + }, + { + "name": "StopOrderType", + "export": "enum", + "type": "string", + "base": "string", + "template": null, + "link": null, + "description": "Type of contingent stop order associated with this order. (CFD orders only).", + "deprecated": false, + "isDefinition": true, + "isReadOnly": false, + "isNullable": false, + "isRequired": false, + "imports": [], + "enum": [ + { + "name": "STANDARD", + "description": null, + "value": "'Standard'", + "type": "string" + }, + { + "name": "TRAILING", + "description": null, + "value": "'Trailing'", + "type": "string" + }, + { + "name": "GUARANTEED", + "description": null, + "value": "'Guaranteed'", + "type": "string" + } + ], + "enums": [], + "properties": [] + }, + { + "name": "Order", + "export": "interface", + "type": "any", + "base": "any", + "template": null, + "link": null, + "description": "Details of the equity order", + "deprecated": false, + "isDefinition": true, + "isReadOnly": false, + "isNullable": false, + "isRequired": false, + "imports": [ + "Direction", + "OrderPriceCondition", + "OrderStatus", + "OrderType", + "ProductType", + "StopOrderType", + "TimeInForce", + "TriggerSide" + ], + "enum": [], + "enums": [], + "properties": [ + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "transactionId", + "description": "Client side generated unique transaction identifier.", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": true + }, + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "orderId", + "description": "Unique Id for the order", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": true + }, + { + "export": "reference", + "type": "OrderType", + "base": "OrderType", + "template": null, + "link": null, + "isNullable": false, + "imports": ["OrderType"], + "enum": [], + "enums": [], + "properties": [], + "name": "orderType", + "description": null, + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": true + }, + { + "export": "reference", + "type": "Direction", + "base": "Direction", + "template": null, + "link": null, + "isNullable": false, + "imports": ["Direction"], + "enum": [], + "enums": [], + "properties": [], + "name": "orderDirection", + "description": null, + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": true + }, + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "orderQuantity", + "description": "Requested quantity of the units to be bought or sold.", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": true + }, + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "instrumentId", + "description": "CMC Markets indentifer for the underlying instrument of the order.", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": true + }, + { + "export": "reference", + "type": "ProductType", + "base": "ProductType", + "template": null, + "link": null, + "isNullable": false, + "imports": ["ProductType"], + "enum": [], + "enums": [], + "properties": [], + "name": "productType", + "description": null, + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": true + }, + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "orderPrice", + "description": "Price of the order. It will only be populated if the order has a type of Limit or StopEntry.", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "reference", + "type": "TriggerSide", + "base": "TriggerSide", + "template": null, + "link": null, + "isNullable": false, + "imports": ["TriggerSide"], + "enum": [], + "enums": [], + "properties": [], + "name": "orderTriggerSide", + "description": null, + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "orderBoundaryPrice", + "description": "Execution boundary price of the order. (CFD Market and StopEntry orders only)", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "reference", + "type": "TimeInForce", + "base": "TimeInForce", + "template": null, + "link": null, + "isNullable": false, + "imports": ["TimeInForce"], + "enum": [], + "enums": [], + "properties": [], + "name": "timeInForce", + "description": null, + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "expiryDate", + "description": "Expiry date of the order. It will only be populated if the order has a time in force of GoodTillDate.", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "reference", + "type": "OrderStatus", + "base": "OrderStatus", + "template": null, + "link": null, + "isNullable": false, + "imports": ["OrderStatus"], + "enum": [], + "enums": [], + "properties": [], + "name": "orderStatus", + "description": null, + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": true + }, + { + "export": "reference", + "type": "OrderPriceCondition", + "base": "OrderPriceCondition", + "template": null, + "link": null, + "isNullable": false, + "imports": ["OrderPriceCondition"], + "enum": [], + "enums": [], + "properties": [], + "name": "orderPriceCondition", + "description": null, + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "reference", + "type": "StopOrderType", + "base": "StopOrderType", + "template": null, + "link": null, + "isNullable": false, + "imports": ["StopOrderType"], + "enum": [], + "enums": [], + "properties": [], + "name": "contingentStopOrderType", + "description": null, + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "contingentStopOrderPrice", + "description": "Target price for the contingent stop order. (CFD orders only).", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "reference", + "type": "TriggerSide", + "base": "TriggerSide", + "template": null, + "link": null, + "isNullable": false, + "imports": ["TriggerSide"], + "enum": [], + "enums": [], + "properties": [], + "name": "contingentStopOrderTriggerSide", + "description": "The side of the market which is used to trigger the contingent stop order - if empty, assume normal side. (CFD orders only)", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "contingentLimitOrderPrice", + "description": "Target price for the contingent limit order. (CFD orders only).", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "filledVWAP", + "description": "Current volume weighted average fill price for the order.", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "filledQuantity", + "description": "Current filled quantity for the order.", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": true + } + ] + }, + { + "name": "OrderPostType", + "export": "enum", + "type": "string", + "base": "string", + "template": null, + "link": null, + "description": "The way in which the order is to be executed.", + "deprecated": false, + "isDefinition": true, + "isReadOnly": false, + "isNullable": false, + "isRequired": false, + "imports": [], + "enum": [ + { + "name": "MARKET", + "description": null, + "value": "'Market'", + "type": "string" + }, + { + "name": "LIMIT", + "description": null, + "value": "'Limit'", + "type": "string" + } + ], + "enums": [], + "properties": [] + }, + { + "name": "OrderPostTimeInForce", + "export": "enum", + "type": "string", + "base": "string", + "template": null, + "link": null, + "description": "Instruction to control how long the order remains active before it is executed or expires.", + "deprecated": false, + "isDefinition": true, + "isReadOnly": false, + "isNullable": false, + "isRequired": false, + "imports": [], + "enum": [ + { + "name": "DAY", + "description": null, + "value": "'Day'", + "type": "string" + }, + { + "name": "IMMEDIATE_OR_CANCEL", + "description": null, + "value": "'ImmediateOrCancel'", + "type": "string" + }, + { + "name": "FILL_OR_KILL", + "description": null, + "value": "'FillOrKill'", + "type": "string" + } + ], + "enums": [], + "properties": [] + }, + { + "name": "Currency", + "export": "enum", + "type": "string", + "base": "string", + "template": null, + "link": null, + "description": "Which of the trading currencies available to the account to book the order under. If not set, the default account currency will be used.", + "deprecated": false, + "isDefinition": true, + "isReadOnly": false, + "isNullable": false, + "isRequired": false, + "imports": [], + "enum": [ + { + "name": "GBP", + "description": null, + "value": "'GBP'", + "type": "string" + }, + { + "name": "EUR", + "description": null, + "value": "'EUR'", + "type": "string" + }, + { + "name": "USD", + "description": null, + "value": "'USD'", + "type": "string" + }, + { + "name": "CHF", + "description": null, + "value": "'CHF'", + "type": "string" + }, + { + "name": "NOK", + "description": null, + "value": "'NOK'", + "type": "string" + }, + { + "name": "SEK", + "description": null, + "value": "'SEK'", + "type": "string" + }, + { + "name": "AED", + "description": null, + "value": "'AED'", + "type": "string" + }, + { + "name": "PLN", + "description": null, + "value": "'PLN'", + "type": "string" + } + ], + "enums": [], + "properties": [] + }, + { + "name": "OrderPostRequest", + "export": "interface", + "type": "any", + "base": "any", + "template": null, + "link": null, + "description": "Equity orders post request", + "deprecated": false, + "isDefinition": true, + "isReadOnly": false, + "isNullable": false, + "isRequired": false, + "imports": ["Currency", "Direction", "OrderPostTimeInForce", "OrderPostType"], + "enum": [], + "enums": [ + { + "export": "enum", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [ + { + "name": "EQUITY", + "description": null, + "value": "'Equity'", + "type": "string" + } + ], + "enums": [], + "properties": [], + "name": "productType", + "description": "The way in which the underlying instrument is to be traded.", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": true + } + ], + "properties": [ + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "transactionId", + "description": "Client side generated unique transaction identifier.", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": true + }, + { + "export": "reference", + "type": "OrderPostType", + "base": "OrderPostType", + "template": null, + "link": null, + "isNullable": false, + "imports": ["OrderPostType"], + "enum": [], + "enums": [], + "properties": [], + "name": "orderType", + "description": null, + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": true + }, + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "orderQuantity", + "description": "Quantity of units to be bought or sold. Availability of fractional trading dependant on product configuration.", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": true + }, + { + "export": "reference", + "type": "Direction", + "base": "Direction", + "template": null, + "link": null, + "isNullable": false, + "imports": ["Direction"], + "enum": [], + "enums": [], + "properties": [], + "name": "orderDirection", + "description": null, + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": true + }, + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "instrumentId", + "description": "CMC Markets indentifer for the underlying instrument of the order.", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": true + }, + { + "export": "enum", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [ + { + "name": "EQUITY", + "description": null, + "value": "'Equity'", + "type": "string" + } + ], + "enums": [], + "properties": [], + "name": "productType", + "description": "The way in which the underlying instrument is to be traded.", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": true + }, + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "limitPrice", + "description": "Specified price to match or beat for Limit orders. (required if orderType = Limit)", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "reference", + "type": "OrderPostTimeInForce", + "base": "OrderPostTimeInForce", + "template": null, + "link": null, + "isNullable": false, + "imports": ["OrderPostTimeInForce"], + "enum": [], + "enums": [], + "properties": [], + "name": "timeInForce", + "description": null, + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "reference", + "type": "Currency", + "base": "Currency", + "template": null, + "link": null, + "isNullable": false, + "imports": ["Currency"], + "enum": [], + "enums": [], + "properties": [], + "name": "requestedAccountCurrency", + "description": null, + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "clientStateQuoteBid", + "description": "Current bid price for the instrument that the user sees in the order panel.", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "clientStateQuoteAsk", + "description": "Current ask price for the instrument that the user sees in the order panel.", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "clientStateQuoteId", + "description": "Unique identifer for the price quote for the instrument that the user sees in the order panel. (internal only)", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "clientStateParams", + "description": "Bitmask encoded string holding information about the customers settings on the frontend when placing an order. (internal only)", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "generic", + "type": "number", + "base": "number", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "clientStateRequestTime", + "description": "Timestamp for the point in time at which the order was submited from the client GUI, expressed as the number of milliseconds since epoch. (internal only)", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + } + ] + }, + { + "name": "OrderPostResponse", + "export": "interface", + "type": "any", + "base": "any", + "template": null, + "link": null, + "description": "Equity orders post response details", + "deprecated": false, + "isDefinition": true, + "isReadOnly": false, + "isNullable": false, + "isRequired": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [ + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "id", + "description": "order id", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + } + ] + }, + { + "name": "OrderCancelationStatus", + "export": "enum", + "type": "string", + "base": "string", + "template": null, + "link": null, + "description": "Order cancelation status.", + "deprecated": false, + "isDefinition": true, + "isReadOnly": false, + "isNullable": false, + "isRequired": false, + "imports": [], + "enum": [ + { + "name": "PENDING_CANCEL", + "description": null, + "value": "'PendingCancel'", + "type": "string" + }, + { + "name": "CANCELED", + "description": null, + "value": "'Canceled'", + "type": "string" + }, + { + "name": "REJECTED", + "description": null, + "value": "'Rejected'", + "type": "string" + } + ], + "enums": [], + "properties": [] + }, + { + "name": "OrderCancelationRequest", + "export": "interface", + "type": "any", + "base": "any", + "template": null, + "link": null, + "description": "Details of order cancelation request", + "deprecated": false, + "isDefinition": true, + "isReadOnly": false, + "isNullable": false, + "isRequired": false, + "imports": ["OrderCancelationStatus"], + "enum": [], + "enums": [], + "properties": [ + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "transactionId", + "description": "Client side generated unique transaction identifier.", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": true + }, + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "orderId", + "description": "Unique Id for the order", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": true + }, + { + "export": "reference", + "type": "OrderCancelationStatus", + "base": "OrderCancelationStatus", + "template": null, + "link": null, + "isNullable": false, + "imports": ["OrderCancelationStatus"], + "enum": [], + "enums": [], + "properties": [], + "name": "cancelationStatus", + "description": "Order cancelation status.", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": true + } + ] + }, + { + "name": "CancelOrderPostRequest", + "export": "interface", + "type": "any", + "base": "any", + "template": null, + "link": null, + "description": "Cancel order post request", + "deprecated": false, + "isDefinition": true, + "isReadOnly": false, + "isNullable": false, + "isRequired": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [ + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "transactionId", + "description": "Client side generated unique transaction identifier.", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": true + } + ] + }, + { + "name": "Trade", + "export": "interface", + "type": "any", + "base": "any", + "template": null, + "link": null, + "description": "Trade details", + "deprecated": false, + "isDefinition": true, + "isReadOnly": false, + "isNullable": false, + "isRequired": false, + "imports": ["Direction"], + "enum": [], + "enums": [], + "properties": [ + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "tradeId", + "description": "Unique Id for the trade.", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": true + }, + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "orderId", + "description": "Unique Id for the order.", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": true + }, + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "tradeTime", + "description": "Time at which the trade was executed (UTC).", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": true + }, + { + "export": "reference", + "type": "Direction", + "base": "Direction", + "template": null, + "link": null, + "isNullable": false, + "imports": ["Direction"], + "enum": [], + "enums": [], + "properties": [], + "name": "tradeDirection", + "description": "Direction of the trade.", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": true + }, + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "tradeQuantity", + "description": "Quantity bought or sold.", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": true + }, + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "tradePrice", + "description": "Price paid per unit quantity, in instrument currency.", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": true + }, + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "tradeAmount", + "description": "Amount value of the trade, in instrument currency.", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": true + }, + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "tradeAmountInAccountCurrency", + "description": "Amount value of the trade, in primary account currency.", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": true + }, + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "tradeProfitLoss", + "description": "Amount of profit or loss realised by the trade, in instrument currency. (Closing trades only)", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "tradeProfitLossInAccountCurrency", + "description": "Amount of profit or loss realised by the trade, in primary account currency. (Closing trades only)", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + } + ] + }, + { + "name": "UserDataFile", + "export": "interface", + "type": "any", + "base": "any", + "template": null, + "link": null, + "description": "The filename and pre-signed links to the file in S3", + "deprecated": false, + "isDefinition": true, + "isReadOnly": false, + "isNullable": false, + "isRequired": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [ + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "filename", + "description": "The filename", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": true + }, + { + "export": "interface", + "type": "any", + "base": "any", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [ + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "url", + "description": "A pre-signed link to get the file from S3", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": true + } + ], + "name": "get", + "description": "Config for getting the file from S3", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": true + }, + { + "export": "interface", + "type": "any", + "base": "any", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [ + { + "export": "dictionary", + "type": "string", + "base": "string", + "template": null, + "link": { + "name": "", + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "description": null, + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isNullable": false, + "isRequired": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [] + }, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "fields", + "description": "Form fields that must be included in the post to S3, with the !last! field being `file` and having the file as the value", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": true + }, + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "url", + "description": "A pre-signed link to post the file to S3", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": true + } + ], + "name": "post", + "description": "Config for posting the file (encoded as form data) to S3", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": true + }, + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "urlsExpireAt", + "description": "The datetime that the pre-signed URLs will cease to be accepted", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": true + } + ] + }, + { + "name": "ClientUserDataGetAllFilesResponse", + "export": "interface", + "type": "any", + "base": "any", + "template": null, + "link": null, + "description": "Client User Data Get All Files Response", + "deprecated": false, + "isDefinition": true, + "isReadOnly": false, + "isNullable": false, + "isRequired": false, + "imports": ["UserDataFile"], + "enum": [], + "enums": [], + "properties": [ + { + "export": "array", + "type": "UserDataFile", + "base": "UserDataFile", + "template": null, + "link": null, + "isNullable": false, + "imports": ["UserDataFile"], + "enum": [], + "enums": [], + "properties": [], + "name": "files", + "description": null, + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": true + } + ] + }, + { + "name": "ClientUserDataGetFileResponse", + "export": "interface", + "type": "any", + "base": "any", + "template": null, + "link": null, + "description": "Client User Data Get File Response", + "deprecated": false, + "isDefinition": true, + "isReadOnly": false, + "isNullable": false, + "isRequired": false, + "imports": ["UserDataFile"], + "enum": [], + "enums": [], + "properties": [ + { + "export": "reference", + "type": "UserDataFile", + "base": "UserDataFile", + "template": null, + "link": null, + "isNullable": false, + "imports": ["UserDataFile"], + "enum": [], + "enums": [], + "properties": [], + "name": "file", + "description": null, + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": true + } + ] + }, + { + "name": "ClientUserDataCreateFileResponse", + "export": "interface", + "type": "any", + "base": "any", + "template": null, + "link": null, + "description": "Client User Data Create File Response", + "deprecated": false, + "isDefinition": true, + "isReadOnly": false, + "isNullable": false, + "isRequired": false, + "imports": ["UserDataFile"], + "enum": [], + "enums": [], + "properties": [ + { + "export": "reference", + "type": "UserDataFile", + "base": "UserDataFile", + "template": null, + "link": null, + "isNullable": false, + "imports": ["UserDataFile"], + "enum": [], + "enums": [], + "properties": [], + "name": "file", + "description": null, + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": true + } + ] + }, + { + "name": "Product", + "export": "interface", + "type": "any", + "base": "any", + "template": null, + "link": null, + "description": "Details about a product", + "deprecated": false, + "isDefinition": true, + "isReadOnly": false, + "isNullable": false, + "isRequired": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [ + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "code", + "description": null, + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + } + ] + }, + { + "name": "GetProductResponse", + "export": "interface", + "type": "any", + "base": "any", + "template": null, + "link": null, + "description": "Client User Data Get File Response", + "deprecated": false, + "isDefinition": true, + "isReadOnly": false, + "isNullable": false, + "isRequired": false, + "imports": ["Product"], + "enum": [], + "enums": [], + "properties": [ + { + "export": "reference", + "type": "Product", + "base": "Product", + "template": null, + "link": null, + "isNullable": false, + "imports": ["Product"], + "enum": [], + "enums": [], + "properties": [], + "name": "product", + "description": null, + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": true + } + ] + }, + { + "name": "OrderTicketProductType", + "export": "enum", + "type": "string", + "base": "string", + "template": null, + "link": null, + "description": "Product Type for which the Order Ticket Model will be maintained for.", + "deprecated": false, + "isDefinition": true, + "isReadOnly": false, + "isNullable": false, + "isRequired": false, + "imports": [], + "enum": [ + { + "name": "CFD", + "description": null, + "value": "'CFD'", + "type": "string" + }, + { + "name": "EQUITY", + "description": null, + "value": "'EQUITY'", + "type": "string" + }, + { + "name": "FX", + "description": null, + "value": "'FX'", + "type": "string" + }, + { + "name": "SB", + "description": null, + "value": "'SB'", + "type": "string" + } + ], + "enums": [], + "properties": [] + }, + { + "name": "OrderTicketType", + "export": "enum", + "type": "string", + "base": "string", + "template": null, + "link": null, + "description": "This field indicates the type of action to be performed on an order. It can take the following values: 'PLACE_ORDER_TICKET' for creating a new order, 'MODIFY_ORDER_TICKET' for making changes to an existing order, 'CLOSE_ORDER_TICKET' for closing an order, and 'ROLL_ORDER_TICKET' for rolling over an order to the next trading period.", + "deprecated": false, + "isDefinition": true, + "isReadOnly": false, + "isNullable": false, + "isRequired": false, + "imports": [], + "enum": [ + { + "name": "PLACE_ORDER_TICKET", + "description": null, + "value": "'PLACE_ORDER_TICKET'", + "type": "string" + }, + { + "name": "MODIFY_ORDER_TICKET", + "description": null, + "value": "'MODIFY_ORDER_TICKET'", + "type": "string" + }, + { + "name": "CLOSE_ORDER_TICKET", + "description": null, + "value": "'CLOSE_ORDER_TICKET'", + "type": "string" + }, + { + "name": "ROLL_ORDER_TICKET", + "description": null, + "value": "'ROLL_ORDER_TICKET'", + "type": "string" + } + ], + "enums": [], + "properties": [] + }, + { + "name": "OrderTicketDirection", + "export": "enum", + "type": "string", + "base": "string", + "template": null, + "link": null, + "description": "The Direction object is a string that represents the direction of an order. The possible values for this object are 'BUY' and 'SELL'.", + "deprecated": false, + "isDefinition": true, + "isReadOnly": false, + "isNullable": false, + "isRequired": false, + "imports": [], + "enum": [ + { + "name": "BUY", + "description": null, + "value": "'BUY'", + "type": "string" + }, + { + "name": "SELL", + "description": null, + "value": "'SELL'", + "type": "string" + } + ], + "enums": [], + "properties": [] + }, + { + "name": "OrderQuantityBase", + "export": "enum", + "type": "string", + "base": "string", + "template": null, + "link": null, + "description": "Requested quantity base of the order ticket.", + "deprecated": false, + "isDefinition": true, + "isReadOnly": false, + "isNullable": false, + "isRequired": false, + "imports": [], + "enum": [ + { + "name": "AMOUNT", + "description": null, + "value": "'AMOUNT'", + "type": "string" + }, + { + "name": "UNITS", + "description": null, + "value": "'UNITS'", + "type": "string" + } + ], + "enums": [], + "properties": [] + }, + { + "name": "StopLossType", + "export": "enum", + "type": "string", + "base": "string", + "template": null, + "link": null, + "description": "The type of stop loss to be used for the order.", + "deprecated": false, + "isDefinition": true, + "isReadOnly": false, + "isNullable": false, + "isRequired": false, + "imports": [], + "enum": [ + { + "name": "REGULAR", + "description": null, + "value": "'REGULAR'", + "type": "string" + }, + { + "name": "TRAILING", + "description": null, + "value": "'TRAILING'", + "type": "string" + }, + { + "name": "GUARANTEED", + "description": null, + "value": "'GUARANTEED'", + "type": "string" + } + ], + "enums": [], + "properties": [] + }, + { + "name": "ChildOrderBase", + "export": "enum", + "type": "string", + "base": "string", + "template": null, + "link": null, + "description": "Base to use for child orders", + "deprecated": false, + "isDefinition": true, + "isReadOnly": false, + "isNullable": false, + "isRequired": false, + "imports": [], + "enum": [ + { + "name": "NONE", + "description": null, + "value": "'NONE'", + "type": "string" + }, + { + "name": "MARGIN", + "description": null, + "value": "'MARGIN'", + "type": "string" + }, + { + "name": "PRICE", + "description": null, + "value": "'PRICE'", + "type": "string" + }, + { + "name": "POINTS", + "description": null, + "value": "'POINTS'", + "type": "string" + }, + { + "name": "AMOUNT", + "description": null, + "value": "'AMOUNT'", + "type": "string" + } + ], + "enums": [], + "properties": [] + }, + { + "name": "StopLossRequest", + "export": "interface", + "type": "any", + "base": "any", + "template": null, + "link": null, + "description": "Details of the stop loss order", + "deprecated": false, + "isDefinition": true, + "isReadOnly": false, + "isNullable": false, + "isRequired": false, + "imports": ["ChildOrderBase", "StopLossType"], + "enum": [], + "enums": [], + "properties": [ + { + "export": "reference", + "type": "StopLossType", + "base": "StopLossType", + "template": null, + "link": null, + "isNullable": false, + "imports": ["StopLossType"], + "enum": [], + "enums": [], + "properties": [], + "name": "type", + "description": null, + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": true + }, + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "price", + "description": "Price of the stop loss order", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "amount", + "description": "Amount of the stop loss order", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "points", + "description": "Trailing points away from the market price of the stop loss order", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "reference", + "type": "ChildOrderBase", + "base": "ChildOrderBase", + "template": null, + "link": null, + "isNullable": false, + "imports": ["ChildOrderBase"], + "enum": [], + "enums": [], + "properties": [], + "name": "base", + "description": null, + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": true + } + ] + }, + { + "name": "PendingOrderType", + "export": "enum", + "type": "string", + "base": "string", + "template": null, + "link": null, + "description": "The type of the pending order", + "deprecated": false, + "isDefinition": true, + "isReadOnly": false, + "isNullable": false, + "isRequired": false, + "imports": [], + "enum": [ + { + "name": "LIMIT", + "description": null, + "value": "'LIMIT'", + "type": "string" + }, + { + "name": "STOP_ENTRY", + "description": null, + "value": "'STOP_ENTRY'", + "type": "string" + } + ], + "enums": [], + "properties": [] + }, + { + "name": "PendingOrder", + "export": "interface", + "type": "any", + "base": "any", + "template": null, + "link": null, + "description": "Details of the pending order", + "deprecated": false, + "isDefinition": true, + "isReadOnly": false, + "isNullable": false, + "isRequired": false, + "imports": ["PendingOrderType"], + "enum": [], + "enums": [], + "properties": [ + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "price", + "description": "Price of the pending order.", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "expiryDate", + "description": "Expiry date of the pending order.", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false, + "format": "date-time" + }, + { + "export": "reference", + "type": "PendingOrderType", + "base": "PendingOrderType", + "template": null, + "link": null, + "isNullable": false, + "imports": ["PendingOrderType"], + "enum": [], + "enums": [], + "properties": [], + "name": "type", + "description": null, + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + } + ] + }, + { + "name": "OrderTicketRequest", + "export": "interface", + "type": "any", + "base": "any", + "template": null, + "link": null, + "description": "Details of the order ticket model request", + "deprecated": false, + "isDefinition": true, + "isReadOnly": false, + "isNullable": false, + "isRequired": false, + "imports": [ + "OrderQuantityBase", + "OrderTicketDirection", + "OrderTicketProductType", + "OrderTicketType", + "PendingOrder", + "StopLossRequest" + ], + "enum": [], + "enums": [], + "properties": [ + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "orderId", + "description": "Unique Id for the order. This is required if the order ticket model needs to be created for a `MODIFY` order.", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "generic", + "type": "number", + "base": "number", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "tradingAccountId", + "description": "ID of the trading account", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": true + }, + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "instrumentId", + "description": "Indentifer for the underlying instrument of the order.", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": true + }, + { + "export": "reference", + "type": "OrderTicketProductType", + "base": "OrderTicketProductType", + "template": null, + "link": null, + "isNullable": false, + "imports": ["OrderTicketProductType"], + "enum": [], + "enums": [], + "properties": [], + "name": "productType", + "description": null, + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": true + }, + { + "export": "reference", + "type": "OrderTicketType", + "base": "OrderTicketType", + "template": null, + "link": null, + "isNullable": false, + "imports": ["OrderTicketType"], + "enum": [], + "enums": [], + "properties": [], + "name": "ticketType", + "description": null, + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": true + }, + { + "export": "reference", + "type": "OrderTicketDirection", + "base": "OrderTicketDirection", + "template": null, + "link": null, + "isNullable": false, + "imports": ["OrderTicketDirection"], + "enum": [], + "enums": [], + "properties": [], + "name": "orderDirection", + "description": null, + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": true + }, + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "quantity", + "description": "Requested quantity of the units to be bought or sold.", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "reference", + "type": "OrderQuantityBase", + "base": "OrderQuantityBase", + "template": null, + "link": null, + "isNullable": false, + "imports": ["OrderQuantityBase"], + "enum": [], + "enums": [], + "properties": [], + "name": "quantityBase", + "description": null, + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "reference", + "type": "StopLossRequest", + "base": "StopLossRequest", + "template": null, + "link": null, + "isNullable": false, + "imports": ["StopLossRequest"], + "enum": [], + "enums": [], + "properties": [], + "name": "stopLoss", + "description": null, + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "generic", + "type": "boolean", + "base": "boolean", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "isStopLossChanged", + "description": "Indicates whether the stop loss has been changed.", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "reference", + "type": "PendingOrder", + "base": "PendingOrder", + "template": null, + "link": null, + "isNullable": false, + "imports": ["PendingOrder"], + "enum": [], + "enums": [], + "properties": [], + "name": "pendingOrder", + "description": null, + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + } + ] + }, + { + "name": "OrderTicketOrderType", + "export": "enum", + "type": "string", + "base": "string", + "template": null, + "link": null, + "description": "The type of the order", + "deprecated": false, + "isDefinition": true, + "isReadOnly": false, + "isNullable": false, + "isRequired": false, + "imports": [], + "enum": [ + { + "name": "MARKET", + "description": null, + "value": "'MARKET'", + "type": "string" + }, + { + "name": "LIMIT", + "description": null, + "value": "'LIMIT'", + "type": "string" + }, + { + "name": "STOP_ENTRY", + "description": null, + "value": "'STOP_ENTRY'", + "type": "string" + } + ], + "enums": [], + "properties": [] + }, + { + "name": "OrderTicketValues", + "export": "interface", + "type": "any", + "base": "any", + "template": null, + "link": null, + "description": "Details of order ticket model for the base order", + "deprecated": false, + "isDefinition": true, + "isReadOnly": false, + "isNullable": false, + "isRequired": false, + "imports": ["OrderQuantityBase", "OrderTicketDirection", "OrderTicketOrderType", "StopLossType"], + "enum": [], + "enums": [], + "properties": [ + { + "export": "reference", + "type": "OrderTicketDirection", + "base": "OrderTicketDirection", + "template": null, + "link": null, + "isNullable": false, + "imports": ["OrderTicketDirection"], + "enum": [], + "enums": [], + "properties": [], + "name": "direction", + "description": null, + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "quantity", + "description": "Requested quantity of the order", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "revaluatedAmount", + "description": "Revaluated amount of the order. Amount is valued in trading account currency.", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "reference", + "type": "OrderQuantityBase", + "base": "OrderQuantityBase", + "template": null, + "link": null, + "isNullable": false, + "imports": ["OrderQuantityBase"], + "enum": [], + "enums": [], + "properties": [], + "name": "quantityBase", + "description": null, + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "clientStateParameters", + "description": "Bit string formatted of the client state parameters", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "generic", + "type": "boolean", + "base": "boolean", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "isMarketOpen", + "description": "Indicates whether the market is open or not", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "generic", + "type": "boolean", + "base": "boolean", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "isTicketValid", + "description": "Indicates whether the ticket is valid or not", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "array", + "type": "StopLossType", + "base": "StopLossType", + "template": null, + "link": null, + "isNullable": false, + "imports": ["StopLossType"], + "enum": [], + "enums": [], + "properties": [], + "name": "validStopLossTypes", + "description": "List of valid stop loss types", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "generic", + "type": "boolean", + "base": "boolean", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "isTakeProfitAllowed", + "description": "Indicates whether take profit is allowed or not", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "array", + "type": "OrderTicketOrderType", + "base": "OrderTicketOrderType", + "template": null, + "link": null, + "isNullable": false, + "imports": ["OrderTicketOrderType"], + "enum": [], + "enums": [], + "properties": [], + "name": "validOrderTypes", + "description": "List of valid order types", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "generic", + "type": "boolean", + "base": "boolean", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "isTriggeringSideVisible", + "description": "Indicates whether triggering side is visible or not", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "generic", + "type": "boolean", + "base": "boolean", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "isBoundaryVisible", + "description": "Indicates whether boundary is visible or not", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + } + ] + }, + { + "name": "BoundaryOrderBase", + "export": "enum", + "type": "string", + "base": "string", + "template": null, + "link": null, + "description": "Base for boundary orders.", + "deprecated": false, + "isDefinition": true, + "isReadOnly": false, + "isNullable": false, + "isRequired": false, + "imports": [], + "enum": [ + { + "name": "NONE", + "description": null, + "value": "'NONE'", + "type": "string" + }, + { + "name": "PERCENTAGE", + "description": null, + "value": "'PERCENTAGE'", + "type": "string" + }, + { + "name": "PRICE", + "description": null, + "value": "'PRICE'", + "type": "string" + }, + { + "name": "POINTS", + "description": null, + "value": "'POINTS'", + "type": "string" + } + ], + "enums": [], + "properties": [] + }, + { + "name": "BoundaryOrder", + "export": "interface", + "type": "any", + "base": "any", + "template": null, + "link": null, + "description": "Details of the boundary order", + "deprecated": false, + "isDefinition": true, + "isReadOnly": false, + "isNullable": false, + "isRequired": false, + "imports": ["BoundaryOrderBase"], + "enum": [], + "enums": [], + "properties": [ + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "points", + "description": "The maximum number of points from the current market price that the order will be executed at.", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "price", + "description": "The maximum price at which the order will be executed.", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "reference", + "type": "BoundaryOrderBase", + "base": "BoundaryOrderBase", + "template": null, + "link": null, + "isNullable": false, + "imports": ["BoundaryOrderBase"], + "enum": [], + "enums": [], + "properties": [], + "name": "base", + "description": null, + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + } + ] + }, + { + "name": "TriggeringSide", + "export": "enum", + "type": "string", + "base": "string", + "template": null, + "link": null, + "description": "The side of the market which is used to trigger the order", + "deprecated": false, + "isDefinition": true, + "isReadOnly": false, + "isNullable": false, + "isRequired": false, + "imports": [], + "enum": [ + { + "name": "NONE", + "description": null, + "value": "'NONE'", + "type": "string" + }, + { + "name": "BID", + "description": null, + "value": "'BID'", + "type": "string" + }, + { + "name": "MID", + "description": null, + "value": "'MID'", + "type": "string" + }, + { + "name": "ASK", + "description": null, + "value": "'ASK'", + "type": "string" + } + ], + "enums": [], + "properties": [] + }, + { + "name": "StopLossOrder", + "export": "interface", + "type": "any", + "base": "any", + "template": null, + "link": null, + "description": "Details of the stop loss order", + "deprecated": false, + "isDefinition": true, + "isReadOnly": false, + "isNullable": false, + "isRequired": false, + "imports": ["ChildOrderBase", "StopLossType", "TriggeringSide"], + "enum": [], + "enums": [], + "properties": [ + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "price", + "description": "Price of the stop loss order.", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "points", + "description": "Points of the stop loss order.", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "revaluatedAmount", + "description": "Revaluated amount of the stop loss order.", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "reference", + "type": "ChildOrderBase", + "base": "ChildOrderBase", + "template": null, + "link": null, + "isNullable": false, + "imports": ["ChildOrderBase"], + "enum": [], + "enums": [], + "properties": [], + "name": "base", + "description": null, + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "reference", + "type": "StopLossType", + "base": "StopLossType", + "template": null, + "link": null, + "isNullable": false, + "imports": ["StopLossType"], + "enum": [], + "enums": [], + "properties": [], + "name": "type", + "description": null, + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "reference", + "type": "TriggeringSide", + "base": "TriggeringSide", + "template": null, + "link": null, + "isNullable": false, + "imports": ["TriggeringSide"], + "enum": [], + "enums": [], + "properties": [], + "name": "triggeringSide", + "description": null, + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "generic", + "type": "boolean", + "base": "boolean", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "isTriggeringSideVisible", + "description": "Whether the triggering side is visible.", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + } + ] + }, + { + "name": "TakeProfitOrder", + "export": "interface", + "type": "any", + "base": "any", + "template": null, + "link": null, + "description": "Details of the take profit order", + "deprecated": false, + "isDefinition": true, + "isReadOnly": false, + "isNullable": false, + "isRequired": false, + "imports": ["ChildOrderBase"], + "enum": [], + "enums": [], + "properties": [ + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "price", + "description": "Price of the take profit order", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "points", + "description": "Points of the take profit order", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "revaluatedAmount", + "description": "Revaluated amount of the take profit order", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "reference", + "type": "ChildOrderBase", + "base": "ChildOrderBase", + "template": null, + "link": null, + "isNullable": false, + "imports": ["ChildOrderBase"], + "enum": [], + "enums": [], + "properties": [], + "name": "base", + "description": null, + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + } + ] + }, + { + "name": "EstimatedCosts", + "export": "interface", + "type": "any", + "base": "any", + "template": null, + "link": null, + "description": "Estimated costs for the order", + "deprecated": false, + "isDefinition": true, + "isReadOnly": false, + "isNullable": false, + "isRequired": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [ + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "totalCost", + "description": "Total cost of the order", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "gsloPremium", + "description": "Premium for the Guaranteed Stop Loss Order", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "commission", + "description": "Commission for the order", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "totalMargin", + "description": "Total margin required for the order", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "positionMargin", + "description": "Position margin required for the order", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "primeMargin", + "description": "Prime margin required for the order", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + } + ] + }, + { + "name": "ForwardExpiryType", + "export": "enum", + "type": "string", + "base": "string", + "template": null, + "link": null, + "description": "Forward expiry type", + "deprecated": false, + "isDefinition": true, + "isReadOnly": false, + "isNullable": false, + "isRequired": false, + "imports": [], + "enum": [ + { + "name": "NONE", + "description": null, + "value": "'NONE'", + "type": "string" + }, + { + "name": "AUTO_ROLL", + "description": null, + "value": "'AUTO_ROLL'", + "type": "string" + }, + { + "name": "CASH_SETTLE", + "description": null, + "value": "'CASH_SETTLE'", + "type": "string" + } + ], + "enums": [], + "properties": [] + }, + { + "name": "ForwardState", + "export": "interface", + "type": "any", + "base": "any", + "template": null, + "link": null, + "description": "Details of the forward state", + "deprecated": false, + "isDefinition": true, + "isReadOnly": false, + "isNullable": false, + "isRequired": false, + "imports": ["ForwardExpiryType"], + "enum": [], + "enums": [], + "properties": [ + { + "export": "generic", + "type": "boolean", + "base": "boolean", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "isRollable", + "description": "Indicates whether the forward can be rolled.", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "reference", + "type": "ForwardExpiryType", + "base": "ForwardExpiryType", + "template": null, + "link": null, + "isNullable": false, + "imports": ["ForwardExpiryType"], + "enum": [], + "enums": [], + "properties": [], + "name": "forwardExpiryType", + "description": null, + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + } + ] + }, + { + "name": "ValidationParameter", + "export": "interface", + "type": "any", + "base": "any", + "template": null, + "link": null, + "description": "A validation parameter", + "deprecated": false, + "isDefinition": true, + "isReadOnly": false, + "isNullable": false, + "isRequired": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [ + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "value", + "description": "The value of the validation parameter", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "type", + "description": "The type of the validation parameter", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + } + ] + }, + { + "name": "Validation", + "export": "interface", + "type": "any", + "base": "any", + "template": null, + "link": null, + "description": "Validation", + "deprecated": false, + "isDefinition": true, + "isReadOnly": false, + "isNullable": false, + "isRequired": false, + "imports": ["ValidationParameter"], + "enum": [], + "enums": [], + "properties": [ + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "validationKey", + "description": null, + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "validationMessageKey", + "description": null, + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "severity", + "description": null, + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "array", + "type": "ValidationParameter", + "base": "ValidationParameter", + "template": null, + "link": null, + "isNullable": false, + "imports": ["ValidationParameter"], + "enum": [], + "enums": [], + "properties": [], + "name": "validationMessageParameters", + "description": null, + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + } + ] + }, + { + "name": "OrderTicketModel", + "export": "interface", + "type": "any", + "base": "any", + "template": null, + "link": null, + "description": "Details of the order ticket model", + "deprecated": false, + "isDefinition": true, + "isReadOnly": false, + "isNullable": false, + "isRequired": false, + "imports": [ + "BoundaryOrder", + "EstimatedCosts", + "ForwardState", + "OrderTicketValues", + "PendingOrder", + "StopLossOrder", + "TakeProfitOrder", + "Validation" + ], + "enum": [], + "enums": [], + "properties": [ + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "ticketId", + "description": "Unique Id of the order ticket model", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false, + "format": "uuid" + }, + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "orderId", + "description": "Unique Id for the order. This will be populated if the order ticket model is created for a `MODIFY` order.", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "reference", + "type": "OrderTicketValues", + "base": "OrderTicketValues", + "template": null, + "link": null, + "isNullable": false, + "imports": ["OrderTicketValues"], + "enum": [], + "enums": [], + "properties": [], + "name": "orderTicketValues", + "description": null, + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "reference", + "type": "PendingOrder", + "base": "PendingOrder", + "template": null, + "link": null, + "isNullable": false, + "imports": ["PendingOrder"], + "enum": [], + "enums": [], + "properties": [], + "name": "pendingOrderTicketValues", + "description": null, + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "reference", + "type": "BoundaryOrder", + "base": "BoundaryOrder", + "template": null, + "link": null, + "isNullable": false, + "imports": ["BoundaryOrder"], + "enum": [], + "enums": [], + "properties": [], + "name": "boundaryOrderTicketValues", + "description": null, + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "reference", + "type": "StopLossOrder", + "base": "StopLossOrder", + "template": null, + "link": null, + "isNullable": false, + "imports": ["StopLossOrder"], + "enum": [], + "enums": [], + "properties": [], + "name": "stopLossOrderTicketValues", + "description": null, + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "reference", + "type": "TakeProfitOrder", + "base": "TakeProfitOrder", + "template": null, + "link": null, + "isNullable": false, + "imports": ["TakeProfitOrder"], + "enum": [], + "enums": [], + "properties": [], + "name": "takeProfitOrderTicketValues", + "description": null, + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "reference", + "type": "EstimatedCosts", + "base": "EstimatedCosts", + "template": null, + "link": null, + "isNullable": false, + "imports": ["EstimatedCosts"], + "enum": [], + "enums": [], + "properties": [], + "name": "estimatedCostsOrderTicketValues", + "description": null, + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "reference", + "type": "ForwardState", + "base": "ForwardState", + "template": null, + "link": null, + "isNullable": false, + "imports": ["ForwardState"], + "enum": [], + "enums": [], + "properties": [], + "name": "forwardStateOrderTicketValues", + "description": null, + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "dictionary", + "type": "Validation", + "base": "Validation", + "template": null, + "link": { + "name": "", + "export": "array", + "type": "Validation", + "base": "Validation", + "template": null, + "link": null, + "description": null, + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isNullable": false, + "isRequired": false, + "imports": ["Validation"], + "enum": [], + "enums": [], + "properties": [] + }, + "isNullable": false, + "imports": ["Validation"], + "enum": [], + "enums": [], + "properties": [], + "name": "validationFailures", + "description": null, + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + } + ] + }, + { + "name": "AuthenticatedApiContext", + "export": "interface", + "type": "any", + "base": "any", + "template": null, + "link": null, + "description": "AuthenticatedApiContext that holds account information from JWT token", + "deprecated": false, + "isDefinition": true, + "isReadOnly": false, + "isNullable": false, + "isRequired": false, + "imports": [], + "enum": [], + "enums": [ + { + "export": "enum", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [ + { + "name": "HDEV3", + "description": null, + "value": "'HDEV3'", + "type": "string" + }, + { + "name": "PROD", + "description": null, + "value": "'PROD'", + "type": "string" + } + ], + "enums": [], + "properties": [], + "name": "env", + "description": "the CMC environment being run in", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": true + } + ], + "properties": [ + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "agentId", + "description": "agentId is the user ID of the person acting on someone else's behalf", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "customerId", + "description": "customer id", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": true + }, + { + "export": "enum", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [ + { + "name": "HDEV3", + "description": null, + "value": "'HDEV3'", + "type": "string" + }, + { + "name": "PROD", + "description": null, + "value": "'PROD'", + "type": "string" + } + ], + "enums": [], + "properties": [], + "name": "env", + "description": "the CMC environment being run in", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": true + }, + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "identityId", + "description": "identityId is the customer user ID", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": true + }, + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "oboScope", + "description": "On Behalf Of", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "partnerId", + "description": "partner id", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": true + }, + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "personId", + "description": "person id", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": true + }, + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "sessionId", + "description": "session id", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": true + }, + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "accountId", + "description": "trading account id", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": true + } + ] + }, + { + "name": "Position", + "export": "interface", + "type": "any", + "base": "any", + "template": null, + "link": null, + "description": "Details of account holdings grouped by instrument", + "deprecated": false, + "isDefinition": true, + "isReadOnly": false, + "isNullable": false, + "isRequired": false, + "imports": ["Direction", "ProductType"], + "enum": [], + "enums": [], + "properties": [ + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "instrumentId", + "description": "Identifer for the underlying instrument of the order.", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "reference", + "type": "Direction", + "base": "Direction", + "template": null, + "link": null, + "isNullable": false, + "imports": ["Direction"], + "enum": [], + "enums": [], + "properties": [], + "name": "direction", + "description": null, + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "reference", + "type": "ProductType", + "base": "ProductType", + "template": null, + "link": null, + "isNullable": false, + "imports": ["ProductType"], + "enum": [], + "enums": [], + "properties": [], + "name": "productType", + "description": null, + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "price", + "description": "Volume weighted average price off all the trades that make up the position.", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + }, + { + "export": "generic", + "type": "string", + "base": "string", + "template": null, + "link": null, + "isNullable": false, + "imports": [], + "enum": [], + "enums": [], + "properties": [], + "name": "evaluationClosePrice", + "description": "The close price used to calculate the P&L for the position", + "deprecated": false, + "isDefinition": false, + "isReadOnly": false, + "isRequired": false + } + ] + } +]