@feelflow/ffid-sdk 7.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.
package/README.md CHANGED
@@ -397,6 +397,53 @@ await ffid.updateMemberRole({
397
397
  - `role` は `admin` / `member` / `viewer` のみ指定可能です。`owner` は追加・昇格 API では扱いません。
398
398
  - agency client と同じ呼び味が必要な場合は `ffid.addMember(organizationId, { email, role })` も使えます。
399
399
 
400
+ ### Organization profile / public logo wall
401
+
402
+ hub 等の外部サービスが企業プロフィールを登録・照会し、FeelFlow 全サービス共通のロゴウォールを表示するためのメソッド(#5485 / #5547)。
403
+
404
+ - **`getOrganizationProfile` / `upsertOrganizationProfile` / `uploadOrganizationLogo`** は **`authMode: 'service-key'` 専用**(scope: `organization:read` / `organization:write`)。`token` / `cookie` モードで呼ぶとサーバーへ往復せず `VALIDATION_ERROR`。
405
+ - **`getPublicLogoWall`** は認証不要。service-key を送らない。エンドポイントは `GET /api/v1/organizations/logo-wall`(公開 API なので SDK を使わず直接 GET してもよいが、型付きエラーが欲しければ SDK 経由を推奨)。
406
+ - `upsert` の `listingConsent.consented: true` では `consentVersion` と `consentedByUserId` が必須。同意操作者が対象 org の active メンバーでないとサーバーが `CONSENTED_BY_NOT_MEMBER` を返す。
407
+
408
+ ```ts
409
+ import {
410
+ createFFIDClient,
411
+ FFID_ORGANIZATION_PROFILE_ERROR_CODES,
412
+ } from '@feelflow/ffid-sdk/server'
413
+
414
+ const ffid = createFFIDClient({
415
+ serviceCode: 'feel-agent',
416
+ scope: '',
417
+ authMode: 'service-key',
418
+ serviceApiKey: process.env.FFID_SERVICE_API_KEY!,
419
+ })
420
+
421
+ const current = await ffid.getOrganizationProfile(organizationId)
422
+ if (current.error) throw new Error(current.error.message)
423
+
424
+ const upsert = await ffid.upsertOrganizationProfile(organizationId, {
425
+ displayName: '株式会社サンプル',
426
+ industry: 'it-software',
427
+ companySize: '11-50',
428
+ websiteUrl: 'https://example.co.jp',
429
+ listingConsent: {
430
+ consented: true,
431
+ consentVersion: 'v1.0',
432
+ consentedByUserId: userId,
433
+ },
434
+ })
435
+ if (upsert.error?.code === FFID_ORGANIZATION_PROFILE_ERROR_CODES.CONSENTED_BY_NOT_MEMBER) {
436
+ throw new Error(upsert.error.message)
437
+ }
438
+
439
+ await ffid.uploadOrganizationLogo(organizationId, logoFile)
440
+
441
+ const wall = await ffid.getPublicLogoWall()
442
+ // wall.data.entries: { displayName, logoUrl, websiteUrl }[]
443
+ ```
444
+
445
+ 位置引数と params オブジェクトの両方を受け付ける(`addMember` と同じ)。
446
+
400
447
  ### Provisioning(users / organizations)
401
448
 
402
449
  外部サービスからの一括移行向けに、**service-key 認証**でユーザー・組織を冪等にプロビジョニングするメソッド。REST を直叩きせず `createFFIDClient` 経由で呼べる(SDK-first、#3790 / #4127)。
@@ -1303,6 +1303,310 @@ function createMembersMethods(deps) {
1303
1303
  return { listMembers, addMember, updateMemberRole, removeMember };
1304
1304
  }
1305
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.1.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
+
1306
1610
  // src/client/provisioning-methods.ts
1307
1611
  var USER_PROVISION_ENDPOINT = "/api/v1/ext/users/provision";
1308
1612
  var USER_WELCOME_EMAIL_ENDPOINT = "/api/v1/ext/users/welcome-email";
@@ -1446,7 +1750,7 @@ function createSeatMethods(deps) {
1446
1750
  }
1447
1751
 
1448
1752
  // src/client/profile-methods.ts
1449
- var EXT_PROFILE_ENDPOINT = "/api/v1/users/ext/me";
1753
+ var EXT_PROFILE_ENDPOINT2 = "/api/v1/users/ext/me";
1450
1754
  function resolveAuthOverride(options, createError) {
1451
1755
  if (!options || options.accessToken === void 0) {
1452
1756
  return {};
@@ -1467,7 +1771,7 @@ function createProfileMethods(deps) {
1467
1771
  async function getProfile(options) {
1468
1772
  const { override, error } = resolveAuthOverride(options, createError);
1469
1773
  if (error) return { error };
1470
- return fetchWithAuth(EXT_PROFILE_ENDPOINT, void 0, override);
1774
+ return fetchWithAuth(EXT_PROFILE_ENDPOINT2, void 0, override);
1471
1775
  }
1472
1776
  async function updateProfile(data, options) {
1473
1777
  if (data === null || typeof data !== "object" || Array.isArray(data)) {
@@ -1483,7 +1787,7 @@ function createProfileMethods(deps) {
1483
1787
  const { override, error } = resolveAuthOverride(options, createError);
1484
1788
  if (error) return { error };
1485
1789
  return fetchWithAuth(
1486
- EXT_PROFILE_ENDPOINT,
1790
+ EXT_PROFILE_ENDPOINT2,
1487
1791
  {
1488
1792
  method: "PUT",
1489
1793
  body: JSON.stringify(data)
@@ -1676,50 +1980,6 @@ function validateTokenResponse(tokenResponse) {
1676
1980
  };
1677
1981
  }
1678
1982
 
1679
- // src/client/version-check.ts
1680
- var SDK_VERSION = "7.0.0";
1681
- var SDK_USER_AGENT = `FFID-SDK/${SDK_VERSION} (TypeScript)`;
1682
- var SDK_VERSION_HEADER = "X-FFID-SDK-Version";
1683
- function sdkHeaders() {
1684
- if (typeof window !== "undefined") return {};
1685
- return {
1686
- "User-Agent": SDK_USER_AGENT,
1687
- [SDK_VERSION_HEADER]: SDK_VERSION
1688
- };
1689
- }
1690
- var LATEST_VERSION_HEADER = "X-FFID-SDK-Latest-Version";
1691
- var SEMVER_PATTERN = /^\d+(\.\d+)*$/;
1692
- var _versionWarningShown = false;
1693
- function compareSemver(a, b) {
1694
- const cleanA = a.replace(/^v/, "");
1695
- const cleanB = b.replace(/^v/, "");
1696
- if (!SEMVER_PATTERN.test(cleanA) || !SEMVER_PATTERN.test(cleanB)) return 0;
1697
- const partsA = cleanA.split(".").map(Number);
1698
- const partsB = cleanB.split(".").map(Number);
1699
- const maxLen = Math.max(partsA.length, partsB.length);
1700
- for (let i = 0; i < maxLen; i++) {
1701
- const numA = partsA[i] ?? 0;
1702
- const numB = partsB[i] ?? 0;
1703
- if (numA < numB) return -1;
1704
- if (numA > numB) return 1;
1705
- }
1706
- return 0;
1707
- }
1708
- function checkVersionHeader(response, logger) {
1709
- if (_versionWarningShown) return;
1710
- if (typeof process !== "undefined" && process.env?.NODE_ENV === "production") return;
1711
- if (!response.headers?.get) return;
1712
- const latestVersion = response.headers.get(LATEST_VERSION_HEADER);
1713
- if (!latestVersion) return;
1714
- if (compareSemver(SDK_VERSION, latestVersion) < 0) {
1715
- _versionWarningShown = true;
1716
- logger.warn(
1717
- `\u65B0\u3057\u3044\u30D0\u30FC\u30B8\u30E7\u30F3\u304C\u5229\u7528\u53EF\u80FD\u3067\u3059: v${latestVersion} (\u73FE\u5728: v${SDK_VERSION})
1718
- npm install @feelflow/ffid-sdk@latest \u3067\u30A2\u30C3\u30D7\u30C7\u30FC\u30C8\u3067\u304D\u307E\u3059`
1719
- );
1720
- }
1721
- }
1722
-
1723
1983
  // src/client/oauth-token.ts
1724
1984
  var OAUTH_TOKEN_ENDPOINT = "/api/v1/oauth/token";
1725
1985
  var OAUTH_REVOKE_ENDPOINT = "/api/v1/oauth/revoke";
@@ -2635,7 +2895,7 @@ function normalizeRedirectUri(input) {
2635
2895
 
2636
2896
  // src/client/password-reset.ts
2637
2897
  var RESET_PASSWORD_BASE = "/api/v1/auth/reset-password";
2638
- function isBlank(value) {
2898
+ function isBlank2(value) {
2639
2899
  return !value || !value.trim();
2640
2900
  }
2641
2901
  function createPasswordResetMethods(deps) {
@@ -2696,7 +2956,7 @@ function createPasswordResetMethods(deps) {
2696
2956
  return { data: raw.data };
2697
2957
  }
2698
2958
  async function requestPasswordReset(email) {
2699
- if (isBlank(email)) {
2959
+ if (isBlank2(email)) {
2700
2960
  return {
2701
2961
  error: createError("VALIDATION_ERROR", "\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u306F\u5FC5\u9808\u3067\u3059")
2702
2962
  };
@@ -2710,7 +2970,7 @@ function createPasswordResetMethods(deps) {
2710
2970
  );
2711
2971
  }
2712
2972
  async function verifyPasswordResetToken(accessToken) {
2713
- if (isBlank(accessToken)) {
2973
+ if (isBlank2(accessToken)) {
2714
2974
  return {
2715
2975
  error: createError("VALIDATION_ERROR", "\u30A2\u30AF\u30BB\u30B9\u30C8\u30FC\u30AF\u30F3\u306F\u5FC5\u9808\u3067\u3059")
2716
2976
  };
@@ -2724,12 +2984,12 @@ function createPasswordResetMethods(deps) {
2724
2984
  );
2725
2985
  }
2726
2986
  async function establishResetSession(accessToken, refreshToken) {
2727
- if (isBlank(accessToken)) {
2987
+ if (isBlank2(accessToken)) {
2728
2988
  return {
2729
2989
  error: createError("VALIDATION_ERROR", "\u30A2\u30AF\u30BB\u30B9\u30C8\u30FC\u30AF\u30F3\u306F\u5FC5\u9808\u3067\u3059")
2730
2990
  };
2731
2991
  }
2732
- if (isBlank(refreshToken)) {
2992
+ if (isBlank2(refreshToken)) {
2733
2993
  return {
2734
2994
  error: createError("VALIDATION_ERROR", "\u30EA\u30D5\u30EC\u30C3\u30B7\u30E5\u30C8\u30FC\u30AF\u30F3\u306F\u5FC5\u9808\u3067\u3059")
2735
2995
  };
@@ -2743,7 +3003,7 @@ function createPasswordResetMethods(deps) {
2743
3003
  );
2744
3004
  }
2745
3005
  async function confirmPasswordReset(password) {
2746
- if (isBlank(password)) {
3006
+ if (isBlank2(password)) {
2747
3007
  return {
2748
3008
  error: createError("VALIDATION_ERROR", "\u30D1\u30B9\u30EF\u30FC\u30C9\u306F\u5FC5\u9808\u3067\u3059")
2749
3009
  };
@@ -2766,7 +3026,7 @@ function createPasswordResetMethods(deps) {
2766
3026
 
2767
3027
  // src/client/otp.ts
2768
3028
  var OTP_BASE = "/api/v1/auth/otp";
2769
- function isBlank2(value) {
3029
+ function isBlank3(value) {
2770
3030
  return !value || !value.trim();
2771
3031
  }
2772
3032
  function createOtpMethods(deps) {
@@ -2827,7 +3087,7 @@ function createOtpMethods(deps) {
2827
3087
  return { data: raw.data };
2828
3088
  }
2829
3089
  async function sendOtp(email, options) {
2830
- if (isBlank2(email)) {
3090
+ if (isBlank3(email)) {
2831
3091
  return {
2832
3092
  error: createError("VALIDATION_ERROR", "\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u306F\u5FC5\u9808\u3067\u3059")
2833
3093
  };
@@ -2844,12 +3104,12 @@ function createOtpMethods(deps) {
2844
3104
  );
2845
3105
  }
2846
3106
  async function verifyOtp(params) {
2847
- if (isBlank2(params.accessToken)) {
3107
+ if (isBlank3(params.accessToken)) {
2848
3108
  return {
2849
3109
  error: createError("VALIDATION_ERROR", "\u30A2\u30AF\u30BB\u30B9\u30C8\u30FC\u30AF\u30F3\u306F\u5FC5\u9808\u3067\u3059")
2850
3110
  };
2851
3111
  }
2852
- if (isBlank2(params.refreshToken)) {
3112
+ if (isBlank3(params.refreshToken)) {
2853
3113
  return {
2854
3114
  error: createError("VALIDATION_ERROR", "\u30EA\u30D5\u30EC\u30C3\u30B7\u30E5\u30C8\u30FC\u30AF\u30F3\u306F\u5FC5\u9808\u3067\u3059")
2855
3115
  };
@@ -3415,6 +3675,12 @@ function resolveRedirectUri(raw, logger) {
3415
3675
  return raw;
3416
3676
  }
3417
3677
  }
3678
+ function jsonContentTypeHeader(body) {
3679
+ if (typeof FormData !== "undefined" && body instanceof FormData) {
3680
+ return {};
3681
+ }
3682
+ return { "Content-Type": "application/json" };
3683
+ }
3418
3684
  function createFFIDClient(config) {
3419
3685
  if (!config.serviceCode || !config.serviceCode.trim()) {
3420
3686
  throw new Error("FFID Client: serviceCode \u304C\u672A\u8A2D\u5B9A\u3067\u3059");
@@ -3467,7 +3733,7 @@ function createFFIDClient(config) {
3467
3733
  ...options,
3468
3734
  credentials: "omit",
3469
3735
  headers: {
3470
- "Content-Type": "application/json",
3736
+ ...jsonContentTypeHeader(options.body),
3471
3737
  ...sdkHeaders(),
3472
3738
  ...options.headers,
3473
3739
  Authorization: `Bearer ${authOverride.accessToken}`
@@ -3479,7 +3745,7 @@ function createFFIDClient(config) {
3479
3745
  ...options,
3480
3746
  credentials: "omit",
3481
3747
  headers: {
3482
- "Content-Type": "application/json",
3748
+ ...jsonContentTypeHeader(options.body),
3483
3749
  ...sdkHeaders(),
3484
3750
  "X-Service-Api-Key": serviceApiKey,
3485
3751
  ...options.headers
@@ -3489,7 +3755,7 @@ function createFFIDClient(config) {
3489
3755
  if (authMode === "token") {
3490
3756
  const tokens = tokenStore.getTokens();
3491
3757
  const headers = {
3492
- "Content-Type": "application/json",
3758
+ ...jsonContentTypeHeader(options.body),
3493
3759
  ...sdkHeaders(),
3494
3760
  ...options.headers
3495
3761
  };
@@ -3506,7 +3772,7 @@ function createFFIDClient(config) {
3506
3772
  ...options,
3507
3773
  credentials: "include",
3508
3774
  headers: {
3509
- "Content-Type": "application/json",
3775
+ ...jsonContentTypeHeader(options.body),
3510
3776
  ...sdkHeaders(),
3511
3777
  ...options.headers
3512
3778
  }
@@ -3723,6 +3989,19 @@ function createFFIDClient(config) {
3723
3989
  createError,
3724
3990
  serviceCode: config.serviceCode
3725
3991
  });
3992
+ const {
3993
+ getOrganizationProfile,
3994
+ upsertOrganizationProfile,
3995
+ uploadOrganizationLogo,
3996
+ getPublicLogoWall
3997
+ } = createOrganizationProfileMethods({
3998
+ fetchWithAuth,
3999
+ createError,
4000
+ authMode,
4001
+ baseUrl,
4002
+ logger,
4003
+ errorCodes: FFID_ERROR_CODES
4004
+ });
3726
4005
  const { provisionUser, sendProvisionWelcomeEmail, provisionOrganization } = createProvisioningMethods({
3727
4006
  fetchWithAuth,
3728
4007
  createError,
@@ -3823,6 +4102,10 @@ function createFFIDClient(config) {
3823
4102
  addMember,
3824
4103
  updateMemberRole,
3825
4104
  removeMember,
4105
+ getOrganizationProfile,
4106
+ upsertOrganizationProfile,
4107
+ uploadOrganizationLogo,
4108
+ getPublicLogoWall,
3826
4109
  provisionUser,
3827
4110
  sendProvisionWelcomeEmail,
3828
4111
  provisionOrganization,
@@ -6027,13 +6310,19 @@ exports.FFIDProvider = FFIDProvider;
6027
6310
  exports.FFIDSDKError = FFIDSDKError;
6028
6311
  exports.FFIDSubscriptionBadge = FFIDSubscriptionBadge;
6029
6312
  exports.FFIDUserMenu = FFIDUserMenu;
6313
+ exports.FFID_ALLOWED_ORGANIZATION_LOGO_MIME_TYPES = FFID_ALLOWED_ORGANIZATION_LOGO_MIME_TYPES;
6030
6314
  exports.FFID_ANNOUNCEMENTS_ERROR_CODES = FFID_ANNOUNCEMENTS_ERROR_CODES;
6031
6315
  exports.FFID_CATALOG_ENVIRONMENTS = FFID_CATALOG_ENVIRONMENTS;
6032
6316
  exports.FFID_CATALOG_PUBLICATION_STATUSES = FFID_CATALOG_PUBLICATION_STATUSES;
6317
+ exports.FFID_COMPANY_SIZE_CODES = FFID_COMPANY_SIZE_CODES;
6033
6318
  exports.FFID_ERROR_CODES = FFID_ERROR_CODES;
6319
+ exports.FFID_INDUSTRY_CODES = FFID_INDUSTRY_CODES;
6034
6320
  exports.FFID_INQUIRY_ACQUISITION_SOURCES = FFID_INQUIRY_ACQUISITION_SOURCES;
6035
6321
  exports.FFID_INQUIRY_CATEGORIES = FFID_INQUIRY_CATEGORIES;
6036
6322
  exports.FFID_INQUIRY_CATEGORIES_SITE_2026 = FFID_INQUIRY_CATEGORIES_SITE_2026;
6323
+ exports.FFID_MAX_ORGANIZATION_LOGO_FILE_SIZE_BYTES = FFID_MAX_ORGANIZATION_LOGO_FILE_SIZE_BYTES;
6324
+ exports.FFID_MAX_ORGANIZATION_LOGO_FILE_SIZE_MB = FFID_MAX_ORGANIZATION_LOGO_FILE_SIZE_MB;
6325
+ exports.FFID_ORGANIZATION_PROFILE_ERROR_CODES = FFID_ORGANIZATION_PROFILE_ERROR_CODES;
6037
6326
  exports.canonicalizeCatalogValue = canonicalizeCatalogValue;
6038
6327
  exports.cleanupStateStorage = cleanupStateStorage;
6039
6328
  exports.computeEffectiveStatusFromSession = computeEffectiveStatusFromSession;