@commercetools-frontend/mc-scripts 24.9.0 → 24.10.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 (50) hide show
  1. package/cli/dist/commercetools-frontend-mc-scripts-cli.cjs.dev.js +10 -8
  2. package/cli/dist/commercetools-frontend-mc-scripts-cli.cjs.prod.js +10 -8
  3. package/cli/dist/commercetools-frontend-mc-scripts-cli.esm.js +10 -8
  4. package/dist/{build-4c4732a6.cjs.prod.js → build-9c26fe58.cjs.prod.js} +3 -3
  5. package/dist/{build-d44c1454.cjs.dev.js → build-bd986bac.cjs.dev.js} +3 -3
  6. package/dist/{build-c98b5309.esm.js → build-c91d680c.esm.js} +3 -3
  7. package/dist/commercetools-frontend-mc-scripts.cjs.dev.js +1 -1
  8. package/dist/commercetools-frontend-mc-scripts.cjs.prod.js +1 -1
  9. package/dist/commercetools-frontend-mc-scripts.esm.js +1 -1
  10. package/dist/{config-sync-cc8e443c.cjs.prod.js → config-sync-200c5df5.cjs.prod.js} +4 -4
  11. package/dist/{config-sync-94a1bab9.cjs.dev.js → config-sync-6977827c.cjs.dev.js} +4 -4
  12. package/dist/{config-sync-f89e965a.esm.js → config-sync-d57260cc.esm.js} +4 -4
  13. package/dist/{create-postcss-config-3c6e4082.esm.js → create-postcss-config-152ced99.esm.js} +1 -1
  14. package/dist/{create-postcss-config-7bd97267.cjs.dev.js → create-postcss-config-fd3dee79.cjs.dev.js} +1 -1
  15. package/dist/{create-postcss-config-6004d1b3.cjs.prod.js → create-postcss-config-fe3387fa.cjs.prod.js} +1 -1
  16. package/dist/{create-webpack-config-for-development-1d9166b6.cjs.dev.js → create-webpack-config-for-development-049a78d6.cjs.dev.js} +1 -1
  17. package/dist/{create-webpack-config-for-development-1ff29f29.esm.js → create-webpack-config-for-development-48e5e9d0.esm.js} +1 -1
  18. package/dist/{create-webpack-config-for-development-bad89362.cjs.prod.js → create-webpack-config-for-development-527a632e.cjs.prod.js} +1 -1
  19. package/dist/{create-webpack-config-for-production-d3715c1f.cjs.prod.js → create-webpack-config-for-production-5ef997a2.cjs.prod.js} +1 -1
  20. package/dist/{create-webpack-config-for-production-e7e9d73f.cjs.dev.js → create-webpack-config-for-production-9452f0ea.cjs.dev.js} +1 -1
  21. package/dist/{create-webpack-config-for-production-44398864.esm.js → create-webpack-config-for-production-991b35ad.esm.js} +1 -1
  22. package/dist/{credentials-storage-382cbd6c.cjs.prod.js → credentials-storage-0b89aa0e.cjs.prod.js} +0 -13
  23. package/dist/{credentials-storage-a0da40e8.esm.js → credentials-storage-4464313c.esm.js} +1 -12
  24. package/dist/{credentials-storage-0959d001.cjs.dev.js → credentials-storage-cbb5c559.cjs.dev.js} +0 -13
  25. package/dist/declarations/src/types.d.ts +6 -0
  26. package/dist/{deployment-previews-set-9e95bfa1.esm.js → deployment-previews-set-178cacbc.esm.js} +4 -4
  27. package/dist/{deployment-previews-set-485f4cf4.cjs.prod.js → deployment-previews-set-93927f50.cjs.prod.js} +4 -4
  28. package/dist/{deployment-previews-set-9e920f80.cjs.dev.js → deployment-previews-set-b9ebe08f.cjs.dev.js} +4 -4
  29. package/dist/{graphql-requests-2aa18200.cjs.prod.js → graphql-requests-5527b635.cjs.dev.js} +15 -6
  30. package/dist/{graphql-requests-bdc3f4b6.esm.js → graphql-requests-6043a20b.esm.js} +13 -5
  31. package/dist/{graphql-requests-d4d32da7.cjs.dev.js → graphql-requests-c5ecf40e.cjs.prod.js} +15 -6
  32. package/dist/login-2c875e0b.esm.js +214 -0
  33. package/dist/login-73e9f04f.cjs.prod.js +248 -0
  34. package/dist/login-d7cb2619.cjs.dev.js +248 -0
  35. package/dist/{package-0b5fe01d.cjs.prod.js → package-0d7eef40.cjs.dev.js} +8 -8
  36. package/dist/{package-ecec051f.esm.js → package-6a5c0475.esm.js} +8 -8
  37. package/dist/{package-fd9ca992.cjs.dev.js → package-c32ced1c.cjs.prod.js} +8 -8
  38. package/dist/{start-5c2c41a2.cjs.prod.js → start-296a8335.cjs.prod.js} +3 -3
  39. package/dist/{start-7d5da6e8.cjs.dev.js → start-66ec8479.cjs.dev.js} +3 -3
  40. package/dist/{start-4ad2de73.esm.js → start-f7aed0ed.esm.js} +3 -3
  41. package/package.json +8 -8
  42. package/postcss/dist/commercetools-frontend-mc-scripts-postcss.cjs.dev.js +2 -2
  43. package/postcss/dist/commercetools-frontend-mc-scripts-postcss.cjs.prod.js +2 -2
  44. package/postcss/dist/commercetools-frontend-mc-scripts-postcss.esm.js +2 -2
  45. package/webpack/dist/commercetools-frontend-mc-scripts-webpack.cjs.dev.js +4 -4
  46. package/webpack/dist/commercetools-frontend-mc-scripts-webpack.cjs.prod.js +4 -4
  47. package/webpack/dist/commercetools-frontend-mc-scripts-webpack.esm.js +4 -4
  48. package/dist/login-24a16f2b.esm.js +0 -229
  49. package/dist/login-2d480e6f.cjs.prod.js +0 -270
  50. package/dist/login-6625af4a.cjs.dev.js +0 -270
