@adobedjangir/commerce-admin-management 0.0.16 → 0.0.18

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 CHANGED
@@ -51,15 +51,24 @@ and an extension point for host apps to add their own pages and actions.
51
51
  aio app init my-commerce-admin
52
52
  cd my-commerce-admin
53
53
 
54
- # 2. Install. The postinstall bumps the host's package.json to the
55
- # React 18 / Spectrum 4 floor and re-runs `npm install` automatically.
56
- npm install @adobedjangir/commerce-admin-management
54
+ # 2. Install with --legacy-peer-deps on first install.
55
+ # aio's default template pins React 16; this package requires React 18.
56
+ npm install --legacy-peer-deps @adobedjangir/commerce-admin-management
57
57
 
58
- # 3. Fill in .env (see required values below)
59
- cp env.dist .env
58
+ # 3. Run the setup helper. Bumps host deps to React 18 / Spectrum 4 floor,
59
+ # scaffolds web-src/, removes the dx/excshell/1 boilerplate, and
60
+ # generates AIO_DB_REGION + SYSTEM_CONFIG_CRYPT_KEY in .env.
61
+ npx @adobedjangir/commerce-admin-management-setup
62
+
63
+ # 4. Apply the bumped versions
64
+ rm -rf node_modules package-lock.json
65
+ npm install
66
+
67
+ # 5. Fill in any missing .env values (OAUTH_*) — region + crypt key are
68
+ # auto-generated by step 3.
60
69
  $EDITOR .env
61
70
 
62
- # 4. Deploy. ABDB is auto-provisioned; actions + web assets ship to CDN.
71
+ # 6. Deploy. ABDB is auto-provisioned; actions + web assets ship to CDN.
63
72
  aio app deploy
