@postman-cse/onboarding-bootstrap 2.1.1 → 2.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/action.cjs +52 -42
- package/dist/cli.cjs +52 -42
- package/dist/index.cjs +52 -42
- package/package.json +1 -1
package/dist/action.cjs
CHANGED
|
@@ -299522,7 +299522,7 @@ function extractGitRepoUrl(value) {
|
|
|
299522
299522
|
}
|
|
299523
299523
|
var PostmanGatewayAssetsClient = class _PostmanGatewayAssetsClient {
|
|
299524
299524
|
static GENERATION_LOCKED_MAX_RETRIES = 5;
|
|
299525
|
-
static GENERATION_POLL_ATTEMPTS =
|
|
299525
|
+
static GENERATION_POLL_ATTEMPTS = 90;
|
|
299526
299526
|
static GENERATION_POLL_DELAY_MS = 2e3;
|
|
299527
299527
|
gateway;
|
|
299528
299528
|
sleep;
|
|
@@ -299897,6 +299897,40 @@ var PostmanGatewayAssetsClient = class _PostmanGatewayAssetsClient {
|
|
|
299897
299897
|
const u = String(uid ?? "").trim();
|
|
299898
299898
|
return u.includes("-") ? u.slice(u.indexOf("-") + 1) : u;
|
|
299899
299899
|
}
|
|
299900
|
+
/**
|
|
299901
|
+
* PATCH a freshly-created item's `/scripts`, tolerating the two transient
|
|
299902
|
+
* failures this immediate-after-create write is prone to on the shared gateway:
|
|
299903
|
+
* - `404 RESOURCE_NOT_FOUND` — the create write returns the assigned id, but
|
|
299904
|
+
* an immediate PATCH can hit a replica that has not yet observed the create
|
|
299905
|
+
* (read-after-write lag, live-observed on org-mode teams).
|
|
299906
|
+
* - a downstream `5xx` (e.g. `500 ESOCKETTIMEDOUT`) — a Bifrost/gateway read
|
|
299907
|
+
* timeout, not a durable rejection.
|
|
299908
|
+
* `op:add /scripts` is idempotent (overwrites), so retrying either is safe.
|
|
299909
|
+
* This is a deeper, longer-backoff budget than the gateway client's inner
|
|
299910
|
+
* transient retry, to wait out a longer platform hiccup on this fragile write.
|
|
299911
|
+
* Non-transient errors (e.g. 4xx schema rejections) surface immediately.
|
|
299912
|
+
*/
|
|
299913
|
+
async patchNewItemScripts(cid, itemId, scripts) {
|
|
299914
|
+
const maxAttempts = 6;
|
|
299915
|
+
for (let attempt = 0; attempt < maxAttempts; attempt += 1) {
|
|
299916
|
+
try {
|
|
299917
|
+
await this.gateway.requestJson({
|
|
299918
|
+
service: "collection",
|
|
299919
|
+
method: "patch",
|
|
299920
|
+
path: `/v3/collections/${cid}/items/${itemId}`,
|
|
299921
|
+
headers: { "X-Entity-Type": "http-request" },
|
|
299922
|
+
body: [{ op: "add", path: "/scripts", value: scripts }]
|
|
299923
|
+
});
|
|
299924
|
+
return;
|
|
299925
|
+
} catch (error2) {
|
|
299926
|
+
const retriable = error2 instanceof HttpError && (error2.status === 404 || error2.status >= 500);
|
|
299927
|
+
if (!retriable || attempt === maxAttempts - 1) {
|
|
299928
|
+
throw error2;
|
|
299929
|
+
}
|
|
299930
|
+
await this.sleep(Math.min(2e3, 300 * 2 ** attempt));
|
|
299931
|
+
}
|
|
299932
|
+
}
|
|
299933
|
+
}
|
|
299900
299934
|
/**
|
|
299901
299935
|
* Apply tag slugs via the dedicated `tagging` service:
|
|
299902
299936
|
* `PUT /v1/tags/collections/:uid` (full uid), body `{ tags:[{ slug }] }` — the
|
|
@@ -300014,26 +300048,14 @@ var PostmanGatewayAssetsClient = class _PostmanGatewayAssetsClient {
|
|
|
300014
300048
|
});
|
|
300015
300049
|
const newItemId = String(asRecord7(created?.data)?.id ?? "").trim();
|
|
300016
300050
|
if (!newItemId) return;
|
|
300017
|
-
await this.
|
|
300018
|
-
|
|
300019
|
-
|
|
300020
|
-
|
|
300021
|
-
|
|
300022
|
-
|
|
300023
|
-
|
|
300024
|
-
|
|
300025
|
-
path: "/scripts",
|
|
300026
|
-
value: toV3Scripts([
|
|
300027
|
-
'if (pm.environment.get("CI") === "true") { return; }',
|
|
300028
|
-
"const body = pm.response.json();",
|
|
300029
|
-
"if (body.SecretString) {",
|
|
300030
|
-
" const secrets = JSON.parse(body.SecretString);",
|
|
300031
|
-
" Object.entries(secrets).forEach(([k, v]) => pm.collectionVariables.set(k, v));",
|
|
300032
|
-
"}"
|
|
300033
|
-
])
|
|
300034
|
-
}
|
|
300035
|
-
]
|
|
300036
|
-
});
|
|
300051
|
+
await this.patchNewItemScripts(cid, newItemId, toV3Scripts([
|
|
300052
|
+
'if (pm.environment.get("CI") === "true") { return; }',
|
|
300053
|
+
"const body = pm.response.json();",
|
|
300054
|
+
"if (body.SecretString) {",
|
|
300055
|
+
" const secrets = JSON.parse(body.SecretString);",
|
|
300056
|
+
" Object.entries(secrets).forEach(([k, v]) => pm.collectionVariables.set(k, v));",
|
|
300057
|
+
"}"
|
|
300058
|
+
]));
|
|
300037
300059
|
}
|
|
300038
300060
|
// --- workspace roles + member resolution (live-proven 2026-06-30) ---
|
|
300039
300061
|
//
|
|
@@ -300192,26 +300214,14 @@ var PostmanGatewayAssetsClient = class _PostmanGatewayAssetsClient {
|
|
|
300192
300214
|
});
|
|
300193
300215
|
const newItemId = String(asRecord7(created?.data)?.id ?? "").trim();
|
|
300194
300216
|
if (newItemId) {
|
|
300195
|
-
await this.
|
|
300196
|
-
|
|
300197
|
-
|
|
300198
|
-
|
|
300199
|
-
|
|
300200
|
-
|
|
300201
|
-
|
|
300202
|
-
|
|
300203
|
-
path: "/scripts",
|
|
300204
|
-
value: toV3Scripts([
|
|
300205
|
-
'if (pm.environment.get("CI") === "true") { return; }',
|
|
300206
|
-
"const body = pm.response.json();",
|
|
300207
|
-
"if (body.SecretString) {",
|
|
300208
|
-
" const secrets = JSON.parse(body.SecretString);",
|
|
300209
|
-
" Object.entries(secrets).forEach(([k, v]) => pm.collectionVariables.set(k, v));",
|
|
300210
|
-
"}"
|
|
300211
|
-
])
|
|
300212
|
-
}
|
|
300213
|
-
]
|
|
300214
|
-
});
|
|
300217
|
+
await this.patchNewItemScripts(cid, newItemId, toV3Scripts([
|
|
300218
|
+
'if (pm.environment.get("CI") === "true") { return; }',
|
|
300219
|
+
"const body = pm.response.json();",
|
|
300220
|
+
"if (body.SecretString) {",
|
|
300221
|
+
" const secrets = JSON.parse(body.SecretString);",
|
|
300222
|
+
" Object.entries(secrets).forEach(([k, v]) => pm.collectionVariables.set(k, v));",
|
|
300223
|
+
"}"
|
|
300224
|
+
]));
|
|
300215
300225
|
}
|
|
300216
300226
|
}
|
|
300217
300227
|
return plan.warnings;
|
|
@@ -301047,7 +301057,7 @@ function resolveActionVersion(explicit) {
|
|
|
301047
301057
|
if (explicit) {
|
|
301048
301058
|
return explicit;
|
|
301049
301059
|
}
|
|
301050
|
-
return "2.1.
|
|
301060
|
+
return "2.1.2" ? "2.1.2" : "unknown";
|
|
301051
301061
|
}
|
|
301052
301062
|
function telemetryDisabled(env) {
|
|
301053
301063
|
const flag = String(env.POSTMAN_ACTIONS_TELEMETRY ?? "").trim().toLowerCase();
|
package/dist/cli.cjs
CHANGED
|
@@ -297840,7 +297840,7 @@ function extractGitRepoUrl(value) {
|
|
|
297840
297840
|
}
|
|
297841
297841
|
var PostmanGatewayAssetsClient = class _PostmanGatewayAssetsClient {
|
|
297842
297842
|
static GENERATION_LOCKED_MAX_RETRIES = 5;
|
|
297843
|
-
static GENERATION_POLL_ATTEMPTS =
|
|
297843
|
+
static GENERATION_POLL_ATTEMPTS = 90;
|
|
297844
297844
|
static GENERATION_POLL_DELAY_MS = 2e3;
|
|
297845
297845
|
gateway;
|
|
297846
297846
|
sleep;
|
|
@@ -298215,6 +298215,40 @@ var PostmanGatewayAssetsClient = class _PostmanGatewayAssetsClient {
|
|
|
298215
298215
|
const u = String(uid ?? "").trim();
|
|
298216
298216
|
return u.includes("-") ? u.slice(u.indexOf("-") + 1) : u;
|
|
298217
298217
|
}
|
|
298218
|
+
/**
|
|
298219
|
+
* PATCH a freshly-created item's `/scripts`, tolerating the two transient
|
|
298220
|
+
* failures this immediate-after-create write is prone to on the shared gateway:
|
|
298221
|
+
* - `404 RESOURCE_NOT_FOUND` — the create write returns the assigned id, but
|
|
298222
|
+
* an immediate PATCH can hit a replica that has not yet observed the create
|
|
298223
|
+
* (read-after-write lag, live-observed on org-mode teams).
|
|
298224
|
+
* - a downstream `5xx` (e.g. `500 ESOCKETTIMEDOUT`) — a Bifrost/gateway read
|
|
298225
|
+
* timeout, not a durable rejection.
|
|
298226
|
+
* `op:add /scripts` is idempotent (overwrites), so retrying either is safe.
|
|
298227
|
+
* This is a deeper, longer-backoff budget than the gateway client's inner
|
|
298228
|
+
* transient retry, to wait out a longer platform hiccup on this fragile write.
|
|
298229
|
+
* Non-transient errors (e.g. 4xx schema rejections) surface immediately.
|
|
298230
|
+
*/
|
|
298231
|
+
async patchNewItemScripts(cid, itemId, scripts) {
|
|
298232
|
+
const maxAttempts = 6;
|
|
298233
|
+
for (let attempt = 0; attempt < maxAttempts; attempt += 1) {
|
|
298234
|
+
try {
|
|
298235
|
+
await this.gateway.requestJson({
|
|
298236
|
+
service: "collection",
|
|
298237
|
+
method: "patch",
|
|
298238
|
+
path: `/v3/collections/${cid}/items/${itemId}`,
|
|
298239
|
+
headers: { "X-Entity-Type": "http-request" },
|
|
298240
|
+
body: [{ op: "add", path: "/scripts", value: scripts }]
|
|
298241
|
+
});
|
|
298242
|
+
return;
|
|
298243
|
+
} catch (error) {
|
|
298244
|
+
const retriable = error instanceof HttpError && (error.status === 404 || error.status >= 500);
|
|
298245
|
+
if (!retriable || attempt === maxAttempts - 1) {
|
|
298246
|
+
throw error;
|
|
298247
|
+
}
|
|
298248
|
+
await this.sleep(Math.min(2e3, 300 * 2 ** attempt));
|
|
298249
|
+
}
|
|
298250
|
+
}
|
|
298251
|
+
}
|
|
298218
298252
|
/**
|
|
298219
298253
|
* Apply tag slugs via the dedicated `tagging` service:
|
|
298220
298254
|
* `PUT /v1/tags/collections/:uid` (full uid), body `{ tags:[{ slug }] }` — the
|
|
@@ -298332,26 +298366,14 @@ var PostmanGatewayAssetsClient = class _PostmanGatewayAssetsClient {
|
|
|
298332
298366
|
});
|
|
298333
298367
|
const newItemId = String(asRecord7(created?.data)?.id ?? "").trim();
|
|
298334
298368
|
if (!newItemId) return;
|
|
298335
|
-
await this.
|
|
298336
|
-
|
|
298337
|
-
|
|
298338
|
-
|
|
298339
|
-
|
|
298340
|
-
|
|
298341
|
-
|
|
298342
|
-
|
|
298343
|
-
path: "/scripts",
|
|
298344
|
-
value: toV3Scripts([
|
|
298345
|
-
'if (pm.environment.get("CI") === "true") { return; }',
|
|
298346
|
-
"const body = pm.response.json();",
|
|
298347
|
-
"if (body.SecretString) {",
|
|
298348
|
-
" const secrets = JSON.parse(body.SecretString);",
|
|
298349
|
-
" Object.entries(secrets).forEach(([k, v]) => pm.collectionVariables.set(k, v));",
|
|
298350
|
-
"}"
|
|
298351
|
-
])
|
|
298352
|
-
}
|
|
298353
|
-
]
|
|
298354
|
-
});
|
|
298369
|
+
await this.patchNewItemScripts(cid, newItemId, toV3Scripts([
|
|
298370
|
+
'if (pm.environment.get("CI") === "true") { return; }',
|
|
298371
|
+
"const body = pm.response.json();",
|
|
298372
|
+
"if (body.SecretString) {",
|
|
298373
|
+
" const secrets = JSON.parse(body.SecretString);",
|
|
298374
|
+
" Object.entries(secrets).forEach(([k, v]) => pm.collectionVariables.set(k, v));",
|
|
298375
|
+
"}"
|
|
298376
|
+
]));
|
|
298355
298377
|
}
|
|
298356
298378
|
// --- workspace roles + member resolution (live-proven 2026-06-30) ---
|
|
298357
298379
|
//
|
|
@@ -298510,26 +298532,14 @@ var PostmanGatewayAssetsClient = class _PostmanGatewayAssetsClient {
|
|
|
298510
298532
|
});
|
|
298511
298533
|
const newItemId = String(asRecord7(created?.data)?.id ?? "").trim();
|
|
298512
298534
|
if (newItemId) {
|
|
298513
|
-
await this.
|
|
298514
|
-
|
|
298515
|
-
|
|
298516
|
-
|
|
298517
|
-
|
|
298518
|
-
|
|
298519
|
-
|
|
298520
|
-
|
|
298521
|
-
path: "/scripts",
|
|
298522
|
-
value: toV3Scripts([
|
|
298523
|
-
'if (pm.environment.get("CI") === "true") { return; }',
|
|
298524
|
-
"const body = pm.response.json();",
|
|
298525
|
-
"if (body.SecretString) {",
|
|
298526
|
-
" const secrets = JSON.parse(body.SecretString);",
|
|
298527
|
-
" Object.entries(secrets).forEach(([k, v]) => pm.collectionVariables.set(k, v));",
|
|
298528
|
-
"}"
|
|
298529
|
-
])
|
|
298530
|
-
}
|
|
298531
|
-
]
|
|
298532
|
-
});
|
|
298535
|
+
await this.patchNewItemScripts(cid, newItemId, toV3Scripts([
|
|
298536
|
+
'if (pm.environment.get("CI") === "true") { return; }',
|
|
298537
|
+
"const body = pm.response.json();",
|
|
298538
|
+
"if (body.SecretString) {",
|
|
298539
|
+
" const secrets = JSON.parse(body.SecretString);",
|
|
298540
|
+
" Object.entries(secrets).forEach(([k, v]) => pm.collectionVariables.set(k, v));",
|
|
298541
|
+
"}"
|
|
298542
|
+
]));
|
|
298533
298543
|
}
|
|
298534
298544
|
}
|
|
298535
298545
|
return plan.warnings;
|
|
@@ -299365,7 +299375,7 @@ function resolveActionVersion(explicit) {
|
|
|
299365
299375
|
if (explicit) {
|
|
299366
299376
|
return explicit;
|
|
299367
299377
|
}
|
|
299368
|
-
return "2.1.
|
|
299378
|
+
return "2.1.2" ? "2.1.2" : "unknown";
|
|
299369
299379
|
}
|
|
299370
299380
|
function telemetryDisabled(env) {
|
|
299371
299381
|
const flag = String(env.POSTMAN_ACTIONS_TELEMETRY ?? "").trim().toLowerCase();
|
package/dist/index.cjs
CHANGED
|
@@ -299539,7 +299539,7 @@ function extractGitRepoUrl(value) {
|
|
|
299539
299539
|
}
|
|
299540
299540
|
var PostmanGatewayAssetsClient = class _PostmanGatewayAssetsClient {
|
|
299541
299541
|
static GENERATION_LOCKED_MAX_RETRIES = 5;
|
|
299542
|
-
static GENERATION_POLL_ATTEMPTS =
|
|
299542
|
+
static GENERATION_POLL_ATTEMPTS = 90;
|
|
299543
299543
|
static GENERATION_POLL_DELAY_MS = 2e3;
|
|
299544
299544
|
gateway;
|
|
299545
299545
|
sleep;
|
|
@@ -299914,6 +299914,40 @@ var PostmanGatewayAssetsClient = class _PostmanGatewayAssetsClient {
|
|
|
299914
299914
|
const u = String(uid ?? "").trim();
|
|
299915
299915
|
return u.includes("-") ? u.slice(u.indexOf("-") + 1) : u;
|
|
299916
299916
|
}
|
|
299917
|
+
/**
|
|
299918
|
+
* PATCH a freshly-created item's `/scripts`, tolerating the two transient
|
|
299919
|
+
* failures this immediate-after-create write is prone to on the shared gateway:
|
|
299920
|
+
* - `404 RESOURCE_NOT_FOUND` — the create write returns the assigned id, but
|
|
299921
|
+
* an immediate PATCH can hit a replica that has not yet observed the create
|
|
299922
|
+
* (read-after-write lag, live-observed on org-mode teams).
|
|
299923
|
+
* - a downstream `5xx` (e.g. `500 ESOCKETTIMEDOUT`) — a Bifrost/gateway read
|
|
299924
|
+
* timeout, not a durable rejection.
|
|
299925
|
+
* `op:add /scripts` is idempotent (overwrites), so retrying either is safe.
|
|
299926
|
+
* This is a deeper, longer-backoff budget than the gateway client's inner
|
|
299927
|
+
* transient retry, to wait out a longer platform hiccup on this fragile write.
|
|
299928
|
+
* Non-transient errors (e.g. 4xx schema rejections) surface immediately.
|
|
299929
|
+
*/
|
|
299930
|
+
async patchNewItemScripts(cid, itemId, scripts) {
|
|
299931
|
+
const maxAttempts = 6;
|
|
299932
|
+
for (let attempt = 0; attempt < maxAttempts; attempt += 1) {
|
|
299933
|
+
try {
|
|
299934
|
+
await this.gateway.requestJson({
|
|
299935
|
+
service: "collection",
|
|
299936
|
+
method: "patch",
|
|
299937
|
+
path: `/v3/collections/${cid}/items/${itemId}`,
|
|
299938
|
+
headers: { "X-Entity-Type": "http-request" },
|
|
299939
|
+
body: [{ op: "add", path: "/scripts", value: scripts }]
|
|
299940
|
+
});
|
|
299941
|
+
return;
|
|
299942
|
+
} catch (error2) {
|
|
299943
|
+
const retriable = error2 instanceof HttpError && (error2.status === 404 || error2.status >= 500);
|
|
299944
|
+
if (!retriable || attempt === maxAttempts - 1) {
|
|
299945
|
+
throw error2;
|
|
299946
|
+
}
|
|
299947
|
+
await this.sleep(Math.min(2e3, 300 * 2 ** attempt));
|
|
299948
|
+
}
|
|
299949
|
+
}
|
|
299950
|
+
}
|
|
299917
299951
|
/**
|
|
299918
299952
|
* Apply tag slugs via the dedicated `tagging` service:
|
|
299919
299953
|
* `PUT /v1/tags/collections/:uid` (full uid), body `{ tags:[{ slug }] }` — the
|
|
@@ -300031,26 +300065,14 @@ var PostmanGatewayAssetsClient = class _PostmanGatewayAssetsClient {
|
|
|
300031
300065
|
});
|
|
300032
300066
|
const newItemId = String(asRecord7(created?.data)?.id ?? "").trim();
|
|
300033
300067
|
if (!newItemId) return;
|
|
300034
|
-
await this.
|
|
300035
|
-
|
|
300036
|
-
|
|
300037
|
-
|
|
300038
|
-
|
|
300039
|
-
|
|
300040
|
-
|
|
300041
|
-
|
|
300042
|
-
path: "/scripts",
|
|
300043
|
-
value: toV3Scripts([
|
|
300044
|
-
'if (pm.environment.get("CI") === "true") { return; }',
|
|
300045
|
-
"const body = pm.response.json();",
|
|
300046
|
-
"if (body.SecretString) {",
|
|
300047
|
-
" const secrets = JSON.parse(body.SecretString);",
|
|
300048
|
-
" Object.entries(secrets).forEach(([k, v]) => pm.collectionVariables.set(k, v));",
|
|
300049
|
-
"}"
|
|
300050
|
-
])
|
|
300051
|
-
}
|
|
300052
|
-
]
|
|
300053
|
-
});
|
|
300068
|
+
await this.patchNewItemScripts(cid, newItemId, toV3Scripts([
|
|
300069
|
+
'if (pm.environment.get("CI") === "true") { return; }',
|
|
300070
|
+
"const body = pm.response.json();",
|
|
300071
|
+
"if (body.SecretString) {",
|
|
300072
|
+
" const secrets = JSON.parse(body.SecretString);",
|
|
300073
|
+
" Object.entries(secrets).forEach(([k, v]) => pm.collectionVariables.set(k, v));",
|
|
300074
|
+
"}"
|
|
300075
|
+
]));
|
|
300054
300076
|
}
|
|
300055
300077
|
// --- workspace roles + member resolution (live-proven 2026-06-30) ---
|
|
300056
300078
|
//
|
|
@@ -300209,26 +300231,14 @@ var PostmanGatewayAssetsClient = class _PostmanGatewayAssetsClient {
|
|
|
300209
300231
|
});
|
|
300210
300232
|
const newItemId = String(asRecord7(created?.data)?.id ?? "").trim();
|
|
300211
300233
|
if (newItemId) {
|
|
300212
|
-
await this.
|
|
300213
|
-
|
|
300214
|
-
|
|
300215
|
-
|
|
300216
|
-
|
|
300217
|
-
|
|
300218
|
-
|
|
300219
|
-
|
|
300220
|
-
path: "/scripts",
|
|
300221
|
-
value: toV3Scripts([
|
|
300222
|
-
'if (pm.environment.get("CI") === "true") { return; }',
|
|
300223
|
-
"const body = pm.response.json();",
|
|
300224
|
-
"if (body.SecretString) {",
|
|
300225
|
-
" const secrets = JSON.parse(body.SecretString);",
|
|
300226
|
-
" Object.entries(secrets).forEach(([k, v]) => pm.collectionVariables.set(k, v));",
|
|
300227
|
-
"}"
|
|
300228
|
-
])
|
|
300229
|
-
}
|
|
300230
|
-
]
|
|
300231
|
-
});
|
|
300234
|
+
await this.patchNewItemScripts(cid, newItemId, toV3Scripts([
|
|
300235
|
+
'if (pm.environment.get("CI") === "true") { return; }',
|
|
300236
|
+
"const body = pm.response.json();",
|
|
300237
|
+
"if (body.SecretString) {",
|
|
300238
|
+
" const secrets = JSON.parse(body.SecretString);",
|
|
300239
|
+
" Object.entries(secrets).forEach(([k, v]) => pm.collectionVariables.set(k, v));",
|
|
300240
|
+
"}"
|
|
300241
|
+
]));
|
|
300232
300242
|
}
|
|
300233
300243
|
}
|
|
300234
300244
|
return plan.warnings;
|
|
@@ -301064,7 +301074,7 @@ function resolveActionVersion(explicit) {
|
|
|
301064
301074
|
if (explicit) {
|
|
301065
301075
|
return explicit;
|
|
301066
301076
|
}
|
|
301067
|
-
return "2.1.
|
|
301077
|
+
return "2.1.2" ? "2.1.2" : "unknown";
|
|
301068
301078
|
}
|
|
301069
301079
|
function telemetryDisabled(env) {
|
|
301070
301080
|
const flag = String(env.POSTMAN_ACTIONS_TELEMETRY ?? "").trim().toLowerCase();
|