@feelflow/ffid-sdk 6.0.0 → 7.1.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.
@@ -1079,11 +1079,6 @@ var FALLBACK_VALUE = {
1079
1079
  syncWithUser: defaultAction
1080
1080
  };
1081
1081
  var FFIDConsentContext = react.createContext(FALLBACK_VALUE);
1082
- var DEFAULT_MERGE_WARNING_MESSAGES = {
1083
- local_state_overridden: "\u5225\u306E\u7AEF\u672B\u3067\u4FDD\u5B58\u3055\u308C\u305F Cookie \u540C\u610F\u8A2D\u5B9A\u3067\u66F4\u65B0\u3055\u308C\u307E\u3057\u305F",
1084
- shared_device_detected: "\u3053\u306E\u7AEF\u672B\u306F\u5225\u306E\u30A2\u30AB\u30A6\u30F3\u30C8\u3067\u3082\u4F7F\u7528\u3055\u308C\u3066\u3044\u307E\u3059\u3002Cookie \u8A2D\u5B9A\u306F\u30A2\u30AB\u30A6\u30F3\u30C8\u3054\u3068\u306B\u4FDD\u5B58\u3055\u308C\u3066\u3044\u307E\u3059",
1085
- drift_detected: "\u4FDD\u5B58\u3055\u308C\u3066\u3044\u305F\u8A2D\u5B9A\u3068\u7570\u306A\u308B\u9805\u76EE\u304C\u3042\u3063\u305F\u305F\u3081\u3001\u65B0\u3057\u304F\u8A18\u9332\u3055\u308C\u307E\u3057\u305F"
1086
- };
1087
1082
  var DEFAULT_DISMISSAL_COOLDOWN_MINUTES = 30;
1088
1083
  var MS_PER_MINUTE = 6e4;
