@adobedjangir/commerce-admin-management 0.0.9 → 0.0.11

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 (2) hide show
  1. package/package.json +1 -1
  2. package/scripts/setup.js +66 -11
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adobedjangir/commerce-admin-management",
3
- "version": "0.0.9",
3
+ "version": "0.0.11",
4
4
  "description": "Schema-driven system configuration for Adobe Commerce App Builder sync apps. Magento-style scoped config in Adobe App Builder Database (ABDB) with encryption, Commerce REST helpers, and React Admin UI.",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Adobe Inc.",
package/scripts/setup.js CHANGED
@@ -69,29 +69,56 @@ function updateExistingExtensionBlock (content) {
69
69
  return next !== content ? next : null
70
70
  }
71
71
 
72
+ /**
73
+ * Remove the boilerplate `dx/excshell/1` extension block that aio's default
74
+ * `app init` ships with. The host can only run one extension point per
75
+ * project for our purposes, and `commerce/backend-ui/1` is what this
76
+ * package needs — leaving `dx/excshell/1` in place causes aio to try
77
+ * building BOTH, which fails on the excshell side because we don't ship
78
+ * any code for it.
79
+ *
80
+ * Matches a 2-space-indented `dx/excshell/1:` block followed by any
81
+ * deeper-indented nested lines, terminating when we see a non-indented
82
+ * line or a sibling extension. Safe to run repeatedly — no-op if absent.
83
+ */
84
+ function stripExcshellBlock (content) {
85
+ const re = /^[ \t]*dx\/excshell\/1:[ \t]*\n(?:[ \t]+[^\n]*\n)*/m
86
+ if (!re.test(content)) return { content, changed: false }
87
+ const next = content.replace(re, '')
88
+ return { content: next, changed: true }
89
+ }
90
+
72
91
  function patchAppConfig (content) {
73
- if (alreadyLinked(content)) {
74
- return { content, changed: false, reason: 'already-linked' }
92
+ // First strip the boilerplate dx/excshell/1 block — see stripExcshellBlock.
93
+ const excshell = stripExcshellBlock(content)
94
+ let working = excshell.content
95
+
96
+ if (alreadyLinked(working)) {
97
+ return {
98
+ content: working,
99
+ changed: excshell.changed,
100
+ reason: excshell.changed ? 'stripped-excshell' : 'already-linked'
101
+ }
75
102
  }
76
103
 
77
- if (hasExtensionPoint(content)) {
78
- const updated = updateExistingExtensionBlock(content)
104
+ if (hasExtensionPoint(working)) {
105
+ const updated = updateExistingExtensionBlock(working)
79
106
  if (updated) {
80
107
  return { content: updated, changed: true, reason: 'updated-existing-extension' }
81
108
  }
82
- return { content, changed: false, reason: 'extension-exists-unmodified' }
109
+ return { content: working, changed: excshell.changed, reason: 'extension-exists-unmodified' }
83
110
  }
84
111
 
85
- if (/^extensions:[ \t]*\n/m.test(content)) {
112
+ if (/^extensions:[ \t]*\n/m.test(working)) {
86
113
  const injection = ` ${EXTENSION_POINT}:\n $include: ${INCLUDE_REL}\n`
87
- const next = content.replace(/^extensions:[ \t]*\n/m, `extensions:\n${injection}`)
88
- if (next !== content) {
114
+ const next = working.replace(/^extensions:[ \t]*\n/m, `extensions:\n${injection}`)
115
+ if (next !== working) {
89
116
  return { content: next, changed: true, reason: 'added-under-extensions' }
90
117
  }
91
118
  }
92
119
 
93
- if (!/^extensions:/m.test(content)) {
94
- const trimmed = content.replace(/\s+$/, '')
120
+ if (!/^extensions:/m.test(working)) {
121
+ const trimmed = working.replace(/\s+$/, '')
95
122
  const separator = trimmed.length > 0 ? '\n\n' : ''
96
123
  return {
97
124
  content: `${trimmed}${separator}${buildExtensionBlock()}\n`,
@@ -100,7 +127,7 @@ function patchAppConfig (content) {
100
127
  }
101
128
  }
102
129
 
103
- return { content, changed: false, reason: 'no-change' }
130
+ return { content: working, changed: excshell.changed, reason: excshell.changed ? 'stripped-excshell' : 'no-change' }
104
131
  }
105
132
 
106
133
  // ────────────────────────────────────────────────────────────────────────────
@@ -414,6 +441,27 @@ function setupWebSrc (projectRoot) {
414
441
  return { changed, results }
415
442
  }
416
443
 
444
+ /**
445
+ * Remove the aio `app init` boilerplate source directory for the
446
+ * dx/excshell/1 extension. We stripped its entry from app.config.yaml in
447
+ * patchAppConfig, but the matching scaffolded source tree at
448
+ * `src/dx-excshell-1/` is left behind. Delete it so its stale React-16
449
+ * code (with `react-error-boundary` default-import) doesn't get picked up
450
+ * by `aio app dev` or `npm install` peer-resolution.
451
+ */
452
+ function stripExcshellSourceDir (projectRoot) {
453
+ const dir = path.join(projectRoot, 'src', 'dx-excshell-1')
454
+ if (!fs.existsSync(dir)) {
455
+ return { changed: false, reason: 'absent' }
456
+ }
457
+ try {
458
+ fs.rmSync(dir, { recursive: true, force: true })
459
+ return { changed: true, reason: 'removed' }
460
+ } catch (err) {
461
+ return { changed: false, reason: `rm-failed: ${err.message}` }
462
+ }
463
+ }
464
+
417
465
  function setupAppConfig (projectRoot) {
418
466
  const appConfigPath = path.join(projectRoot, 'app.config.yaml')
419
467
  if (!fs.existsSync(appConfigPath)) {
@@ -450,6 +498,13 @@ function main () {
450
498
  return
451
499
  }
452
500
 
501
+ // Strip the leftover aio dx/excshell/1 source scaffold before anything
502
+ // else — its stale React-16 code conflicts with our React-18 bundle.
503
+ const excshell = stripExcshellSourceDir(projectRoot)
504
+ if (excshell.changed) {
505
+ console.log('[@adobedjangir/commerce-admin-management] removed src/dx-excshell-1/ (replaced by commerce/backend-ui/1)')
506
+ }
507
+
453
508
  const app = setupAppConfig(projectRoot)
454
509
  if (app.changed) {
455
510
  console.log(