@feelflow/ffid-sdk 7.0.0 → 7.2.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.
@@ -222,13 +222,18 @@ function mapUserinfoSubscriptionToSession(userinfo, serviceCode) {
222
222
  ];
223
223
  }
224
224
  var JWKS_ENDPOINT = "/.well-known/jwks.json";
225
- var JWT_ISSUER = "https://id.feelflow.net";
225
+ var LEGACY_JWT_ISSUER = "https://id.feelflow.net";
226
226
  var JWT_ALGORITHM = "ES256";
227
227
  var JWT_CLOCK_TOLERANCE_SECONDS = 30;
228
+ function resolveAcceptedIssuers(baseUrl) {
229
+ const deployedOrigin = new URL(baseUrl).origin;
230
+ return deployedOrigin === LEGACY_JWT_ISSUER ? [LEGACY_JWT_ISSUER] : [deployedOrigin, LEGACY_JWT_ISSUER];
231
+ }
228
232
  function createJwtVerifier(deps) {
229
233
  const { baseUrl, serviceCode, logger, createError, errorCodes } = deps;
230
234
  const jwksUrl = new URL(JWKS_ENDPOINT, baseUrl);
231
235
  const jwks = createRemoteJWKSet(jwksUrl);
236
+ const acceptedIssuers = resolveAcceptedIssuers(baseUrl);
232
237
  async function verifyJwt(accessToken) {
233
238
  if (!accessToken || !accessToken.trim()) {
234
239
  return {
@@ -241,7 +246,7 @@ function createJwtVerifier(deps) {
241
246
  try {
242
247
  const { payload } = await jwtVerify(accessToken, jwks, {
243
248
  algorithms: [JWT_ALGORITHM],
244
- issuer: JWT_ISSUER,
249
+ issuer: acceptedIssuers,
245
250
  audience: serviceCode,
246
251
  clockTolerance: JWT_CLOCK_TOLERANCE_SECONDS
247
252
  });
@@ -1297,6 +1302,310 @@ function createMembersMethods(deps) {
1297
1302
  return { listMembers, addMember, updateMemberRole, removeMember };
1298
1303
  }
1299
1304
 
1305
+ // src/types/organization-profile.ts
1306
+ var FFID_INDUSTRY_CODES = [
1307
+ "agriculture",
1308
+ "construction",
1309
+ "manufacturing",
1310
+ "it-software",
1311
+ "telecom",
1312
+ "media",
1313
+ "retail",
1314
+ "wholesale",
1315
+ "finance-insurance",
1316
+ "real-estate",
1317
+ "transport-logistics",
1318
+ "hospitality-food",
1319
+ "healthcare",
1320
+ "education",
1321
+ "professional-services",
1322
+ "marketing-advertising",
1323
+ "energy-utilities",
1324
+ "public-sector",
1325
+ "nonprofit",
1326
+ "other"
1327
+ ];
1328
+ var FFID_COMPANY_SIZE_CODES = [
1329
+ "1-10",
1330
+ "11-50",
1331
+ "51-200",
1332
+ "201-500",
1333
+ "501-1000",
1334
+ "1001+"
1335
+ ];
1336
+ var BYTES_PER_KB = 1024;
1337
+ var KB_PER_MB = 1024;
1338
+ var FFID_MAX_ORGANIZATION_LOGO_FILE_SIZE_MB = 2;
1339
+ var FFID_MAX_ORGANIZATION_LOGO_FILE_SIZE_BYTES = FFID_MAX_ORGANIZATION_LOGO_FILE_SIZE_MB * KB_PER_MB * BYTES_PER_KB;
1340
+ var FFID_ALLOWED_ORGANIZATION_LOGO_MIME_TYPES = [
1341
+ "image/png",
1342
+ "image/jpeg",
1343
+ "image/webp"
1344
+ ];
1345
+ var FFID_ORGANIZATION_PROFILE_ERROR_CODES = {
1346
+ VALIDATION_ERROR: "VALIDATION_ERROR",
1347
+ ORGANIZATION_NOT_FOUND: "ORGANIZATION_NOT_FOUND",
1348
+ CONSENTED_BY_NOT_MEMBER: "CONSENTED_BY_NOT_MEMBER",
1349
+ MISSING_FILE: "MISSING_FILE",
1350
+ INVALID_FILE_TYPE: "INVALID_FILE_TYPE",
1351
+ FILE_TOO_LARGE: "FILE_TOO_LARGE",
1352
+ INVALID_IMAGE: "INVALID_IMAGE",
1353
+ LOGO_UPLOAD_FAILED: "LOGO_UPLOAD_FAILED"
1354
+ };
1355
+
1356
+ // src/client/version-check.ts
1357
+ var SDK_VERSION = "7.2.0";
1358
+ var SDK_USER_AGENT = `FFID-SDK/${SDK_VERSION} (TypeScript)`;
1359
+ var SDK_VERSION_HEADER = "X-FFID-SDK-Version";
1360
+ function sdkHeaders() {
1361
+ if (typeof window !== "undefined") return {};
1362
+ return {
1363
+ "User-Agent": SDK_USER_AGENT,
1364
+ [SDK_VERSION_HEADER]: SDK_VERSION
1365
+ };
1366
+ }
1367
+ var LATEST_VERSION_HEADER = "X-FFID-SDK-Latest-Version";
1368
+ var SEMVER_PATTERN = /^\d+(\.\d+)*$/;
1369
+ var _versionWarningShown = false;
1370
+ function compareSemver(a, b) {
1371
+ const cleanA = a.replace(/^v/, "");
1372
+ const cleanB = b.replace(/^v/, "");
1373
+ if (!SEMVER_PATTERN.test(cleanA) || !SEMVER_PATTERN.test(cleanB)) return 0;
1374
+ const partsA = cleanA.split(".").map(Number);
1375
+ const partsB = cleanB.split(".").map(Number);
1376
+ const maxLen = Math.max(partsA.length, partsB.length);
1377
+ for (let i = 0; i < maxLen; i++) {
1378
+ const numA = partsA[i] ?? 0;
1379
+ const numB = partsB[i] ?? 0;
1380
+ if (numA < numB) return -1;
1381
+ if (numA > numB) return 1;
1382
+ }
1383
+ return 0;
1384
+ }
1385
+ function checkVersionHeader(response, logger) {
1386
+ if (_versionWarningShown) return;
1387
+ if (typeof process !== "undefined" && process.env?.NODE_ENV === "production") return;
1388
+ if (!response.headers?.get) return;
1389
+ const latestVersion = response.headers.get(LATEST_VERSION_HEADER);
1390
+ if (!latestVersion) return;
1391
+ if (compareSemver(SDK_VERSION, latestVersion) < 0) {
1392
+ _versionWarningShown = true;
1393
+ logger.warn(
1394
+ `\u65B0\u3057\u3044\u30D0\u30FC\u30B8\u30E7\u30F3\u304C\u5229\u7528\u53EF\u80FD\u3067\u3059: v${latestVersion} (\u73FE\u5728: v${SDK_VERSION})
1395
+ npm install @feelflow/ffid-sdk@latest \u3067\u30A2\u30C3\u30D7\u30C7\u30FC\u30C8\u3067\u304D\u307E\u3059`
1396
+ );
1397
+ }
1398
+ }
1399
+
1400
+ // src/client/organization-profile-methods.ts
1401
+ var EXT_PROFILE_ENDPOINT = "/api/v1/organizations/ext/profile";
1402
+ var EXT_PROFILE_LOGO_ENDPOINT = "/api/v1/organizations/ext/profile/logo";
1403
+ var LOGO_WALL_ENDPOINT = "/api/v1/organizations/logo-wall";
1404
+ var DEFAULT_LOGO_UPLOAD_FILENAME = "logo";
1405
+ function isBlank(value) {
1406
+ return !value || !value.trim();
1407
+ }
1408
+ function resolveOrganizationId(organizationIdOrParams) {
1409
+ return typeof organizationIdOrParams === "string" ? organizationIdOrParams : organizationIdOrParams.organizationId;
1410
+ }
1411
+ function resolveUpsertParams(organizationIdOrParams, payload) {
1412
+ if (typeof organizationIdOrParams === "string") {
1413
+ return { ...payload, organizationId: organizationIdOrParams };
1414
+ }
1415
+ return organizationIdOrParams;
1416
+ }
1417
+ function resolveUploadParams(organizationIdOrParams, file) {
1418
+ if (typeof organizationIdOrParams === "string") {
1419
+ return { organizationId: organizationIdOrParams, file };
1420
+ }
1421
+ return organizationIdOrParams;
1422
+ }
1423
+ function buildUpsertBody(params) {
1424
+ const { organizationId, ...body } = params;
1425
+ return body;
1426
+ }
1427
+ function profileQuery(organizationId) {
1428
+ return new URLSearchParams({ organizationId }).toString();
1429
+ }
1430
+ function logoUploadFilename(file) {
1431
+ if (typeof File !== "undefined" && file instanceof File && file.name) {
1432
+ return file.name;
1433
+ }
1434
+ return DEFAULT_LOGO_UPLOAD_FILENAME;
1435
+ }
1436
+ function listingConsentValidationError(listingConsent, createError) {
1437
+ if (!listingConsent || listingConsent.consented !== true) return null;
1438
+ if (isBlank(listingConsent.consentVersion) || isBlank(listingConsent.consentedByUserId)) {
1439
+ return createError(
1440
+ FFID_ORGANIZATION_PROFILE_ERROR_CODES.VALIDATION_ERROR,
1441
+ "\u63B2\u8F09\u540C\u610F\u3092\u8A18\u9332\u3059\u308B\u5834\u5408\u306F consentVersion \u3068 consentedByUserId \u304C\u5FC5\u9808\u3067\u3059"
1442
+ );
1443
+ }
1444
+ return null;
1445
+ }
1446
+ function resolveLogoFile(file, createError) {
1447
+ if (!file) {
1448
+ return {
1449
+ ok: false,
1450
+ error: createError(
1451
+ FFID_ORGANIZATION_PROFILE_ERROR_CODES.MISSING_FILE,
1452
+ "file \u30D5\u30A3\u30FC\u30EB\u30C9\u306B\u30ED\u30B4\u753B\u50CF\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044"
1453
+ )
1454
+ };
1455
+ }
1456
+ if (file.size > FFID_MAX_ORGANIZATION_LOGO_FILE_SIZE_BYTES) {
1457
+ return {
1458
+ ok: false,
1459
+ error: createError(
1460
+ FFID_ORGANIZATION_PROFILE_ERROR_CODES.FILE_TOO_LARGE,
1461
+ `\u30ED\u30B4\u753B\u50CF\u306F${FFID_MAX_ORGANIZATION_LOGO_FILE_SIZE_MB}MB\u4EE5\u4E0B\u306B\u3057\u3066\u304F\u3060\u3055\u3044`
1462
+ )
1463
+ };
1464
+ }
1465
+ if (file.type !== "" && !FFID_ALLOWED_ORGANIZATION_LOGO_MIME_TYPES.includes(file.type)) {
1466
+ return {
1467
+ ok: false,
1468
+ error: createError(
1469
+ FFID_ORGANIZATION_PROFILE_ERROR_CODES.INVALID_FILE_TYPE,
1470
+ "\u30ED\u30B4\u753B\u50CF\u306F PNG / JPEG / WebP \u5F62\u5F0F\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044"
1471
+ )
1472
+ };
1473
+ }
1474
+ return { ok: true, file };
1475
+ }
1476
+ function createOrganizationProfileMethods(deps) {
1477
+ const { fetchWithAuth, createError, authMode, baseUrl, logger, errorCodes } = deps;
1478
+ function serviceKeyModeError() {
1479
+ if (authMode === "service-key") return null;
1480
+ return createError(
1481
+ FFID_ORGANIZATION_PROFILE_ERROR_CODES.VALIDATION_ERROR,
1482
+ "getOrganizationProfile / upsertOrganizationProfile / uploadOrganizationLogo \u306F service-key \u8A8D\u8A3C\uFF08X-Service-Api-Key\uFF09\u3067\u306E\u307F\u5229\u7528\u3067\u304D\u307E\u3059\u3002Bearer / cookie \u30E2\u30FC\u30C9\u3067\u306F\u547C\u3073\u51FA\u305B\u307E\u305B\u3093"
1483
+ );
1484
+ }
1485
+ function requireOrganizationId(organizationId) {
1486
+ if (isBlank(organizationId)) {
1487
+ return createError(
1488
+ FFID_ORGANIZATION_PROFILE_ERROR_CODES.VALIDATION_ERROR,
1489
+ "organizationId \u306F\u5FC5\u9808\u3067\u3059"
1490
+ );
1491
+ }
1492
+ return null;
1493
+ }
1494
+ async function fetchPublic(endpoint, options = {}) {
1495
+ const url = `${baseUrl}${endpoint}`;
1496
+ logger.debug("Fetching (public):", url);
1497
+ let response;
1498
+ try {
1499
+ response = await fetch(url, {
1500
+ ...options,
1501
+ credentials: "omit",
1502
+ headers: {
1503
+ ...sdkHeaders(),
1504
+ ...options.headers
1505
+ }
1506
+ });
1507
+ } catch (error) {
1508
+ logger.error("Network error:", error);
1509
+ return {
1510
+ error: {
1511
+ code: errorCodes.NETWORK_ERROR,
1512
+ message: error instanceof Error ? error.message : "\u30CD\u30C3\u30C8\u30EF\u30FC\u30AF\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F"
1513
+ }
1514
+ };
1515
+ }
1516
+ let parsed;
1517
+ try {
1518
+ parsed = await response.json();
1519
+ } catch (parseError) {
1520
+ logger.error("Parse error:", parseError, "Status:", response.status);
1521
+ return {
1522
+ error: {
1523
+ code: errorCodes.PARSE_ERROR,
1524
+ message: `\u30B5\u30FC\u30D0\u30FC\u304B\u3089\u4E0D\u6B63\u306A\u30EC\u30B9\u30DD\u30F3\u30B9\u3092\u53D7\u4FE1\u3057\u307E\u3057\u305F (status: ${response.status})`
1525
+ }
1526
+ };
1527
+ }
1528
+ if (!parsed || typeof parsed !== "object") {
1529
+ return {
1530
+ error: {
1531
+ code: errorCodes.PARSE_ERROR,
1532
+ message: `\u30B5\u30FC\u30D0\u30FC\u304B\u3089\u4E0D\u6B63\u306A\u30EC\u30B9\u30DD\u30F3\u30B9\u3092\u53D7\u4FE1\u3057\u307E\u3057\u305F (status: ${response.status})`
1533
+ }
1534
+ };
1535
+ }
1536
+ const raw = parsed;
1537
+ logger.debug("Response (public):", response.status, raw);
1538
+ checkVersionHeader(response, logger);
1539
+ if (!response.ok) {
1540
+ return {
1541
+ error: raw.error ?? {
1542
+ code: errorCodes.UNKNOWN_ERROR,
1543
+ message: "\u4E0D\u660E\u306A\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F"
1544
+ }
1545
+ };
1546
+ }
1547
+ if (raw.data === void 0) {
1548
+ return {
1549
+ error: {
1550
+ code: errorCodes.UNKNOWN_ERROR,
1551
+ message: "\u30B5\u30FC\u30D0\u30FC\u304B\u3089\u30C7\u30FC\u30BF\u304C\u8FD4\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F"
1552
+ }
1553
+ };
1554
+ }
1555
+ return { data: raw.data };
1556
+ }
1557
+ async function getOrganizationProfile(organizationIdOrParams) {
1558
+ const modeError = serviceKeyModeError();
1559
+ if (modeError) return { error: modeError };
1560
+ const organizationId = resolveOrganizationId(organizationIdOrParams);
1561
+ const idError = requireOrganizationId(organizationId);
1562
+ if (idError) return { error: idError };
1563
+ return fetchWithAuth(
1564
+ `${EXT_PROFILE_ENDPOINT}?${profileQuery(organizationId)}`
1565
+ );
1566
+ }
1567
+ async function upsertOrganizationProfile(organizationIdOrParams, payload) {
1568
+ const modeError = serviceKeyModeError();
1569
+ if (modeError) return { error: modeError };
1570
+ const params = resolveUpsertParams(organizationIdOrParams, payload);
1571
+ const idError = requireOrganizationId(params.organizationId);
1572
+ if (idError) return { error: idError };
1573
+ const consentError = listingConsentValidationError(params.listingConsent, createError);
1574
+ if (consentError) return { error: consentError };
1575
+ return fetchWithAuth(
1576
+ `${EXT_PROFILE_ENDPOINT}?${profileQuery(params.organizationId)}`,
1577
+ {
1578
+ method: "PUT",
1579
+ body: JSON.stringify(buildUpsertBody(params))
1580
+ }
1581
+ );
1582
+ }
1583
+ async function uploadOrganizationLogo(organizationIdOrParams, file) {
1584
+ const modeError = serviceKeyModeError();
1585
+ if (modeError) return { error: modeError };
1586
+ const params = resolveUploadParams(organizationIdOrParams, file);
1587
+ const idError = requireOrganizationId(params.organizationId);
1588
+ if (idError) return { error: idError };
1589
+ const logoFile = resolveLogoFile(params.file, createError);
1590
+ if (!logoFile.ok) return { error: logoFile.error };
1591
+ const form = new FormData();
1592
+ form.append("file", logoFile.file, logoUploadFilename(logoFile.file));
1593
+ return fetchWithAuth(
1594
+ `${EXT_PROFILE_LOGO_ENDPOINT}?${profileQuery(params.organizationId)}`,
1595
+ { method: "POST", body: form }
1596
+ );
1597
+ }
1598
+ async function getPublicLogoWall() {
1599
+ return fetchPublic(LOGO_WALL_ENDPOINT);
1600
+ }
1601
+ return {
1602
+ getOrganizationProfile,
1603
+ upsertOrganizationProfile,
1604
+ uploadOrganizationLogo,
1605
+ getPublicLogoWall
1606
+ };
1607
+ }
1608
+
1300
1609
  // src/client/provisioning-methods.ts
1301
1610
  var USER_PROVISION_ENDPOINT = "/api/v1/ext/users/provision";
1302
1611
  var USER_WELCOME_EMAIL_ENDPOINT = "/api/v1/ext/users/welcome-email";
@@ -1440,7 +1749,7 @@ function createSeatMethods(deps) {
1440
1749
  }
1441
1750
 
1442
1751
  // src/client/profile-methods.ts
1443
- var EXT_PROFILE_ENDPOINT = "/api/v1/users/ext/me";
1752
+ var EXT_PROFILE_ENDPOINT2 = "/api/v1/users/ext/me";
1444
1753
  function resolveAuthOverride(options, createError) {
1445
1754
  if (!options || options.accessToken === void 0) {
1446
1755
  return {};
@@ -1461,7 +1770,7 @@ function createProfileMethods(deps) {
1461
1770
  async function getProfile(options) {
1462
1771
  const { override, error } = resolveAuthOverride(options, createError);
1463
1772
  if (error) return { error };
1464
- return fetchWithAuth(EXT_PROFILE_ENDPOINT, void 0, override);
1773
+ return fetchWithAuth(EXT_PROFILE_ENDPOINT2, void 0, override);
1465
1774
  }
1466
1775
  async function updateProfile(data, options) {
1467
1776
  if (data === null || typeof data !== "object" || Array.isArray(data)) {
@@ -1477,7 +1786,7 @@ function createProfileMethods(deps) {
1477
1786
  const { override, error } = resolveAuthOverride(options, createError);
1478
1787
  if (error) return { error };
1479
1788
  return fetchWithAuth(
1480
- EXT_PROFILE_ENDPOINT,
1789
+ EXT_PROFILE_ENDPOINT2,
1481
1790
  {
1482
1791
  method: "PUT",
1483
1792
  body: JSON.stringify(data)
@@ -1670,50 +1979,6 @@ function validateTokenResponse(tokenResponse) {
1670
1979
  };
1671
1980
  }
1672
1981
 
1673
- // src/client/version-check.ts
1674
- var SDK_VERSION = "7.0.0";
1675
- var SDK_USER_AGENT = `FFID-SDK/${SDK_VERSION} (TypeScript)`;
1676
- var SDK_VERSION_HEADER = "X-FFID-SDK-Version";
1677
- function sdkHeaders() {
1678
- if (typeof window !== "undefined") return {};
1679
- return {
1680
- "User-Agent": SDK_USER_AGENT,
1681
- [SDK_VERSION_HEADER]: SDK_VERSION
1682
- };
1683
- }
1684
- var LATEST_VERSION_HEADER = "X-FFID-SDK-Latest-Version";
1685
- var SEMVER_PATTERN = /^\d+(\.\d+)*$/;
1686
- var _versionWarningShown = false;
1687
- function compareSemver(a, b) {
1688
- const cleanA = a.replace(/^v/, "");
1689
- const cleanB = b.replace(/^v/, "");
1690
- if (!SEMVER_PATTERN.test(cleanA) || !SEMVER_PATTERN.test(cleanB)) return 0;
1691
- const partsA = cleanA.split(".").map(Number);
1692
- const partsB = cleanB.split(".").map(Number);
1693
- const maxLen = Math.max(partsA.length, partsB.length);
1694
- for (let i = 0; i < maxLen; i++) {
1695
- const numA = partsA[i] ?? 0;
1696
- const numB = partsB[i] ?? 0;
1697
- if (numA < numB) return -1;
1698
- if (numA > numB) return 1;
1699
- }
1700
- return 0;
1701
- }
1702
- function checkVersionHeader(response, logger) {
1703
- if (_versionWarningShown) return;
1704
- if (typeof process !== "undefined" && process.env?.NODE_ENV === "production") return;
1705
- if (!response.headers?.get) return;
1706
- const latestVersion = response.headers.get(LATEST_VERSION_HEADER);
1707
- if (!latestVersion) return;
1708
- if (compareSemver(SDK_VERSION, latestVersion) < 0) {
1709
- _versionWarningShown = true;
1710
- logger.warn(
1711
- `\u65B0\u3057\u3044\u30D0\u30FC\u30B8\u30E7\u30F3\u304C\u5229\u7528\u53EF\u80FD\u3067\u3059: v${latestVersion} (\u73FE\u5728: v${SDK_VERSION})
1712
- npm install @feelflow/ffid-sdk@latest \u3067\u30A2\u30C3\u30D7\u30C7\u30FC\u30C8\u3067\u304D\u307E\u3059`
1713
- );
1714
- }
1715
- }
1716
-
1717
1982
  // src/client/oauth-token.ts
1718
1983
  var OAUTH_TOKEN_ENDPOINT = "/api/v1/oauth/token";
1719
1984
  var OAUTH_REVOKE_ENDPOINT = "/api/v1/oauth/revoke";
@@ -2534,7 +2799,7 @@ function normalizeRedirectUri(input) {
2534
2799
 
2535
2800
  // src/client/password-reset.ts
2536
2801
  var RESET_PASSWORD_BASE = "/api/v1/auth/reset-password";
2537
- function isBlank(value) {
2802
+ function isBlank2(value) {
2538
2803
  return !value || !value.trim();
2539
2804
  }
2540
2805
  function createPasswordResetMethods(deps) {
@@ -2595,7 +2860,7 @@ function createPasswordResetMethods(deps) {
2595
2860
  return { data: raw.data };
2596
2861
  }
2597
2862
  async function requestPasswordReset(email) {
2598
- if (isBlank(email)) {
2863
+ if (isBlank2(email)) {
2599
2864
  return {
2600
2865
  error: createError("VALIDATION_ERROR", "\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u306F\u5FC5\u9808\u3067\u3059")
2601
2866
  };
@@ -2609,7 +2874,7 @@ function createPasswordResetMethods(deps) {
2609
2874
  );
2610
2875
  }
2611
2876
  async function verifyPasswordResetToken(accessToken) {
2612
- if (isBlank(accessToken)) {
2877
+ if (isBlank2(accessToken)) {
2613
2878
  return {
2614
2879
  error: createError("VALIDATION_ERROR", "\u30A2\u30AF\u30BB\u30B9\u30C8\u30FC\u30AF\u30F3\u306F\u5FC5\u9808\u3067\u3059")
2615
2880
  };
@@ -2623,12 +2888,12 @@ function createPasswordResetMethods(deps) {
2623
2888
  );
2624
2889
  }
2625
2890
  async function establishResetSession(accessToken, refreshToken) {
2626
- if (isBlank(accessToken)) {
2891
+ if (isBlank2(accessToken)) {
2627
2892
  return {
2628
2893
  error: createError("VALIDATION_ERROR", "\u30A2\u30AF\u30BB\u30B9\u30C8\u30FC\u30AF\u30F3\u306F\u5FC5\u9808\u3067\u3059")
2629
2894
  };
2630
2895
  }
2631
- if (isBlank(refreshToken)) {
2896
+ if (isBlank2(refreshToken)) {
2632
2897
  return {
2633
2898
  error: createError("VALIDATION_ERROR", "\u30EA\u30D5\u30EC\u30C3\u30B7\u30E5\u30C8\u30FC\u30AF\u30F3\u306F\u5FC5\u9808\u3067\u3059")
2634
2899
  };
@@ -2642,7 +2907,7 @@ function createPasswordResetMethods(deps) {
2642
2907
  );
2643
2908
  }
2644
2909
  async function confirmPasswordReset(password) {
2645
- if (isBlank(password)) {
2910
+ if (isBlank2(password)) {
2646
2911
  return {
2647
2912
  error: createError("VALIDATION_ERROR", "\u30D1\u30B9\u30EF\u30FC\u30C9\u306F\u5FC5\u9808\u3067\u3059")
2648
2913
  };
@@ -2665,7 +2930,7 @@ function createPasswordResetMethods(deps) {
2665
2930
 
2666
2931
  // src/client/otp.ts
2667
2932
  var OTP_BASE = "/api/v1/auth/otp";
2668
- function isBlank2(value) {
2933
+ function isBlank3(value) {
2669
2934
  return !value || !value.trim();
2670
2935
  }
2671
2936
  function createOtpMethods(deps) {
@@ -2726,7 +2991,7 @@ function createOtpMethods(deps) {
2726
2991
  return { data: raw.data };
2727
2992
  }
2728
2993
  async function sendOtp(email, options) {
2729
- if (isBlank2(email)) {
2994
+ if (isBlank3(email)) {
2730
2995
  return {
2731
2996
  error: createError("VALIDATION_ERROR", "\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u306F\u5FC5\u9808\u3067\u3059")
2732
2997
  };
@@ -2743,12 +3008,12 @@ function createOtpMethods(deps) {
2743
3008
  );
2744
3009
  }
2745
3010
  async function verifyOtp(params) {
2746
- if (isBlank2(params.accessToken)) {
3011
+ if (isBlank3(params.accessToken)) {
2747
3012
  return {
2748
3013
  error: createError("VALIDATION_ERROR", "\u30A2\u30AF\u30BB\u30B9\u30C8\u30FC\u30AF\u30F3\u306F\u5FC5\u9808\u3067\u3059")
2749
3014
  };
2750
3015
  }
2751
- if (isBlank2(params.refreshToken)) {
3016
+ if (isBlank3(params.refreshToken)) {
2752
3017
  return {
2753
3018
  error: createError("VALIDATION_ERROR", "\u30EA\u30D5\u30EC\u30C3\u30B7\u30E5\u30C8\u30FC\u30AF\u30F3\u306F\u5FC5\u9808\u3067\u3059")
2754
3019
  };
@@ -3239,6 +3504,12 @@ function resolveRedirectUri(raw, logger) {
3239
3504
  return raw;
3240
3505
  }
3241
3506
  }
3507
+ function jsonContentTypeHeader(body) {
3508
+ if (typeof FormData !== "undefined" && body instanceof FormData) {
3509
+ return {};
3510
+ }
3511
+ return { "Content-Type": "application/json" };
3512
+ }
3242
3513
  function createFFIDClient(config) {
3243
3514
  if (!config.serviceCode || !config.serviceCode.trim()) {
3244
3515
  throw new Error("FFID Client: serviceCode \u304C\u672A\u8A2D\u5B9A\u3067\u3059");
@@ -3291,7 +3562,7 @@ function createFFIDClient(config) {
3291
3562
  ...options,
3292
3563
  credentials: "omit",
3293
3564
  headers: {
3294
- "Content-Type": "application/json",
3565
+ ...jsonContentTypeHeader(options.body),
3295
3566
  ...sdkHeaders(),
3296
3567
  ...options.headers,
3297
3568
  Authorization: `Bearer ${authOverride.accessToken}`
@@ -3303,7 +3574,7 @@ function createFFIDClient(config) {
3303
3574
  ...options,
3304
3575
  credentials: "omit",
3305
3576
  headers: {
3306
- "Content-Type": "application/json",
3577
+ ...jsonContentTypeHeader(options.body),
3307
3578
  ...sdkHeaders(),
3308
3579
  "X-Service-Api-Key": serviceApiKey,
3309
3580
  ...options.headers
@@ -3313,7 +3584,7 @@ function createFFIDClient(config) {
3313
3584
  if (authMode === "token") {
3314
3585
  const tokens = tokenStore.getTokens();
3315
3586
  const headers = {
3316
- "Content-Type": "application/json",
3587
+ ...jsonContentTypeHeader(options.body),
3317
3588
  ...sdkHeaders(),
3318
3589
  ...options.headers
3319
3590
  };
@@ -3330,7 +3601,7 @@ function createFFIDClient(config) {
3330
3601
  ...options,
3331
3602
  credentials: "include",
3332
3603
  headers: {
3333
- "Content-Type": "application/json",
3604
+ ...jsonContentTypeHeader(options.body),
3334
3605
  ...sdkHeaders(),
3335
3606
  ...options.headers
3336
3607
  }
@@ -3547,6 +3818,19 @@ function createFFIDClient(config) {
3547
3818
  createError,
3548
3819
  serviceCode: config.serviceCode
3549
3820
  });
3821
+ const {
3822
+ getOrganizationProfile,
3823
+ upsertOrganizationProfile,
3824
+ uploadOrganizationLogo,
3825
+ getPublicLogoWall
3826
+ } = createOrganizationProfileMethods({
3827
+ fetchWithAuth,
3828
+ createError,
3829
+ authMode,
3830
+ baseUrl,
3831
+ logger,
3832
+ errorCodes: FFID_ERROR_CODES
3833
+ });
3550
3834
  const { provisionUser, sendProvisionWelcomeEmail, provisionOrganization } = createProvisioningMethods({
3551
3835
  fetchWithAuth,
3552
3836
  createError,
@@ -3647,6 +3931,10 @@ function createFFIDClient(config) {
3647
3931
  addMember,
3648
3932
  updateMemberRole,
3649
3933
  removeMember,
3934
+ getOrganizationProfile,
3935
+ upsertOrganizationProfile,
3936
+ uploadOrganizationLogo,
3937
+ getPublicLogoWall,
3650
3938
  provisionUser,
3651
3939
  sendProvisionWelcomeEmail,
3652
3940
  provisionOrganization,
@@ -4104,4 +4392,4 @@ function clear(opts = {}) {
4104
4392
  }
4105
4393
  var sessionCookies = { serialize, read, clear };
4106
4394
 
4107
- export { ALL_DENIED_EXCEPT_NECESSARY, CATALOG_HASH_PATTERN, CONSENT_COOKIE_NAME, COOKIE_VERSION, FFIDCatalogHashError, FFID_CATALOG_ENVIRONMENTS, FFID_CATALOG_PUBLICATION_STATUSES, FFID_ERROR_CODES, FFID_SESSION_COOKIE_NAME, canonicalizeCatalogValue, computeFFIDCheckoutCopyHash, computeLegalDisclosureHash, computePaymentConfigurationHash, computePraxisCopyHash, computeScopeHash, computeTaxConfigurationHash, createFFIDClient, createKVCacheAdapter, createMemoryCacheAdapter, createServerAuthClient, createTokenStore, createVerifyAccessToken, decodeConsentCookie, encodeConsentCookie, generateServerState, getFFIDConsentFromCookieHeader, getFFIDConsentFromCookies, hashCanonicalJson, sessionCookies, sha256Hex, validatePublishedCatalog };
4395
+ export { ALL_DENIED_EXCEPT_NECESSARY, CATALOG_HASH_PATTERN, CONSENT_COOKIE_NAME, COOKIE_VERSION, FFIDCatalogHashError, FFID_ALLOWED_ORGANIZATION_LOGO_MIME_TYPES, FFID_CATALOG_ENVIRONMENTS, FFID_CATALOG_PUBLICATION_STATUSES, FFID_COMPANY_SIZE_CODES, FFID_ERROR_CODES, FFID_INDUSTRY_CODES, FFID_MAX_ORGANIZATION_LOGO_FILE_SIZE_BYTES, FFID_MAX_ORGANIZATION_LOGO_FILE_SIZE_MB, FFID_ORGANIZATION_PROFILE_ERROR_CODES, FFID_SESSION_COOKIE_NAME, canonicalizeCatalogValue, computeFFIDCheckoutCopyHash, computeLegalDisclosureHash, computePaymentConfigurationHash, computePraxisCopyHash, computeScopeHash, computeTaxConfigurationHash, createFFIDClient, createKVCacheAdapter, createMemoryCacheAdapter, createServerAuthClient, createTokenStore, createVerifyAccessToken, decodeConsentCookie, encodeConsentCookie, generateServerState, getFFIDConsentFromCookieHeader, getFFIDConsentFromCookies, hashCanonicalJson, sessionCookies, sha256Hex, validatePublishedCatalog };
@@ -1,4 +1,4 @@
1
- import { q as FFIDClient, e as FFIDOAuthUserInfo } from '../../ffid-client-C8XV7lUt.cjs';
1
+ import { r as FFIDClient, e as FFIDOAuthUserInfo } from '../../ffid-client-BFgoVPOZ.cjs';
2
2
  import '../../types-Cjb9J0rL.cjs';
3
3
 
4
4
  /**
@@ -1,4 +1,4 @@
1
- import { q as FFIDClient, e as FFIDOAuthUserInfo } from '../../ffid-client-CpVixUM3.js';
1
+ import { r as FFIDClient, e as FFIDOAuthUserInfo } from '../../ffid-client-QNEFA3mv.js';
2
2
  import '../../types-Cjb9J0rL.js';
3
3
 
4
4
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@feelflow/ffid-sdk",
3
- "version": "7.0.0",
3
+ "version": "7.2.0",
4
4
  "description": "FeelFlow ID Platform SDK for React/Next.js applications",
5
5
  "keywords": [
6
6
  "feelflow",