@adobe/aio-commerce-lib-app 1.3.1 → 1.5.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.
Files changed (62) hide show
  1. package/CHANGELOG.md +53 -0
  2. package/dist/cjs/actions/app-config.cjs +3 -3
  3. package/dist/cjs/actions/app-config.d.cts +1 -1
  4. package/dist/cjs/actions/config.cjs +31 -9
  5. package/dist/cjs/actions/installation.cjs +16 -13
  6. package/dist/cjs/actions/installation.d.cts +2 -2
  7. package/dist/cjs/actions/registration.cjs +41 -0
  8. package/dist/cjs/actions/registration.d.cts +33 -0
  9. package/dist/cjs/actions/scope-tree.cjs +5 -4
  10. package/dist/cjs/admin-ui-sdk-BiSopnKI.d.cts +665 -0
  11. package/dist/cjs/{app-DcQMhW2N.d.cts → app-C6kImBl7.d.cts} +242 -16
  12. package/dist/cjs/chunk-DS2yp5vX.cjs +48 -0
  13. package/dist/cjs/commands/index.cjs +582 -321
  14. package/dist/cjs/commands/templates/admin-ui-sdk/registration.js.template +20 -0
  15. package/dist/cjs/config/index.cjs +4 -3
  16. package/dist/cjs/config/index.d.cts +558 -62
  17. package/dist/cjs/{config-BppBKCFj.cjs → config-ct-qMOGj.cjs} +56 -25
  18. package/dist/cjs/{error-Dn7ool6k.cjs → error-C5LNOZ4f.cjs} +1 -1
  19. package/dist/cjs/{index-BVwQk9bx.d.cts → index-B5WKJ3hJ.d.cts} +20 -174
  20. package/dist/cjs/{logging-4s36JTiN.cjs → logging-BTevALnL.cjs} +2 -2
  21. package/dist/cjs/management/index.cjs +1 -1
  22. package/dist/cjs/management/index.d.cts +3 -2
  23. package/dist/cjs/{management-C6xG5bfl.cjs → management-D1QXg4YU.cjs} +128 -75
  24. package/dist/cjs/{router-KeQRduO3.cjs → router-CFErodHU.cjs} +2 -2
  25. package/dist/cjs/{schemas-nkIxa8sL.cjs → schemas-CukVpc19.cjs} +2 -34
  26. package/dist/cjs/step-CWYnKbga.d.cts +187 -0
  27. package/dist/cjs/{validate-CeUCT_7k.cjs → validate-b_bI4mDb.cjs} +4 -3
  28. package/dist/cjs/{webhooks-CLtDxwMa.cjs → webhooks-DS1BtgED.cjs} +157 -17
  29. package/dist/es/actions/app-config.d.mts +1 -1
  30. package/dist/es/actions/app-config.mjs +1 -1
  31. package/dist/es/actions/config.mjs +28 -7
  32. package/dist/es/actions/installation.d.mts +2 -2
  33. package/dist/es/actions/installation.mjs +12 -10
  34. package/dist/es/actions/registration.d.mts +33 -0
  35. package/dist/es/actions/registration.mjs +39 -0
  36. package/dist/es/actions/scope-tree.mjs +1 -1
  37. package/dist/es/admin-ui-sdk-CCo2SWiL.d.mts +667 -0
  38. package/dist/es/{app-DJr-mN9d.d.mts → app-DcY6dJiQ.d.mts} +242 -16
  39. package/dist/es/commands/index.mjs +575 -316
  40. package/dist/es/commands/templates/admin-ui-sdk/registration.js.template +20 -0
  41. package/dist/es/config/index.d.mts +558 -62
  42. package/dist/es/config/index.mjs +4 -4
  43. package/dist/es/{config-BohwKkQS.mjs → config-DGPFTk6w.mjs} +51 -20
  44. package/dist/es/{index-BENO5T7n.d.mts → index-CCov0odd.d.mts} +20 -174
  45. package/dist/es/management/index.d.mts +3 -2
  46. package/dist/es/management/index.mjs +1 -1
  47. package/dist/es/{management-ByHvVJ12.mjs → management-CCsOfniv.mjs} +124 -71
  48. package/dist/es/step-0eI2x4C9.d.mts +187 -0
  49. package/dist/es/{validate-CqJdGzyZ.mjs → validate-Dn3lLTGj.mjs} +2 -2
  50. package/dist/es/{webhooks-CYo-pqbR.mjs → webhooks-Dhrkkip7.mjs} +155 -16
  51. package/package.json +15 -12
  52. /package/dist/cjs/commands/{generate/actions/templates → templates}/app-management/app-config.js.template +0 -0
  53. /package/dist/cjs/commands/{generate/actions/templates → templates}/app-management/custom-scripts.js.template +0 -0
  54. /package/dist/cjs/commands/{generate/actions/templates → templates}/app-management/installation.js.template +0 -0
  55. /package/dist/cjs/commands/{generate/actions/templates → templates}/business-configuration/config.js.template +0 -0
  56. /package/dist/cjs/commands/{generate/actions/templates → templates}/business-configuration/scope-tree.js.template +0 -0
  57. /package/dist/es/commands/{generate/actions/templates → templates}/app-management/app-config.js.template +0 -0
  58. /package/dist/es/commands/{generate/actions/templates → templates}/app-management/custom-scripts.js.template +0 -0
  59. /package/dist/es/commands/{generate/actions/templates → templates}/app-management/installation.js.template +0 -0
  60. /package/dist/es/commands/{generate/actions/templates → templates}/business-configuration/config.js.template +0 -0
  61. /package/dist/es/commands/{generate/actions/templates → templates}/business-configuration/scope-tree.js.template +0 -0
  62. /package/dist/es/{schemas-CVXHgUhv.mjs → schemas-DOcnD16x.mjs} +0 -0
