@delopay/sdk 0.266.0 → 0.269.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/dist/index.js CHANGED
@@ -23,6 +23,7 @@ import {
23
23
  BUILTIN_PAYMENT_ICON_KEYS,
24
24
  BuyerBlocklist,
25
25
  BuyerConversations,
26
+ BuyerEvidenceReviews,
26
27
  CARD_FIELD_CHROMES,
27
28
  CARD_FIELD_FONT_SIZES,
28
29
  CARD_FIELD_WEIGHTS,
@@ -113,6 +114,7 @@ import {
113
114
  SellToRestrictions,
114
115
  Settings,
115
116
  Settlement,
117
+ ShopLabels,
116
118
  Subscriptions,
117
119
  UNKNOWN_SECTION_ORDER,
118
120
  WCAG_AA_TEXT,
@@ -250,7 +252,7 @@ import {
250
252
  visibleCustomFields,
251
253
  whopAccentSwatch,
252
254
  whopCardElement
253
- } from "./chunk-T7DDPU7M.js";
255
+ } from "./chunk-HEDL3UHE.js";
254
256
  export {
255
257
  AIRWALLEX_AUTOFILL_TREATMENTS,
256
258
  AIRWALLEX_CARD_LAYOUTS,
@@ -276,6 +278,7 @@ export {
276
278
  BUILTIN_PAYMENT_ICON_KEYS,
277
279
  BuyerBlocklist,
278
280
  BuyerConversations,
281
+ BuyerEvidenceReviews,
279
282
  CARD_FIELD_CHROMES,
280
283
  CARD_FIELD_FONT_SIZES,
281
284
  CARD_FIELD_WEIGHTS,
@@ -366,6 +369,7 @@ export {
366
369
  SellToRestrictions,
367
370
  Settings,
368
371
  Settlement,
372
+ ShopLabels,
369
373
  Subscriptions,
370
374
  UNKNOWN_SECTION_ORDER,
371
375
  WCAG_AA_TEXT,
package/dist/internal.cjs CHANGED
@@ -47,6 +47,7 @@ __export(internal_exports, {
47
47
  BUILTIN_PAYMENT_ICON_KEYS: () => BUILTIN_PAYMENT_ICON_KEYS,
48
48
  BuyerBlocklist: () => BuyerBlocklist,
49
49
  BuyerConversations: () => BuyerConversations,
50
+ BuyerEvidenceReviews: () => BuyerEvidenceReviews,
50
51
  CARD_FIELD_CHROMES: () => CARD_FIELD_CHROMES,
51
52
  CARD_FIELD_FONT_SIZES: () => CARD_FIELD_FONT_SIZES,
52
53
  CARD_FIELD_WEIGHTS: () => CARD_FIELD_WEIGHTS,
@@ -150,6 +151,7 @@ __export(internal_exports, {
150
151
  SellToRestrictions: () => SellToRestrictions,
151
152
  Settings: () => Settings,
152
153
  Settlement: () => Settlement,
154
+ ShopLabels: () => ShopLabels,
153
155
  Subscriptions: () => Subscriptions,
154
156
  UNKNOWN_SECTION_ORDER: () => UNKNOWN_SECTION_ORDER,
155
157
  WCAG_AA_TEXT: () => WCAG_AA_TEXT,
@@ -2932,6 +2934,35 @@ var Payments = class {
2932
2934
  body: params
2933
2935
  });
2934
2936
  }
2937
+ /**
2938
+ * Abort a payment nobody has paid. The payment becomes `aborted`: its hosted
2939
+ * checkout stops taking payments, a confirm is refused, and it can no longer
2940
+ * be reactivated. Every processor object a buyer could still pay is closed
2941
+ * where the processor allows it, and a `payment_aborted` webhook is sent.
2942
+ *
2943
+ * A success the processor confirms later still moves the payment to
2944
+ * `succeeded`, so the order can be fulfilled or refunded. Aborting an
2945
+ * aborted payment returns it unchanged. A payment that took money, holds an
2946
+ * authorisation or awaits a merchant decision is refused with `IR_16`
2947
+ * (HTTP 400).
2948
+ *
2949
+ * `POST /payments/{paymentId}/abort`
2950
+ *
2951
+ * @param paymentId - The payment intent ID to abort.
2952
+ * @param params - Optional `reason`, at most 255 characters, stored as the
2953
+ * attempt's cancellation reason (`merchant_aborted` when absent).
2954
+ * @returns The payment, with status `aborted`.
2955
+ *
2956
+ * @example
2957
+ * ```typescript
2958
+ * const payment = await delopay.payments.abort('pay_123', { reason: 'order_cancelled' });
2959
+ * ```
2960
+ */
2961
+ async abort(paymentId, params) {
2962
+ return this.request("POST", `/payments/${encodeURIComponent(paymentId)}/abort`, {
2963
+ body: params ?? {}
2964
+ });
2965
+ }
2935
2966
  /**
2936
2967
  * List payment intents, optionally filtered by customer or date range.
2937
2968
  *
@@ -5941,6 +5972,63 @@ var BuyerBlocklist = class {
5941
5972
  }
5942
5973
  };
5943
5974
 
5975
+ // src/resources/shopLabels.ts
5976
+ var labelsPath = (merchantId) => `/account/${encodeURIComponent(merchantId)}/business-profile/labels`;
5977
+ var ShopLabels = class {
5978
+ constructor(request) {
5979
+ this.request = request;
5980
+ }
5981
+ /**
5982
+ * Every label of the merchant, ordered by name, each with the ids of the
5983
+ * shops that carry it. A shop with several labels appears under each of
5984
+ * them; a shop with none appears under no label. A caller limited to one
5985
+ * shop sees every label but only its own shop in `profile_ids`.
5986
+ * `GET /account/{merchantId}/business-profile/labels`
5987
+ */
5988
+ async list(merchantId) {
5989
+ return this.request("GET", labelsPath(merchantId));
5990
+ }
5991
+ /**
5992
+ * Create a label. The name is trimmed and inner whitespace collapsed; a
5993
+ * name that differs from an existing label only in letter case is refused
5994
+ * (`IR_38`), so one category is never spelled two ways. A merchant holds at
5995
+ * most 200 labels.
5996
+ * `POST /account/{merchantId}/business-profile/labels`
5997
+ */
5998
+ async create(merchantId, params) {
5999
+ return this.request("POST", labelsPath(merchantId), { body: params });
6000
+ }
6001
+ /**
6002
+ * Rename a label on every shop that carries it.
6003
+ * `PATCH /account/{merchantId}/business-profile/labels/{labelId}`
6004
+ */
6005
+ async update(merchantId, labelId, params) {
6006
+ return this.request("PATCH", `${labelsPath(merchantId)}/${encodeURIComponent(labelId)}`, {
6007
+ body: params
6008
+ });
6009
+ }
6010
+ /**
6011
+ * Delete a label and remove it from every shop. The shops are unchanged.
6012
+ * `DELETE /account/{merchantId}/business-profile/labels/{labelId}`
6013
+ */
6014
+ async delete(merchantId, labelId) {
6015
+ return this.request("DELETE", `${labelsPath(merchantId)}/${encodeURIComponent(labelId)}`);
6016
+ }
6017
+ /**
6018
+ * Replace the labels of one shop: `label_ids` is the complete set
6019
+ * afterwards, so a label left out is removed from the shop and an empty
6020
+ * list removes them all. At most 20 per shop.
6021
+ * `PUT /account/{merchantId}/business-profile/{profileId}/labels`
6022
+ */
6023
+ async setForShop(merchantId, profileId, params) {
6024
+ return this.request(
6025
+ "PUT",
6026
+ `/account/${encodeURIComponent(merchantId)}/business-profile/${encodeURIComponent(profileId)}/labels`,
6027
+ { body: params }
6028
+ );
6029
+ }
6030
+ };
6031
+
5944
6032
  // src/resources/buyerConversations.ts
5945
6033
  var BuyerConversations = class {
5946
6034
  constructor(request) {
@@ -6008,6 +6096,60 @@ var BuyerConversations = class {
6008
6096
  }
6009
6097
  };
6010
6098
 
6099
+ // src/resources/buyerEvidenceReviews.ts
6100
+ var BuyerEvidenceReviews = class {
6101
+ constructor(request) {
6102
+ this.request = request;
6103
+ }
6104
+ /**
6105
+ * The shop's cases with buyer evidence, the nearest target first.
6106
+ * `merchant_id` and `reviewer` are ignored here. `GET /buyer-evidence`
6107
+ */
6108
+ async list(params) {
6109
+ return this.request("GET", "/buyer-evidence", {
6110
+ query: params
6111
+ });
6112
+ }
6113
+ /** One case's evidence with its history and files. `GET /buyer-evidence/{id}` */
6114
+ async retrieve(evidenceId) {
6115
+ return this.request("GET", `/buyer-evidence/${encodeURIComponent(evidenceId)}`);
6116
+ }
6117
+ /** Download a file of a case's evidence. */
6118
+ async downloadFile(evidenceId, fileId) {
6119
+ return this.request(
6120
+ "GET",
6121
+ `/buyer-evidence/${encodeURIComponent(evidenceId)}/files/${encodeURIComponent(fileId)}`,
6122
+ { responseType: "blob" }
6123
+ );
6124
+ }
6125
+ /** Ask the buyer for more, by a cut-off. Refused once a result closed the review. */
6126
+ async requestInformation(evidenceId, params) {
6127
+ return this.request(
6128
+ "POST",
6129
+ `/buyer-evidence/${encodeURIComponent(evidenceId)}/information-requests`,
6130
+ { body: params }
6131
+ );
6132
+ }
6133
+ /** An answer the buyer sees. */
6134
+ async reply(evidenceId, params) {
6135
+ return this.request("POST", `/buyer-evidence/${encodeURIComponent(evidenceId)}/replies`, {
6136
+ body: params
6137
+ });
6138
+ }
6139
+ /** Record the result, which closes the review. */
6140
+ async review(evidenceId, params) {
6141
+ return this.request("POST", `/buyer-evidence/${encodeURIComponent(evidenceId)}/reviews`, {
6142
+ body: params
6143
+ });
6144
+ }
6145
+ /** A note the shop's team and DeloPay read, never the buyer. */
6146
+ async note(evidenceId, params) {
6147
+ return this.request("POST", `/buyer-evidence/${encodeURIComponent(evidenceId)}/notes`, {
6148
+ body: params
6149
+ });
6150
+ }
6151
+ };
6152
+
6011
6153
  // src/resources/checkoutRecovery.ts
6012
6154
  var CheckoutRecovery = class {
6013
6155
  constructor(request) {
@@ -7625,6 +7767,17 @@ var BuyerAccount = class {
7625
7767
  async getSession(options) {
7626
7768
  return this.request("GET", "/buyer-account/session", { ...options });
7627
7769
  }
7770
+ /**
7771
+ * What the buyer is mailed about: a reply from a shop's team they have not
7772
+ * read, and news in their refund requests and disputes.
7773
+ */
7774
+ async noticeSettings(options) {
7775
+ return this.request("GET", "/buyer-account/notice-settings", { ...options });
7776
+ }
7777
+ /** Turn either mail on or off for the buyer, at every shop. */
7778
+ async setNoticeSettings(params, options) {
7779
+ return this.request("PUT", "/buyer-account/notice-settings", { body: params, ...options });
7780
+ }
7628
7781
  /** End the current session. */
7629
7782
  async signOut(options) {
7630
7783
  return this.request("DELETE", "/buyer-account/session", { ...options });
@@ -7759,6 +7912,78 @@ var BuyerAccount = class {
7759
7912
  ...options
7760
7913
  });
7761
7914
  }
7915
+ /**
7916
+ * A case's evidence: what may be handed in and by when, the files saved
7917
+ * and handed in, and what the reviewer said. Opened on the first read
7918
+ * while the case still waits.
7919
+ * The case is one of a confirmed record's, named by the `record` its
7920
+ * purchases carry and the case id the case list shows.
7921
+ */
7922
+ async caseEvidence(record, caseId, options) {
7923
+ return this.request(
7924
+ "GET",
7925
+ `/buyer-account/records/${encodeURIComponent(record)}/cases/${encodeURIComponent(caseId)}/evidence`,
7926
+ { ...options }
7927
+ );
7928
+ }
7929
+ /**
7930
+ * Upload a file for a case. It is saved, not handed in, until a
7931
+ * submission takes it. Uploading again with the same `clientUploadId`
7932
+ * returns the file the first upload stored, also after the cut-off.
7933
+ */
7934
+ async uploadEvidenceFile(record, caseId, file, clientUploadId, options) {
7935
+ const { fileName, ...extras } = options ?? {};
7936
+ const form = new FormData();
7937
+ form.append("client_upload_id", clientUploadId);
7938
+ if (fileName === void 0) form.append("file", file);
7939
+ else form.append("file", file, fileName);
7940
+ return this.request(
7941
+ "POST",
7942
+ `/buyer-account/records/${encodeURIComponent(record)}/cases/${encodeURIComponent(caseId)}/evidence/files`,
7943
+ { body: form, ...extras }
7944
+ );
7945
+ }
7946
+ /** Download a file of the case's evidence. */
7947
+ async downloadEvidenceFile(record, caseId, fileId, options) {
7948
+ return this.request(
7949
+ "GET",
7950
+ `/buyer-account/records/${encodeURIComponent(record)}/cases/${encodeURIComponent(caseId)}/evidence/files/${encodeURIComponent(fileId)}`,
7951
+ {
7952
+ responseType: "blob",
7953
+ ...options
7954
+ }
7955
+ );
7956
+ }
7957
+ /** Remove a saved file. A file a submission took stays. */
7958
+ async removeEvidenceFile(record, caseId, fileId, options) {
7959
+ return this.request(
7960
+ "DELETE",
7961
+ `/buyer-account/records/${encodeURIComponent(record)}/cases/${encodeURIComponent(caseId)}/evidence/files/${encodeURIComponent(fileId)}`,
7962
+ {
7963
+ ...options
7964
+ }
7965
+ );
7966
+ }
7967
+ /**
7968
+ * Hand in an explanation, saved files or both, while the buyer's window
7969
+ * is open. Sending again with the same `client_submission_id` returns the
7970
+ * submission the first send stored.
7971
+ */
7972
+ async submitEvidence(record, caseId, params, options) {
7973
+ return this.request(
7974
+ "POST",
7975
+ `/buyer-account/records/${encodeURIComponent(record)}/cases/${encodeURIComponent(caseId)}/evidence/submissions`,
7976
+ { body: params, ...options }
7977
+ );
7978
+ }
7979
+ /** Ask for more time, once until the cut-off is next set. */
7980
+ async requestEvidenceExtension(record, caseId, params, options) {
7981
+ return this.request(
7982
+ "POST",
7983
+ `/buyer-account/records/${encodeURIComponent(record)}/cases/${encodeURIComponent(caseId)}/evidence/extension-requests`,
7984
+ { body: params, ...options }
7985
+ );
7986
+ }
7762
7987
  };
7763
7988
 
7764
7989
  // src/resources/buyerPortal.ts
@@ -7777,6 +8002,74 @@ var BuyerPortal = class {
7777
8002
  async listCases(options) {
7778
8003
  return this.request("GET", "/buyer-portal/cases", { ...options });
7779
8004
  }
8005
+ /**
8006
+ * A case's evidence: what may be handed in and by when, the files saved
8007
+ * and handed in, and what the reviewer said. Opened on the first read
8008
+ * while the case still waits.
8009
+ */
8010
+ async caseEvidence(caseId, options) {
8011
+ return this.request("GET", `/buyer-portal/cases/${encodeURIComponent(caseId)}/evidence`, {
8012
+ ...options
8013
+ });
8014
+ }
8015
+ /**
8016
+ * Upload a file for a case. It is saved, not handed in, until a
8017
+ * submission takes it. Uploading again with the same `clientUploadId`
8018
+ * returns the file the first upload stored, also after the cut-off.
8019
+ */
8020
+ async uploadEvidenceFile(caseId, file, clientUploadId, options) {
8021
+ const { fileName, ...extras } = options ?? {};
8022
+ const form = new FormData();
8023
+ form.append("client_upload_id", clientUploadId);
8024
+ if (fileName === void 0) form.append("file", file);
8025
+ else form.append("file", file, fileName);
8026
+ return this.request(
8027
+ "POST",
8028
+ `/buyer-portal/cases/${encodeURIComponent(caseId)}/evidence/files`,
8029
+ { body: form, ...extras }
8030
+ );
8031
+ }
8032
+ /** Download a file of the case's evidence. */
8033
+ async downloadEvidenceFile(caseId, fileId, options) {
8034
+ return this.request(
8035
+ "GET",
8036
+ `/buyer-portal/cases/${encodeURIComponent(caseId)}/evidence/files/${encodeURIComponent(fileId)}`,
8037
+ {
8038
+ responseType: "blob",
8039
+ ...options
8040
+ }
8041
+ );
8042
+ }
8043
+ /** Remove a saved file. A file a submission took stays. */
8044
+ async removeEvidenceFile(caseId, fileId, options) {
8045
+ return this.request(
8046
+ "DELETE",
8047
+ `/buyer-portal/cases/${encodeURIComponent(caseId)}/evidence/files/${encodeURIComponent(fileId)}`,
8048
+ {
8049
+ ...options
8050
+ }
8051
+ );
8052
+ }
8053
+ /**
8054
+ * Hand in an explanation, saved files or both, while the buyer's window
8055
+ * is open. Sending again with the same `client_submission_id` returns the
8056
+ * submission the first send stored.
8057
+ */
8058
+ async submitEvidence(caseId, params, options) {
8059
+ return this.request(
8060
+ "POST",
8061
+ `/buyer-portal/cases/${encodeURIComponent(caseId)}/evidence/submissions`,
8062
+ { body: params, ...options }
8063
+ );
8064
+ }
8065
+ /** Ask for more time, once until the cut-off is next set. */
8066
+ async requestEvidenceExtension(caseId, params, options) {
8067
+ return this.request(
8068
+ "POST",
8069
+ `/buyer-portal/cases/${encodeURIComponent(caseId)}/evidence/extension-requests`,
8070
+ { body: params, ...options }
8071
+ );
8072
+ }
7780
8073
  /**
7781
8074
  * The buyer's conversations with the shop, the latest message first. A
7782
8075
  * portal link for the whole merchant lists one per shop and mode.
@@ -8938,7 +9231,9 @@ var Delopay = class {
8938
9231
  this.availabilityOverrides = new AvailabilityOverrides(request);
8939
9232
  this.sellToRestrictions = new SellToRestrictions(request);
8940
9233
  this.buyerBlocklist = new BuyerBlocklist(request);
9234
+ this.shopLabels = new ShopLabels(request);
8941
9235
  this.buyerConversations = new BuyerConversations(request);
9236
+ this.buyerEvidence = new BuyerEvidenceReviews(request);
8942
9237
  this.checkoutRecovery = new CheckoutRecovery(request);
8943
9238
  this.costRules = new CostRules(request);
8944
9239
  this.externalRecords = new ExternalRecords(request);
@@ -12724,15 +13019,11 @@ var CheckoutSession = class {
12724
13019
  });
12725
13020
  }
12726
13021
  /**
12727
- * The PayPal order for the payment's e-Payouts access code, from the PayPal
12728
- * SDK's `createOrder` on an experimental PayPal SDK pane — after the payment
12729
- * was confirmed through that pane, which mints the code.
12730
- *
12731
- * The router reads the order off e-Payouts' own PayPal page for the code, so
12732
- * `amount` and `currency` are what e-Payouts charges for it. Repeated calls
12733
- * answer the same order, so a cancelled PayPal popup is retried with the same
12734
- * code. When `captured` is `true` a capture was already reported: create no
12735
- * order and wait for the payment's status instead.
13022
+ * The PayPal order e-Payouts created for the payment, for the PayPal SDK's
13023
+ * `createOrder` on the PayPal Express or Pay with card pane, after the payment
13024
+ * was confirmed through that pane. Return `order_id` from `createOrder` and
13025
+ * send the buyer to `approve_url` once PayPal approved it; without an order,
13026
+ * or when PayPal's button cannot be drawn, send the buyer to `redirect_url`.
12736
13027
  *
12737
13028
  * `POST /payment-link/{merchantId}/{paymentId}/epayouts/paypal-order`
12738
13029
  */
@@ -14058,6 +14349,82 @@ var AdminPortal = class {
14058
14349
  query: params
14059
14350
  });
14060
14351
  }
14352
+ // --- Buyer evidence review --------------------------------------------------
14353
+ /**
14354
+ * DeloPay's review queue of buyers' evidence, the nearest target first,
14355
+ * across merchants unless `merchant_id` narrows it.
14356
+ */
14357
+ async listBuyerEvidence(params) {
14358
+ return this.request("GET", "/admin-portal/buyer-evidence", {
14359
+ query: params
14360
+ });
14361
+ }
14362
+ /** One case's evidence with every step and file, internal ones included. */
14363
+ async getBuyerEvidence(evidenceId) {
14364
+ return this.request("GET", `/admin-portal/buyer-evidence/${encodeURIComponent(evidenceId)}`);
14365
+ }
14366
+ /** Download a file of a case's evidence. */
14367
+ async downloadBuyerEvidenceFile(evidenceId, fileId) {
14368
+ return this.request(
14369
+ "GET",
14370
+ `/admin-portal/buyer-evidence/${encodeURIComponent(evidenceId)}/files/${encodeURIComponent(fileId)}`,
14371
+ { responseType: "blob" }
14372
+ );
14373
+ }
14374
+ /**
14375
+ * Ask the buyer for more, by a cut-off. Refused once a result has closed
14376
+ * the review.
14377
+ */
14378
+ async requestBuyerEvidenceInformation(evidenceId, params) {
14379
+ return this.request(
14380
+ "POST",
14381
+ `/admin-portal/buyer-evidence/${encodeURIComponent(evidenceId)}/information-requests`,
14382
+ { body: params }
14383
+ );
14384
+ }
14385
+ /** An answer the buyer sees. */
14386
+ async replyToBuyerEvidence(evidenceId, params) {
14387
+ return this.request(
14388
+ "POST",
14389
+ `/admin-portal/buyer-evidence/${encodeURIComponent(evidenceId)}/replies`,
14390
+ { body: params }
14391
+ );
14392
+ }
14393
+ /**
14394
+ * Record the result, which closes the review. It never refunds a payment
14395
+ * and never decides a dispute with the payment provider.
14396
+ */
14397
+ async reviewBuyerEvidence(evidenceId, params) {
14398
+ return this.request(
14399
+ "POST",
14400
+ `/admin-portal/buyer-evidence/${encodeURIComponent(evidenceId)}/reviews`,
14401
+ { body: params }
14402
+ );
14403
+ }
14404
+ /** Move the buyer's cut-off, with a reason the buyer sees. */
14405
+ async moveBuyerEvidenceDeadline(evidenceId, params) {
14406
+ return this.request(
14407
+ "PUT",
14408
+ `/admin-portal/buyer-evidence/${encodeURIComponent(evidenceId)}/deadline`,
14409
+ { body: params }
14410
+ );
14411
+ }
14412
+ /** Make a user responsible for the review: an id, `me`, or `null` for nobody. */
14413
+ async assignBuyerEvidence(evidenceId, params) {
14414
+ return this.request(
14415
+ "PUT",
14416
+ `/admin-portal/buyer-evidence/${encodeURIComponent(evidenceId)}/reviewer`,
14417
+ { body: params }
14418
+ );
14419
+ }
14420
+ /** An internal note, never shown to the buyer. */
14421
+ async noteBuyerEvidence(evidenceId, params) {
14422
+ return this.request(
14423
+ "POST",
14424
+ `/admin-portal/buyer-evidence/${encodeURIComponent(evidenceId)}/notes`,
14425
+ { body: params }
14426
+ );
14427
+ }
14061
14428
  async analytics(params) {
14062
14429
  return this.request("GET", "/admin-portal/analytics", {
14063
14430
  query: params
@@ -15391,6 +15758,7 @@ var DelopayInternal = class extends Delopay {
15391
15758
  BUILTIN_PAYMENT_ICON_KEYS,
15392
15759
  BuyerBlocklist,
15393
15760
  BuyerConversations,
15761
+ BuyerEvidenceReviews,
15394
15762
  CARD_FIELD_CHROMES,
15395
15763
  CARD_FIELD_FONT_SIZES,
15396
15764
  CARD_FIELD_WEIGHTS,
@@ -15494,6 +15862,7 @@ var DelopayInternal = class extends Delopay {
15494
15862
  SellToRestrictions,
15495
15863
  Settings,
15496
15864
  Settlement,
15865
+ ShopLabels,
15497
15866
  Subscriptions,
15498
15867
  UNKNOWN_SECTION_ORDER,
15499
15868
  WCAG_AA_TEXT,