1089
1084
  function applyChanges(base, changes) {
@@ -1106,18 +1101,10 @@ function FFIDAnalyticsProvider({
1106
1101
  onError,
1107
1102
  autoShowBanner = true,
1108
1103
  dismissalCooldownMinutes = DEFAULT_DISMISSAL_COOLDOWN_MINUTES,
1109
- mergeWarningMessages,
1110
1104
  fetchImpl,
1111
1105
  children
1112
1106
  }) {
1113
1107
  const cooldownMs = Number.isFinite(dismissalCooldownMinutes) && dismissalCooldownMinutes > 0 ? dismissalCooldownMinutes * MS_PER_MINUTE : 0;
1114
- const resolvedMergeWarningMessages = react.useMemo(
1115
- () => ({
1116
- ...DEFAULT_MERGE_WARNING_MESSAGES,
1117
- ...mergeWarningMessages
1118
- }),
1119
- [mergeWarningMessages]
1120
- );
1121
1108
  const isWithinDismissalCooldown = react.useCallback(() => {
1122
1109
  if (cooldownMs <= 0) return false;
1123
1110
  const dismissedAt = readConsentDismissalTimestamp();
@@ -1387,19 +1374,7 @@ function FFIDAnalyticsProvider({
1387
1374
  setState(result.value.state);
1388
1375
  applyCategoriesSideEffects(result.value.state.categories);
1389
1376
  persistCategories(result.value.state.categories);
1390
- const warning = result.value.warning ? {
1391
- code: result.value.warning,
1392
- // Belt-and-suspenders fallback per spec §5.3: an empty-string
1393
- // override (`mergeWarningMessages={{ code: '' }}`) or a future
1394
- // wire-schema widening that adds a new `FFIDConsentMergeWarning`
1395
- // literal without a default copy would otherwise leak `''` /
1396
- // `undefined` into `warning.message`, silently breaking consumers
1397
- // that render it (`<Toast>{warning.message}</Toast>`,
1398
- // `Sentry.setContext`). Truthy-fallback preserves visibility of
1399
- // the JP default; consumers wanting to suppress display should
1400
- // pattern-match on `code` instead of mutating `message`.
1401
- message: resolvedMergeWarningMessages[result.value.warning] || DEFAULT_MERGE_WARNING_MESSAGES[result.value.warning]
1402
- } : null;
1377
+ const warning = result.value.warning ? { code: result.value.warning } : null;
1403
1378
  onConsentChange?.(result.value.state, warning);
1404
1379
  return result;
1405
1380
  }, [
@@ -1407,8 +1382,7 @@ function FFIDAnalyticsProvider({
1407
1382
  ensurePolicyVersion,
1408
1383
  onConsentChange,
1409
1384
  onError,
1410
- persistCategories,
1411
- resolvedMergeWarningMessages
1385
+ persistCategories
1412
1386
  ]);
1413
1387
  const openBanner = react.useCallback(() => setIsBannerOpen(true), []);
1414
1388
  const closeBanner = react.useCallback(() => {
@@ -2012,7 +1986,6 @@ exports.CONSENT_DISMISSAL_TIMESTAMP_KEY = CONSENT_DISMISSAL_TIMESTAMP_KEY;
2012
1986
  exports.CONSENT_SESSION_STORAGE_KEY = CONSENT_SESSION_STORAGE_KEY;
2013
1987
  exports.COOKIE_VERSION = COOKIE_VERSION;
2014
1988
  exports.DEFAULT_CONSENT_ERROR_MESSAGES = DEFAULT_CONSENT_ERROR_MESSAGES;
2015
- exports.DEFAULT_MERGE_WARNING_MESSAGES = DEFAULT_MERGE_WARNING_MESSAGES;
2016
1989
  exports.DEVICE_ID_LOCAL_STORAGE_KEY = DEVICE_ID_LOCAL_STORAGE_KEY;
2017
1990
  exports.DEVICE_ID_SESSION_STORAGE_KEY = DEVICE_ID_SESSION_STORAGE_KEY;
2018
1991
  exports.DeviceIdSchema = DeviceIdSchema;
@@ -1301,6 +1301,310 @@ function createMembersMethods(deps) {
1301
1301
  return { listMembers, addMember, updateMemberRole, removeMember };
1302
1302
  }
1303
1303
 
1304
+ // src/types/organization-profile.ts
1305
+ var FFID_INDUSTRY_CODES = [
1306
+ "agriculture",
1307
+ "construction",
1308
+ "manufacturing",
1309
+ "it-software",
1310
+ "telecom",
1311
+ "media",
1312
+ "retail",
1313
+ "wholesale",
1314
+ "finance-insurance",
1315
+ "real-estate",
1316
+ "transport-logistics",
1317
+ "hospitality-food",
1318
+ "healthcare",
1319
+ "education",
1320
+ "professional-services",
1321
+ "marketing-advertising",
1322
+ "energy-utilities",
1323
+ "public-sector",
1324
+ "nonprofit",
1325
+ "other"
1326
+ ];
1327
+ var FFID_COMPANY_SIZE_CODES = [
1328
+ "1-10",
1329
+ "11-50",
1330
+ "51-200",
1331
+ "201-500",
1332
+ "501-1000",
1333
+ "1001+"
1334
+ ];
1335
+ var BYTES_PER_KB = 1024;
1336
+ var KB_PER_MB = 1024;
1337
+ var FFID_MAX_ORGANIZATION_LOGO_FILE_SIZE_MB = 2;
1338
+ var FFID_MAX_ORGANIZATION_LOGO_FILE_SIZE_BYTES = FFID_MAX_ORGANIZATION_LOGO_FILE_SIZE_MB * KB_PER_MB * BYTES_PER_KB;
1339
+ var FFID_ALLOWED_ORGANIZATION_LOGO_MIME_TYPES = [
1340
+ "image/png",
1341
+ "image/jpeg",
1342
+ "image/webp"
1343
+ ];
1344
+ var FFID_ORGANIZATION_PROFILE_ERROR_CODES = {
1345
+ VALIDATION_ERROR: "VALIDATION_ERROR",
1346
+ ORGANIZATION_NOT_FOUND: "ORGANIZATION_NOT_FOUND",
1347
+ CONSENTED_BY_NOT_MEMBER: "CONSENTED_BY_NOT_MEMBER",
1348
+ MISSING_FILE: "MISSING_FILE",
1349
+ INVALID_FILE_TYPE: "INVALID_FILE_TYPE",
1350
+ FILE_TOO_LARGE: "FILE_TOO_LARGE",
1351
+ INVALID_IMAGE: "INVALID_IMAGE",
1352
+ LOGO_UPLOAD_FAILED: "LOGO_UPLOAD_FAILED"
1353
+ };
1354
+
1355
+ // src/client/version-check.ts
1356
+ var SDK_VERSION = "7.1.0";
1357
+ var SDK_USER_AGENT = `FFID-SDK/${SDK_VERSION} (TypeScript)`;
1358
+ var SDK_VERSION_HEADER = "X-FFID-SDK-Version";
1359
+ function sdkHeaders() {
1360
+ if (typeof window !== "undefined") return {};
1361
+ return {
1362
+ "User-Agent": SDK_USER_AGENT,
1363
+ [SDK_VERSION_HEADER]: SDK_VERSION
1364
+ };
1365
+ }
1366
+ var LATEST_VERSION_HEADER = "X-FFID-SDK-Latest-Version";
1367
+ var SEMVER_PATTERN = /^\d+(\.\d+)*$/;
1368
+ var _versionWarningShown = false;
1369
+ function compareSemver(a, b) {
1370
+ const cleanA = a.replace(/^v/, "");
1371
+ const cleanB = b.replace(/^v/, "");
1372
+ if (!SEMVER_PATTERN.test(cleanA) || !SEMVER_PATTERN.test(cleanB)) return 0;
1373
+ const partsA = cleanA.split(".").map(Number);
1374
+ const partsB = cleanB.split(".").map(Number);
1375
+ const maxLen = Math.max(partsA.length, partsB.length);
1376
+ for (let i = 0; i < maxLen; i++) {
1377
+ const numA = partsA[i] ?? 0;
1378
+ const numB = partsB[i] ?? 0;
1379
+ if (numA < numB) return -1;
1380
+ if (numA > numB) return 1;
1381
+ }
1382
+ return 0;
1383
+ }
1384
+ function checkVersionHeader(response, logger) {
1385
+ if (_versionWarningShown) return;
1386
+ if (typeof process !== "undefined" && process.env?.NODE_ENV === "production") return;
1387
+ if (!response.headers?.get) return;
1388
+ const latestVersion = response.headers.get(LATEST_VERSION_HEADER);
1389
+ if (!latestVersion) return;
1390
+ if (compareSemver(SDK_VERSION, latestVersion) < 0) {
1391
+ _versionWarningShown = true;
1392
+ logger.warn(
1393
+ `\u65B0\u3057\u3044\u30D0\u30FC\u30B8\u30E7\u30F3\u304C\u5229\u7528\u53EF\u80FD\u3067\u3059: v${latestVersion} (\u73FE\u5728: v${SDK_VERSION})
1394
+ npm install @feelflow/ffid-sdk@latest \u3067\u30A2\u30C3\u30D7\u30C7\u30FC\u30C8\u3067\u304D\u307E\u3059`
1395
+ );
1396
+ }
1397
+ }
1398
+
1399
+ // src/client/organization-profile-methods.ts
1400
+ var EXT_PROFILE_ENDPOINT = "/api/v1/organizations/ext/profile";
1401
+ var EXT_PROFILE_LOGO_ENDPOINT = "/api/v1/organizations/ext/profile/logo";
1402
+ var LOGO_WALL_ENDPOINT = "/api/v1/organizations/logo-wall";
1403
+ var DEFAULT_LOGO_UPLOAD_FILENAME = "logo";
1404
+ function isBlank(value) {
1405
+ return !value || !value.trim();
1406
+ }
1407
+ function resolveOrganizationId(organizationIdOrParams) {
1408
+ return typeof organizationIdOrParams === "string" ? organizationIdOrParams : organizationIdOrParams.organizationId;
1409
+ }
1410
+ function resolveUpsertParams(organizationIdOrParams, payload) {
1411
+ if (typeof organizationIdOrParams === "string") {
1412
+ return { ...payload, organizationId: organizationIdOrParams };
1413
+ }
1414
+ return organizationIdOrParams;
1415
+ }
1416
+ function resolveUploadParams(organizationIdOrParams, file) {
1417
+ if (typeof organizationIdOrParams === "string") {
1418
+ return { organizationId: organizationIdOrParams, file };
1419
+ }
1420
+ return organizationIdOrParams;
1421
+ }
1422
+ function buildUpsertBody(params) {
1423
+ const { organizationId, ...body } = params;
1424
+ return body;
1425
+ }
1426
+ function profileQuery(organizationId) {
1427
+ return new URLSearchParams({ organizationId }).toString();
1428
+ }
1429
+ function logoUploadFilename(file) {
1430
+ if (typeof File !== "undefined" && file instanceof File && file.name) {
1431
+ return file.name;
1432
+ }
1433
+ return DEFAULT_LOGO_UPLOAD_FILENAME;
1434
+ }
1435
+ function listingConsentValidationError(listingConsent, createError) {
1436
+ if (!listingConsent || listingConsent.consented !== true) return null;
1437
+ if (isBlank(listingConsent.consentVersion) || isBlank(listingConsent.consentedByUserId)) {
1438
+ return createError(
1439
+ FFID_ORGANIZATION_PROFILE_ERROR_CODES.VALIDATION_ERROR,
1440
+ "\u63B2\u8F09\u540C\u610F\u3092\u8A18\u9332\u3059\u308B\u5834\u5408\u306F consentVersion \u3068 consentedByUserId \u304C\u5FC5\u9808\u3067\u3059"
1441
+ );
1442
+ }
1443
+ return null;
1444
+ }
1445
+ function resolveLogoFile(file, createError) {
1446
+ if (!file) {
1447
+ return {
1448
+ ok: false,
1449
+ error: createError(
1450
+ FFID_ORGANIZATION_PROFILE_ERROR_CODES.MISSING_FILE,
1451
+ "file \u30D5\u30A3\u30FC\u30EB\u30C9\u306B\u30ED\u30B4\u753B\u50CF\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044"
1452
+ )
1453
+ };
1454
+ }
1455
+ if (file.size > FFID_MAX_ORGANIZATION_LOGO_FILE_SIZE_BYTES) {
1456
+ return {
1457
+ ok: false,
1458
+ error: createError(
1459
+ FFID_ORGANIZATION_PROFILE_ERROR_CODES.FILE_TOO_LARGE,
1460
+ `\u30ED\u30B4\u753B\u50CF\u306F${FFID_MAX_ORGANIZATION_LOGO_FILE_SIZE_MB}MB\u4EE5\u4E0B\u306B\u3057\u3066\u304F\u3060\u3055\u3044`
1461
+ )
1462
+ };
1463
+ }
1464
+ if (file.type !== "" && !FFID_ALLOWED_ORGANIZATION_LOGO_MIME_TYPES.includes(file.type)) {
1465
+ return {
1466
+ ok: false,
1467
+ error: createError(
1468
+ FFID_ORGANIZATION_PROFILE_ERROR_CODES.INVALID_FILE_TYPE,
1469
+ "\u30ED\u30B4\u753B\u50CF\u306F PNG / JPEG / WebP \u5F62\u5F0F\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044"
1470
+ )
1471
+ };
1472
+ }
1473
+ return { ok: true, file };
1474
+ }
1475
+ function createOrganizationProfileMethods(deps) {
1476
+ const { fetchWithAuth, createError, authMode, baseUrl, logger, errorCodes } = deps;
1477
+ function serviceKeyModeError() {
1478
+ if (authMode === "service-key") return null;
1479
+ return createError(
1480
+ FFID_ORGANIZATION_PROFILE_ERROR_CODES.VALIDATION_ERROR,
1481
+ "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"
1482
+ );
1483
+ }
1484
+ function requireOrganizationId(organizationId) {
1485
+ if (isBlank(organizationId)) {
1486
+ return createError(
1487
+ FFID_ORGANIZATION_PROFILE_ERROR_CODES.VALIDATION_ERROR,
1488
+ "organizationId \u306F\u5FC5\u9808\u3067\u3059"
1489
+ );
1490
+ }
1491
+ return null;
1492
+ }
1493
+ async function fetchPublic(endpoint, options = {}) {
1494
+ const url = `${baseUrl}${endpoint}`;
1495
+ logger.debug("Fetching (public):", url);
1496
+ let response;
1497
+ try {
1498
+ response = await fetch(url, {
1499
+ ...options,
1500
+ credentials: "omit",
1501
+ headers: {
1502
+ ...sdkHeaders(),
1503
+ ...options.headers
1504
+ }
1505
+ });
1506
+ } catch (error) {
1507
+ logger.error("Network error:", error);
1508
+ return {
1509
+ error: {
1510
+ code: errorCodes.NETWORK_ERROR,
1511
+ message: error instanceof Error ? error.message : "\u30CD\u30C3\u30C8\u30EF\u30FC\u30AF\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F"
1512
+ }
1513
+ };
1514
+ }
1515
+ let parsed;
1516
+ try {
1517
+ parsed = await response.json();
1518
+ } catch (parseError) {
1519
+ logger.error("Parse error:", parseError, "Status:", response.status);
1520
+ return {
1521
+ error: {
1522
+ code: errorCodes.PARSE_ERROR,
1523
+ 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})`
1524
+ }
1525
+ };
1526
+ }
1527
+ if (!parsed || typeof parsed !== "object") {
1528
+ return {
1529
+ error: {
1530
+ code: errorCodes.PARSE_ERROR,
1531
+ 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})`
1532
+ }
1533
+ };
1534
+ }
1535
+ const raw = parsed;
1536
+ logger.debug("Response (public):", response.status, raw);
1537
+ checkVersionHeader(response, logger);
1538
+ if (!response.ok) {
1539
+ return {
1540
+ error: raw.error ?? {
1541
+ code: errorCodes.UNKNOWN_ERROR,
1542
+ message: "\u4E0D\u660E\u306A\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F"
1543
+ }
1544
+ };
1545
+ }
1546
+ if (raw.data === void 0) {
1547
+ return {
1548
+ error: {
1549
+ code: errorCodes.UNKNOWN_ERROR,
1550
+ message: "\u30B5\u30FC\u30D0\u30FC\u304B\u3089\u30C7\u30FC\u30BF\u304C\u8FD4\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F"
1551
+ }
1552
+ };
1553
+ }
1554
+ return { data: raw.data };
1555
+ }
1556
+ async function getOrganizationProfile(organizationIdOrParams) {
1557
+ const modeError = serviceKeyModeError();
1558
+ if (modeError) return { error: modeError };
1559
+ const organizationId = resolveOrganizationId(organizationIdOrParams);
1560
+ const idError = requireOrganizationId(organizationId);
1561
+ if (idError) return { error: idError };
1562
+ return fetchWithAuth(
1563
+ `${EXT_PROFILE_ENDPOINT}?${profileQuery(organizationId)}`
1564
+ );
1565
+ }
1566
+ async function upsertOrganizationProfile(organizationIdOrParams, payload) {
1567
+ const modeError = serviceKeyModeError();
1568
+ if (modeError) return { error: modeError };
1569
+ const params = resolveUpsertParams(organizationIdOrParams, payload);
1570
+ const idError = requireOrganizationId(params.organizationId);
1571
+ if (idError) return { error: idError };
1572
+ const consentError = listingConsentValidationError(params.listingConsent, createError);
1573
+ if (consentError) return { error: consentError };
1574
+ return fetchWithAuth(
1575
+ `${EXT_PROFILE_ENDPOINT}?${profileQuery(params.organizationId)}`,
1576
+ {
1577
+ method: "PUT",
1578
+ body: JSON.stringify(buildUpsertBody(params))
1579
+ }
1580
+ );
1581
+ }
1582
+ async function uploadOrganizationLogo(organizationIdOrParams, file) {
1583
+ const modeError = serviceKeyModeError();
1584
+ if (modeError) return { error: modeError };
1585
+ const params = resolveUploadParams(organizationIdOrParams, file);
1586
+ const idError = requireOrganizationId(params.organizationId);
1587
+ if (idError) return { error: idError };
1588
+ const logoFile = resolveLogoFile(params.file, createError);
1589
+ if (!logoFile.ok) return { error: logoFile.error };
1590
+ const form = new FormData();
1591
+ form.append("file", logoFile.file, logoUploadFilename(logoFile.file));
1592
+ return fetchWithAuth(
1593
+ `${EXT_PROFILE_LOGO_ENDPOINT}?${profileQuery(params.organizationId)}`,
1594
+ { method: "POST", body: form }
1595
+ );
1596
+ }
1597
+ async function getPublicLogoWall() {
1598
+ return fetchPublic(LOGO_WALL_ENDPOINT);
1599
+ }
1600
+ return {
1601
+ getOrganizationProfile,
1602
+ upsertOrganizationProfile,
1603
+ uploadOrganizationLogo,
1604
+ getPublicLogoWall
1605
+ };
1606
+ }
1607
+
1304
1608
  // src/client/provisioning-methods.ts
1305
1609
  var USER_PROVISION_ENDPOINT = "/api/v1/ext/users/provision";
1306
1610
  var USER_WELCOME_EMAIL_ENDPOINT = "/api/v1/ext/users/welcome-email";
@@ -1444,7 +1748,7 @@ function createSeatMethods(deps) {
1444
1748
  }
1445
1749
 
1446
1750
  // src/client/profile-methods.ts
1447
- var EXT_PROFILE_ENDPOINT = "/api/v1/users/ext/me";
1751
+ var EXT_PROFILE_ENDPOINT2 = "/api/v1/users/ext/me";
1448
1752
  function resolveAuthOverride(options, createError) {
1449
1753
  if (!options || options.accessToken === void 0) {
1450
1754
  return {};
@@ -1465,7 +1769,7 @@ function createProfileMethods(deps) {
1465
1769
  async function getProfile(options) {
1466
1770
  const { override, error } = resolveAuthOverride(options, createError);
1467
1771
  if (error) return { error };
1468
- return fetchWithAuth(EXT_PROFILE_ENDPOINT, void 0, override);
1772
+ return fetchWithAuth(EXT_PROFILE_ENDPOINT2, void 0, override);
1469
1773
  }
1470
1774
  async function updateProfile(data, options) {
1471
1775
  if (data === null || typeof data !== "object" || Array.isArray(data)) {
@@ -1481,7 +1785,7 @@ function createProfileMethods(deps) {
1481
1785
  const { override, error } = resolveAuthOverride(options, createError);
1482
1786
  if (error) return { error };
1483
1787
  return fetchWithAuth(
1484
- EXT_PROFILE_ENDPOINT,
1788
+ EXT_PROFILE_ENDPOINT2,
1485
1789
  {
1486
1790
  method: "PUT",
1487
1791
  body: JSON.stringify(data)
@@ -1674,50 +1978,6 @@ function validateTokenResponse(tokenResponse) {
1674
1978
  };
1675
1979
  }
1676
1980
 
1677
- // src/client/version-check.ts
1678
- var SDK_VERSION = "6.0.0";
1679
- var SDK_USER_AGENT = `FFID-SDK/${SDK_VERSION} (TypeScript)`;
1680
- var SDK_VERSION_HEADER = "X-FFID-SDK-Version";
1681
- function sdkHeaders() {
1682
- if (typeof window !== "undefined") return {};
1683
- return {
1684
- "User-Agent": SDK_USER_AGENT,
1685
- [SDK_VERSION_HEADER]: SDK_VERSION
1686
- };
1687
- }
1688
- var LATEST_VERSION_HEADER = "X-FFID-SDK-Latest-Version";
1689
- var SEMVER_PATTERN = /^\d+(\.\d+)*$/;
1690
- var _versionWarningShown = false;
1691
- function compareSemver(a, b) {
1692
- const cleanA = a.replace(/^v/, "");
1693
- const cleanB = b.replace(/^v/, "");
1694
- if (!SEMVER_PATTERN.test(cleanA) || !SEMVER_PATTERN.test(cleanB)) return 0;
1695
- const partsA = cleanA.split(".").map(Number);
1696
- const partsB = cleanB.split(".").map(Number);
1697
- const maxLen = Math.max(partsA.length, partsB.length);
1698
- for (let i = 0; i < maxLen; i++) {
1699
- const numA = partsA[i] ?? 0;
1700
- const numB = partsB[i] ?? 0;
1701
- if (numA < numB) return -1;
1702
- if (numA > numB) return 1;
1703
- }
1704
- return 0;
1705
- }
1706
- function checkVersionHeader(response, logger) {
1707
- if (_versionWarningShown) return;
1708
- if (typeof process !== "undefined" && process.env?.NODE_ENV === "production") return;
1709
- if (!response.headers?.get) return;
1710
- const latestVersion = response.headers.get(LATEST_VERSION_HEADER);
1711
- if (!latestVersion) return;
1712
- if (compareSemver(SDK_VERSION, latestVersion) < 0) {
1713
- _versionWarningShown = true;
1714
- logger.warn(
1715
- `\u65B0\u3057\u3044\u30D0\u30FC\u30B8\u30E7\u30F3\u304C\u5229\u7528\u53EF\u80FD\u3067\u3059: v${latestVersion} (\u73FE\u5728: v${SDK_VERSION})
1716
- npm install @feelflow/ffid-sdk@latest \u3067\u30A2\u30C3\u30D7\u30C7\u30FC\u30C8\u3067\u304D\u307E\u3059`
1717
- );
1718
- }
1719
- }
1720
-
1721
1981
  // src/client/oauth-token.ts
1722
1982
  var OAUTH_TOKEN_ENDPOINT = "/api/v1/oauth/token";
1723
1983
  var OAUTH_REVOKE_ENDPOINT = "/api/v1/oauth/revoke";
@@ -2633,7 +2893,7 @@ function normalizeRedirectUri(input) {
2633
2893
 
2634
2894
  // src/client/password-reset.ts
2635
2895
  var RESET_PASSWORD_BASE = "/api/v1/auth/reset-password";
2636
- function isBlank(value) {
2896
+ function isBlank2(value) {
2637
2897
  return !value || !value.trim();
2638
2898
  }
2639
2899
  function createPasswordResetMethods(deps) {
@@ -2694,7 +2954,7 @@ function createPasswordResetMethods(deps) {
2694
2954
  return { data: raw.data };
2695
2955
  }
2696
2956
  async function requestPasswordReset(email) {
2697
- if (isBlank(email)) {
2957
+ if (isBlank2(email)) {
2698
2958
  return {
2699
2959
  error: createError("VALIDATION_ERROR", "\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u306F\u5FC5\u9808\u3067\u3059")
2700
2960
  };
@@ -2708,7 +2968,7 @@ function createPasswordResetMethods(deps) {
2708
2968
  );
2709
2969
  }
2710
2970
  async function verifyPasswordResetToken(accessToken) {
2711
- if (isBlank(accessToken)) {
2971
+ if (isBlank2(accessToken)) {
2712
2972
  return {
2713
2973
  error: createError("VALIDATION_ERROR", "\u30A2\u30AF\u30BB\u30B9\u30C8\u30FC\u30AF\u30F3\u306F\u5FC5\u9808\u3067\u3059")
2714
2974
  };
@@ -2722,12 +2982,12 @@ function createPasswordResetMethods(deps) {
2722
2982
  );
2723
2983
  }
2724
2984
  async function establishResetSession(accessToken, refreshToken) {
2725
- if (isBlank(accessToken)) {
2985
+ if (isBlank2(accessToken)) {
2726
2986
  return {
2727
2987
  error: createError("VALIDATION_ERROR", "\u30A2\u30AF\u30BB\u30B9\u30C8\u30FC\u30AF\u30F3\u306F\u5FC5\u9808\u3067\u3059")
2728
2988
  };
2729
2989
  }
2730
- if (isBlank(refreshToken)) {
2990
+ if (isBlank2(refreshToken)) {
2731
2991
  return {
2732
2992
  error: createError("VALIDATION_ERROR", "\u30EA\u30D5\u30EC\u30C3\u30B7\u30E5\u30C8\u30FC\u30AF\u30F3\u306F\u5FC5\u9808\u3067\u3059")
2733
2993
  };
@@ -2741,7 +3001,7 @@ function createPasswordResetMethods(deps) {
2741
3001
  );
2742
3002
  }
2743
3003
  async function confirmPasswordReset(password) {
2744
- if (isBlank(password)) {
3004
+ if (isBlank2(password)) {
2745
3005
  return {
2746
3006
  error: createError("VALIDATION_ERROR", "\u30D1\u30B9\u30EF\u30FC\u30C9\u306F\u5FC5\u9808\u3067\u3059")
2747
3007
  };
@@ -2764,7 +3024,7 @@ function createPasswordResetMethods(deps) {
2764
3024
 
2765
3025
  // src/client/otp.ts
2766
3026
  var OTP_BASE = "/api/v1/auth/otp";
2767
- function isBlank2(value) {
3027
+ function isBlank3(value) {
2768
3028
  return !value || !value.trim();
2769
3029
  }
2770
3030
  function createOtpMethods(deps) {
@@ -2825,7 +3085,7 @@ function createOtpMethods(deps) {
2825
3085
  return { data: raw.data };
2826
3086
  }
2827
3087
  async function sendOtp(email, options) {
2828
- if (isBlank2(email)) {
3088
+ if (isBlank3(email)) {
2829
3089
  return {
2830
3090
  error: createError("VALIDATION_ERROR", "\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u306F\u5FC5\u9808\u3067\u3059")
2831
3091
  };
@@ -2842,12 +3102,12 @@ function createOtpMethods(deps) {
2842
3102
  );
2843
3103
  }
2844
3104
  async function verifyOtp(params) {
2845
- if (isBlank2(params.accessToken)) {
3105
+ if (isBlank3(params.accessToken)) {
2846
3106
  return {
2847
3107
  error: createError("VALIDATION_ERROR", "\u30A2\u30AF\u30BB\u30B9\u30C8\u30FC\u30AF\u30F3\u306F\u5FC5\u9808\u3067\u3059")
2848
3108
  };
2849
3109
  }
2850
- if (isBlank2(params.refreshToken)) {
3110
+ if (isBlank3(params.refreshToken)) {
2851
3111
  return {
2852
3112
  error: createError("VALIDATION_ERROR", "\u30EA\u30D5\u30EC\u30C3\u30B7\u30E5\u30C8\u30FC\u30AF\u30F3\u306F\u5FC5\u9808\u3067\u3059")
2853
3113
  };
@@ -3413,6 +3673,12 @@ function resolveRedirectUri(raw, logger) {
3413
3673
  return raw;
3414
3674
  }
3415
3675
  }
3676
+ function jsonContentTypeHeader(body) {
3677
+ if (typeof FormData !== "undefined" && body instanceof FormData) {
3678
+ return {};
3679
+ }
3680
+ return { "Content-Type": "application/json" };
3681
+ }
3416
3682
  function createFFIDClient(config) {
3417
3683
  if (!config.serviceCode || !config.serviceCode.trim()) {
3418
3684
  throw new Error("FFID Client: serviceCode \u304C\u672A\u8A2D\u5B9A\u3067\u3059");
@@ -3465,7 +3731,7 @@ function createFFIDClient(config) {
3465
3731
  ...options,
3466
3732
  credentials: "omit",
3467
3733
  headers: {
3468
- "Content-Type": "application/json",
3734
+ ...jsonContentTypeHeader(options.body),
3469
3735
  ...sdkHeaders(),
3470
3736
  ...options.headers,
3471
3737
  Authorization: `Bearer ${authOverride.accessToken}`
@@ -3477,7 +3743,7 @@ function createFFIDClient(config) {
3477
3743
  ...options,
3478
3744
  credentials: "omit",
3479
3745
  headers: {
3480
- "Content-Type": "application/json",
3746
+ ...jsonContentTypeHeader(options.body),
3481
3747
  ...sdkHeaders(),
3482
3748
  "X-Service-Api-Key": serviceApiKey,
3483
3749
  ...options.headers
@@ -3487,7 +3753,7 @@ function createFFIDClient(config) {
3487
3753
  if (authMode === "token") {
3488
3754
  const tokens = tokenStore.getTokens();
3489
3755
  const headers = {
3490
- "Content-Type": "application/json",
3756
+ ...jsonContentTypeHeader(options.body),
3491
3757
  ...sdkHeaders(),
3492
3758
  ...options.headers
3493
3759
  };
@@ -3504,7 +3770,7 @@ function createFFIDClient(config) {
3504
3770
  ...options,
3505
3771
  credentials: "include",
3506
3772
  headers: {
3507
- "Content-Type": "application/json",
3773
+ ...jsonContentTypeHeader(options.body),
3508
3774
  ...sdkHeaders(),
3509
3775
  ...options.headers
3510
3776
  }
@@ -3721,6 +3987,19 @@ function createFFIDClient(config) {
3721
3987
  createError,
3722
3988
  serviceCode: config.serviceCode
3723
3989
  });
3990
+ const {
3991
+ getOrganizationProfile,
3992
+ upsertOrganizationProfile,
3993
+ uploadOrganizationLogo,
3994
+ getPublicLogoWall
3995
+ } = createOrganizationProfileMethods({
3996
+ fetchWithAuth,
3997
+ createError,
3998
+ authMode,
3999
+ baseUrl,
4000
+ logger,
4001
+ errorCodes: FFID_ERROR_CODES
4002
+ });
3724
4003
  const { provisionUser, sendProvisionWelcomeEmail, provisionOrganization } = createProvisioningMethods({
3725
4004
  fetchWithAuth,
3726
4005
  createError,
@@ -3821,6 +4100,10 @@ function createFFIDClient(config) {
3821
4100
  addMember,
3822
4101
  updateMemberRole,
3823
4102
  removeMember,
4103
+ getOrganizationProfile,
4104
+ upsertOrganizationProfile,
4105
+ uploadOrganizationLogo,
4106
+ getPublicLogoWall,
3824
4107
  provisionUser,
3825
4108
  sendProvisionWelcomeEmail,
3826
4109
  provisionOrganization,
@@ -6009,4 +6292,4 @@ function FFIDInquiryForm({
6009
6292
  );
6010
6293
  }
6011
6294
 
6012
- export { ACCESS_GRANTING_EFFECTIVE_STATUSES, BLOCKING_EFFECTIVE_STATUSES, CATALOG_HASH_PATTERN, DEFAULT_API_BASE_URL, DEFAULT_OAUTH_SCOPES, EFFECTIVE_SUBSCRIPTION_STATUSES, FFIDAnnouncementBadge, FFIDAnnouncementList, FFIDCatalogHashError, FFIDInquiryForm, FFIDLoginButton, FFIDOrganizationSwitcher, FFIDProvider, FFIDSDKError, FFIDSubscriptionBadge, FFIDUserMenu, FFID_ANNOUNCEMENTS_ERROR_CODES, FFID_CATALOG_ENVIRONMENTS, FFID_CATALOG_PUBLICATION_STATUSES, FFID_ERROR_CODES, FFID_INQUIRY_ACQUISITION_SOURCES, FFID_INQUIRY_CATEGORIES, FFID_INQUIRY_CATEGORIES_SITE_2026, canonicalizeCatalogValue, cleanupStateStorage, computeEffectiveStatusFromSession, computeFFIDCheckoutCopyHash, computeLegalDisclosureHash, computePaymentConfigurationHash, computePraxisCopyHash, computeScopeHash, computeTaxConfigurationHash, createFFIDAnnouncementsClient, createFFIDClient, createTokenStore, generateCodeChallenge, generateCodeVerifier, handleRedirectCallback, hasAccessFromUserinfo, hashCanonicalJson, isBlockedFromUserinfo, isFFIDInquiryAcquisitionSource, isFFIDInquiryCategorySite2026, normalizeRedirectUri, retrieveCodeVerifier, retrieveState, sha256Hex, storeCodeVerifier, storeState, useFFID, useFFIDAnnouncements, useFFIDContext, useSubscription, validatePublishedCatalog, withSubscription };
6295
+ export { ACCESS_GRANTING_EFFECTIVE_STATUSES, BLOCKING_EFFECTIVE_STATUSES, CATALOG_HASH_PATTERN, DEFAULT_API_BASE_URL, DEFAULT_OAUTH_SCOPES, EFFECTIVE_SUBSCRIPTION_STATUSES, FFIDAnnouncementBadge, FFIDAnnouncementList, FFIDCatalogHashError, FFIDInquiryForm, FFIDLoginButton, FFIDOrganizationSwitcher, FFIDProvider, FFIDSDKError, FFIDSubscriptionBadge, FFIDUserMenu, FFID_ALLOWED_ORGANIZATION_LOGO_MIME_TYPES, FFID_ANNOUNCEMENTS_ERROR_CODES, FFID_CATALOG_ENVIRONMENTS, FFID_CATALOG_PUBLICATION_STATUSES, FFID_COMPANY_SIZE_CODES, FFID_ERROR_CODES, FFID_INDUSTRY_CODES, FFID_INQUIRY_ACQUISITION_SOURCES, FFID_INQUIRY_CATEGORIES, FFID_INQUIRY_CATEGORIES_SITE_2026, FFID_MAX_ORGANIZATION_LOGO_FILE_SIZE_BYTES, FFID_MAX_ORGANIZATION_LOGO_FILE_SIZE_MB, FFID_ORGANIZATION_PROFILE_ERROR_CODES, canonicalizeCatalogValue, cleanupStateStorage, computeEffectiveStatusFromSession, computeFFIDCheckoutCopyHash, computeLegalDisclosureHash, computePaymentConfigurationHash, computePraxisCopyHash, computeScopeHash, computeTaxConfigurationHash, createFFIDAnnouncementsClient, createFFIDClient, createTokenStore, generateCodeChallenge, generateCodeVerifier, handleRedirectCallback, hasAccessFromUserinfo, hashCanonicalJson, isBlockedFromUserinfo, isFFIDInquiryAcquisitionSource, isFFIDInquiryCategorySite2026, normalizeRedirectUri, retrieveCodeVerifier, retrieveState, sha256Hex, storeCodeVerifier, storeState, useFFID, useFFIDAnnouncements, useFFIDContext, useSubscription, validatePublishedCatalog, withSubscription };
@@ -1,34 +1,34 @@
1
1
  'use strict';
2
2
 
3
- var chunkCI6RBG77_cjs = require('../chunk-CI6RBG77.cjs');
3
+ var chunkCI4N7KJK_cjs = require('../chunk-CI4N7KJK.cjs');
4
4
 
5
5
 
6
6
 
7
7
  Object.defineProperty(exports, "FFIDAnnouncementBadge", {
8
8
  enumerable: true,
9
- get: function () { return chunkCI6RBG77_cjs.FFIDAnnouncementBadge; }
9
+ get: function () { return chunkCI4N7KJK_cjs.FFIDAnnouncementBadge; }
10
10
  });
11
11
  Object.defineProperty(exports, "FFIDAnnouncementList", {
12
12
  enumerable: true,
13
- get: function () { return chunkCI6RBG77_cjs.FFIDAnnouncementList; }
13
+ get: function () { return chunkCI4N7KJK_cjs.FFIDAnnouncementList; }
14
14
  });
15
15
  Object.defineProperty(exports, "FFIDInquiryForm", {
16
16
  enumerable: true,
17
- get: function () { return chunkCI6RBG77_cjs.FFIDInquiryForm; }
17
+ get: function () { return chunkCI4N7KJK_cjs.FFIDInquiryForm; }
18
18
  });
19
19
  Object.defineProperty(exports, "FFIDLoginButton", {
20
20
  enumerable: true,
21
- get: function () { return chunkCI6RBG77_cjs.FFIDLoginButton; }
21
+ get: function () { return chunkCI4N7KJK_cjs.FFIDLoginButton; }
22
22
  });
23
23
  Object.defineProperty(exports, "FFIDOrganizationSwitcher", {
24
24
  enumerable: true,
25
- get: function () { return chunkCI6RBG77_cjs.FFIDOrganizationSwitcher; }
25
+ get: function () { return chunkCI4N7KJK_cjs.FFIDOrganizationSwitcher; }
26
26
  });
27
27
  Object.defineProperty(exports, "FFIDSubscriptionBadge", {
28
28
  enumerable: true,
29
- get: function () { return chunkCI6RBG77_cjs.FFIDSubscriptionBadge; }
29
+ get: function () { return chunkCI4N7KJK_cjs.FFIDSubscriptionBadge; }
30
30
  });
31
31
  Object.defineProperty(exports, "FFIDUserMenu", {
32
32
  enumerable: true,
33
- get: function () { return chunkCI6RBG77_cjs.FFIDUserMenu; }
33
+ get: function () { return chunkCI4N7KJK_cjs.FFIDUserMenu; }
34
34
  });
@@ -1 +1 @@
1
- export { FFIDAnnouncementBadge, FFIDAnnouncementList, FFIDInquiryForm, FFIDLoginButton, FFIDOrganizationSwitcher, FFIDSubscriptionBadge, FFIDUserMenu } from '../chunk-NBBHMLXO.js';
1
+ export { FFIDAnnouncementBadge, FFIDAnnouncementList, FFIDInquiryForm, FFIDLoginButton, FFIDOrganizationSwitcher, FFIDSubscriptionBadge, FFIDUserMenu } from '../chunk-Y4TUICQZ.js';