@@ -12,25 +12,154 @@
12
12
  * governing permissions and limitations under the License.
13
13
  */
14
14
 
15
- import { a as stringValueSchema, i as positiveNumberValueSchema, n as booleanValueSchema, r as nonEmptyStringValueSchema, t as alphaNumericOrHyphenSchema } from "./schemas-CVXHgUhv.mjs";
15
+ import { a as stringValueSchema, i as positiveNumberValueSchema, n as booleanValueSchema, r as nonEmptyStringValueSchema, t as alphaNumericOrHyphenSchema } from "./schemas-DOcnD16x.mjs";
16
16
  import * as v from "valibot";
17
17
 
18
18
  //#region source/config/schema/admin-ui-sdk.ts
19
+ const SANDBOX_VALUES = [
20
+ "allow-downloads",
21
+ "allow-modals",
22
+ "allow-popups"
23
+ ];
24
+ function isSandboxValue(value) {
25
+ return SANDBOX_VALUES.includes(value);
26
+ }
27
+ const SandboxSchema = v.pipe(v.string("Expected a string value for \"sandbox\""), v.check((val) => val.split(" ").every(isSandboxValue), `sandbox must contain only single-space-separated values from: ${SANDBOX_VALUES.map((t) => `"${t}"`).join(", ")}`));
28
+ const ColumnTypeSchema = v.picklist([
29
+ "boolean",
30
+ "date",
31
+ "float",
32
+ "integer",
33
+ "string"
34
+ ]);
35
+ const ColumnAlignSchema = v.picklist([
36
+ "left",
37
+ "right",
38
+ "center"
39
+ ]);
40
+ const ViewButtonLevelSchema = v.picklist([
41
+ -1,
42
+ 0,
43
+ 1
44
+ ]);
45
+ const MassActionConfirmSchema = v.object({
46
+ title: v.optional(nonEmptyStringValueSchema("confirm title")),
47
+ message: v.optional(nonEmptyStringValueSchema("confirm message"))
48
+ });
49
+ const ViewButtonConfirmSchema = v.object({ message: v.optional(nonEmptyStringValueSchema("confirm message")) });
50
+ const iframeActionEntries = {
51
+ displayIframe: v.optional(booleanValueSchema("displayIframe")),
52
+ timeout: v.optional(positiveNumberValueSchema("timeout")),
53
+ sandbox: v.optional(SandboxSchema)
54
+ };
55
+ const GridColumnPropertySchema = v.object({
56
+ label: nonEmptyStringValueSchema("column label"),
57
+ columnId: nonEmptyStringValueSchema("column ID"),
58
+ type: ColumnTypeSchema,
59
+ align: ColumnAlignSchema
60
+ });
61
+ const GridColumnsSchema = v.object({
62
+ data: v.object({ meshId: nonEmptyStringValueSchema("mesh ID") }),
63
+ properties: v.pipe(v.array(GridColumnPropertySchema), v.minLength(1, "At least one grid column property is required"))
64
+ });
65
+ const massActionBaseEntries = {
66
+ actionId: nonEmptyStringValueSchema("mass action ID"),
67
+ label: nonEmptyStringValueSchema("mass action label"),
68
+ title: v.optional(nonEmptyStringValueSchema("mass action page title")),
69
+ confirm: v.optional(MassActionConfirmSchema),
70
+ path: nonEmptyStringValueSchema("mass action path"),
71
+ ...iframeActionEntries
72
+ };
73
+ const sandboxDisplayIframeCheck = v.forward(v.partialCheck([["sandbox"], ["displayIframe"]], (input) => input.sandbox === void 0 || input.displayIframe === true, "sandbox is only relevant when displayIframe is set to true"), ["sandbox"]);
74
+ function withSandboxDisplayIframeCheck(schema) {
75
+ return v.pipe(schema, sandboxDisplayIframeCheck);
76
+ }
77
+ function createMassActionSchema(variantEntries) {
78
+ return withSandboxDisplayIframeCheck(v.strictObject({
79
+ ...massActionBaseEntries,
80
+ ...variantEntries
81
+ }));
82
+ }
83
+ const OrderMassActionSchema = createMassActionSchema({ selectionLimit: v.optional(positiveNumberValueSchema("selectionLimit")) });
84
+ const ProductMassActionSchema = createMassActionSchema({ productSelectLimit: v.optional(positiveNumberValueSchema("productSelectLimit")) });
85
+ const CustomerMassActionSchema = createMassActionSchema({ customerSelectLimit: v.optional(positiveNumberValueSchema("customerSelectLimit")) });
86
+ const OrderViewButtonSchema = withSandboxDisplayIframeCheck(v.object({
87
+ buttonId: nonEmptyStringValueSchema("view button ID"),
88
+ label: nonEmptyStringValueSchema("view button label"),
89
+ confirm: v.optional(ViewButtonConfirmSchema),
90
+ path: nonEmptyStringValueSchema("view button path"),
91
+ level: v.optional(ViewButtonLevelSchema),
92
+ sortOrder: v.optional(positiveNumberValueSchema("sortOrder")),
93
+ ...iframeActionEntries
94
+ }));
95
+ const CustomFeeSchema = v.object({
96
+ id: nonEmptyStringValueSchema("custom fee ID"),
97
+ label: nonEmptyStringValueSchema("custom fee label"),
98
+ value: v.number("Custom fee value must be a number"),
99
+ orderMinimumAmount: v.optional(v.number("orderMinimumAmount must be a number")),
100
+ applyFeeOnLastInvoice: v.optional(booleanValueSchema("applyFeeOnLastInvoice")),
101
+ applyFeeOnLastCreditMemo: v.optional(booleanValueSchema("applyFeeOnLastCreditMemo"))
102
+ });
103
+ const OrderExtensionPointsSchema = v.object({
104
+ massActions: v.optional(v.array(OrderMassActionSchema)),
105
+ gridColumns: v.optional(GridColumnsSchema),
106
+ viewButtons: v.optional(v.array(OrderViewButtonSchema)),
107
+ customFees: v.optional(v.array(CustomFeeSchema))
108
+ });
109
+ const ProductExtensionPointsSchema = v.object({
110
+ massActions: v.optional(v.array(ProductMassActionSchema)),
111
+ gridColumns: v.optional(GridColumnsSchema)
112
+ });
113
+ const CustomerExtensionPointsSchema = v.object({
114
+ massActions: v.optional(v.array(CustomerMassActionSchema)),
115
+ gridColumns: v.optional(GridColumnsSchema)
116
+ });
117
+ const MassActionBannerSchema = v.object({
118
+ actionId: nonEmptyStringValueSchema("mass action ID"),
119
+ successMessage: v.optional(nonEmptyStringValueSchema("success message")),
120
+ errorMessage: v.optional(nonEmptyStringValueSchema("error message"))
121
+ });
122
+ const OrderViewButtonBannerSchema = v.object({
123
+ buttonId: nonEmptyStringValueSchema("view button ID"),
124
+ successMessage: v.optional(nonEmptyStringValueSchema("success message")),
125
+ errorMessage: v.optional(nonEmptyStringValueSchema("error message"))
126
+ });
127
+ const BannerNotificationSchema = v.object({
128
+ massActions: v.optional(v.object({
129
+ order: v.optional(v.array(MassActionBannerSchema)),
130
+ product: v.optional(v.array(MassActionBannerSchema)),
131
+ customer: v.optional(v.array(MassActionBannerSchema))
132
+ })),
133
+ orderViewButtons: v.optional(v.array(OrderViewButtonBannerSchema))
134
+ });
135
+ const MenuItemSchema = v.object({
136
+ id: nonEmptyStringValueSchema("menu item ID"),
137
+ title: v.optional(nonEmptyStringValueSchema("menu item title")),
138
+ parent: v.optional(nonEmptyStringValueSchema("menu item parent")),
139
+ sortOrder: v.optional(v.number()),
140
+ isSection: v.optional(booleanValueSchema("isSection")),
141
+ sandbox: v.optional(SandboxSchema)
142
+ });
19
143
  /**
20
144
  * Schema for the Admin UI SDK registration parameters (for the `adminUiSdk.registration` config section).
21
145
  * @see https://developer.adobe.com/commerce/extensibility/admin-ui-sdk/extension-points/ for more details.
22
146
  */
