@matech/thebigpos-sdk 3.19.0-main-6895 → 3.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -39
- package/dist/index.d.ts +531 -575
- package/dist/index.js +2 -49
- package/dist/index.js.map +1 -1
- package/package.json +8 -13
- package/scripts/apply-json-patch-content-type.js +36 -189
- package/src/index.ts +7 -101
- package/docs/sdk_generation.md +0 -149
|
@@ -1,209 +1,56 @@
|
|
|
1
|
-
/*
|
|
2
|
-
|
|
1
|
+
/*
|
|
2
|
+
This script is meant to run after the SDK has been generated.
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
it by reading the OpenAPI spec the SDK was generated from and, for every
|
|
8
|
-
generated PATCH method, setting:
|
|
4
|
+
- It updates the generated code to ensure that all PATCH methods use ContentType.JsonPatch.
|
|
5
|
+
- It also ensures that the ContentType enum includes JsonPatch and modifies the Operation interface
|
|
6
|
+
to allow any value for the `value` property instead of just object or null.
|
|
9
7
|
|
|
10
|
-
|
|
11
|
-
advertises application/json-patch+json
|
|
12
|
-
- ContentType.Json -> for every other PATCH method
|
|
13
|
-
(e.g. updateLoan, which the backend declares as
|
|
14
|
-
[Consumes("application/json")])
|
|
15
|
-
|
|
16
|
-
The decision is taken entirely from the spec — there is no hard-coded list of
|
|
17
|
-
endpoints to keep in sync. It also ensures the ContentType enum includes
|
|
18
|
-
JsonPatch and relaxes the Operation interface `value` to accept any value.
|
|
19
|
-
|
|
20
|
-
It additionally teaches `createFormData` to recognise React Native files. The
|
|
21
|
-
generator assumes a browser and detects file parts with `instanceof Blob ||
|
|
22
|
-
instanceof File`; in React Native a file is a plain `{ uri, name, type }`
|
|
23
|
-
object, so without the extra branch every mobile upload is serialised as the
|
|
24
|
-
string "[object Object]". This used to live as a patch-package patch in
|
|
25
|
-
pos-mobile-v2, which had to be re-created on every SDK bump.
|
|
26
|
-
|
|
27
|
-
Usage (pass the SAME spec given to `swagger-typescript-api -p`):
|
|
28
|
-
node scripts/apply-json-patch-content-type.js https://api.thebigpos.dev/swagger/<version>/swagger.json
|
|
29
|
-
node scripts/apply-json-patch-content-type.js ./swagger.json
|
|
30
|
-
SWAGGER_SPEC=<url-or-file> node scripts/apply-json-patch-content-type.js
|
|
31
|
-
|
|
32
|
-
Design notes:
|
|
33
|
-
- The rewrite is scoped to a single generated method block at a time
|
|
34
|
-
(anchored on that method's own `...params,`), so it can never bleed across
|
|
35
|
-
method boundaries.
|
|
36
|
-
- It sets each method's content type to its target value rather than doing a
|
|
37
|
-
conditional replace, so it is idempotent and self-healing (it also repairs
|
|
38
|
-
a previously-seen ContentType.JsonPatchPatch double-application).
|
|
39
|
-
- If no spec is provided (e.g. a plain commit-hook run), the content-type
|
|
40
|
-
rewrite is skipped instead of guessing, so it can never silently corrupt
|
|
41
|
-
the generated output.
|
|
8
|
+
This is necessary because the SDK generation does not currently handle these cases correctly.
|
|
42
9
|
*/
|
|
43
10
|
|
|
44
11
|
const fs = require('fs')
|
|
45
|
-
const nodePath = require('path')
|
|
46
12
|
|
|
47
|
-
const
|
|
13
|
+
const path = require('path').resolve(__dirname, '../src/index.ts')
|
|
48
14
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
const res = await fetch(source)
|
|
53
|
-
if (!res.ok) throw new Error(`Failed to fetch spec from "${source}": HTTP ${res.status}`)
|
|
54
|
-
return res.json()
|
|
55
|
-
}
|
|
56
|
-
return JSON.parse(fs.readFileSync(nodePath.resolve(source), 'utf8'))
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
// Collapse spec ("{id}") and generated ("${id}") path params to a common token
|
|
60
|
-
// so generated paths can be matched against spec paths regardless of param names.
|
|
61
|
-
function normalizePath(p) {
|
|
62
|
-
return p.replace(/\$\{[^}]+\}/g, '{}').replace(/\{[^}]+\}/g, '{}')
|
|
15
|
+
if (!fs.existsSync(path)) {
|
|
16
|
+
console.error(`Error: File not found at path "${path}". Please ensure the SDK has been generated.`)
|
|
17
|
+
process.exit(1)
|
|
63
18
|
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
set.add(normalizePath(route))
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
return set
|
|
19
|
+
let content
|
|
20
|
+
try {
|
|
21
|
+
content = fs.readFileSync(path, 'utf8')
|
|
22
|
+
} catch (err) {
|
|
23
|
+
console.error(`Error: Unable to read file at path "${path}". Details: ${err.message}`)
|
|
24
|
+
process.exit(1)
|
|
74
25
|
}
|
|
75
26
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
return block.replace(/\n(\s*)\.\.\.params,/, `\n$1${target},\n$1...params,`)
|
|
82
|
-
}
|
|
27
|
+
// Update PATCH methods to use ContentType.JsonPatch
|
|
28
|
+
content = content.replace(
|
|
29
|
+
/(method:\s*"PATCH"[\s\S]+?)type:\s*ContentType\.Json/g,
|
|
30
|
+
(match) => match.replace('ContentType.Json', 'ContentType.JsonPatch')
|
|
31
|
+
)
|
|
83
32
|
|
|
84
|
-
|
|
85
|
-
|
|
33
|
+
// Ensure JsonPatch is included in the ContentType enum
|
|
34
|
+
content = content.replace(
|
|
35
|
+
/export enum ContentType\s*{([\s\S]*?)}/,
|
|
36
|
+
(match, enumBody) => {
|
|
86
37
|
if (enumBody.includes('JsonPatch')) return match
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
}
|
|
38
|
+
const insertion = ` JsonPatch = "application/json-patch+json",\n `
|
|
39
|
+
return `export enum ContentType {\n${insertion}${enumBody.trim()}\n}`
|
|
40
|
+
}
|
|
41
|
+
)
|
|
90
42
|
|
|
91
|
-
|
|
92
|
-
|
|
43
|
+
// Fix the Operation interface to allow any value
|
|
44
|
+
content = content.replace(
|
|
45
|
+
/export interface Operation\s*{([\s\S]*?)}/,
|
|
46
|
+
(match, body) => {
|
|
93
47
|
const updated = body.replace(
|
|
94
48
|
/value\?:\s*object\s*\|?\s*null?;/,
|
|
95
49
|
'value?: string | number | boolean | null | object;'
|
|
96
50
|
)
|
|
97
51
|
return `export interface Operation {\n ${updated.trim()}\n}`
|
|
98
|
-
})
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
const RN_FILE_MARKER = 'isReactNativeFile'
|
|
102
|
-
|
|
103
|
-
// swagger-typescript-api assumes a browser: it detects multipart file parts with
|
|
104
|
-
// `instanceof Blob || instanceof File`. React Native has neither in a usable form —
|
|
105
|
-
// a file there is a plain `{ uri, name, type }` object. Without this branch those
|
|
106
|
-
// objects fall through to `stringifyFormItem` and every upload from the mobile app
|
|
107
|
-
// goes out as the string "[object Object]".
|
|
108
|
-
//
|
|
109
|
-
// The React Native check runs first so the `instanceof` operands are never even
|
|
110
|
-
// evaluated on that path.
|
|
111
|
-
//
|
|
112
|
-
// The pattern is deliberately whitespace-tolerant instead of matching one exact
|
|
113
|
-
// line. As generated today that statement is exactly 80 characters wide, which is
|
|
114
|
-
// Prettier's default printWidth — so the moment the generator nests it one level
|
|
115
|
-
// deeper, or renames `formItem`, Prettier reflows it across two lines. Anchoring
|
|
116
|
-
// on the single-line form would then quietly stop matching.
|
|
117
|
-
const GENERATED_FILE_CHECK =
|
|
118
|
-
/^([ \t]*)const isFileType\s*=\s*formItem instanceof Blob\s*\|\|\s*formItem instanceof File;/m
|
|
119
|
-
|
|
120
|
-
function applyReactNativeFileSupport(content) {
|
|
121
|
-
if (content.includes(RN_FILE_MARKER)) return content
|
|
122
|
-
|
|
123
|
-
// Never fail open. A silent no-op here ships an SDK where every React Native
|
|
124
|
-
// upload is serialised as "[object Object]", with nothing in the build to
|
|
125
|
-
// suggest anything went wrong.
|
|
126
|
-
if (!GENERATED_FILE_CHECK.test(content)) {
|
|
127
|
-
throw new Error(
|
|
128
|
-
'applyReactNativeFileSupport: could not find the generated `isFileType` check in ' +
|
|
129
|
-
'createFormData.\n' +
|
|
130
|
-
'swagger-typescript-api has most likely changed its output. Update ' +
|
|
131
|
-
'GENERATED_FILE_CHECK in this script — do not skip this step, or React Native ' +
|
|
132
|
-
'file uploads will break with no visible error.'
|
|
133
|
-
)
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
return content.replace(
|
|
137
|
-
GENERATED_FILE_CHECK,
|
|
138
|
-
(match, indent) =>
|
|
139
|
-
[
|
|
140
|
-
`${indent}// React Native files are plain { uri, name, type } objects, not Blob/File.`,
|
|
141
|
-
`${indent}const ${RN_FILE_MARKER} =`,
|
|
142
|
-
`${indent} !!formItem &&`,
|
|
143
|
-
`${indent} typeof formItem === "object" &&`,
|
|
144
|
-
`${indent} "uri" in formItem &&`,
|
|
145
|
-
`${indent} "name" in formItem &&`,
|
|
146
|
-
`${indent} "type" in formItem;`,
|
|
147
|
-
`${indent}const isFileType =`,
|
|
148
|
-
`${indent} ${RN_FILE_MARKER} || formItem instanceof Blob || formItem instanceof File;`,
|
|
149
|
-
].join('\n')
|
|
150
|
-
)
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
function applyContentTypes(content, patchPaths) {
|
|
154
|
-
// Heal any earlier double-application (ContentType.JsonPatchPatch...).
|
|
155
|
-
content = content.replace(/ContentType\.JsonPatch(?:Patch)+\b/g, 'ContentType.JsonPatch')
|
|
156
|
-
|
|
157
|
-
const METHOD_BLOCK = /[a-zA-Z0-9_]+:\s*\([\s\S]*?\)\s*=>\s*this\.request<[^>]*>\(\{[\s\S]*?\.\.\.params,/g
|
|
158
|
-
return content.replace(METHOD_BLOCK, (block) => {
|
|
159
|
-
if (!/method:\s*"PATCH"/.test(block)) {
|
|
160
|
-
// Non-PATCH methods must never be JSON Patch.
|
|
161
|
-
return /type:\s*ContentType\.JsonPatch\b/.test(block)
|
|
162
|
-
? block.replace(/type:\s*ContentType\.JsonPatch\b/, 'type: ContentType.Json')
|
|
163
|
-
: block
|
|
164
|
-
}
|
|
165
|
-
const routeMatch = block.match(/path:\s*`([^`]*)`/)
|
|
166
|
-
const route = routeMatch ? normalizePath(routeMatch[1]) : ''
|
|
167
|
-
return setContentType(block, patchPaths.has(route) ? 'JsonPatch' : 'Json')
|
|
168
|
-
})
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
;(async () => {
|
|
172
|
-
if (!fs.existsSync(SRC)) {
|
|
173
|
-
console.error(`Error: File not found at "${SRC}". Generate the SDK first.`)
|
|
174
|
-
process.exit(1)
|
|
175
52
|
}
|
|
53
|
+
)
|
|
176
54
|
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
try {
|
|
180
|
-
spec = await loadSpec(source)
|
|
181
|
-
} catch (err) {
|
|
182
|
-
console.error(`Error loading OpenAPI spec: ${err.message}`)
|
|
183
|
-
process.exit(1)
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
let content = fs.readFileSync(SRC, 'utf8')
|
|
187
|
-
content = ensureJsonPatchEnum(content)
|
|
188
|
-
content = relaxOperationValue(content)
|
|
189
|
-
content = applyReactNativeFileSupport(content)
|
|
190
|
-
|
|
191
|
-
if (!spec) {
|
|
192
|
-
console.warn(
|
|
193
|
-
'No OpenAPI spec provided (argument / SWAGGER_SPEC / SWAGGER_URL) — skipping PATCH content-type rewrite.\n' +
|
|
194
|
-
'Re-run with the spec used for generation to apply it, e.g.:\n' +
|
|
195
|
-
' node scripts/apply-json-patch-content-type.js https://api.thebigpos.dev/swagger/<version>/swagger.json'
|
|
196
|
-
)
|
|
197
|
-
fs.writeFileSync(SRC, content)
|
|
198
|
-
return
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
const patchPaths = jsonPatchPaths(spec)
|
|
202
|
-
content = applyContentTypes(content, patchPaths)
|
|
203
|
-
|
|
204
|
-
fs.writeFileSync(SRC, content)
|
|
205
|
-
console.log(`SDK patch complete: PATCH content types set from the OpenAPI spec (${patchPaths.size} json-patch endpoint(s)).`)
|
|
206
|
-
})().catch((err) => {
|
|
207
|
-
console.error(err)
|
|
208
|
-
process.exit(1)
|
|
209
|
-
})
|
|
55
|
+
fs.writeFileSync(path, content)
|
|
56
|
+
console.log('SDK patch complete: All PATCH methods now use ContentType.JsonPatch.')
|
package/src/index.ts
CHANGED
|
@@ -2607,7 +2607,7 @@ export interface CreateInviteRequest {
|
|
|
2607
2607
|
phoneNumber?: string | null;
|
|
2608
2608
|
/** @deprecated */
|
|
2609
2609
|
relationship: CreateInviteRequestRelationshipEnum;
|
|
2610
|
-
loanID
|
|
2610
|
+
loanID?: string | null;
|
|
2611
2611
|
route?: string | null;
|
|
2612
2612
|
/** @format uuid */
|
|
2613
2613
|
siteConfigurationID: string;
|
|
@@ -3019,6 +3019,7 @@ export interface DraftRequest {
|
|
|
3019
3019
|
applicationPayload: any;
|
|
3020
3020
|
customData?: any | null;
|
|
3021
3021
|
isCoBorrower: boolean;
|
|
3022
|
+
/** @format uuid */
|
|
3022
3023
|
partnerId?: string | null;
|
|
3023
3024
|
}
|
|
3024
3025
|
|
|
@@ -4049,6 +4050,7 @@ export interface LoanApplicationRequest {
|
|
|
4049
4050
|
nonOwningBorrowers: LoanNonOwningBorrowerRequest[];
|
|
4050
4051
|
/** @format uuid */
|
|
4051
4052
|
draftId?: string | null;
|
|
4053
|
+
/** @format uuid */
|
|
4052
4054
|
partnerId?: string | null;
|
|
4053
4055
|
additionalFields?: Record<string, any> | null;
|
|
4054
4056
|
/** @format uuid */
|
|
@@ -6496,7 +6498,8 @@ export interface PartnerFormLink {
|
|
|
6496
6498
|
}
|
|
6497
6499
|
|
|
6498
6500
|
export interface PartnerLinks {
|
|
6499
|
-
|
|
6501
|
+
/** @format uuid */
|
|
6502
|
+
partnerId: string;
|
|
6500
6503
|
loanOfficers: PartnerLoanOfficerLinks[];
|
|
6501
6504
|
}
|
|
6502
6505
|
|
|
@@ -6515,10 +6518,6 @@ export interface PartnerSearchCriteria {
|
|
|
6515
6518
|
roles?: UserRole[] | null;
|
|
6516
6519
|
}
|
|
6517
6520
|
|
|
6518
|
-
export interface PartnerSlug {
|
|
6519
|
-
slug: string;
|
|
6520
|
-
}
|
|
6521
|
-
|
|
6522
6521
|
export interface PendingInvite {
|
|
6523
6522
|
status: PendingInviteStatusEnum;
|
|
6524
6523
|
/** @format uuid */
|
|
@@ -8162,10 +8161,6 @@ export interface UpdatePartnerPortalRequest {
|
|
|
8162
8161
|
isEnabled?: boolean | null;
|
|
8163
8162
|
}
|
|
8164
8163
|
|
|
8165
|
-
export interface UpdatePartnerSlugRequest {
|
|
8166
|
-
slug: string;
|
|
8167
|
-
}
|
|
8168
|
-
|
|
8169
8164
|
export interface UpdateUserGroupRequest {
|
|
8170
8165
|
name: string;
|
|
8171
8166
|
description?: string | null;
|
|
@@ -10034,15 +10029,7 @@ export class HttpClient<SecurityDataType = unknown> {
|
|
|
10034
10029
|
property instanceof Array ? property : [property];
|
|
10035
10030
|
|
|
10036
10031
|
for (const formItem of propertyContent) {
|
|
10037
|
-
|
|
10038
|
-
const isReactNativeFile =
|
|
10039
|
-
!!formItem &&
|
|
10040
|
-
typeof formItem === "object" &&
|
|
10041
|
-
"uri" in formItem &&
|
|
10042
|
-
"name" in formItem &&
|
|
10043
|
-
"type" in formItem;
|
|
10044
|
-
const isFileType =
|
|
10045
|
-
isReactNativeFile || formItem instanceof Blob || formItem instanceof File;
|
|
10032
|
+
const isFileType = formItem instanceof Blob || formItem instanceof File;
|
|
10046
10033
|
formData.append(
|
|
10047
10034
|
key,
|
|
10048
10035
|
isFileType ? formItem : this.stringifyFormItem(formItem),
|
|
@@ -10104,7 +10091,7 @@ export class HttpClient<SecurityDataType = unknown> {
|
|
|
10104
10091
|
|
|
10105
10092
|
/**
|
|
10106
10093
|
* @title The Big POS API
|
|
10107
|
-
* @version v3.
|
|
10094
|
+
* @version v3.20.0
|
|
10108
10095
|
* @termsOfService https://www.thebigpos.com/terms-of-use/
|
|
10109
10096
|
* @contact Mortgage Automation Technologies <support@thebigpos.com> (https://www.thebigpos.com/terms-of-use/)
|
|
10110
10097
|
*/
|
|
@@ -15758,30 +15745,6 @@ export class Api<
|
|
|
15758
15745
|
...params,
|
|
15759
15746
|
}),
|
|
15760
15747
|
|
|
15761
|
-
/**
|
|
15762
|
-
* No description
|
|
15763
|
-
*
|
|
15764
|
-
* @tags LegacyLoan
|
|
15765
|
-
* @name GetLoanEmbeddedSigningLink
|
|
15766
|
-
* @summary Get Embedded Signing Link
|
|
15767
|
-
* @request POST:/api/los/loan/embeddedsigning/{envelopeId}/{userName}/{email}
|
|
15768
|
-
* @secure
|
|
15769
|
-
* @response `200` `string` OK
|
|
15770
|
-
*/
|
|
15771
|
-
getLoanEmbeddedSigningLink: (
|
|
15772
|
-
envelopeId: string,
|
|
15773
|
-
userName: string,
|
|
15774
|
-
email: string,
|
|
15775
|
-
params: RequestParams = {},
|
|
15776
|
-
) =>
|
|
15777
|
-
this.request<string, any>({
|
|
15778
|
-
path: `/api/los/loan/embeddedsigning/${envelopeId}/${userName}/${email}`,
|
|
15779
|
-
method: "POST",
|
|
15780
|
-
secure: true,
|
|
15781
|
-
format: "json",
|
|
15782
|
-
...params,
|
|
15783
|
-
}),
|
|
15784
|
-
|
|
15785
15748
|
/**
|
|
15786
15749
|
* No description
|
|
15787
15750
|
*
|
|
@@ -20067,35 +20030,6 @@ export class Api<
|
|
|
20067
20030
|
...params,
|
|
20068
20031
|
}),
|
|
20069
20032
|
|
|
20070
|
-
/**
|
|
20071
|
-
* @description Changes the short name a realtor's partner links carry. Links shared with the previous name stop working.
|
|
20072
|
-
*
|
|
20073
|
-
* @tags Partners
|
|
20074
|
-
* @name UpdatePartnerLinkSlug
|
|
20075
|
-
* @summary Update Partner Link Slug
|
|
20076
|
-
* @request PUT:/api/partners/{realtorId}/link-slug
|
|
20077
|
-
* @secure
|
|
20078
|
-
* @response `200` `PartnerSlug` OK
|
|
20079
|
-
* @response `403` `ProblemDetails` Forbidden
|
|
20080
|
-
* @response `404` `ProblemDetails` Not Found
|
|
20081
|
-
* @response `409` `ProblemDetails` Conflict
|
|
20082
|
-
* @response `422` `UnprocessableEntity` Unprocessable Content
|
|
20083
|
-
*/
|
|
20084
|
-
updatePartnerLinkSlug: (
|
|
20085
|
-
realtorId: string,
|
|
20086
|
-
data: UpdatePartnerSlugRequest,
|
|
20087
|
-
params: RequestParams = {},
|
|
20088
|
-
) =>
|
|
20089
|
-
this.request<PartnerSlug, ProblemDetails | UnprocessableEntity>({
|
|
20090
|
-
path: `/api/partners/${realtorId}/link-slug`,
|
|
20091
|
-
method: "PUT",
|
|
20092
|
-
body: data,
|
|
20093
|
-
secure: true,
|
|
20094
|
-
type: "application/json",
|
|
20095
|
-
format: "json",
|
|
20096
|
-
...params,
|
|
20097
|
-
}),
|
|
20098
|
-
|
|
20099
20033
|
/**
|
|
20100
20034
|
* No description
|
|
20101
20035
|
*
|
|
@@ -23074,34 +23008,6 @@ export class Api<
|
|
|
23074
23008
|
...params,
|
|
23075
23009
|
}),
|
|
23076
23010
|
|
|
23077
|
-
/**
|
|
23078
|
-
* @description Changes the short name the partner's links carry and returns the links rebuilt with it. Links shared with the previous name stop working.
|
|
23079
|
-
*
|
|
23080
|
-
* @tags UsersMe
|
|
23081
|
-
* @name UpdateMyPartnerLinkSlug
|
|
23082
|
-
* @summary Update My Partner Link Slug
|
|
23083
|
-
* @request PUT:/api/users/me/partner-links/slug
|
|
23084
|
-
* @secure
|
|
23085
|
-
* @response `200` `PartnerLinks` OK
|
|
23086
|
-
* @response `403` `ProblemDetails` Forbidden
|
|
23087
|
-
* @response `404` `ProblemDetails` Not Found
|
|
23088
|
-
* @response `409` `ProblemDetails` Conflict
|
|
23089
|
-
* @response `422` `UnprocessableEntity` Unprocessable Content
|
|
23090
|
-
*/
|
|
23091
|
-
updateMyPartnerLinkSlug: (
|
|
23092
|
-
data: UpdatePartnerSlugRequest,
|
|
23093
|
-
params: RequestParams = {},
|
|
23094
|
-
) =>
|
|
23095
|
-
this.request<PartnerLinks, ProblemDetails | UnprocessableEntity>({
|
|
23096
|
-
path: `/api/users/me/partner-links/slug`,
|
|
23097
|
-
method: "PUT",
|
|
23098
|
-
body: data,
|
|
23099
|
-
secure: true,
|
|
23100
|
-
type: "application/json",
|
|
23101
|
-
format: "json",
|
|
23102
|
-
...params,
|
|
23103
|
-
}),
|
|
23104
|
-
|
|
23105
23011
|
/**
|
|
23106
23012
|
* No description
|
|
23107
23013
|
*
|
package/docs/sdk_generation.md
DELETED
|
@@ -1,149 +0,0 @@
|
|
|
1
|
-
# Publishing the POS Typescript SDK
|
|
2
|
-
|
|
3
|
-
## Prerequisites
|
|
4
|
-
|
|
5
|
-
1. Clone the repository (if you haven't already):
|
|
6
|
-
|
|
7
|
-
```bash
|
|
8
|
-
git clone https://github.com/MortgageAutomationTechnologies/thebigpos-sdk-typescript
|
|
9
|
-
cd thebigpos-sdk-typescript
|
|
10
|
-
```
|
|
11
|
-
|
|
12
|
-
2. Install swagger-typescript-api globally:
|
|
13
|
-
|
|
14
|
-
```bash
|
|
15
|
-
npm i -g swagger-typescript-api
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
3. Connect to the MAT VPN
|
|
19
|
-
|
|
20
|
-
## Step 1: Create a release branch
|
|
21
|
-
|
|
22
|
-
Create a new branch for the version you're releasing:
|
|
23
|
-
|
|
24
|
-
```bash
|
|
25
|
-
git checkout develop
|
|
26
|
-
git pull origin develop
|
|
27
|
-
git checkout -b release/X.Y.Z
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
## Step 2: Generate the SDK
|
|
31
|
-
|
|
32
|
-
Replace `{version}` with the target API version (e.g., `v2.31.0`):
|
|
33
|
-
|
|
34
|
-
```bash
|
|
35
|
-
npx swagger-typescript-api generate -p https://api.thebigpos.dev/swagger/{version}/swagger.json -o ./src -n index.ts -r true --axios --enum-names-as-values --generate-union-enums
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
> **Note:** If generating locally, use `http://localhost:5212/swagger/{version}/swagger.json` due to self-signed cert issues with https.
|
|
39
|
-
|
|
40
|
-
## Step 3: Apply post-generation fixes
|
|
41
|
-
|
|
42
|
-
Run the script to fix PATCH methods content type and Operation interface:
|
|
43
|
-
|
|
44
|
-
```bash
|
|
45
|
-
node scripts/apply-json-patch-content-type.js
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
This script:
|
|
49
|
-
- Sets all PATCH methods to use `ContentType.JsonPatch`
|
|
50
|
-
- Adds `JsonPatch` to the `ContentType` enum
|
|
51
|
-
- Fixes the `Operation` interface to allow any value type
|
|
52
|
-
|
|
53
|
-
## Step 4: Update the version
|
|
54
|
-
|
|
55
|
-
Use npm's version command to update the version in `package.json`:
|
|
56
|
-
|
|
57
|
-
```bash
|
|
58
|
-
npm version X.Y.Z
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
**Version conventions:**
|
|
62
|
-
|
|
63
|
-
- Match the SDK version to the API version being released
|
|
64
|
-
- For release candidates (pre-release), use: `npm version X.Y.Z-rc.N --preid=rc`
|
|
65
|
-
- For patch increments: `npm version patch`
|
|
66
|
-
- For minor increments: `npm version minor`
|
|
67
|
-
|
|
68
|
-
## Step 5: Build the SDK
|
|
69
|
-
|
|
70
|
-
```bash
|
|
71
|
-
npm run build
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
Ensure there are no TypeScript compilation errors.
|
|
75
|
-
|
|
76
|
-
## Step 6: Merge develop (if needed)
|
|
77
|
-
|
|
78
|
-
If there are changes in develop that need to be included:
|
|
79
|
-
|
|
80
|
-
```bash
|
|
81
|
-
git fetch origin develop
|
|
82
|
-
git merge origin/develop
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
If there are conflicts in `src/index.ts` or `dist/*`, regenerate the SDK (Step 2), apply fixes (Step 3), and rebuild (Step 5) to resolve them.
|
|
86
|
-
|
|
87
|
-
## Step 7: Commit and push
|
|
88
|
-
|
|
89
|
-
```bash
|
|
90
|
-
git add .
|
|
91
|
-
git commit -m "X.Y.Z"
|
|
92
|
-
git push -u origin release/X.Y.Z
|
|
93
|
-
```
|
|
94
|
-
|
|
95
|
-
## Step 8: Publish to NPM
|
|
96
|
-
|
|
97
|
-
### Authentication
|
|
98
|
-
|
|
99
|
-
NPM requires a granular access token with publish permissions and 2FA bypass enabled.
|
|
100
|
-
|
|
101
|
-
1. Go to [npmjs.com](https://www.npmjs.com) > Access Tokens > Generate New Token
|
|
102
|
-
2. Select "Granular Access Token"
|
|
103
|
-
3. Enable "Bypass 2FA for automation"
|
|
104
|
-
4. Set permissions to publish to `@matech/thebigpos-sdk`
|
|
105
|
-
|
|
106
|
-
Configure the token:
|
|
107
|
-
|
|
108
|
-
```bash
|
|
109
|
-
npm config set //registry.npmjs.org/:_authToken YOUR_TOKEN
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
### Publish
|
|
113
|
-
|
|
114
|
-
**To latest (stable release):**
|
|
115
|
-
|
|
116
|
-
```bash
|
|
117
|
-
npm publish --access public
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
**To next (pre-release):**
|
|
121
|
-
|
|
122
|
-
```bash
|
|
123
|
-
npm publish --tag next
|
|
124
|
-
```
|
|
125
|
-
|
|
126
|
-
**To a feature tag (for testing):**
|
|
127
|
-
|
|
128
|
-
```bash
|
|
129
|
-
npm publish --tag feature-name
|
|
130
|
-
```
|
|
131
|
-
|
|
132
|
-
### Installing the SDK
|
|
133
|
-
|
|
134
|
-
```bash
|
|
135
|
-
# Latest stable
|
|
136
|
-
yarn add @matech/thebigpos-sdk
|
|
137
|
-
|
|
138
|
-
# Next pre-release
|
|
139
|
-
yarn add @matech/thebigpos-sdk@next
|
|
140
|
-
|
|
141
|
-
# Specific version
|
|
142
|
-
yarn add @matech/thebigpos-sdk@X.Y.Z
|
|
143
|
-
```
|
|
144
|
-
|
|
145
|
-
## Step 9: Clean up
|
|
146
|
-
|
|
147
|
-
1. **Revoke the NPM token** after publishing for security
|
|
148
|
-
2. **Create a Pull Request** from `release/X.Y.Z` to `develop` and `main`
|
|
149
|
-
3. **Create a GitHub Release** with release notes
|