64
73
  ```
65
74
 
@@ -36,9 +36,13 @@ runtimeManifest:
36
36
  LOG_LEVEL: debug
37
37
  SYSTEM_CONFIG_CRYPT_KEY: $SYSTEM_CONFIG_CRYPT_KEY
38
38
  OAUTH_CLIENT_ID: $OAUTH_CLIENT_ID
39
+ IMS_OAUTH_S2S_CLIENT_ID: $IMS_OAUTH_S2S_CLIENT_ID
39
40
  OAUTH_CLIENT_SECRET: $OAUTH_CLIENT_SECRET
41
+ IMS_OAUTH_S2S_CLIENT_SECRET: $IMS_OAUTH_S2S_CLIENT_SECRET
40
42
  OAUTH_ORG_ID: $OAUTH_ORG_ID
43
+ IMS_OAUTH_S2S_ORG_ID: $IMS_OAUTH_S2S_ORG_ID
41
44
  OAUTH_SCOPES: $OAUTH_SCOPES
45
+ IMS_OAUTH_S2S_SCOPES: $IMS_OAUTH_S2S_SCOPES
42
46
  AIO_DB_REGION: $AIO_DB_REGION
43
47
  annotations:
44
48
  require-adobe-auth: false
@@ -52,9 +56,13 @@ runtimeManifest:
52
56
  LOG_LEVEL: debug
53
57
  SYSTEM_CONFIG_CRYPT_KEY: $SYSTEM_CONFIG_CRYPT_KEY
54
58
  OAUTH_CLIENT_ID: $OAUTH_CLIENT_ID
59
+ IMS_OAUTH_S2S_CLIENT_ID: $IMS_OAUTH_S2S_CLIENT_ID
55
60
  OAUTH_CLIENT_SECRET: $OAUTH_CLIENT_SECRET
61
+ IMS_OAUTH_S2S_CLIENT_SECRET: $IMS_OAUTH_S2S_CLIENT_SECRET
56
62
  OAUTH_ORG_ID: $OAUTH_ORG_ID
63
+ IMS_OAUTH_S2S_ORG_ID: $IMS_OAUTH_S2S_ORG_ID
57
64
  OAUTH_SCOPES: $OAUTH_SCOPES
65
+ IMS_OAUTH_S2S_SCOPES: $IMS_OAUTH_S2S_SCOPES
58
66
  AIO_DB_REGION: $AIO_DB_REGION
59
67
  annotations:
60
68
  require-adobe-auth: false
@@ -68,9 +76,13 @@ runtimeManifest:
68
76
  LOG_LEVEL: debug
69
77
  SYSTEM_CONFIG_CRYPT_KEY: $SYSTEM_CONFIG_CRYPT_KEY
70
78
  OAUTH_CLIENT_ID: $OAUTH_CLIENT_ID
79
+ IMS_OAUTH_S2S_CLIENT_ID: $IMS_OAUTH_S2S_CLIENT_ID
71
80
  OAUTH_CLIENT_SECRET: $OAUTH_CLIENT_SECRET
81
+ IMS_OAUTH_S2S_CLIENT_SECRET: $IMS_OAUTH_S2S_CLIENT_SECRET
72
82
  OAUTH_ORG_ID: $OAUTH_ORG_ID
83
+ IMS_OAUTH_S2S_ORG_ID: $IMS_OAUTH_S2S_ORG_ID
73
84
  OAUTH_SCOPES: $OAUTH_SCOPES
85
+ IMS_OAUTH_S2S_SCOPES: $IMS_OAUTH_S2S_SCOPES
74
86
  AIO_DB_REGION: $AIO_DB_REGION
75
87
  annotations:
76
88
  require-adobe-auth: false
@@ -83,9 +95,13 @@ runtimeManifest:
83
95
  inputs:
84
96
  LOG_LEVEL: debug
85
97
  OAUTH_CLIENT_ID: $OAUTH_CLIENT_ID
98
+ IMS_OAUTH_S2S_CLIENT_ID: $IMS_OAUTH_S2S_CLIENT_ID
86
99
  OAUTH_CLIENT_SECRET: $OAUTH_CLIENT_SECRET
100
+ IMS_OAUTH_S2S_CLIENT_SECRET: $IMS_OAUTH_S2S_CLIENT_SECRET
87
101
  OAUTH_ORG_ID: $OAUTH_ORG_ID
102
+ IMS_OAUTH_S2S_ORG_ID: $IMS_OAUTH_S2S_ORG_ID
88
103
  OAUTH_SCOPES: $OAUTH_SCOPES
104
+ IMS_OAUTH_S2S_SCOPES: $IMS_OAUTH_S2S_SCOPES
89
105
  AIO_DB_REGION: $AIO_DB_REGION
90
106
  annotations:
91
107
  require-adobe-auth: false
@@ -99,9 +115,13 @@ runtimeManifest:
99
115
  LOG_LEVEL: debug
100
116
  SYSTEM_CONFIG_CRYPT_KEY: $SYSTEM_CONFIG_CRYPT_KEY
101
117
  OAUTH_CLIENT_ID: $OAUTH_CLIENT_ID
118
+ IMS_OAUTH_S2S_CLIENT_ID: $IMS_OAUTH_S2S_CLIENT_ID
102
119
  OAUTH_CLIENT_SECRET: $OAUTH_CLIENT_SECRET
120
+ IMS_OAUTH_S2S_CLIENT_SECRET: $IMS_OAUTH_S2S_CLIENT_SECRET
103
121
  OAUTH_ORG_ID: $OAUTH_ORG_ID
122
+ IMS_OAUTH_S2S_ORG_ID: $IMS_OAUTH_S2S_ORG_ID
104
123
  OAUTH_SCOPES: $OAUTH_SCOPES
124
+ IMS_OAUTH_S2S_SCOPES: $IMS_OAUTH_S2S_SCOPES
105
125
  AIO_DB_REGION: $AIO_DB_REGION
106
126
  annotations:
107
127
  require-adobe-auth: false
@@ -118,9 +138,13 @@ runtimeManifest:
118
138
  LOG_LEVEL: debug
119
139
  SYSTEM_CONFIG_CRYPT_KEY: $SYSTEM_CONFIG_CRYPT_KEY
120
140
  OAUTH_CLIENT_ID: $OAUTH_CLIENT_ID
141
+ IMS_OAUTH_S2S_CLIENT_ID: $IMS_OAUTH_S2S_CLIENT_ID
121
142
  OAUTH_CLIENT_SECRET: $OAUTH_CLIENT_SECRET
143
+ IMS_OAUTH_S2S_CLIENT_SECRET: $IMS_OAUTH_S2S_CLIENT_SECRET
122
144
  OAUTH_ORG_ID: $OAUTH_ORG_ID
145
+ IMS_OAUTH_S2S_ORG_ID: $IMS_OAUTH_S2S_ORG_ID
123
146
  OAUTH_SCOPES: $OAUTH_SCOPES
147
+ IMS_OAUTH_S2S_SCOPES: $IMS_OAUTH_S2S_SCOPES
124
148
  AIO_DB_REGION: $AIO_DB_REGION
125
149
  annotations:
126
150
  require-adobe-auth: false
@@ -134,9 +158,13 @@ runtimeManifest:
134
158
  LOG_LEVEL: debug
135
159
  SYSTEM_CONFIG_CRYPT_KEY: $SYSTEM_CONFIG_CRYPT_KEY
136
160
  OAUTH_CLIENT_ID: $OAUTH_CLIENT_ID
161
+ IMS_OAUTH_S2S_CLIENT_ID: $IMS_OAUTH_S2S_CLIENT_ID
137
162
  OAUTH_CLIENT_SECRET: $OAUTH_CLIENT_SECRET
163
+ IMS_OAUTH_S2S_CLIENT_SECRET: $IMS_OAUTH_S2S_CLIENT_SECRET
138
164
  OAUTH_ORG_ID: $OAUTH_ORG_ID
165
+ IMS_OAUTH_S2S_ORG_ID: $IMS_OAUTH_S2S_ORG_ID
139
166
  OAUTH_SCOPES: $OAUTH_SCOPES
167
+ IMS_OAUTH_S2S_SCOPES: $IMS_OAUTH_S2S_SCOPES
140
168
  AIO_DB_REGION: $AIO_DB_REGION
141
169
  annotations:
142
170
  require-adobe-auth: false
@@ -150,9 +178,13 @@ runtimeManifest:
150
178
  LOG_LEVEL: debug
151
179
  SYSTEM_CONFIG_CRYPT_KEY: $SYSTEM_CONFIG_CRYPT_KEY
152
180
  OAUTH_CLIENT_ID: $OAUTH_CLIENT_ID
181
+ IMS_OAUTH_S2S_CLIENT_ID: $IMS_OAUTH_S2S_CLIENT_ID
153
182
  OAUTH_CLIENT_SECRET: $OAUTH_CLIENT_SECRET
183
+ IMS_OAUTH_S2S_CLIENT_SECRET: $IMS_OAUTH_S2S_CLIENT_SECRET
154
184
  OAUTH_ORG_ID: $OAUTH_ORG_ID
185
+ IMS_OAUTH_S2S_ORG_ID: $IMS_OAUTH_S2S_ORG_ID
155
186
  OAUTH_SCOPES: $OAUTH_SCOPES
187
+ IMS_OAUTH_S2S_SCOPES: $IMS_OAUTH_S2S_SCOPES
156
188
  AIO_DB_REGION: $AIO_DB_REGION
157
189
  annotations:
158
190
  require-adobe-auth: false
@@ -166,9 +198,13 @@ runtimeManifest:
166
198
  LOG_LEVEL: debug
167
199
  SYSTEM_CONFIG_CRYPT_KEY: $SYSTEM_CONFIG_CRYPT_KEY
168
200
  OAUTH_CLIENT_ID: $OAUTH_CLIENT_ID
201
+ IMS_OAUTH_S2S_CLIENT_ID: $IMS_OAUTH_S2S_CLIENT_ID
169
202
  OAUTH_CLIENT_SECRET: $OAUTH_CLIENT_SECRET
203
+ IMS_OAUTH_S2S_CLIENT_SECRET: $IMS_OAUTH_S2S_CLIENT_SECRET
170
204
  OAUTH_ORG_ID: $OAUTH_ORG_ID
205
+ IMS_OAUTH_S2S_ORG_ID: $IMS_OAUTH_S2S_ORG_ID
171
206
  OAUTH_SCOPES: $OAUTH_SCOPES
207
+ IMS_OAUTH_S2S_SCOPES: $IMS_OAUTH_S2S_SCOPES
172
208
  AIO_DB_REGION: $AIO_DB_REGION
173
209
  annotations:
174
210
  require-adobe-auth: false
@@ -182,9 +218,13 @@ runtimeManifest:
182
218
  LOG_LEVEL: debug
183
219
  SYSTEM_CONFIG_CRYPT_KEY: $SYSTEM_CONFIG_CRYPT_KEY
184
220
  OAUTH_CLIENT_ID: $OAUTH_CLIENT_ID
221
+ IMS_OAUTH_S2S_CLIENT_ID: $IMS_OAUTH_S2S_CLIENT_ID
185
222
  OAUTH_CLIENT_SECRET: $OAUTH_CLIENT_SECRET
223
+ IMS_OAUTH_S2S_CLIENT_SECRET: $IMS_OAUTH_S2S_CLIENT_SECRET
186
224
  OAUTH_ORG_ID: $OAUTH_ORG_ID
225
+ IMS_OAUTH_S2S_ORG_ID: $IMS_OAUTH_S2S_ORG_ID
187
226
  OAUTH_SCOPES: $OAUTH_SCOPES
227
+ IMS_OAUTH_S2S_SCOPES: $IMS_OAUTH_S2S_SCOPES
188
228
  AIO_DB_REGION: $AIO_DB_REGION
189
229
  annotations:
190
230
  require-adobe-auth: false
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adobedjangir/commerce-admin-management",
3
- "version": "0.0.16",
3
+ "version": "0.0.18",
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
@@ -591,24 +591,55 @@ function ensureHostDeps (projectRoot) {
591
591
  try { pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8')) } catch (_) {
592
592
  return { changed: false, reason: 'unreadable-package-json' }
593
593
  }
594
- pkg.dependencies = pkg.dependencies || {}
595
594
 
595
+ // Decide which deps need bumping by reading the current package.json.
596
596
  const bumped = []
597
597
  for (const [name, floor] of Object.entries(REQUIRED_HOST_DEPS)) {
598
- const declared = pkg.dependencies[name] || (pkg.devDependencies && pkg.devDependencies[name])
598
+ const declared = (pkg.dependencies && pkg.dependencies[name]) ||
599
+ (pkg.devDependencies && pkg.devDependencies[name])
599
600
  if (declared && satisfiesFloor(declared, floor)) continue
600
- // Move it to dependencies (out of devDependencies if it was there) and
601
- // set to the floor.
602
- pkg.dependencies[name] = floor
603
- if (pkg.devDependencies && pkg.devDependencies[name]) {
604
- delete pkg.devDependencies[name]
605
- }
606
601
  bumped.push({ name, was: declared || '(missing)', now: floor })
607
602
  }
608
603
 
609
604
  if (bumped.length === 0) return { changed: false, reason: 'already-satisfies' }
610
605
 
611
- fs.writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + '\n', 'utf8')
606
+ // Persist via `npm pkg set` rather than fs.writeFileSync. The outer
607
+ // `npm install <pkg>` keeps a buffered copy of package.json that it
608
+ // writes at the very end of the install (to add the package itself
609
+ // as a dependency) — that write clobbers anything we'd done via
610
+ // fs.writeFileSync. `npm pkg set` goes through npm's own metadata
611
+ // layer and persists across that final write.
612
+ const { execSync } = require('child_process')
613
+ const args = bumped
614
+ .map((b) => `dependencies.${b.name}=${b.now}`)
615
+ // Some keys contain "@" which `npm pkg set` accepts unquoted; we
616
+ // shell-quote the whole assignment to be safe.
617
+ .map((a) => `'${a.replace(/'/g, "'\\''")}'`)
618
+ .join(' ')
619
+ try {
620
+ execSync(`npm pkg set ${args}`, {
621
+ cwd: projectRoot,
622
+ stdio: 'pipe',
623
+ env: { ...process.env, COMMERCE_ADMIN_MANAGEMENT_SKIP_SETUP: '1' }
624
+ })
625
+ } catch (e) {
626
+ return { changed: false, reason: `npm-pkg-set-failed: ${e.message}` }
627
+ }
628
+
629
+ // Also remove from devDependencies so the bumped value in dependencies
630
+ // is the only spec npm will see on the next resolution.
631
+ const inDev = bumped.filter((b) => pkg.devDependencies && pkg.devDependencies[b.name])
632
+ if (inDev.length) {
633
+ const delArgs = inDev.map((b) => `'devDependencies.${b.name}'`).join(' ')
634
+ try {
635
+ execSync(`npm pkg delete ${delArgs}`, {
636
+ cwd: projectRoot,
637
+ stdio: 'pipe',
638
+ env: { ...process.env, COMMERCE_ADMIN_MANAGEMENT_SKIP_SETUP: '1' }
639
+ })
640
+ } catch (_) { /* non-fatal */ }
641
+ }
642
+
612
643
  return { changed: true, bumped }