23
- const AdminUiSdkRegistrationSchema = v.object({ menuItems: v.array(v.object({
24
- id: v.string(),
25
- title: v.optional(v.string()),
26
- parent: v.optional(v.string()),
27
- sortOrder: v.optional(v.number()),
28
- sandbox: v.optional(v.string()),
29
- isSection: v.optional(v.boolean())
30
- })) });
31
- /** Schema for Admin UI SDK configuration. */
147
+ const AdminUiSdkRegistrationSchema = v.object({
148
+ menuItems: v.optional(v.array(MenuItemSchema)),
149
+ order: v.optional(OrderExtensionPointsSchema),
150
+ product: v.optional(ProductExtensionPointsSchema),
151
+ customer: v.optional(CustomerExtensionPointsSchema),
152
+ bannerNotification: v.optional(BannerNotificationSchema)
153
+ });
154
+ /**
155
+ * Schema for Admin UI SDK configuration.
156
+ * @experimental
157
+ */
32
158
  const AdminUiSdkSchema = v.object({ registration: AdminUiSdkRegistrationSchema });
33
- /** Check if config has Admin UI SDK registration configuration. */
159
+ /**
160
+ * Check if config has Admin UI SDK registration configuration.
161
+ * @experimental
162
+ */
34
163
  function hasAdminUiSdk(config) {
35
164
  return config.adminUiSdk !== void 0 && config.adminUiSdk.registration !== void 0;
36
165
  }