@@ -5,10 +5,8 @@ import _findInstanceProperty from '@babel/runtime-corejs3/core-js-stable/instanc
5
5
  import chalk from 'chalk';
6
6
  import prompts from 'prompts';
7
7
  import { processConfig } from '@commercetools-frontend/application-config';
8
- import { C as CredentialsStorage } from './credentials-storage-a0da40e8.esm.js';
9
- import { f as fetchCustomApplication, g as updateCustomApplicationDeploymentPreview, h as createCustomApplicationDeploymentPreview } from './graphql-requests-bdc3f4b6.esm.js';
10
- import '@commercetools/http-user-agent';
11
- import './package-ecec051f.esm.js';
8
+ import { C as CredentialsStorage } from './credentials-storage-4464313c.esm.js';
9
+ import { f as fetchCustomApplication, g as updateCustomApplicationDeploymentPreview, h as createCustomApplicationDeploymentPreview } from './graphql-requests-6043a20b.esm.js';
12
10
  import '@babel/runtime-corejs3/helpers/classCallCheck';
13
11
  import '@babel/runtime-corejs3/helpers/createClass';
14
12
  import '@babel/runtime-corejs3/core-js-stable/json/stringify';
@@ -29,6 +27,8 @@ import '@babel/runtime-corejs3/core-js-stable/instance/some';
29
27
  import 'graphql';
30
28
  import 'graphql-request';
31
29
  import '@commercetools-frontend/constants';
30
+ import '@commercetools/http-user-agent';
31
+ import './package-6a5c0475.esm.js';
32
32
 
33
33
  const credentialsStorage = new CredentialsStorage();
