powr-sdk-web 5.10.5 → 5.10.7

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/sso/api.js CHANGED
@@ -29,8 +29,10 @@ function safeNextPath(next) {
29
29
 
30
30
  /**
31
31
  * Issue a one-time login code (caller must already be authenticated).
32
- * @param {string} apiUrl - Powr API base (…/powr)
32
+ * Host `injectProjectId` needs destination `projectId` on the body.
33
+ * @param {string} apiUrl - Powr API base
33
34
  * @param {string} bearerToken
35
+ * @param {{ projectId?: string }} [opts]
34
36
  */
35
37
  function issueLoginCode(_x, _x2) {
36
38
  return _issueLoginCode.apply(this, arguments);
@@ -39,20 +41,30 @@ function issueLoginCode(_x, _x2) {
39
41
  * Exchange loginId for session (same shape as /login).
40
42
  * @param {string} apiUrl
41
43
  * @param {string} loginId
44
+ * @param {{ projectId?: string }} [opts]
42
45
  */
43
46
  function _issueLoginCode() {
44
47
  _issueLoginCode = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(apiUrl, bearerToken) {
45
- var res, data;
48
+ var opts,
49
+ projectId,
50
+ res,
51
+ data,
52
+ _args = arguments;
46
53
  return _regenerator().w(function (_context) {
47
54
  while (1) switch (_context.n) {
48
55
  case 0:
56
+ opts = _args.length > 2 && _args[2] !== undefined ? _args[2] : {};
57
+ projectId = opts.projectId ? String(opts.projectId) : "";
49
58
  _context.n = 1;
50
59
  return fetch(joinApi(apiUrl, "auth/issue-login-code"), {
51
60
  method: "POST",
52
61
  headers: {
53
62
  Authorization: "Bearer ".concat(bearerToken),
54
63
  "Content-Type": "application/json"
55
- }
64
+ },
65
+ body: JSON.stringify(projectId ? {
66
+ projectId: projectId
67
+ } : {})
56
68
  });
57
69
  case 1:
58
70
  res = _context.v;
@@ -79,19 +91,29 @@ function loginWithCode(_x3, _x4) {
79
91
  }
80
92
  function _loginWithCode() {
81
93
  _loginWithCode = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(apiUrl, loginId) {
82
- var res, data, err;
94
+ var opts,
95
+ projectId,
96
+ body,
97
+ res,
98
+ data,
99
+ err,
100
+ _args2 = arguments;
83
101
  return _regenerator().w(function (_context2) {
84
102
  while (1) switch (_context2.n) {
85
103
  case 0:
104
+ opts = _args2.length > 2 && _args2[2] !== undefined ? _args2[2] : {};
105
+ projectId = opts.projectId ? String(opts.projectId) : "";
106
+ body = {
107
+ loginId: loginId
108
+ };
109
+ if (projectId) body.projectId = projectId;
86
110
  _context2.n = 1;
87
111
  return fetch(joinApi(apiUrl, "auth/login-with-code"), {
88
112
  method: "POST",
89
113
  headers: {
90
114
  "Content-Type": "application/json"
91
115
  },
92
- body: JSON.stringify({
93
- loginId: loginId
94
- })
116
+ body: JSON.stringify(body)
95
117
  });
96
118
  case 1:
97
119
  res = _context2.v;
package/dist/sso/index.js CHANGED
@@ -84,6 +84,7 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
84
84
  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
85
85
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
86
86
  function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
87
+ var config = require("../config");
87
88
  var shellStyle = {
88
89
  display: "flex",
89
90
  minHeight: "100vh",
@@ -149,7 +150,8 @@ var btnStyle = {
149
150
  * Apps keep a thin `/sso` page that renders this with `apiUrl` + `onSuccess`.
150
151
  *
151
152
  * @param {object} props
152
- * @param {string} props.apiUrl - Powr API base ending in /powr (or /powr/)
153
+ * @param {string} [props.apiUrl] - Powr host. Defaults to https://powr-api.lawazia.tech
154
+ * @param {string} [props.projectId] - Destination Powr id. Defaults to NEXT_PUBLIC_PROJECT_ID
153
155
  * @param {string} [props.appName]
154
156
  * @param {boolean} [props.ready=true] - Wait (e.g. auth hydrate) before exchanging code
155
157
  * @param {string} [props.loginHref="/login"]
@@ -162,6 +164,7 @@ var btnStyle = {
162
164
  */
163
165
  function PowrBaseSso(_ref) {
164
166
  var apiUrl = _ref.apiUrl,
167
+ projectIdProp = _ref.projectId,
165
168
  _ref$appName = _ref.appName,
166
169
  appName = _ref$appName === void 0 ? "App" : _ref$appName,
167
170
  _ref$ready = _ref.ready,
@@ -182,6 +185,8 @@ function PowrBaseSso(_ref) {
182
185
  })[0];
183
186
  var loginId = loginIdProp !== undefined ? loginIdProp : fromUrl.loginId;
184
187
  var next = nextProp !== undefined ? nextProp : fromUrl.next;
188
+ var powrApi = String(apiUrl || config.defaultPowrUrl || "").replace(/\/$/, "");
189
+ var projectId = String(projectIdProp || config.projectId || "");
185
190
  var _useState = (0, _react.useState)(loginId ? null : "Missing login link"),
186
191
  _useState2 = _slicedToArray(_useState, 2),
187
192
  error = _useState2[0],
@@ -194,10 +199,17 @@ function PowrBaseSso(_ref) {
194
199
  var onSuccessRef = (0, _react.useRef)(onSuccess);
195
200
  onSuccessRef.current = onSuccess;
196
201
  (0, _react.useEffect)(function () {
197
- if (!loginId || !ready || !apiUrl || started.current) return;
202
+ if (!loginId || !ready || !powrApi || started.current) return;
203
+ if (!projectId) {
204
+ setError("Powr project is not configured");
205
+ setBusy(false);
206
+ return;
207
+ }
198
208
  started.current = true;
199
209
  setBusy(true);
200
- (0, _api.loginWithCode)(apiUrl, loginId).then(/*#__PURE__*/function () {
210
+ (0, _api.loginWithCode)(powrApi, loginId, {
211
+ projectId: projectId
212
+ }).then(/*#__PURE__*/function () {
201
213
  var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(data) {
202
214
  var cb;
203
215
  return _regenerator().w(function (_context) {
@@ -227,7 +239,7 @@ function PowrBaseSso(_ref) {
227
239
  setError((err === null || err === void 0 ? void 0 : err.message) || "Could not finish sign-in");
228
240
  setBusy(false);
229
241
  });
230
- }, [loginId, next, ready, apiUrl]);
242
+ }, [loginId, next, ready, powrApi, projectId]);
231
243
  return /*#__PURE__*/_react["default"].createElement("div", {
232
244
  style: shellStyle
233
245
  }, /*#__PURE__*/_react["default"].createElement("style", null, "@keyframes powr-sso-spin{to{transform:rotate(360deg)}}"), /*#__PURE__*/_react["default"].createElement("p", {
@@ -13,6 +13,9 @@ function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present,
13
13
  function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); }
14
14
  function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
15
15
  function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
16
+ function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
17
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
18
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
16
19
  var config = require("../config");
17
20
  function normalizeOrigin(value) {
18
21
  return String(value || "").replace(/\/$/, "").toLowerCase();
@@ -34,6 +37,28 @@ function originsFromApps(apps) {
34
37
  return "";
35
38
  }).filter(Boolean);
36
39
  }
40
+ function projectIdFromApps(url, origins) {
41
+ if (!Array.isArray(origins)) return "";
42
+ var dest = parseDest(url);
43
+ if (!dest) return "";
44
+ var origin = normalizeOrigin(dest.origin);
45
+ var _iterator = _createForOfIteratorHelper(origins),
46
+ _step;
47
+ try {
48
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
49
+ var item = _step.value;
50
+ if (!item || typeof item === "string" || !item.url || !item.projectId) continue;
51
+ if (normalizeOrigin(originFromEntry(item.url)) === origin) {
52
+ return String(item.projectId);
53
+ }
54
+ }
55
+ } catch (err) {
56
+ _iterator.e(err);
57
+ } finally {
58
+ _iterator.f();
59
+ }
60
+ return "";
61
+ }
37
62
  function parseDest(url) {
38
63
  try {
39
64
  var parsed = new URL(url);
@@ -56,19 +81,21 @@ function resolvePowrApiUrl(apiUrl) {
56
81
 
57
82
  /**
58
83
  * @param {string} url
59
- * @param {string[]|Array<{url?: string}>} [origins] - sibling card list or origins
60
- * @returns {{ origin: string, pathname: string, search: string, hash: string } | null}
84
+ * @param {string[]|Array<{url?: string, projectId?: string}>} [origins] - sibling card list or origins
85
+ * @returns {{ origin: string, pathname: string, search: string, hash: string, projectId: string } | null}
61
86
  */
62
87
  function matchPowrTarget(url, origins) {
63
88
  var dest = parseDest(url);
64
89
  if (!dest) return null;
65
90
  var list = originsFromApps(origins);
66
- if (!list.length) return dest;
67
- var origin = normalizeOrigin(dest.origin);
68
- if (list.some(function (o) {
69
- return normalizeOrigin(o) === origin;
70
- })) return dest;
71
- return null;
91
+ if (list.length) {
92
+ var origin = normalizeOrigin(dest.origin);
93
+ if (!list.some(function (o) {
94
+ return normalizeOrigin(o) === origin;
95
+ })) return null;
96
+ }
97
+ dest.projectId = projectIdFromApps(url, origins);
98
+ return dest;
72
99
  }
73
100
 
74
101
  /**
@@ -99,13 +126,14 @@ function openPlain(url) {
99
126
 
100
127
  /**
101
128
  * Issue a login code and navigate to `/sso?loginId=`.
102
- * Same as login/admin: `apiUrl` comes from the app (or NEXT_PUBLIC_POWR_URL).
129
+ * Host is the SDK default. Omit `apiUrl` unless this call is a real override.
103
130
  *
104
131
  * @param {string} url - Destination app URL (from the sibling card / banner)
105
132
  * @param {string|null|undefined} token
106
133
  * @param {object} [options]
107
- * @param {string} [options.apiUrl] - Powr API (`…/powr`). Pass from the app.
108
- * @param {string[]|Array<{url?: string}>} [options.origins] - The card list
134
+ * @param {string} [options.apiUrl] - Override host. Do not pass product `/powr`.
135
+ * @param {string} [options.projectId] - Destination Powr id (else from matched card)
136
+ * @param {string[]|Array<{url?: string, projectId?: string}>} [options.origins] - The card list
109
137
  */
110
138
  function openPowrLogin(_x, _x2) {
111
139
  return _openPowrLogin.apply(this, arguments);
@@ -114,6 +142,7 @@ function _openPowrLogin() {
114
142
  _openPowrLogin = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(url, token) {
115
143
  var options,
116
144
  apiUrl,
145
+ projectIdOpt,
117
146
  origins,
118
147
  _options$ssoPath,
119
148
  ssoPath,
@@ -123,6 +152,7 @@ function _openPowrLogin() {
123
152
  navigate,
124
153
  powrApi,
125
154
  dest,
155
+ projectId,
126
156
  data,
127
157
  _args = arguments,
128
158
  _t;
@@ -130,12 +160,13 @@ function _openPowrLogin() {
130
160
  while (1) switch (_context.p = _context.n) {
131
161
  case 0:
132
162
  options = _args.length > 2 && _args[2] !== undefined ? _args[2] : {};
133
- apiUrl = options.apiUrl, origins = options.origins, _options$ssoPath = options.ssoPath, ssoPath = _options$ssoPath === void 0 ? "/sso" : _options$ssoPath, _options$onFallback = options.onFallback, onFallback = _options$onFallback === void 0 ? openPlain : _options$onFallback, _options$navigate = options.navigate, navigate = _options$navigate === void 0 ? function (ssoUrl) {
163
+ apiUrl = options.apiUrl, projectIdOpt = options.projectId, origins = options.origins, _options$ssoPath = options.ssoPath, ssoPath = _options$ssoPath === void 0 ? "/sso" : _options$ssoPath, _options$onFallback = options.onFallback, onFallback = _options$onFallback === void 0 ? openPlain : _options$onFallback, _options$navigate = options.navigate, navigate = _options$navigate === void 0 ? function (ssoUrl) {
134
164
  if (typeof window !== "undefined") window.location.assign(ssoUrl);
135
165
  } : _options$navigate;
136
166
  powrApi = resolvePowrApiUrl(apiUrl);
137
167
  dest = matchPowrTarget(url, origins);
138
- if (!(!dest || !token || !powrApi)) {
168
+ projectId = projectIdOpt || (dest === null || dest === void 0 ? void 0 : dest.projectId);
169
+ if (!(!dest || !token || !powrApi || !projectId)) {
139
170
  _context.n = 1;
140
171
  break;
141
172
  }
@@ -144,7 +175,9 @@ function _openPowrLogin() {
144
175
  case 1:
145
176
  _context.p = 1;
146
177
  _context.n = 2;
147
- return (0, _api.issueLoginCode)(powrApi, token);
178
+ return (0, _api.issueLoginCode)(powrApi, token, {
179
+ projectId: projectId
180
+ });
148
181
  case 2:
149
182
  data = _context.v;
150
183
  navigate(buildPowrSsoUrl(dest, data.loginId, {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "powr-sdk-web",
3
- "version": "5.10.5",
3
+ "version": "5.10.7",
4
4
  "main": "dist/index.js",
5
5
  "scripts": {
6
6
  "build": "babel src -d dist --copy-files",