@@ -60,6 +189,12 @@ const EXTERNAL_EVENT_NAME_REGEX = /^[\w\-_.]+$/;
60
189
  */
61
190
  const FIELD_NAME_REGEX = /^([a-zA-Z0-9_\-.[\]]+|\*)$/;
62
191
  /**
192
+ * Regex for Adobe I/O Events API text fields (label, description).
193
+ * Valid characters per API: letters, numbers, spaces, underscores, hyphens,
194
+ * dots, colons, parentheses, commas, @, and /.
195
+ */
196
+ const IO_EVENTS_TEXT_REGEX = /^[a-zA-Z0-9 _.:()\-,@/]+$/;
197
+ /**
63
198
  * Schema for Commerce event names.
64
199
  * Validates that the event name starts with "plugin." or "observer."
65
200
  * followed by one or more dot-separated lowercase segments containing letters
@@ -84,6 +219,10 @@ function externalEventNameSchema() {
84
219
  function fieldNameSchema() {
85
220
  return v.pipe(nonEmptyStringValueSchema("field name"), v.regex(FIELD_NAME_REGEX, "Field name must contain only letters (a-z, A-Z), numbers (0-9), underscores (_), dashes (-), dots (.), and square brackets ([, ]), or be exactly \"*\""));
86
221
  }
222
+ /** Validates that a text field contains only characters accepted by the Adobe I/O Events API. */
223
+ function ioEventsTextSchema(name) {
224
+ return v.regex(IO_EVENTS_TEXT_REGEX, `${name} can only contain letters, numbers, spaces, underscores, hyphens, dots, colons, parentheses, commas, @, and /`);
225
+ }
87
226
  /**
88
227
  * Schema for field objects in Commerce events.
89
228
  * Each field has a required name and an optional source.
@@ -96,14 +235,14 @@ function commerceEventFieldSchema() {
96
235
  }
97
236
  /** Schema for event provider configuration */