613
644
  }
614
645
 
@@ -624,6 +655,62 @@ function ensureHostDeps (projectRoot) {
624
655
  *
625
656
  * Returns { changed, set: [{key, source}], file }.
626
657
  */
658
+ /**
659
+ * Mirror IMS_OAUTH_S2S_* → OAUTH_* in the host's .env. Newer Adobe Developer
660
+ * Console templates use the IMS_OAUTH_S2S_ prefix; our actions still read
661
+ * the legacy OAUTH_ names. We append aliases so both work — only when
662
+ * IMS_OAUTH_S2S_* is set and OAUTH_* isn't. Idempotent: re-running won't
663
+ * duplicate the block (we identify our own mirror block by its comment).
664
+ */
665
+ function mirrorImsOauthAliases (projectRoot) {
666
+ const envPath = path.join(projectRoot, '.env')
667
+ if (!fs.existsSync(envPath)) return { changed: false, reason: 'no-env' }
668
+ let env = ''
669
+ try { env = fs.readFileSync(envPath, 'utf8') } catch (_) { return { changed: false, reason: 'unreadable' } }
670
+
671
+ const grab = (k) => {
672
+ const m = env.match(new RegExp('^' + k + '=(.*)$', 'm'))
673
+ return m ? m[1] : ''
674
+ }
675
+ const id = grab('IMS_OAUTH_S2S_CLIENT_ID')
676
+ const sec = grab('IMS_OAUTH_S2S_CLIENT_SECRET')
677
+ const org = grab('IMS_OAUTH_S2S_ORG_ID')
678
+ let scopes = grab('IMS_OAUTH_S2S_SCOPES')
679
+
680
+ if (!id || !sec || !org) return { changed: false, reason: 'ims-vars-missing' }
681
+
682
+ // SCOPES is often a JSON array; the action expects a comma-separated string.
683
+ if (scopes.trim().startsWith('[')) {
684
+ try { scopes = JSON.parse(scopes).join(', ') } catch (_) { /* leave as-is */ }
685
+ }
686
+
687
+ // If OAUTH_* already non-empty, leave the user's values alone.
688
+ const existing = {
689
+ OAUTH_CLIENT_ID: grab('OAUTH_CLIENT_ID'),
690
+ OAUTH_CLIENT_SECRET: grab('OAUTH_CLIENT_SECRET'),
691
+ OAUTH_ORG_ID: grab('OAUTH_ORG_ID'),
692
+ OAUTH_SCOPES: grab('OAUTH_SCOPES')
693
+ }
694
+ const anyMissing = Object.values(existing).some((v) => !v)
695
+ if (!anyMissing) return { changed: false, reason: 'already-aliased' }
696
+
697
+ // Strip any previously-mirrored block so re-runs don't accumulate.
698
+ env = env.replace(/\n# Aliases mirrored from IMS_OAUTH_S2S_\*[\s\S]*?(?=\n[A-Z_]+=|\n*$)/g, '')
699
+
700
+ const block = [
701
+ '',
702
+ '# Aliases mirrored from IMS_OAUTH_S2S_* — required by the commerce-admin-management actions.',
703
+ `OAUTH_CLIENT_ID=${id}`,
704
+ `OAUTH_CLIENT_SECRET=${sec}`,
705
+ `OAUTH_ORG_ID=${org}`,
706
+ `OAUTH_SCOPES=${scopes}`,
707
+ ''
708
+ ].join('\n')
709
+
710
+ fs.writeFileSync(envPath, env + block, 'utf8')
711
+ return { changed: true }
712
+ }
713
+
627
714
  function ensureEnvDefaults (projectRoot) {
628
715
  const envPath = path.join(projectRoot, '.env')
629
716
  let lines = []
@@ -751,6 +838,12 @@ function main () {
751
838
  console.log(`[@adobedjangir/commerce-admin-management] .env ${s.source}: ${s.key}`)
752
839
  }
753
840
  }
841
+ // Newer Adobe Developer Console templates use IMS_OAUTH_S2S_* prefix in
842
+ // .env. Our actions still read OAUTH_*. Mirror automatically so both work.
843
+ const mirror = mirrorImsOauthAliases(projectRoot)
844
+ if (mirror.changed) {
845
+ console.log('[@adobedjangir/commerce-admin-management] .env mirrored IMS_OAUTH_S2S_* → OAUTH_*')
846
+ }
754
847
 
755
848
  // Bump host package.json so React-18 + Spectrum-4 peers are satisfied
756
849
  // without the consumer running a long `npm install --save react@^18 ...`