@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.
@@ -223,13 +223,18 @@ function mapUserinfoSubscriptionToSession(userinfo, serviceCode) {
223
223
  ];
224
224
  }
225
225
  var JWKS_ENDPOINT = "/.well-known/jwks.json";
226
- var JWT_ISSUER = "https://id.feelflow.net";
226
+ var LEGACY_JWT_ISSUER = "https://id.feelflow.net";
227
227
  var JWT_ALGORITHM = "ES256";
228
228
  var JWT_CLOCK_TOLERANCE_SECONDS = 30;
229
+ function resolveAcceptedIssuers(baseUrl) {
230
+ const deployedOrigin = new URL(baseUrl).origin;
231
+ return deployedOrigin === LEGACY_JWT_ISSUER ? [LEGACY_JWT_ISSUER] : [deployedOrigin, LEGACY_JWT_ISSUER];
232
+ }
229
233
  function createJwtVerifier(deps) {
230
234
  const { baseUrl, serviceCode, logger, createError, errorCodes } = deps;
231
235
  const jwksUrl = new URL(JWKS_ENDPOINT, baseUrl);
232
236
  const jwks = jose.createRemoteJWKSet(jwksUrl);
237
+ const acceptedIssuers = resolveAcceptedIssuers(baseUrl);
233
238
  async function verifyJwt(accessToken) {
234
239
  if (!accessToken || !accessToken.trim()) {
235
240
  return {
@@ -242,7 +247,7 @@ function createJwtVerifier(deps) {
242
247
  try {
243
248
  const { payload } = await jose.jwtVerify(accessToken, jwks, {
244
249
  algorithms: [JWT_ALGORITHM],
245
- issuer: JWT_ISSUER,
250
+ issuer: acceptedIssuers,
246
251
  audience: serviceCode,
247
252
  clockTolerance: JWT_CLOCK_TOLERANCE_SECONDS
248
253
  });
@@ -1298,6 +1303,310 @@ function createMembersMethods(deps) {
1298
1303
  return { listMembers, addMember, updateMemberRole, removeMember };
1299
1304
  }
1300
1305
 
1306
+ // src/types/organization-profile.ts
1307
+ var FFID_INDUSTRY_CODES = [
1308
+ "agriculture",
1309
+ "construction",
1310
+ "manufacturing",
1311
+ "it-software",
1312
+ "telecom",
1313
+ "media",
1314
+ "retail",
1315
+ "wholesale",
1316
+ "finance-insurance",
1317
+ "real-estate",
1318
+ "transport-logistics",
1319
+ "hospitality-food",
1320
+ "healthcare",
1321
+ "education",
1322
+ "professional-services",
1323
+ "marketing-advertising",
1324
+ "energy-utilities",
1325
+ "public-sector",
1326
+ "nonprofit",
1327
+ "other"
1328
+ ];
1329
+ var FFID_COMPANY_SIZE_CODES = [
1330
+ "1-10",
1331
+ "11-50",
1332
+ "51-200",
1333
+ "201-500",
1334
+ "501-1000",
1335
+ "1001+"
1336
+ ];
1337
+ var BYTES_PER_KB = 1024;
1338
+ var KB_PER_MB = 1024;
1339
+ var FFID_MAX_ORGANIZATION_LOGO_FILE_SIZE_MB = 2;
1340
+ var FFID_MAX_ORGANIZATION_LOGO_FILE_SIZE_BYTES = FFID_MAX_ORGANIZATION_LOGO_FILE_SIZE_MB * KB_PER_MB * BYTES_PER_KB;
1341
+ var FFID_ALLOWED_ORGANIZATION_LOGO_MIME_TYPES = [
1342
+ "image/png",
1343
+ "image/jpeg",
1344
+ "image/webp"
1345
+ ];
1346
+ var FFID_ORGANIZATION_PROFILE_ERROR_CODES = {
1347
+ VALIDATION_ERROR: "VALIDATION_ERROR",
1348
+ ORGANIZATION_NOT_FOUND: "ORGANIZATION_NOT_FOUND",
1349
+ CONSENTED_BY_NOT_MEMBER: "CONSENTED_BY_NOT_MEMBER",
1350
+ MISSING_FILE: "MISSING_FILE",
1351
+ INVALID_FILE_TYPE: "INVALID_FILE_TYPE",
1352
+ FILE_TOO_LARGE: "FILE_TOO_LARGE",
1353
+ INVALID_IMAGE: "INVALID_IMAGE",
1354
+ LOGO_UPLOAD_FAILED: "LOGO_UPLOAD_FAILED"
1355
+ };
1356
+
1357
+ // src/client/version-check.ts
1358
+ var SDK_VERSION = "7.2.0";
1359
+ var SDK_USER_AGENT = `FFID-SDK/${SDK_VERSION} (TypeScript)`;
1360
+ var SDK_VERSION_HEADER = "X-FFID-SDK-Version";
1361
+ function sdkHeaders() {
1362
+ if (typeof window !== "undefined") return {};
1363
+ return {
1364
+ "User-Agent": SDK_USER_AGENT,
1365
+ [SDK_VERSION_HEADER]: SDK_VERSION
1366
+ };
1367
+ }
1368
+ var LATEST_VERSION_HEADER = "X-FFID-SDK-Latest-Version";
1369
+ var SEMVER_PATTERN = /^\d+(\.\d+)*$/;
1370
+ var _versionWarningShown = false;
1371
+ function compareSemver(a, b) {
1372
+ const cleanA = a.replace(/^v/, "");
1373
+ const cleanB = b.replace(/^v/, "");
1374
+ if (!SEMVER_PATTERN.test(cleanA) || !SEMVER_PATTERN.test(cleanB)) return 0;
1375
+ const partsA = cleanA.split(".").map(Number);
1376
+ const partsB = cleanB.split(".").map(Number);
1377
+ const maxLen = Math.max(partsA.length, partsB.length);
1378
+ for (let i = 0; i < maxLen; i++) {
1379
+ const numA = partsA[i] ?? 0;
1380
+ const numB = partsB[i] ?? 0;
1381
+ if (numA < numB) return -1;
1382
+ if (numA > numB) return 1;
1383
+ }
1384
+ return 0;
1385
+ }
1386
+ function checkVersionHeader(response, logger) {
1387
+ if (_versionWarningShown) return;
1388
+ if (typeof process !== "undefined" && process.env?.NODE_ENV === "production") return;
1389
+ if (!response.headers?.get) return;
1390
+ const latestVersion = response.headers.get(LATEST_VERSION_HEADER);
1391
+ if (!latestVersion) return;
1392
+ if (compareSemver(SDK_VERSION, latestVersion) < 0) {
1393
+ _versionWarningShown = true;
1394
+ logger.warn(
1395
+ `\u65B0\u3057\u3044\u30D0\u30FC\u30B8\u30E7\u30F3\u304C\u5229\u7528\u53EF\u80FD\u3067\u3059: v${latestVersion} (\u73FE\u5728: v${SDK_VERSION})
1396
+ npm install @feelflow/ffid-sdk@latest \u3067\u30A2\u30C3\u30D7\u30C7\u30FC\u30C8\u3067\u304D\u307E\u3059`
1397
+ );
1398
+ }
1399
+ }
1400
+
1401
+ // src/client/organization-profile-methods.ts
1402
+ var EXT_PROFILE_ENDPOINT = "/api/v1/organizations/ext/profile";
1403
+ var EXT_PROFILE_LOGO_ENDPOINT = "/api/v1/organizations/ext/profile/logo";
1404
+ var LOGO_WALL_ENDPOINT = "/api/v1/organizations/logo-wall";
1405
+ var DEFAULT_LOGO_UPLOAD_FILENAME = "logo";
1406
+ function isBlank(value) {
1407
+ return !value || !value.trim();
1408
+ }
1409
+ function resolveOrganizationId(organizationIdOrParams) {
1410
+ return typeof organizationIdOrParams === "string" ? organizationIdOrParams : organizationIdOrParams.organizationId;
1411
+ }
1412
+ function resolveUpsertParams(organizationIdOrParams, payload) {
1413
+ if (typeof organizationIdOrParams === "string") {
1414
+ return { ...payload, organizationId: organizationIdOrParams };
1415
+ }
1416
+ return organizationIdOrParams;
1417
+ }
1418
+ function resolveUploadParams(organizationIdOrParams, file) {
1419
+ if (typeof organizationIdOrParams === "string") {
1420
+ return { organizationId: organizationIdOrParams, file };
1421
+ }
1422
+ return organizationIdOrParams;
1423
+ }
1424
+ function buildUpsertBody(params) {
1425
+ const { organizationId, ...body } = params;
1426
+ return body;
1427
+ }
1428
+ function profileQuery(organizationId) {
1429
+ return new URLSearchParams({ organizationId }).toString();
1430
+ }
1431
+ function logoUploadFilename(file) {
1432
+ if (typeof File !== "undefined" && file instanceof File && file.name) {
1433
+ return file.name;
1434
+ }
1435
+ return DEFAULT_LOGO_UPLOAD_FILENAME;
1436
+ }
1437
+ function listingConsentValidationError(listingConsent, createError) {
1438
+ if (!listingConsent || listingConsent.consented !== true) return null;
1439
+ if (isBlank(listingConsent.consentVersion) || isBlank(listingConsent.consentedByUserId)) {
1440
+ return createError(
1441
+ FFID_ORGANIZATION_PROFILE_ERROR_CODES.VALIDATION_ERROR,
1442
+ "\u63B2\u8F09\u540C\u610F\u3092\u8A18\u9332\u3059\u308B\u5834\u5408\u306F consentVersion \u3068 consentedByUserId \u304C\u5FC5\u9808\u3067\u3059"
1443
+ );
1444
+ }
1445
+ return null;
1446
+ }
1447
+ function resolveLogoFile(file, createError) {
1448
+ if (!file) {
1449
+ return {
1450
+ ok: false,
1451
+ error: createError(
1452
+ FFID_ORGANIZATION_PROFILE_ERROR_CODES.MISSING_FILE,
1453
+ "file \u30D5\u30A3\u30FC\u30EB\u30C9\u306B\u30ED\u30B4\u753B\u50CF\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044"
1454
+ )
1455
+ };
1456
+ }
1457
+ if (file.size > FFID_MAX_ORGANIZATION_LOGO_FILE_SIZE_BYTES) {
1458
+ return {
1459
+ ok: false,
1460
+ error: createError(
1461
+ FFID_ORGANIZATION_PROFILE_ERROR_CODES.FILE_TOO_LARGE,
1462
+ `\u30ED\u30B4\u753B\u50CF\u306F${FFID_MAX_ORGANIZATION_LOGO_FILE_SIZE_MB}MB\u4EE5\u4E0B\u306B\u3057\u3066\u304F\u3060\u3055\u3044`
1463
+ )
1464
+ };
1465
+ }
1466
+ if (file.type !== "" && !FFID_ALLOWED_ORGANIZATION_LOGO_MIME_TYPES.includes(file.type)) {
1467
+ return {
1468
+ ok: false,
1469
+ error: createError(
1470
+ FFID_ORGANIZATION_PROFILE_ERROR_CODES.INVALID_FILE_TYPE,
1471
+ "\u30ED\u30B4\u753B\u50CF\u306F PNG / JPEG / WebP \u5F62\u5F0F\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044"
1472
+ )
1473
+ };
1474
+ }
1475
+ return { ok: true, file };
1476
+ }
1477
+ function createOrganizationProfileMethods(deps) {
1478
+ const { fetchWithAuth, createError, authMode, baseUrl, logger, errorCodes } = deps;
1479
+ function serviceKeyModeError() {
1480
+ if (authMode === "service-key") return null;
1481
+ return createError(
1482
+ FFID_ORGANIZATION_PROFILE_ERROR_CODES.VALIDATION_ERROR,
1483
+ "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"
1484
+ );
1485
+ }
1486
+ function requireOrganizationId(organizationId) {
1487
+ if (isBlank(organizationId)) {
1488
+ return createError(
1489
+ FFID_ORGANIZATION_PROFILE_ERROR_CODES.VALIDATION_ERROR,
1490
+ "organizationId \u306F\u5FC5\u9808\u3067\u3059"
1491
+ );
1492
+ }
1493
+ return null;
1494
+ }
1495
+ async function fetchPublic(endpoint, options = {}) {
1496
+ const url = `${baseUrl}${endpoint}`;
1497
+ logger.debug("Fetching (public):", url);
1498
+ let response;
1499
+ try {
1500
+ response = await fetch(url, {
1501
+ ...options,
1502
+ credentials: "omit",
1503
+ headers: {
1504
+ ...sdkHeaders(),
1505
+ ...options.headers
1506
+ }
1507
+ });
1508
+ } catch (error) {
1509
+ logger.error("Network error:", error);
1510
+ return {
1511
+ error: {
1512
+ code: errorCodes.NETWORK_ERROR,
1513
+ message: error instanceof Error ? error.message : "\u30CD\u30C3\u30C8\u30EF\u30FC\u30AF\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F"
1514
+ }
1515
+ };
1516
+ }
1517
+ let parsed;
1518
+ try {
1519
+ parsed = await response.json();
1520
+ } catch (parseError) {
1521
+ logger.error("Parse error:", parseError, "Status:", response.status);
1522
+ return {
1523
+ error: {
1524
+ code: errorCodes.PARSE_ERROR,
1525
+ 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})`
1526
+ }
1527
+ };
1528
+ }
1529
+ if (!parsed || typeof parsed !== "object") {
1530
+ return {
1531
+ error: {
1532
+ code: errorCodes.PARSE_ERROR,
1533
+ 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})`
1534
+ }
1535
+ };
1536
+ }
1537
+ const raw = parsed;
1538
+ logger.debug("Response (public):", response.status, raw);
1539
+ checkVersionHeader(response, logger);
1540
+ if (!response.ok) {
1541
+ return {
1542
+ error: raw.error ?? {
1543
+ code: errorCodes.UNKNOWN_ERROR,
1544
+ message: "\u4E0D\u660E\u306A\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F"
1545
+ }
1546
+ };
1547
+ }
1548
+ if (raw.data === void 0) {
1549
+ return {
1550
+ error: {
1551
+ code: errorCodes.UNKNOWN_ERROR,
1552
+ message: "\u30B5\u30FC\u30D0\u30FC\u304B\u3089\u30C7\u30FC\u30BF\u304C\u8FD4\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F"
1553
+ }
1554
+ };
1555
+ }
1556
+ return { data: raw.data };
1557
+ }
1558
+ async function getOrganizationProfile(organizationIdOrParams) {
1559
+ const modeError = serviceKeyModeError();
1560
+ if (modeError) return { error: modeError };
1561
+ const organizationId = resolveOrganizationId(organizationIdOrParams);
1562
+ const idError = requireOrganizationId(organizationId);
1563
+ if (idError) return { error: idError };
1564
+ return fetchWithAuth(
1565
+ `${EXT_PROFILE_ENDPOINT}?${profileQuery(organizationId)}`
1566
+ );
1567
+ }
1568
+ async function upsertOrganizationProfile(organizationIdOrParams, payload) {
1569
+ const modeError = serviceKeyModeError();
1570
+ if (modeError) return { error: modeError };
1571
+ const params = resolveUpsertParams(organizationIdOrParams, payload);
1572
+ const idError = requireOrganizationId(params.organizationId);
1573
+ if (idError) return { error: idError };
1574
+ const consentError = listingConsentValidationError(params.listingConsent, createError);
1575
+ if (consentError) return { error: consentError };
1576
+ return fetchWithAuth(
1577
+ `${EXT_PROFILE_ENDPOINT}?${profileQuery(params.organizationId)}`,
1578
+ {
1579
+ method: "PUT",
1580
+ body: JSON.stringify(buildUpsertBody(params))
1581
+ }
1582
+ );
1583
+ }
1584
+ async function uploadOrganizationLogo(organizationIdOrParams, file) {
1585
+ const modeError = serviceKeyModeError();
1586
+ if (modeError) return { error: modeError };
1587
+ const params = resolveUploadParams(organizationIdOrParams, file);
1588
+ const idError = requireOrganizationId(params.organizationId);
1589
+ if (idError) return { error: idError };
1590
+ const logoFile = resolveLogoFile(params.file, createError);
1591
+ if (!logoFile.ok) return { error: logoFile.error };
1592
+ const form = new FormData();
1593
+ form.append("file", logoFile.file, logoUploadFilename(logoFile.file));
1594
+ return fetchWithAuth(
1595
+ `${EXT_PROFILE_LOGO_ENDPOINT}?${profileQuery(params.organizationId)}`,
1596
+ { method: "POST", body: form }
1597
+ );
1598
+ }
1599
+ async function getPublicLogoWall() {
1600
+ return fetchPublic(LOGO_WALL_ENDPOINT);
1601
+ }
1602
+ return {
1603
+ getOrganizationProfile,
1604
+ upsertOrganizationProfile,
1605
+ uploadOrganizationLogo,
1606
+ getPublicLogoWall
1607
+ };
1608
+ }
1609
+
1301
1610
  // src/client/provisioning-methods.ts
1302
1611
  var USER_PROVISION_ENDPOINT = "/api/v1/ext/users/provision";
1303
1612
  var USER_WELCOME_EMAIL_ENDPOINT = "/api/v1/ext/users/welcome-email";
@@ -1441,7 +1750,7 @@ function createSeatMethods(deps) {
1441
1750
  }
1442
1751
 
1443
1752
  // src/client/profile-methods.ts
1444
- var EXT_PROFILE_ENDPOINT = "/api/v1/users/ext/me";
1753
+ var EXT_PROFILE_ENDPOINT2 = "/api/v1/users/ext/me";
1445
1754
  function resolveAuthOverride(options, createError) {
1446
1755
  if (!options || options.accessToken === void 0) {
1447
1756
  return {};
@@ -1462,7 +1771,7 @@ function createProfileMethods(deps) {
1462
1771
  async function getProfile(options) {
1463
1772
  const { override, error } = resolveAuthOverride(options, createError);
1464
1773
  if (error) return { error };
1465
- return fetchWithAuth(EXT_PROFILE_ENDPOINT, void 0, override);
1774
+ return fetchWithAuth(EXT_PROFILE_ENDPOINT2, void 0, override);
1466
1775
  }
1467
1776
  async function updateProfile(data, options) {
1468
1777
  if (data === null || typeof data !== "object" || Array.isArray(data)) {
@@ -1478,7 +1787,7 @@ function createProfileMethods(deps) {
1478
1787
  const { override, error } = resolveAuthOverride(options, createError);
1479
1788
  if (error) return { error };
1480
1789
  return fetchWithAuth(
1481
- EXT_PROFILE_ENDPOINT,
1790
+ EXT_PROFILE_ENDPOINT2,
1482
1791
  {
1483
1792
  method: "PUT",
1484
1793
  body: JSON.stringify(data)
@@ -1671,50 +1980,6 @@ function validateTokenResponse(tokenResponse) {
1671
1980
  };
1672
1981
  }
1673
1982
 
1674
- // src/client/version-check.ts
1675
- var SDK_VERSION = "7.0.0";
1676
- var SDK_USER_AGENT = `FFID-SDK/${SDK_VERSION} (TypeScript)`;
1677
- var SDK_VERSION_HEADER = "X-FFID-SDK-Version";
1678
- function sdkHeaders() {
1679
- if (typeof window !== "undefined") return {};
1680
- return {
1681
- "User-Agent": SDK_USER_AGENT,
1682
- [SDK_VERSION_HEADER]: SDK_VERSION
1683
- };
1684
- }
1685
- var LATEST_VERSION_HEADER = "X-FFID-SDK-Latest-Version";
1686
- var SEMVER_PATTERN = /^\d+(\.\d+)*$/;
1687
- var _versionWarningShown = false;
1688
- function compareSemver(a, b) {
1689
- const cleanA = a.replace(/^v/, "");
1690
- const cleanB = b.replace(/^v/, "");
1691
- if (!SEMVER_PATTERN.test(cleanA) || !SEMVER_PATTERN.test(cleanB)) return 0;
1692
- const partsA = cleanA.split(".").map(Number);
1693
- const partsB = cleanB.split(".").map(Number);
1694
- const maxLen = Math.max(partsA.length, partsB.length);
1695
- for (let i = 0; i < maxLen; i++) {
1696
- const numA = partsA[i] ?? 0;
1697
- const numB = partsB[i] ?? 0;
1698
- if (numA < numB) return -1;
1699
- if (numA > numB) return 1;
1700
- }
1701
- return 0;
1702
- }
1703
- function checkVersionHeader(response, logger) {
1704
- if (_versionWarningShown) return;
1705
- if (typeof process !== "undefined" && process.env?.NODE_ENV === "production") return;
1706
- if (!response.headers?.get) return;
1707
- const latestVersion = response.headers.get(LATEST_VERSION_HEADER);
1708
- if (!latestVersion) return;
1709
- if (compareSemver(SDK_VERSION, latestVersion) < 0) {
1710
- _versionWarningShown = true;
1711
- logger.warn(
1712
- `\u65B0\u3057\u3044\u30D0\u30FC\u30B8\u30E7\u30F3\u304C\u5229\u7528\u53EF\u80FD\u3067\u3059: v${latestVersion} (\u73FE\u5728: v${SDK_VERSION})
1713
- npm install @feelflow/ffid-sdk@latest \u3067\u30A2\u30C3\u30D7\u30C7\u30FC\u30C8\u3067\u304D\u307E\u3059`
1714
- );
1715
- }
1716
- }
1717
-
1718
1983
  // src/client/oauth-token.ts
1719
1984
  var OAUTH_TOKEN_ENDPOINT = "/api/v1/oauth/token";
1720
1985
  var OAUTH_REVOKE_ENDPOINT = "/api/v1/oauth/revoke";
@@ -2535,7 +2800,7 @@ function normalizeRedirectUri(input) {
2535
2800
 
2536
2801
  // src/client/password-reset.ts
2537
2802
  var RESET_PASSWORD_BASE = "/api/v1/auth/reset-password";
2538
- function isBlank(value) {
2803
+ function isBlank2(value) {
2539
2804
  return !value || !value.trim();
2540
2805
  }
2541
2806
  function createPasswordResetMethods(deps) {
@@ -2596,7 +2861,7 @@ function createPasswordResetMethods(deps) {
2596
2861
  return { data: raw.data };
2597
2862
  }
2598
2863
  async function requestPasswordReset(email) {
2599
- if (isBlank(email)) {
2864
+ if (isBlank2(email)) {
2600
2865
  return {
2601
2866
  error: createError("VALIDATION_ERROR", "\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u306F\u5FC5\u9808\u3067\u3059")
2602
2867
  };
@@ -2610,7 +2875,7 @@ function createPasswordResetMethods(deps) {
2610
2875
  );
2611
2876
  }
2612
2877
  async function verifyPasswordResetToken(accessToken) {
2613
- if (isBlank(accessToken)) {
2878
+ if (isBlank2(accessToken)) {
2614
2879
  return {
2615
2880
  error: createError("VALIDATION_ERROR", "\u30A2\u30AF\u30BB\u30B9\u30C8\u30FC\u30AF\u30F3\u306F\u5FC5\u9808\u3067\u3059")
2616
2881
  };
@@ -2624,12 +2889,12 @@ function createPasswordResetMethods(deps) {
2624
2889
  );
2625
2890
  }
2626
2891
  async function establishResetSession(accessToken, refreshToken) {
2627
- if (isBlank(accessToken)) {
2892
+ if (isBlank2(accessToken)) {
2628
2893
  return {
2629
2894
  error: createError("VALIDATION_ERROR", "\u30A2\u30AF\u30BB\u30B9\u30C8\u30FC\u30AF\u30F3\u306F\u5FC5\u9808\u3067\u3059")
2630
2895
  };
2631
2896
  }
2632
- if (isBlank(refreshToken)) {
2897
+ if (isBlank2(refreshToken)) {
2633
2898
  return {
2634
2899
  error: createError("VALIDATION_ERROR", "\u30EA\u30D5\u30EC\u30C3\u30B7\u30E5\u30C8\u30FC\u30AF\u30F3\u306F\u5FC5\u9808\u3067\u3059")
2635
2900
  };
@@ -2643,7 +2908,7 @@ function createPasswordResetMethods(deps) {
2643
2908
  );
2644
2909
  }
2645
2910
  async function confirmPasswordReset(password) {
2646
- if (isBlank(password)) {
2911
+ if (isBlank2(password)) {
2647
2912
  return {
2648
2913
  error: createError("VALIDATION_ERROR", "\u30D1\u30B9\u30EF\u30FC\u30C9\u306F\u5FC5\u9808\u3067\u3059")
2649
2914
  };
@@ -2666,7 +2931,7 @@ function createPasswordResetMethods(deps) {
2666
2931
 
2667
2932
  // src/client/otp.ts
2668
2933
  var OTP_BASE = "/api/v1/auth/otp";
2669
- function isBlank2(value) {
2934
+ function isBlank3(value) {
2670
2935
  return !value || !value.trim();
2671
2936
  }
2672
2937
  function createOtpMethods(deps) {
@@ -2727,7 +2992,7 @@ function createOtpMethods(deps) {
2727
2992
  return { data: raw.data };
2728
2993
  }
2729
2994
  async function sendOtp(email, options) {
2730
- if (isBlank2(email)) {
2995
+ if (isBlank3(email)) {
2731
2996
  return {
2732
2997
  error: createError("VALIDATION_ERROR", "\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u306F\u5FC5\u9808\u3067\u3059")
2733
2998
  };
@@ -2744,12 +3009,12 @@ function createOtpMethods(deps) {
2744
3009
  );
2745
3010
  }
2746
3011
  async function verifyOtp(params) {
2747
- if (isBlank2(params.accessToken)) {
3012
+ if (isBlank3(params.accessToken)) {
2748
3013
  return {
2749
3014
  error: createError("VALIDATION_ERROR", "\u30A2\u30AF\u30BB\u30B9\u30C8\u30FC\u30AF\u30F3\u306F\u5FC5\u9808\u3067\u3059")
2750
3015
  };
2751
3016
  }
2752
- if (isBlank2(params.refreshToken)) {
3017
+ if (isBlank3(params.refreshToken)) {
2753
3018
  return {
2754
3019
  error: createError("VALIDATION_ERROR", "\u30EA\u30D5\u30EC\u30C3\u30B7\u30E5\u30C8\u30FC\u30AF\u30F3\u306F\u5FC5\u9808\u3067\u3059")
2755
3020
  };
@@ -3240,6 +3505,12 @@ function resolveRedirectUri(raw, logger) {
3240
3505
  return raw;
3241
3506
  }
3242
3507
  }
3508
+ function jsonContentTypeHeader(body) {
3509
+ if (typeof FormData !== "undefined" && body instanceof FormData) {
3510
+ return {};
3511
+ }
3512
+ return { "Content-Type": "application/json" };
3513
+ }
3243
3514
  function createFFIDClient(config) {
3244
3515
  if (!config.serviceCode || !config.serviceCode.trim()) {
3245
3516
  throw new Error("FFID Client: serviceCode \u304C\u672A\u8A2D\u5B9A\u3067\u3059");
@@ -3292,7 +3563,7 @@ function createFFIDClient(config) {
3292
3563
  ...options,
3293
3564
  credentials: "omit",
3294
3565
  headers: {
3295
- "Content-Type": "application/json",
3566
+ ...jsonContentTypeHeader(options.body),
3296
3567
  ...sdkHeaders(),
3297
3568
  ...options.headers,
3298
3569
  Authorization: `Bearer ${authOverride.accessToken}`
@@ -3304,7 +3575,7 @@ function createFFIDClient(config) {
3304
3575
  ...options,
3305
3576
  credentials: "omit",
3306
3577
  headers: {
3307
- "Content-Type": "application/json",
3578
+ ...jsonContentTypeHeader(options.body),
3308
3579
  ...sdkHeaders(),
3309
3580
  "X-Service-Api-Key": serviceApiKey,
3310
3581
  ...options.headers
@@ -3314,7 +3585,7 @@ function createFFIDClient(config) {
3314
3585
  if (authMode === "token") {
3315
3586
  const tokens = tokenStore.getTokens();
3316
3587
  const headers = {
3317
- "Content-Type": "application/json",
3588
+ ...jsonContentTypeHeader(options.body),
3318
3589
  ...sdkHeaders(),
3319
3590
  ...options.headers
3320
3591
  };
@@ -3331,7 +3602,7 @@ function createFFIDClient(config) {
3331
3602
  ...options,
3332
3603
  credentials: "include",
3333
3604
  headers: {
3334
- "Content-Type": "application/json",
3605
+ ...jsonContentTypeHeader(options.body),
3335
3606
  ...sdkHeaders(),
3336
3607
  ...options.headers
3337
3608
  }
@@ -3548,6 +3819,19 @@ function createFFIDClient(config) {
3548
3819
  createError,
3549
3820
  serviceCode: config.serviceCode
3550
3821
  });
3822
+ const {
3823
+ getOrganizationProfile,
3824
+ upsertOrganizationProfile,
3825
+ uploadOrganizationLogo,
3826
+ getPublicLogoWall
3827
+ } = createOrganizationProfileMethods({
3828
+ fetchWithAuth,
3829
+ createError,
3830
+ authMode,
3831
+ baseUrl,
3832
+ logger,
3833
+ errorCodes: FFID_ERROR_CODES
3834
+ });
3551
3835
  const { provisionUser, sendProvisionWelcomeEmail, provisionOrganization } = createProvisioningMethods({
3552
3836
  fetchWithAuth,
3553
3837
  createError,
@@ -3648,6 +3932,10 @@ function createFFIDClient(config) {
3648
3932
  addMember,
3649
3933
  updateMemberRole,
3650
3934
  removeMember,
3935
+ getOrganizationProfile,
3936
+ upsertOrganizationProfile,
3937
+ uploadOrganizationLogo,
3938
+ getPublicLogoWall,
3651
3939
  provisionUser,
3652
3940
  sendProvisionWelcomeEmail,
3653
3941
  provisionOrganization,
@@ -4118,9 +4406,15 @@ exports.CATALOG_HASH_PATTERN = CATALOG_HASH_PATTERN;
4118
4406
  exports.CONSENT_COOKIE_NAME = CONSENT_COOKIE_NAME;
4119
4407
  exports.COOKIE_VERSION = COOKIE_VERSION;
4120
4408
  exports.FFIDCatalogHashError = FFIDCatalogHashError;
4409
+ exports.FFID_ALLOWED_ORGANIZATION_LOGO_MIME_TYPES = FFID_ALLOWED_ORGANIZATION_LOGO_MIME_TYPES;
4121
4410
  exports.FFID_CATALOG_ENVIRONMENTS = FFID_CATALOG_ENVIRONMENTS;
4122
4411
  exports.FFID_CATALOG_PUBLICATION_STATUSES = FFID_CATALOG_PUBLICATION_STATUSES;
4412
+ exports.FFID_COMPANY_SIZE_CODES = FFID_COMPANY_SIZE_CODES;
4123
4413
  exports.FFID_ERROR_CODES = FFID_ERROR_CODES;
4414
+ exports.FFID_INDUSTRY_CODES = FFID_INDUSTRY_CODES;
4415
+ exports.FFID_MAX_ORGANIZATION_LOGO_FILE_SIZE_BYTES = FFID_MAX_ORGANIZATION_LOGO_FILE_SIZE_BYTES;
4416
+ exports.FFID_MAX_ORGANIZATION_LOGO_FILE_SIZE_MB = FFID_MAX_ORGANIZATION_LOGO_FILE_SIZE_MB;
4417
+ exports.FFID_ORGANIZATION_PROFILE_ERROR_CODES = FFID_ORGANIZATION_PROFILE_ERROR_CODES;
4124
4418
  exports.FFID_SESSION_COOKIE_NAME = FFID_SESSION_COOKIE_NAME;
4125
4419
  exports.canonicalizeCatalogValue = canonicalizeCatalogValue;
4126
4420
  exports.computeFFIDCheckoutCopyHash = computeFFIDCheckoutCopyHash;
@@ -1,5 +1,5 @@
1
- import { F as FFIDLogger, a as FFIDError, b as FFIDCacheAdapter, c as FFIDVerifyAccessTokenOptions, d as FFIDApiResponse, e as FFIDOAuthUserInfo, f as FFIDCatalogEnvironment, g as FFIDBillingInterval, h as FFIDTaxBehavior, i as FFIDPublishedCatalog } from '../ffid-client-C8XV7lUt.cjs';
2
- export { j as FFIDAddMemberParams, k as FFIDAddMemberRequest, l as FFIDAddMemberResponse, m as FFIDAssignableMemberRole, n as FFIDCacheConfig, o as FFIDCatalogPublication, p as FFIDCatalogPublicationStatus, q as FFIDClient, r as FFIDConfig, s as FFIDListMembersResponse, t as FFIDMemberRole, u as FFIDOrganization, v as FFIDOrganizationMember, w as FFIDOtpSendResponse, x as FFIDOtpVerifyResponse, y as FFIDPasswordResetConfirmResponse, z as FFIDPasswordResetResponse, A as FFIDPasswordResetVerifyResponse, B as FFIDProfileCallOptions, C as FFIDProvisionMemberPlan, D as FFIDProvisionMemberPlanStatus, E as FFIDProvisionMemberResult, G as FFIDProvisionMemberStatus, H as FFIDProvisionOrganizationDryRun, I as FFIDProvisionOrganizationMemberInput, J as FFIDProvisionOrganizationOutcome, K as FFIDProvisionOrganizationParams, L as FFIDProvisionOrganizationResponse, M as FFIDProvisionUserDryRun, N as FFIDProvisionUserOutcome, O as FFIDProvisionUserParams, P as FFIDProvisionUserProfileInput, Q as FFIDProvisionUserResponse, R as FFIDProvisionedOrganization, S as FFIDProvisionedUser, T as FFIDPublishedPlan, U as FFIDRemoveMemberResponse, V as FFIDResetSessionResponse, W as FFIDSubscription, X as FFIDUpdateMemberRoleResponse, Y as FFIDUpdateUserProfileRequest, Z as FFIDUser, _ as FFIDUserProfile, $ as FFID_CATALOG_ENVIRONMENTS, a0 as FFID_CATALOG_PUBLICATION_STATUSES, a1 as TokenData, a2 as TokenStore, a3 as createFFIDClient, a4 as createTokenStore } from '../ffid-client-C8XV7lUt.cjs';
1
+ import { F as FFIDLogger, a as FFIDError, b as FFIDCacheAdapter, c as FFIDVerifyAccessTokenOptions, d as FFIDApiResponse, e as FFIDOAuthUserInfo, f as FFIDCatalogEnvironment, g as FFIDBillingInterval, h as FFIDTaxBehavior, i as FFIDPublishedCatalog } from '../ffid-client-BFgoVPOZ.cjs';
2
+ export { j as FFIDAddMemberParams, k as FFIDAddMemberRequest, l as FFIDAddMemberResponse, m as FFIDAllowedLogoMimeType, n as FFIDAssignableMemberRole, o as FFIDCacheConfig, p as FFIDCatalogPublication, q as FFIDCatalogPublicationStatus, r as FFIDClient, s as FFIDCompanySizeCode, t as FFIDConfig, u as FFIDIndustryCode, v as FFIDListMembersResponse, w as FFIDListingConsentInput, x as FFIDLogoWallEntry, y as FFIDLogoWallResponse, z as FFIDMemberRole, A as FFIDOrganization, B as FFIDOrganizationLogoUploadResponse, C as FFIDOrganizationMember, D as FFIDOrganizationProfile, E as FFIDOrganizationProfileErrorCode, G as FFIDOrganizationProfileResponse, H as FFIDOtpSendResponse, I as FFIDOtpVerifyResponse, J as FFIDPasswordResetConfirmResponse, K as FFIDPasswordResetResponse, L as FFIDPasswordResetVerifyResponse, M as FFIDProfileCallOptions, N as FFIDProvisionMemberPlan, O as FFIDProvisionMemberPlanStatus, P as FFIDProvisionMemberResult, Q as FFIDProvisionMemberStatus, R as FFIDProvisionOrganizationDryRun, S as FFIDProvisionOrganizationMemberInput, T as FFIDProvisionOrganizationOutcome, U as FFIDProvisionOrganizationParams, V as FFIDProvisionOrganizationResponse, W as FFIDProvisionUserDryRun, X as FFIDProvisionUserOutcome, Y as FFIDProvisionUserParams, Z as FFIDProvisionUserProfileInput, _ as FFIDProvisionUserResponse, $ as FFIDProvisionedOrganization, a0 as FFIDProvisionedUser, a1 as FFIDPublishedPlan, a2 as FFIDRemoveMemberResponse, a3 as FFIDResetSessionResponse, a4 as FFIDSubscription, a5 as FFIDUpdateMemberRoleResponse, a6 as FFIDUpdateUserProfileRequest, a7 as FFIDUploadOrganizationLogoParams, a8 as FFIDUpsertOrganizationProfileParams, a9 as FFIDUpsertOrganizationProfileRequest, aa as FFIDUser, ab as FFIDUserProfile, ac as FFID_ALLOWED_ORGANIZATION_LOGO_MIME_TYPES, ad as FFID_CATALOG_ENVIRONMENTS, ae as FFID_CATALOG_PUBLICATION_STATUSES, af as FFID_COMPANY_SIZE_CODES, ag as FFID_INDUSTRY_CODES, ah as FFID_MAX_ORGANIZATION_LOGO_FILE_SIZE_BYTES, ai as FFID_MAX_ORGANIZATION_LOGO_FILE_SIZE_MB, aj as FFID_ORGANIZATION_PROFILE_ERROR_CODES, ak as TokenData, al as TokenStore, am as createFFIDClient, an as createTokenStore } from '../ffid-client-BFgoVPOZ.cjs';
3
3
  export { D as DEFAULT_API_BASE_URL, a as DEFAULT_OAUTH_SCOPES } from '../constants-Ce2eXQtB.cjs';
4
4
  import { z } from 'zod';
5
5
  import '../types-Cjb9J0rL.cjs';
@@ -1,5 +1,5 @@
1
- import { F as FFIDLogger, a as FFIDError, b as FFIDCacheAdapter, c as FFIDVerifyAccessTokenOptions, d as FFIDApiResponse, e as FFIDOAuthUserInfo, f as FFIDCatalogEnvironment, g as FFIDBillingInterval, h as FFIDTaxBehavior, i as FFIDPublishedCatalog } from '../ffid-client-CpVixUM3.js';
2
- export { j as FFIDAddMemberParams, k as FFIDAddMemberRequest, l as FFIDAddMemberResponse, m as FFIDAssignableMemberRole, n as FFIDCacheConfig, o as FFIDCatalogPublication, p as FFIDCatalogPublicationStatus, q as FFIDClient, r as FFIDConfig, s as FFIDListMembersResponse, t as FFIDMemberRole, u as FFIDOrganization, v as FFIDOrganizationMember, w as FFIDOtpSendResponse, x as FFIDOtpVerifyResponse, y as FFIDPasswordResetConfirmResponse, z as FFIDPasswordResetResponse, A as FFIDPasswordResetVerifyResponse, B as FFIDProfileCallOptions, C as FFIDProvisionMemberPlan, D as FFIDProvisionMemberPlanStatus, E as FFIDProvisionMemberResult, G as FFIDProvisionMemberStatus, H as FFIDProvisionOrganizationDryRun, I as FFIDProvisionOrganizationMemberInput, J as FFIDProvisionOrganizationOutcome, K as FFIDProvisionOrganizationParams, L as FFIDProvisionOrganizationResponse, M as FFIDProvisionUserDryRun, N as FFIDProvisionUserOutcome, O as FFIDProvisionUserParams, P as FFIDProvisionUserProfileInput, Q as FFIDProvisionUserResponse, R as FFIDProvisionedOrganization, S as FFIDProvisionedUser, T as FFIDPublishedPlan, U as FFIDRemoveMemberResponse, V as FFIDResetSessionResponse, W as FFIDSubscription, X as FFIDUpdateMemberRoleResponse, Y as FFIDUpdateUserProfileRequest, Z as FFIDUser, _ as FFIDUserProfile, $ as FFID_CATALOG_ENVIRONMENTS, a0 as FFID_CATALOG_PUBLICATION_STATUSES, a1 as TokenData, a2 as TokenStore, a3 as createFFIDClient, a4 as createTokenStore } from '../ffid-client-CpVixUM3.js';
1
+ import { F as FFIDLogger, a as FFIDError, b as FFIDCacheAdapter, c as FFIDVerifyAccessTokenOptions, d as FFIDApiResponse, e as FFIDOAuthUserInfo, f as FFIDCatalogEnvironment, g as FFIDBillingInterval, h as FFIDTaxBehavior, i as FFIDPublishedCatalog } from '../ffid-client-QNEFA3mv.js';
2
+ export { j as FFIDAddMemberParams, k as FFIDAddMemberRequest, l as FFIDAddMemberResponse, m as FFIDAllowedLogoMimeType, n as FFIDAssignableMemberRole, o as FFIDCacheConfig, p as FFIDCatalogPublication, q as FFIDCatalogPublicationStatus, r as FFIDClient, s as FFIDCompanySizeCode, t as FFIDConfig, u as FFIDIndustryCode, v as FFIDListMembersResponse, w as FFIDListingConsentInput, x as FFIDLogoWallEntry, y as FFIDLogoWallResponse, z as FFIDMemberRole, A as FFIDOrganization, B as FFIDOrganizationLogoUploadResponse, C as FFIDOrganizationMember, D as FFIDOrganizationProfile, E as FFIDOrganizationProfileErrorCode, G as FFIDOrganizationProfileResponse, H as FFIDOtpSendResponse, I as FFIDOtpVerifyResponse, J as FFIDPasswordResetConfirmResponse, K as FFIDPasswordResetResponse, L as FFIDPasswordResetVerifyResponse, M as FFIDProfileCallOptions, N as FFIDProvisionMemberPlan, O as FFIDProvisionMemberPlanStatus, P as FFIDProvisionMemberResult, Q as FFIDProvisionMemberStatus, R as FFIDProvisionOrganizationDryRun, S as FFIDProvisionOrganizationMemberInput, T as FFIDProvisionOrganizationOutcome, U as FFIDProvisionOrganizationParams, V as FFIDProvisionOrganizationResponse, W as FFIDProvisionUserDryRun, X as FFIDProvisionUserOutcome, Y as FFIDProvisionUserParams, Z as FFIDProvisionUserProfileInput, _ as FFIDProvisionUserResponse, $ as FFIDProvisionedOrganization, a0 as FFIDProvisionedUser, a1 as FFIDPublishedPlan, a2 as FFIDRemoveMemberResponse, a3 as FFIDResetSessionResponse, a4 as FFIDSubscription, a5 as FFIDUpdateMemberRoleResponse, a6 as FFIDUpdateUserProfileRequest, a7 as FFIDUploadOrganizationLogoParams, a8 as FFIDUpsertOrganizationProfileParams, a9 as FFIDUpsertOrganizationProfileRequest, aa as FFIDUser, ab as FFIDUserProfile, ac as FFID_ALLOWED_ORGANIZATION_LOGO_MIME_TYPES, ad as FFID_CATALOG_ENVIRONMENTS, ae as FFID_CATALOG_PUBLICATION_STATUSES, af as FFID_COMPANY_SIZE_CODES, ag as FFID_INDUSTRY_CODES, ah as FFID_MAX_ORGANIZATION_LOGO_FILE_SIZE_BYTES, ai as FFID_MAX_ORGANIZATION_LOGO_FILE_SIZE_MB, aj as FFID_ORGANIZATION_PROFILE_ERROR_CODES, ak as TokenData, al as TokenStore, am as createFFIDClient, an as createTokenStore } from '../ffid-client-QNEFA3mv.js';
3
3
  export { D as DEFAULT_API_BASE_URL, a as DEFAULT_OAUTH_SCOPES } from '../constants-Ce2eXQtB.js';
4
4
  import { z } from 'zod';
5
5
  import '../types-Cjb9J0rL.js';