98
237
  const ProviderSchema = v.object({
99
- label: v.pipe(nonEmptyStringValueSchema("provider label"), v.maxLength(MAX_LABEL_LENGTH, `The provider label must not be longer than ${MAX_LABEL_LENGTH} characters`)),
100
- description: v.pipe(nonEmptyStringValueSchema("provider description"), v.maxLength(MAX_DESCRIPTION_LENGTH$1, `The provider description must not be longer than ${MAX_DESCRIPTION_LENGTH$1} characters`)),
238
+ label: v.pipe(nonEmptyStringValueSchema("provider label"), ioEventsTextSchema("Provider label"), v.maxLength(MAX_LABEL_LENGTH, `The provider label must not be longer than ${MAX_LABEL_LENGTH} characters`)),
239
+ description: v.pipe(nonEmptyStringValueSchema("provider description"), ioEventsTextSchema("Provider description"), v.maxLength(MAX_DESCRIPTION_LENGTH$1, `The provider description must not be longer than ${MAX_DESCRIPTION_LENGTH$1} characters`)),
101
240
  key: v.optional(v.pipe(alphaNumericOrHyphenSchema("provider key"), v.maxLength(MAX_KEY_LENGTH, `The provider key must not be longer than ${MAX_KEY_LENGTH} characters`)))
102
241
  });
103
242
  /** Schema for base shared properties between event types. */
104
243
  const BaseEventSchema = v.object({
105
- label: v.pipe(nonEmptyStringValueSchema("event label"), v.maxLength(MAX_LABEL_LENGTH, `The event label must not be longer than ${MAX_LABEL_LENGTH} characters`)),
106
- description: v.pipe(nonEmptyStringValueSchema("event description"), v.maxLength(MAX_DESCRIPTION_LENGTH$1, `The event description must not be longer than ${MAX_DESCRIPTION_LENGTH$1} characters`)),
244
+ label: v.pipe(nonEmptyStringValueSchema("event label"), ioEventsTextSchema("Event label"), v.maxLength(MAX_LABEL_LENGTH, `The event label must not be longer than ${MAX_LABEL_LENGTH} characters`)),
245
+ description: v.pipe(nonEmptyStringValueSchema("event description"), ioEventsTextSchema("Event description"), v.maxLength(MAX_DESCRIPTION_LENGTH$1, `The event description must not be longer than ${MAX_DESCRIPTION_LENGTH$1} characters`)),
107
246
  runtimeActions: v.array(v.pipe(nonEmptyStringValueSchema("runtime action"), v.regex(/^[a-z0-9-]+\/[a-z0-9-]+$/i, "Runtime action must be in the format \"<package>/<action>\" (e.g., \"my-package/my-action\")")), "Expected an array of runtime actions in the format <package>/<action>")
108
247
  });