34
34
  const validateUrl = function () {
@@ -7,10 +7,8 @@ var _findInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/insta
7
7
  var chalk = require('chalk');
8
8
  var prompts = require('prompts');
9
9
  var applicationConfig = require('@commercetools-frontend/application-config');
10
- var credentialsStorage$1 = require('./credentials-storage-382cbd6c.cjs.prod.js');
11
- var graphqlRequests = require('./graphql-requests-2aa18200.cjs.prod.js');
12
- require('@commercetools/http-user-agent');
13
- require('./package-0b5fe01d.cjs.prod.js');
10
+ var credentialsStorage$1 = require('./credentials-storage-0b89aa0e.cjs.prod.js');
11
+ var graphqlRequests = require('./graphql-requests-c5ecf40e.cjs.prod.js');
14
12
  require('@babel/runtime-corejs3/helpers/classCallCheck');
15
13
  require('@babel/runtime-corejs3/helpers/createClass');
16
14
  require('@babel/runtime-corejs3/core-js-stable/json/stringify');
@@ -31,6 +29,8 @@ require('@babel/runtime-corejs3/core-js-stable/instance/some');
31
29
  require('graphql');
32
30
  require('graphql-request');
33
31
  require('@commercetools-frontend/constants');
32
+ require('@commercetools/http-user-agent');
33
+ require('./package-c32ced1c.cjs.prod.js');
34
34
 
35
35
  function _interopDefault (e) { return e && e.__esModule ? e : { 'default': e }; }
36
36
 
@@ -7,10 +7,8 @@ var _findInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/insta
7
7
  var chalk = require('chalk');
8
8
  var prompts = require('prompts');
9
9
  var applicationConfig = require('@commercetools-frontend/application-config');
10
- var credentialsStorage$1 = require('./credentials-storage-0959d001.cjs.dev.js');
11
- var graphqlRequests = require('./graphql-requests-d4d32da7.cjs.dev.js');
12
- require('@commercetools/http-user-agent');
13
- require('./package-fd9ca992.cjs.dev.js');
10
+ var credentialsStorage$1 = require('./credentials-storage-cbb5c559.cjs.dev.js');
11
+ var graphqlRequests = require('./graphql-requests-5527b635.cjs.dev.js');
14
12
  require('@babel/runtime-corejs3/helpers/classCallCheck');
15
13
  require('@babel/runtime-corejs3/helpers/createClass');
16
14
  require('@babel/runtime-corejs3/core-js-stable/json/stringify');
@@ -31,6 +29,8 @@ require('@babel/runtime-corejs3/core-js-stable/instance/some');
31
29
  require('graphql');
32
30
  require('graphql-request');
33
31
  require('@commercetools-frontend/constants');
32
+ require('@commercetools/http-user-agent');
33
+ require('./package-0d7eef40.cjs.dev.js');
34
34
 
35
35
  function _interopDefault (e) { return e && e.__esModule ? e : { 'default': e }; }
36
36
 
@@ -14,7 +14,9 @@ var chalk = require('chalk');
14
14
  var graphql = require('graphql');
15
15
  var graphqlRequest = require('graphql-request');
16
16
  var constants = require('@commercetools-frontend/constants');
17
- var credentialsStorage$1 = require('./credentials-storage-382cbd6c.cjs.prod.js');
17
+ var credentialsStorage$1 = require('./credentials-storage-cbb5c559.cjs.dev.js');
18
+ var createHttpUserAgent = require('@commercetools/http-user-agent');
19
+ var _package = require('./package-0d7eef40.cjs.dev.js');
18
20
 
19
21
  function _interopDefault (e) { return e && e.__esModule ? e : { 'default': e }; }
20
22
 
@@ -28,6 +30,16 @@ var _Object$defineProperties__default = /*#__PURE__*/_interopDefault(_Object$def
28
30
  var _Object$defineProperty__default = /*#__PURE__*/_interopDefault(_Object$defineProperty);
29
31
  var _someInstanceProperty__default = /*#__PURE__*/_interopDefault(_someInstanceProperty);
30
32
  var chalk__default = /*#__PURE__*/_interopDefault(chalk);
33
+ var createHttpUserAgent__default = /*#__PURE__*/_interopDefault(createHttpUserAgent);
34
+
35
+ const userAgent = createHttpUserAgent__default["default"]({
36
+ name: 'graphql-request',
37
+ libraryName: 'mc-scripts',
38
+ libraryVersion: _package.pkgJson.version,
39
+ contactUrl: 'https://git.io/fjuyC',
40
+ // points to the appkit repo issues
41
+ contactEmail: 'support@commercetools.com'
42
+ });
31
43
 
32
44
  function ownKeys(e, r) { var t = _Object$keys__default["default"](e); if (_Object$getOwnPropertySymbols__default["default"]) { var o = _Object$getOwnPropertySymbols__default["default"](e); r && (o = _filterInstanceProperty__default["default"](o).call(o, function (r) { return _Object$getOwnPropertyDescriptor__default["default"](e, r).enumerable; })), t.push.apply(t, o); } return t; }
33
45
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var _context2, _context3; var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? _forEachInstanceProperty__default["default"](_context2 = ownKeys(Object(t), !0)).call(_context2, function (r) { _defineProperty(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors__default["default"] ? _Object$defineProperties__default["default"](e, _Object$getOwnPropertyDescriptors__default["default"](t)) : _forEachInstanceProperty__default["default"](_context3 = ownKeys(Object(t))).call(_context3, function (r) { _Object$defineProperty__default["default"](e, r, _Object$getOwnPropertyDescriptor__default["default"](t, r)); }); } return e; }
@@ -43,18 +55,15 @@ var UpdateCustomViewFromCli = { kind: "Document", definitions: [{ kind: "Operati
43
55
  const credentialsStorage = new credentialsStorage$1.CredentialsStorage();
44
56
  async function requestWithTokenRetry(document, requestOptions) {
45
57
  let retryCount = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
46
- const shouldUseExperimentalIdentityAuthFlow = process.env.ENABLE_EXPERIMENTAL_IDENTITY_AUTH_FLOW === 'true';
47
58
  const token = credentialsStorage.getToken(requestOptions.mcApiUrl);
48
- const tokenHeader = shouldUseExperimentalIdentityAuthFlow ? {
59
+ const tokenHeader = {
49
60
  [constants.SUPPORTED_HEADERS.AUTHORIZATION]: `Bearer ${token}`
50
- } : {
51
- 'x-mc-cli-access-token': token
52
61
  };
53
62
  const client = new graphqlRequest.GraphQLClient(`${requestOptions.mcApiUrl}/graphql`, {
54
63
  headers: _objectSpread(_objectSpread({
55
64
  Accept: 'application/json',
56
65
  'Content-Type': 'application/json',
57
- 'x-user-agent': credentialsStorage$1.userAgent
66
+ 'x-user-agent': userAgent
58
67
  }, token ? tokenHeader : {}), requestOptions.headers)
59
68
  });
60
69
  try {
@@ -12,7 +12,18 @@ import chalk from 'chalk';
12
12
  import { print } from 'graphql';
13
13
  import { GraphQLClient, ClientError } from 'graphql-request';
14
14
  import { GRAPHQL_TARGETS, SUPPORTED_HEADERS } from '@commercetools-frontend/constants';
15
- import { C as CredentialsStorage, u as userAgent } from './credentials-storage-a0da40e8.esm.js';
15
+ import { C as CredentialsStorage } from './credentials-storage-4464313c.esm.js';
16
+ import createHttpUserAgent from '@commercetools/http-user-agent';
17
+ import { p as pkgJson } from './package-6a5c0475.esm.js';
18
+
19
+ const userAgent = createHttpUserAgent({
20
+ name: 'graphql-request',
21
+ libraryName: 'mc-scripts',
22
+ libraryVersion: pkgJson.version,
23
+ contactUrl: 'https://git.io/fjuyC',
24
+ // points to the appkit repo issues
25
+ contactEmail: 'support@commercetools.com'
26
+ });
16
27
 
17
28
  function ownKeys(e, r) { var t = _Object$keys(e); if (_Object$getOwnPropertySymbols) { var o = _Object$getOwnPropertySymbols(e); r && (o = _filterInstanceProperty(o).call(o, function (r) { return _Object$getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
18
29
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var _context2, _context3; var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? _forEachInstanceProperty(_context2 = ownKeys(Object(t), !0)).call(_context2, function (r) { _defineProperty(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(e, _Object$getOwnPropertyDescriptors(t)) : _forEachInstanceProperty(_context3 = ownKeys(Object(t))).call(_context3, function (r) { _Object$defineProperty(e, r, _Object$getOwnPropertyDescriptor(t, r)); }); } return e; }
@@ -28,12 +39,9 @@ var UpdateCustomViewFromCli = { kind: "Document", definitions: [{ kind: "Operati
28
39
  const credentialsStorage = new CredentialsStorage();
29
40
  async function requestWithTokenRetry(document, requestOptions) {
30
41
  let retryCount = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
31
- const shouldUseExperimentalIdentityAuthFlow = process.env.ENABLE_EXPERIMENTAL_IDENTITY_AUTH_FLOW === 'true';
32
42
  const token = credentialsStorage.getToken(requestOptions.mcApiUrl);
33
- const tokenHeader = shouldUseExperimentalIdentityAuthFlow ? {
43
+ const tokenHeader = {
34
44
  [SUPPORTED_HEADERS.AUTHORIZATION]: `Bearer ${token}`
35
- } : {
36
- 'x-mc-cli-access-token': token
37
45
  };
38
46
  const client = new GraphQLClient(`${requestOptions.mcApiUrl}/graphql`, {
39
47
  headers: _objectSpread(_objectSpread({
@@ -14,7 +14,9 @@ var chalk = require('chalk');
14
14
  var graphql = require('graphql');
15
15
  var graphqlRequest = require('graphql-request');
16
16
  var constants = require('@commercetools-frontend/constants');
17
- var credentialsStorage$1 = require('./credentials-storage-0959d001.cjs.dev.js');
17
+ var credentialsStorage$1 = require('./credentials-storage-0b89aa0e.cjs.prod.js');
18
+ var createHttpUserAgent = require('@commercetools/http-user-agent');
19
+ var _package = require('./package-c32ced1c.cjs.prod.js');
18
20
 
19
21
  function _interopDefault (e) { return e && e.__esModule ? e : { 'default': e }; }
20
22
 
@@ -28,6 +30,16 @@ var _Object$defineProperties__default = /*#__PURE__*/_interopDefault(_Object$def
28
30
  var _Object$defineProperty__default = /*#__PURE__*/_interopDefault(_Object$defineProperty);
29
31
  var _someInstanceProperty__default = /*#__PURE__*/_interopDefault(_someInstanceProperty);
30
32
  var chalk__default = /*#__PURE__*/_interopDefault(chalk);
33
+ var createHttpUserAgent__default = /*#__PURE__*/_interopDefault(createHttpUserAgent);
34
+
35
+ const userAgent = createHttpUserAgent__default["default"]({
36
+ name: 'graphql-request',
37
+ libraryName: 'mc-scripts',
38
+ libraryVersion: _package.pkgJson.version,
39
+ contactUrl: 'https://git.io/fjuyC',
40
+ // points to the appkit repo issues
41
+ contactEmail: 'support@commercetools.com'
42
+ });
31
43
 
32
44
  function ownKeys(e, r) { var t = _Object$keys__default["default"](e); if (_Object$getOwnPropertySymbols__default["default"]) { var o = _Object$getOwnPropertySymbols__default["default"](e); r && (o = _filterInstanceProperty__default["default"](o).call(o, function (r) { return _Object$getOwnPropertyDescriptor__default["default"](e, r).enumerable; })), t.push.apply(t, o); } return t; }
33
45
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var _context2, _context3; var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? _forEachInstanceProperty__default["default"](_context2 = ownKeys(Object(t), !0)).call(_context2, function (r) { _defineProperty(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors__default["default"] ? _Object$defineProperties__default["default"](e, _Object$getOwnPropertyDescriptors__default["default"](t)) : _forEachInstanceProperty__default["default"](_context3 = ownKeys(Object(t))).call(_context3, function (r) { _Object$defineProperty__default["default"](e, r, _Object$getOwnPropertyDescriptor__default["default"](t, r)); }); } return e; }
@@ -43,18 +55,15 @@ var UpdateCustomViewFromCli = { kind: "Document", definitions: [{ kind: "Operati
43
55
  const credentialsStorage = new credentialsStorage$1.CredentialsStorage();
44
56
  async function requestWithTokenRetry(document, requestOptions) {
45
57
  let retryCount = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
46
- const shouldUseExperimentalIdentityAuthFlow = process.env.ENABLE_EXPERIMENTAL_IDENTITY_AUTH_FLOW === 'true';
47
58
  const token = credentialsStorage.getToken(requestOptions.mcApiUrl);
48
- const tokenHeader = shouldUseExperimentalIdentityAuthFlow ? {
59
+ const tokenHeader = {
49
60
  [constants.SUPPORTED_HEADERS.AUTHORIZATION]: `Bearer ${token}`
50
- } : {
51
- 'x-mc-cli-access-token': token
52
61
  };
53
62
  const client = new graphqlRequest.GraphQLClient(`${requestOptions.mcApiUrl}/graphql`, {
54
63
  headers: _objectSpread(_objectSpread({
55
64
  Accept: 'application/json',
56
65
  'Content-Type': 'application/json',
57
- 'x-user-agent': credentialsStorage$1.userAgent
66
+ 'x-user-agent': userAgent
58
67
  }, token ? tokenHeader : {}), requestOptions.headers)
59
68
  });
60
69
  try {
@@ -0,0 +1,214 @@
1
+ import _Promise from '@babel/runtime-corejs3/core-js-stable/promise';
2
+ import _mapInstanceProperty from '@babel/runtime-corejs3/core-js-stable/instance/map';
3
+ import _startsWithInstanceProperty from '@babel/runtime-corejs3/core-js-stable/instance/starts-with';
4
+ import _trimInstanceProperty from '@babel/runtime-corejs3/core-js-stable/instance/trim';
5
+ import _forEachInstanceProperty from '@babel/runtime-corejs3/core-js-stable/instance/for-each';
6
+ import _URL from '@babel/runtime-corejs3/core-js-stable/url';
7
+ import crypto from 'node:crypto';
8
+ import process, { exit } from 'node:process';
9
+ import chalk from 'chalk';
10
+ import { processConfig } from '@commercetools-frontend/application-config';
11
+ import { p as pkgJson } from './package-6a5c0475.esm.js';
12
+ import http from 'node:http';
13
+ import jwtDecode from 'jwt-decode';
14
+ import { C as CredentialsStorage } from './credentials-storage-4464313c.esm.js';
15
+ import '@babel/runtime-corejs3/helpers/classCallCheck';
16
+ import '@babel/runtime-corejs3/helpers/createClass';
17
+ import '@babel/runtime-corejs3/core-js-stable/json/stringify';
18
+ import '@babel/runtime-corejs3/core-js-stable/date/now';
19
+ import 'node:fs';
20
+ import 'node:os';
21
+ import 'node:path';
22
+ import './does-file-exist-32618334.esm.js';
23
+
24
+ function createAuthCallbackServer(options) {
25
+ const server = http.createServer(async (request, response) => {
26
+ try {
27
+ if (request.url?.includes(`/${options.clientIdentifier}/oidc/callback`)) {
28
+ const incomingUrl = new _URL(request.url, 'http://localhost');
29
+ const sessionToken = incomingUrl.searchParams.get('sessionToken');
30
+ const requestedState = incomingUrl.searchParams.get('state');
31
+ if (!sessionToken) {
32
+ throw new Error('Invalid authentication flow (missing sessionToken)');
33
+ }
34
+ const decodedSessionToken = jwtDecode(sessionToken);
35
+ if (decodedSessionToken?.nonce !== options.nonce) {
36
+ throw new Error('Invalid authentication flow (nonce mismatch)');
37
+ }
38
+ if (requestedState !== options.state) {
39
+ throw new Error('Invalid authentication flow (state mismatch)');
40
+ }
41
+ options.onSuccess({
42
+ token: sessionToken,
43
+ expiresAt: decodedSessionToken.exp
44
+ });
45
+ response.setHeader('content-type', 'text/html');
46
+ response.end('Success!');
47
+ server.close(() => {
48
+ exit();
49
+ });
50
+ }
51
+ } catch (error) {
52
+ response.setHeader('content-type', 'text/html');
53
+ if (error instanceof Error) {
54
+ console.error(error.message);
55
+ response.end(error.message);
56
+ } else {
57
+ console.error(error);
58
+ response.end(`Invalid authentication flow.`);
59
+ }
60
+ server.close(() => {
61
+ exit();
62
+ });
63
+ }
64
+ });
65
+ return server;
66
+ }
67
+
68
+ const credentialsStorage = new CredentialsStorage();
69
+ const port = 3001;
70
+ const clientIdentifier = `mc-scripts-${pkgJson.version}`;
71
+ const isServerError = error => {
72
+ return error instanceof Error && 'code' in error;
73
+ };
74
+ const startServer = server => new _Promise((resolve, reject) => {
75
+ server.listen(port, 'localhost').on('listening', resolve).on('error', error => {
76
+ if (isServerError(error) && error.code === 'EADDRINUSE') {
77
+ return reject(new Error(`The address "localhost:${port}" is already in use. Are you running a Merchant Center application in other process? Please stop that and try again.`, {
78
+ cause: error
79
+ }));
80
+ }
81
+ return reject(new Error('Problem starting server', {
82
+ cause: error
83
+ }));
84
+ }).on('close', () => {
85
+ process.exit();
86
+ });
87
+ });
88
+ const resolveMcApiUrl = async options => {
89
+ if (options.mcApiUrl) {
90
+ return options.mcApiUrl;
91
+ }
92
+
93
+ // We first check whether the user has set the MC_API_URL environment variable
94
+ if (process.env.MC_API_URL) {
95
+ return process.env.MC_API_URL;
96
+ }
97
+
98
+ // If not, we parse the configuration and check if it's defined over there
99
+ const applicationConfig = await processConfig();
100
+ const mcApiUrl = applicationConfig.env.mcApiUrl;
101
+ return mcApiUrl;
102
+ };
103
+ const resolveProjectKey = async options => {
104
+ if (options.projectKey) {
105
+ return options.projectKey;
106
+ }
107
+
108
+ // We first check whether the user has set the CTP_PROJECT_KEY environment variable
109
+ if (process.env.CTP_PROJECT_KEY) {
110
+ return process.env.CTP_PROJECT_KEY;
111
+ }
112
+ try {
113
+ const applicationConfig = await processConfig();
114
+ return applicationConfig.env.__DEVELOPMENT__?.oidc?.initialProjectKey;
115
+ } catch (error) {
116
+ // It's ok if there's not application config file or if it does not contain the initialProjectKey
117
+ return;
118
+ }
119
+ };
120
+ const mapOAuthScopesToClaims = scopes => {
121
+ return _mapInstanceProperty(scopes).call(scopes, scope => {
122
+ if (_startsWithInstanceProperty(scope).call(scope, 'view_')) {
123
+ return `view:${scope}`;
124
+ }
125
+ if (_startsWithInstanceProperty(scope).call(scope, 'manage_')) {
126
+ return `manage:${scope}`;
127
+ }
128
+ return scope;
129
+ });
130
+ };
131
+ const mapAdditionalOAuthScopesToClaims = (name, scopes) => {
132
+ return _mapInstanceProperty(scopes).call(scopes, scope => {
133
+ if (_startsWithInstanceProperty(scope).call(scope, 'view_')) {
134
+ return `view/${name}:${scope}`;
135
+ }
136
+ if (_startsWithInstanceProperty(scope).call(scope, 'manage_')) {
137
+ return `manage/${name}:${scope}`;
138
+ }
139
+ return scope;
140
+ });
141
+ };
142
+ const resolveOAuthScopes = async options => {
143
+ if (options.oauthScope) {
144
+ return mapOAuthScopesToClaims(options.oauthScope);
145
+ }
146
+
147
+ // We first check whether the user has set the CTP_OAUTH_SCOPES environment variable
148
+ if (process.env.CTP_OAUTH_SCOPES) {
149
+ return mapOAuthScopesToClaims(process.env.CTP_OAUTH_SCOPES?.split(',').map(scope => _trimInstanceProperty(scope).call(scope)) ?? []);
150
+ }
151
+ try {
152
+ const applicationConfig = await processConfig();
153
+ const configuredOAuthScopes = applicationConfig.env.__DEVELOPMENT__?.oidc?.oAuthScopes;
154
+ const configuredAdditionalOAuthScopes = applicationConfig.env.__DEVELOPMENT__?.oidc?.additionalOAuthScopes;
155
+ return [...mapOAuthScopesToClaims(configuredOAuthScopes?.view ?? []), ...mapOAuthScopesToClaims(configuredOAuthScopes?.manage ?? []), ...(configuredAdditionalOAuthScopes?.flatMap(scope => mapAdditionalOAuthScopesToClaims(scope.name, scope.view)) ?? []), ...(configuredAdditionalOAuthScopes?.flatMap(scope => mapAdditionalOAuthScopesToClaims(scope.name, scope.manage)) ?? [])];
156
+ } catch (error) {
157
+ // It's ok if there's not application config file or if it does not contain the initialProjectKey
158
+ return [];
159
+ }
160
+ };
161
+ const generateRandomHash = function () {
162
+ let length = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 16;
163
+ return crypto.randomBytes(length).toString('hex');
164
+ };
165
+ async function run(options) {
166
+ const mcApiUrl = await resolveMcApiUrl(options);
167
+ if (!mcApiUrl) {
168
+ throw new Error('No Merchant Center API URL found. Aborting.');
169
+ }
170
+ console.log(`Using Merchant Center environment "${chalk.green(mcApiUrl)}".`);
171
+ console.log();
172
+ if (!options.force && credentialsStorage.isSessionValid(mcApiUrl)) {
173
+ console.log(`You already have a valid session.`);
174
+ return;
175
+ }
176
+ const projectKey = await resolveProjectKey(options);
177
+ const oauthScopes = await resolveOAuthScopes(options);
178
+ const scopes = ['openid'];
179
+ if (projectKey) {
180
+ scopes.push(`project_key:${projectKey}`);
181
+ _forEachInstanceProperty(oauthScopes).call(oauthScopes, scope => {
182
+ scopes.push(scope);
183
+ });
184
+ }
185
+ const state = generateRandomHash();
186
+ const nonce = generateRandomHash();
187
+ const authUrl = new _URL('/login/authorize', mcApiUrl);
188
+ authUrl.searchParams.set('response_type', 'id_token');
189
+ authUrl.searchParams.set('response_mode', 'query');
190
+ authUrl.searchParams.set('client_id', `__local:${clientIdentifier}`);
191
+ authUrl.searchParams.set('scope', scopes.join(' '));
192
+ authUrl.searchParams.set('state', state);
193
+ authUrl.searchParams.set('nonce', nonce);
194
+ const server = createAuthCallbackServer({
195
+ clientIdentifier,
196
+ state,
197
+ nonce,
198
+ onSuccess: tokenContext => {
199
+ credentialsStorage.setToken(mcApiUrl, tokenContext);
200
+ console.log();
201
+ console.log(chalk.green(`Login successful.`));
202
+ console.log();
203
+ }
204
+ });
205
+ await startServer(server);
206
+ console.log(`Initiating the OIDC authentication flow, opening the login page in your browser...`);
207
+ console.log(` ${authUrl}`);
208
+ console.log();
209
+ const open = await import('open');
210
+ await open.default(authUrl.toString());
211
+ console.log('Waiting for the OIDC authentication to complete...');
212
+ }
213
+
214
+ export { run as default };
@@ -0,0 +1,248 @@
1
+ 'use strict';
2
+
3
+ var _Promise = require('@babel/runtime-corejs3/core-js-stable/promise');
4
+ var _mapInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/map');
5
+ var _startsWithInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/starts-with');
6
+ var _trimInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/trim');
7
+ var _forEachInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/for-each');
8
+ var _URL = require('@babel/runtime-corejs3/core-js-stable/url');
9
+ var crypto = require('node:crypto');
10
+ var process = require('node:process');
11
+ var chalk = require('chalk');
12
+ var applicationConfig = require('@commercetools-frontend/application-config');
13
+ var _package = require('./package-c32ced1c.cjs.prod.js');
14
+ var http = require('node:http');
15
+ var jwtDecode = require('jwt-decode');
16
+ var credentialsStorage$1 = require('./credentials-storage-0b89aa0e.cjs.prod.js');
17
+ require('@babel/runtime-corejs3/helpers/classCallCheck');
18
+ require('@babel/runtime-corejs3/helpers/createClass');
19
+ require('@babel/runtime-corejs3/core-js-stable/json/stringify');
20
+ require('@babel/runtime-corejs3/core-js-stable/date/now');
21
+ require('node:fs');
22
+ require('node:os');
23
+ require('node:path');
24
+ require('./does-file-exist-be53305d.cjs.prod.js');
25
+
26
+ function _interopDefault (e) { return e && e.__esModule ? e : { 'default': e }; }
27
+
28
+ function _interopNamespace(e) {
29
+ if (e && e.__esModule) return e;
30
+ var n = Object.create(null);
31
+ if (e) {
32
+ Object.keys(e).forEach(function (k) {
33
+ if (k !== 'default') {
34
+ var d = Object.getOwnPropertyDescriptor(e, k);
35
+ Object.defineProperty(n, k, d.get ? d : {
36
+ enumerable: true,
37
+ get: function () { return e[k]; }
38
+ });
39
+ }
40
+ });
41
+ }
42
+ n["default"] = e;
43
+ return Object.freeze(n);
44
+ }
45
+
46
+ var _Promise__default = /*#__PURE__*/_interopDefault(_Promise);
47
+ var _mapInstanceProperty__default = /*#__PURE__*/_interopDefault(_mapInstanceProperty);
48
+ var _startsWithInstanceProperty__default = /*#__PURE__*/_interopDefault(_startsWithInstanceProperty);
49
+ var _trimInstanceProperty__default = /*#__PURE__*/_interopDefault(_trimInstanceProperty);
50
+ var _forEachInstanceProperty__default = /*#__PURE__*/_interopDefault(_forEachInstanceProperty);
51
+ var _URL__default = /*#__PURE__*/_interopDefault(_URL);
52
+ var crypto__default = /*#__PURE__*/_interopDefault(crypto);
53
+ var process__default = /*#__PURE__*/_interopDefault(process);
54
+ var chalk__default = /*#__PURE__*/_interopDefault(chalk);
55
+ var http__default = /*#__PURE__*/_interopDefault(http);
56
+ var jwtDecode__default = /*#__PURE__*/_interopDefault(jwtDecode);
57
+
58
+ function createAuthCallbackServer(options) {
59
+ const server = http__default["default"].createServer(async (request, response) => {
60
+ try {
61
+ if (request.url?.includes(`/${options.clientIdentifier}/oidc/callback`)) {
62
+ const incomingUrl = new _URL__default["default"](request.url, 'http://localhost');
63
+ const sessionToken = incomingUrl.searchParams.get('sessionToken');
64
+ const requestedState = incomingUrl.searchParams.get('state');
65
+ if (!sessionToken) {
66
+ throw new Error('Invalid authentication flow (missing sessionToken)');
67
+ }
68
+ const decodedSessionToken = jwtDecode__default["default"](sessionToken);
69
+ if (decodedSessionToken?.nonce !== options.nonce) {
70
+ throw new Error('Invalid authentication flow (nonce mismatch)');
71
+ }
72
+ if (requestedState !== options.state) {
73
+ throw new Error('Invalid authentication flow (state mismatch)');
74
+ }
75
+ options.onSuccess({
76
+ token: sessionToken,
77
+ expiresAt: decodedSessionToken.exp
78
+ });
79
+ response.setHeader('content-type', 'text/html');
80
+ response.end('Success!');
81
+ server.close(() => {
82
+ process.exit();
83
+ });
84
+ }
85
+ } catch (error) {
86
+ response.setHeader('content-type', 'text/html');
87
+ if (error instanceof Error) {
88
+ console.error(error.message);
89
+ response.end(error.message);
90
+ } else {
91
+ console.error(error);
92
+ response.end(`Invalid authentication flow.`);
93
+ }
94
+ server.close(() => {
95
+ process.exit();
96
+ });
97
+ }
98
+ });
99
+ return server;
100
+ }
101
+
102
+ const credentialsStorage = new credentialsStorage$1.CredentialsStorage();
103
+ const port = 3001;
104
+ const clientIdentifier = `mc-scripts-${_package.pkgJson.version}`;
105
+ const isServerError = error => {
106
+ return error instanceof Error && 'code' in error;
107
+ };
108
+ const startServer = server => new _Promise__default["default"]((resolve, reject) => {
109
+ server.listen(port, 'localhost').on('listening', resolve).on('error', error => {
110
+ if (isServerError(error) && error.code === 'EADDRINUSE') {
111
+ return reject(new Error(`The address "localhost:${port}" is already in use. Are you running a Merchant Center application in other process? Please stop that and try again.`, {
112
+ cause: error
113
+ }));
114
+ }
115
+ return reject(new Error('Problem starting server', {
116
+ cause: error
117
+ }));
118
+ }).on('close', () => {
119
+ process__default["default"].exit();
120
+ });
121
+ });
122
+ const resolveMcApiUrl = async options => {
123
+ if (options.mcApiUrl) {
124
+ return options.mcApiUrl;
125
+ }
126
+
127
+ // We first check whether the user has set the MC_API_URL environment variable
128
+ if (process__default["default"].env.MC_API_URL) {
129
+ return process__default["default"].env.MC_API_URL;
130
+ }
131
+
132
+ // If not, we parse the configuration and check if it's defined over there
133
+ const applicationConfig$1 = await applicationConfig.processConfig();
134
+ const mcApiUrl = applicationConfig$1.env.mcApiUrl;
135
+ return mcApiUrl;
136
+ };
137
+ const resolveProjectKey = async options => {
138
+ if (options.projectKey) {
139
+ return options.projectKey;
140
+ }
141
+
142
+ // We first check whether the user has set the CTP_PROJECT_KEY environment variable
143
+ if (process__default["default"].env.CTP_PROJECT_KEY) {
144
+ return process__default["default"].env.CTP_PROJECT_KEY;
145
+ }
146
+ try {
147
+ const applicationConfig$1 = await applicationConfig.processConfig();
148
+ return applicationConfig$1.env.__DEVELOPMENT__?.oidc?.initialProjectKey;
149
+ } catch (error) {
150
+ // It's ok if there's not application config file or if it does not contain the initialProjectKey
151
+ return;
152
+ }
153
+ };
154
+ const mapOAuthScopesToClaims = scopes => {
155
+ return _mapInstanceProperty__default["default"](scopes).call(scopes, scope => {
156
+ if (_startsWithInstanceProperty__default["default"](scope).call(scope, 'view_')) {
157
+ return `view:${scope}`;
158
+ }
159
+ if (_startsWithInstanceProperty__default["default"](scope).call(scope, 'manage_')) {
160
+ return `manage:${scope}`;
161
+ }
162
+ return scope;
163
+ });
164
+ };
165
+ const mapAdditionalOAuthScopesToClaims = (name, scopes) => {
166
+ return _mapInstanceProperty__default["default"](scopes).call(scopes, scope => {
167
+ if (_startsWithInstanceProperty__default["default"](scope).call(scope, 'view_')) {
168
+ return `view/${name}:${scope}`;
169
+ }
170
+ if (_startsWithInstanceProperty__default["default"](scope).call(scope, 'manage_')) {
171
+ return `manage/${name}:${scope}`;
172
+ }
173
+ return scope;
174
+ });
175
+ };
176
+ const resolveOAuthScopes = async options => {
177
+ if (options.oauthScope) {
178
+ return mapOAuthScopesToClaims(options.oauthScope);
179
+ }
180
+
181
+ // We first check whether the user has set the CTP_OAUTH_SCOPES environment variable
182
+ if (process__default["default"].env.CTP_OAUTH_SCOPES) {
183
+ return mapOAuthScopesToClaims(process__default["default"].env.CTP_OAUTH_SCOPES?.split(',').map(scope => _trimInstanceProperty__default["default"](scope).call(scope)) ?? []);
184
+ }
185
+ try {
186
+ const applicationConfig$1 = await applicationConfig.processConfig();
187
+ const configuredOAuthScopes = applicationConfig$1.env.__DEVELOPMENT__?.oidc?.oAuthScopes;
188
+ const configuredAdditionalOAuthScopes = applicationConfig$1.env.__DEVELOPMENT__?.oidc?.additionalOAuthScopes;
189
+ return [...mapOAuthScopesToClaims(configuredOAuthScopes?.view ?? []), ...mapOAuthScopesToClaims(configuredOAuthScopes?.manage ?? []), ...(configuredAdditionalOAuthScopes?.flatMap(scope => mapAdditionalOAuthScopesToClaims(scope.name, scope.view)) ?? []), ...(configuredAdditionalOAuthScopes?.flatMap(scope => mapAdditionalOAuthScopesToClaims(scope.name, scope.manage)) ?? [])];
190
+ } catch (error) {
191
+ // It's ok if there's not application config file or if it does not contain the initialProjectKey
192
+ return [];
193
+ }
194
+ };
195
+ const generateRandomHash = function () {
196
+ let length = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 16;
197
+ return crypto__default["default"].randomBytes(length).toString('hex');
198
+ };
199
+ async function run(options) {
200
+ const mcApiUrl = await resolveMcApiUrl(options);
201
+ if (!mcApiUrl) {
202
+ throw new Error('No Merchant Center API URL found. Aborting.');
203
+ }
204
+ console.log(`Using Merchant Center environment "${chalk__default["default"].green(mcApiUrl)}".`);
205
+ console.log();
206
+ if (!options.force && credentialsStorage.isSessionValid(mcApiUrl)) {
207
+ console.log(`You already have a valid session.`);
208
+ return;
209
+ }
210
+ const projectKey = await resolveProjectKey(options);
211
+ const oauthScopes = await resolveOAuthScopes(options);
212
+ const scopes = ['openid'];
213
+ if (projectKey) {
214
+ scopes.push(`project_key:${projectKey}`);
215
+ _forEachInstanceProperty__default["default"](oauthScopes).call(oauthScopes, scope => {
216
+ scopes.push(scope);
217
+ });
218
+ }
219
+ const state = generateRandomHash();
220
+ const nonce = generateRandomHash();
221
+ const authUrl = new _URL__default["default"]('/login/authorize', mcApiUrl);
222
+ authUrl.searchParams.set('response_type', 'id_token');
223
+ authUrl.searchParams.set('response_mode', 'query');
224
+ authUrl.searchParams.set('client_id', `__local:${clientIdentifier}`);
225
+ authUrl.searchParams.set('scope', scopes.join(' '));
226
+ authUrl.searchParams.set('state', state);
227
+ authUrl.searchParams.set('nonce', nonce);
228
+ const server = createAuthCallbackServer({
229
+ clientIdentifier,
230
+ state,
231
+ nonce,
232
+ onSuccess: tokenContext => {
233
+ credentialsStorage.setToken(mcApiUrl, tokenContext);
234
+ console.log();
235
+ console.log(chalk__default["default"].green(`Login successful.`));
236
+ console.log();
237
+ }
238
+ });
239
+ await startServer(server);
240
+ console.log(`Initiating the OIDC authentication flow, opening the login page in your browser...`);
241
+ console.log(` ${authUrl}`);
242
+ console.log();
243
+ const open = await Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespace(require('open')); });
244
+ await open.default(authUrl.toString());
245
+ console.log('Waiting for the OIDC authentication to complete...');
246
+ }
247
+
248
+ exports["default"] = run;