109
248
  /**
@@ -129,7 +268,7 @@ const CommerceEventRuleSchema = v.object({
129
268
  const CommerceEventSchema = v.object({
130
269
  ...BaseEventSchema.entries,
131
270
  name: commerceEventNameSchema(),
132
- fields: v.array(commerceEventFieldSchema(), "Expected an array of event field objects with a 'name' property"),
271
+ fields: v.pipe(v.array(commerceEventFieldSchema(), "Expected an array of event field objects with a 'name' property"), v.minLength(1, "The Commerce event configuration must define at least one field")),
133
272
  rules: v.optional(v.array(CommerceEventRuleSchema, "Expected an array of event rules with field, operator, and value")),
134
273
  destination: v.optional(nonEmptyStringValueSchema("destination")),
135
274
  hipaa_audit_required: v.optional(booleanValueSchema("hipaa_audit_required")),
package/package.json CHANGED
@@ -2,10 +2,10 @@
2
2
  "name": "@adobe/aio-commerce-lib-app",
3
3
  "type": "module",
4
4
  "author": "Adobe Inc.",
5
- "version": "1.3.1",
5
+ "version": "1.5.0",
6
6
  "private": false,
7
7
  "engines": {
8
- "node": ">=20 <=24"
8
+ "node": ">=22 <=24"
9
9
  },
10
10
  "license": "Apache-2.0",
11
11
  "description": "App configuration management library for Adobe Commerce applications",
@@ -29,7 +29,7 @@
29
29
  "directory": "packages/aio-commerce-lib-app"
30
30
  },
31
31
  "bin": {
32
- "@adobe/aio-commerce-lib-app": "./bin/cli.mjs"
32
+ "aio-commerce-lib-app": "./bin/cli.mjs"
33
33
  },
34
34
  "exports": {
35
35
  "./actions/*": {
@@ -82,34 +82,37 @@
82
82
  "@adobe/aio-lib-files": "^4.1.2",
83
83
  "@adobe/aio-lib-ims": "^8.1.1",
84
84
  "@adobe/aio-lib-state": "^5.3.1",
85
- "camelcase": "^8.0.0",
85
+ "@npmcli/package-json": "^7.0.5",
86
+ "camelcase": "^9.0.0",
86
87
  "consola": "^3.4.2",
87
88
  "dotenv": "^17.2.3",
88
89
  "jiti": "^2.6.1",
89
90
  "ky": "^1.9.0",
90
91
  "openwhisk": "^3.21.8",
92
+ "package-manager-detector": "^1.6.0",
91
93
  "prettier": "^3.8.1",
92
94
  "regexparam": "^3.0.0",
93
95
  "safe-stable-stringify": "^2.5.0",
94
96
  "type-fest": "^5.0.0",
95
97
  "valibot": "^1.1.0",
96
98
  "yaml": "^2.8.1",
97
- "@adobe/aio-commerce-lib-auth": "1.0.1",
98
- "@adobe/aio-commerce-lib-api": "1.0.1",
99
- "@adobe/aio-commerce-lib-core": "1.0.0",
100
- "@adobe/aio-commerce-lib-events": "1.1.0",
101
- "@adobe/aio-commerce-lib-config": "1.2.0",
102
- "@adobe/aio-commerce-lib-webhooks": "0.1.0"
99
+ "@adobe/aio-commerce-lib-api": "1.2.0",
100
+ "@adobe/aio-commerce-lib-auth": "1.1.0",
101
+ "@adobe/aio-commerce-lib-config": "1.4.0",
102
+ "@adobe/aio-commerce-lib-core": "1.1.0",
103
+ "@adobe/aio-commerce-lib-events": "1.2.0",
104
+ "@adobe/aio-commerce-lib-webhooks": "1.1.0"
103
105
  },
104
106
  "devDependencies": {
107
+ "@types/npmcli__package-json": "^4.0.4",
105
108
  "msw": "^2.11.1",
106
109
  "typescript": "^6.0.0",
107
- "@aio-commerce-sdk/common-utils": "0.2.3",
110
+ "@aio-commerce-sdk/common-utils": "0.2.4",
108
111
  "@aio-commerce-sdk/config-tsdown": "1.0.1",
109
112
  "@aio-commerce-sdk/config-typedoc": "1.0.0",
110
113
  "@aio-commerce-sdk/config-typescript": "1.0.0",
111
114
  "@aio-commerce-sdk/config-vitest": "1.0.0",
112
- "@aio-commerce-sdk/scripting-utils": "0.3.0",
115
+ "@aio-commerce-sdk/scripting-utils": "0.3.2",
113
116
  "@aio-commerce-sdk/scripts": "0.1.0"
114
117
  },
115
118
  "sideEffects": false,