@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.
- package/README.md +47 -0
- package/dist/{FFIDCookieLink-BJgVcJyw.d.cts → FFIDCookieLink-Bwr0FBrV.d.cts} +13 -46
- package/dist/{FFIDCookieLink-BJgVcJyw.d.ts → FFIDCookieLink-Bwr0FBrV.d.ts} +13 -46
- package/dist/{chunk-CI6RBG77.cjs → chunk-CI4N7KJK.cjs} +350 -61
- package/dist/{chunk-G7VOX64X.js → chunk-RHBZHSRD.js} +4 -30
- package/dist/{chunk-H5O2CCAY.cjs → chunk-XELXXL2F.cjs} +2 -29
- package/dist/{chunk-NBBHMLXO.js → chunk-Y4TUICQZ.js} +345 -62
- package/dist/components/index.cjs +8 -8
- package/dist/components/index.js +1 -1
- package/dist/consent/index.cjs +63 -67
- package/dist/consent/index.d.cts +2 -2
- package/dist/consent/index.d.ts +2 -2
- package/dist/consent/index.js +1 -1
- package/dist/{ffid-client-C8XV7lUt.d.cts → ffid-client-BFgoVPOZ.d.cts} +161 -1
- package/dist/{ffid-client-CpVixUM3.d.ts → ffid-client-QNEFA3mv.d.ts} +161 -1
- package/dist/index.cjs +103 -79
- package/dist/index.d.cts +162 -2
- package/dist/index.d.ts +162 -2
- package/dist/index.js +3 -3
- package/dist/server/index.cjs +350 -61
- package/dist/server/index.d.cts +2 -2
- package/dist/server/index.d.ts +2 -2
- package/dist/server/index.js +345 -62
- package/dist/server/test/index.d.cts +1 -1
- package/dist/server/test/index.d.ts +1 -1
- package/package.json +1 -1
package/dist/server/index.js
CHANGED
|
@@ -1297,6 +1297,310 @@ function createMembersMethods(deps) {
|
|
|
1297
1297
|
return { listMembers, addMember, updateMemberRole, removeMember };
|
|
1298
1298
|
}
|
|
1299
1299
|
|
|
1300
|
+
// src/types/organization-profile.ts
|
|
1301
|
+
var FFID_INDUSTRY_CODES = [
|
|
1302
|
+
"agriculture",
|
|
1303
|
+
"construction",
|
|
1304
|
+
"manufacturing",
|
|
1305
|
+
"it-software",
|
|
1306
|
+
"telecom",
|
|
1307
|
+
"media",
|
|
1308
|
+
"retail",
|
|
1309
|
+
"wholesale",
|
|
1310
|
+
"finance-insurance",
|
|
1311
|
+
"real-estate",
|
|
1312
|
+
"transport-logistics",
|
|
1313
|
+
"hospitality-food",
|
|
1314
|
+
"healthcare",
|
|
1315
|
+
"education",
|
|
1316
|
+
"professional-services",
|
|
1317
|
+
"marketing-advertising",
|
|
1318
|
+
"energy-utilities",
|
|
1319
|
+
"public-sector",
|
|
1320
|
+
"nonprofit",
|
|
1321
|
+
"other"
|
|
1322
|
+
];
|
|
1323
|
+
var FFID_COMPANY_SIZE_CODES = [
|
|
1324
|
+
"1-10",
|
|
1325
|
+
"11-50",
|
|
1326
|
+
"51-200",
|
|
1327
|
+
"201-500",
|
|
1328
|
+
"501-1000",
|
|
1329
|
+
"1001+"
|
|
1330
|
+
];
|
|
1331
|
+
var BYTES_PER_KB = 1024;
|
|
1332
|
+
var KB_PER_MB = 1024;
|
|
1333
|
+
var FFID_MAX_ORGANIZATION_LOGO_FILE_SIZE_MB = 2;
|
|
1334
|
+
var FFID_MAX_ORGANIZATION_LOGO_FILE_SIZE_BYTES = FFID_MAX_ORGANIZATION_LOGO_FILE_SIZE_MB * KB_PER_MB * BYTES_PER_KB;
|
|
1335
|
+
var FFID_ALLOWED_ORGANIZATION_LOGO_MIME_TYPES = [
|
|
1336
|
+
"image/png",
|
|
1337
|
+
"image/jpeg",
|
|
1338
|
+
"image/webp"
|
|
1339
|
+
];
|
|
1340
|
+
var FFID_ORGANIZATION_PROFILE_ERROR_CODES = {
|
|
1341
|
+
VALIDATION_ERROR: "VALIDATION_ERROR",
|
|
1342
|
+
ORGANIZATION_NOT_FOUND: "ORGANIZATION_NOT_FOUND",
|
|
1343
|
+
CONSENTED_BY_NOT_MEMBER: "CONSENTED_BY_NOT_MEMBER",
|
|
1344
|
+
MISSING_FILE: "MISSING_FILE",
|
|
1345
|
+
INVALID_FILE_TYPE: "INVALID_FILE_TYPE",
|
|
1346
|
+
FILE_TOO_LARGE: "FILE_TOO_LARGE",
|
|
1347
|
+
INVALID_IMAGE: "INVALID_IMAGE",
|
|
1348
|
+
LOGO_UPLOAD_FAILED: "LOGO_UPLOAD_FAILED"
|
|
1349
|
+
};
|
|
1350
|
+
|
|
1351
|
+
// src/client/version-check.ts
|
|
1352
|
+
var SDK_VERSION = "7.1.0";
|
|
1353
|
+
var SDK_USER_AGENT = `FFID-SDK/${SDK_VERSION} (TypeScript)`;
|
|
1354
|
+
var SDK_VERSION_HEADER = "X-FFID-SDK-Version";
|
|
1355
|
+
function sdkHeaders() {
|
|
1356
|
+
if (typeof window !== "undefined") return {};
|
|
1357
|
+
return {
|
|
1358
|
+
"User-Agent": SDK_USER_AGENT,
|
|
1359
|
+
[SDK_VERSION_HEADER]: SDK_VERSION
|
|
1360
|
+
};
|
|
1361
|
+
}
|
|
1362
|
+
var LATEST_VERSION_HEADER = "X-FFID-SDK-Latest-Version";
|
|
1363
|
+
var SEMVER_PATTERN = /^\d+(\.\d+)*$/;
|
|
1364
|
+
var _versionWarningShown = false;
|
|
1365
|
+
function compareSemver(a, b) {
|
|
1366
|
+
const cleanA = a.replace(/^v/, "");
|
|
1367
|
+
const cleanB = b.replace(/^v/, "");
|
|
1368
|
+
if (!SEMVER_PATTERN.test(cleanA) || !SEMVER_PATTERN.test(cleanB)) return 0;
|
|
1369
|
+
const partsA = cleanA.split(".").map(Number);
|
|
1370
|
+
const partsB = cleanB.split(".").map(Number);
|
|
1371
|
+
const maxLen = Math.max(partsA.length, partsB.length);
|
|
1372
|
+
for (let i = 0; i < maxLen; i++) {
|
|
1373
|
+
const numA = partsA[i] ?? 0;
|
|
1374
|
+
const numB = partsB[i] ?? 0;
|
|
1375
|
+
if (numA < numB) return -1;
|
|
1376
|
+
if (numA > numB) return 1;
|
|
1377
|
+
}
|
|
1378
|
+
return 0;
|
|
1379
|
+
}
|
|
1380
|
+
function checkVersionHeader(response, logger) {
|
|
1381
|
+
if (_versionWarningShown) return;
|
|
1382
|
+
if (typeof process !== "undefined" && process.env?.NODE_ENV === "production") return;
|
|
1383
|
+
if (!response.headers?.get) return;
|
|
1384
|
+
const latestVersion = response.headers.get(LATEST_VERSION_HEADER);
|
|
1385
|
+
if (!latestVersion) return;
|
|
1386
|
+
if (compareSemver(SDK_VERSION, latestVersion) < 0) {
|
|
1387
|
+
_versionWarningShown = true;
|
|
1388
|
+
logger.warn(
|
|
1389
|
+
`\u65B0\u3057\u3044\u30D0\u30FC\u30B8\u30E7\u30F3\u304C\u5229\u7528\u53EF\u80FD\u3067\u3059: v${latestVersion} (\u73FE\u5728: v${SDK_VERSION})
|
|
1390
|
+
npm install @feelflow/ffid-sdk@latest \u3067\u30A2\u30C3\u30D7\u30C7\u30FC\u30C8\u3067\u304D\u307E\u3059`
|
|
1391
|
+
);
|
|
1392
|
+
}
|
|
1393
|
+
}
|
|
1394
|
+
|
|
1395
|
+
// src/client/organization-profile-methods.ts
|
|
1396
|
+
var EXT_PROFILE_ENDPOINT = "/api/v1/organizations/ext/profile";
|
|
1397
|
+
var EXT_PROFILE_LOGO_ENDPOINT = "/api/v1/organizations/ext/profile/logo";
|
|
1398
|
+
var LOGO_WALL_ENDPOINT = "/api/v1/organizations/logo-wall";
|
|
1399
|
+
var DEFAULT_LOGO_UPLOAD_FILENAME = "logo";
|
|
1400
|
+
function isBlank(value) {
|
|
1401
|
+
return !value || !value.trim();
|
|
1402
|
+
}
|
|
1403
|
+
function resolveOrganizationId(organizationIdOrParams) {
|
|
1404
|
+
return typeof organizationIdOrParams === "string" ? organizationIdOrParams : organizationIdOrParams.organizationId;
|
|
1405
|
+
}
|
|
1406
|
+
function resolveUpsertParams(organizationIdOrParams, payload) {
|
|
1407
|
+
if (typeof organizationIdOrParams === "string") {
|
|
1408
|
+
return { ...payload, organizationId: organizationIdOrParams };
|
|
1409
|
+
}
|
|
1410
|
+
return organizationIdOrParams;
|
|
1411
|
+
}
|
|
1412
|
+
function resolveUploadParams(organizationIdOrParams, file) {
|
|
1413
|
+
if (typeof organizationIdOrParams === "string") {
|
|
1414
|
+
return { organizationId: organizationIdOrParams, file };
|
|
1415
|
+
}
|
|
1416
|
+
return organizationIdOrParams;
|
|
1417
|
+
}
|
|
1418
|
+
function buildUpsertBody(params) {
|
|
1419
|
+
const { organizationId, ...body } = params;
|
|
1420
|
+
return body;
|
|
1421
|
+
}
|
|
1422
|
+
function profileQuery(organizationId) {
|
|
1423
|
+
return new URLSearchParams({ organizationId }).toString();
|
|
1424
|
+
}
|
|
1425
|
+
function logoUploadFilename(file) {
|
|
1426
|
+
if (typeof File !== "undefined" && file instanceof File && file.name) {
|
|
1427
|
+
return file.name;
|
|
1428
|
+
}
|
|
1429
|
+
return DEFAULT_LOGO_UPLOAD_FILENAME;
|
|
1430
|
+
}
|
|
1431
|
+
function listingConsentValidationError(listingConsent, createError) {
|
|
1432
|
+
if (!listingConsent || listingConsent.consented !== true) return null;
|
|
1433
|
+
if (isBlank(listingConsent.consentVersion) || isBlank(listingConsent.consentedByUserId)) {
|
|
1434
|
+
return createError(
|
|
1435
|
+
FFID_ORGANIZATION_PROFILE_ERROR_CODES.VALIDATION_ERROR,
|
|
1436
|
+
"\u63B2\u8F09\u540C\u610F\u3092\u8A18\u9332\u3059\u308B\u5834\u5408\u306F consentVersion \u3068 consentedByUserId \u304C\u5FC5\u9808\u3067\u3059"
|
|
1437
|
+
);
|
|
1438
|
+
}
|
|
1439
|
+
return null;
|
|
1440
|
+
}
|
|
1441
|
+
function resolveLogoFile(file, createError) {
|
|
1442
|
+
if (!file) {
|
|
1443
|
+
return {
|
|
1444
|
+
ok: false,
|
|
1445
|
+
error: createError(
|
|
1446
|
+
FFID_ORGANIZATION_PROFILE_ERROR_CODES.MISSING_FILE,
|
|
1447
|
+
"file \u30D5\u30A3\u30FC\u30EB\u30C9\u306B\u30ED\u30B4\u753B\u50CF\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044"
|
|
1448
|
+
)
|
|
1449
|
+
};
|
|
1450
|
+
}
|
|
1451
|
+
if (file.size > FFID_MAX_ORGANIZATION_LOGO_FILE_SIZE_BYTES) {
|
|
1452
|
+
return {
|
|
1453
|
+
ok: false,
|
|
1454
|
+
error: createError(
|
|
1455
|
+
FFID_ORGANIZATION_PROFILE_ERROR_CODES.FILE_TOO_LARGE,
|
|
1456
|
+
`\u30ED\u30B4\u753B\u50CF\u306F${FFID_MAX_ORGANIZATION_LOGO_FILE_SIZE_MB}MB\u4EE5\u4E0B\u306B\u3057\u3066\u304F\u3060\u3055\u3044`
|
|
1457
|
+
)
|
|
1458
|
+
};
|
|
1459
|
+
}
|
|
1460
|
+
if (file.type !== "" && !FFID_ALLOWED_ORGANIZATION_LOGO_MIME_TYPES.includes(file.type)) {
|
|
1461
|
+
return {
|
|
1462
|
+
ok: false,
|
|
1463
|
+
error: createError(
|
|
1464
|
+
FFID_ORGANIZATION_PROFILE_ERROR_CODES.INVALID_FILE_TYPE,
|
|
1465
|
+
"\u30ED\u30B4\u753B\u50CF\u306F PNG / JPEG / WebP \u5F62\u5F0F\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044"
|
|
1466
|
+
)
|
|
1467
|
+
};
|
|
1468
|
+
}
|
|
1469
|
+
return { ok: true, file };
|
|
1470
|
+
}
|
|
1471
|
+
function createOrganizationProfileMethods(deps) {
|
|
1472
|
+
const { fetchWithAuth, createError, authMode, baseUrl, logger, errorCodes } = deps;
|
|
1473
|
+
function serviceKeyModeError() {
|
|
1474
|
+
if (authMode === "service-key") return null;
|
|
1475
|
+
return createError(
|
|
1476
|
+
FFID_ORGANIZATION_PROFILE_ERROR_CODES.VALIDATION_ERROR,
|
|
1477
|
+
"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"
|
|
1478
|
+
);
|
|
1479
|
+
}
|
|
1480
|
+
function requireOrganizationId(organizationId) {
|
|
1481
|
+
if (isBlank(organizationId)) {
|
|
1482
|
+
return createError(
|
|
1483
|
+
FFID_ORGANIZATION_PROFILE_ERROR_CODES.VALIDATION_ERROR,
|
|
1484
|
+
"organizationId \u306F\u5FC5\u9808\u3067\u3059"
|
|
1485
|
+
);
|
|
1486
|
+
}
|
|
1487
|
+
return null;
|
|
1488
|
+
}
|
|
1489
|
+
async function fetchPublic(endpoint, options = {}) {
|
|
1490
|
+
const url = `${baseUrl}${endpoint}`;
|
|
1491
|
+
logger.debug("Fetching (public):", url);
|
|
1492
|
+
let response;
|
|
1493
|
+
try {
|
|
1494
|
+
response = await fetch(url, {
|
|
1495
|
+
...options,
|
|
1496
|
+
credentials: "omit",
|
|
1497
|
+
headers: {
|
|
1498
|
+
...sdkHeaders(),
|
|
1499
|
+
...options.headers
|
|
1500
|
+
}
|
|
1501
|
+
});
|
|
1502
|
+
} catch (error) {
|
|
1503
|
+
logger.error("Network error:", error);
|
|
1504
|
+
return {
|
|
1505
|
+
error: {
|
|
1506
|
+
code: errorCodes.NETWORK_ERROR,
|
|
1507
|
+
message: error instanceof Error ? error.message : "\u30CD\u30C3\u30C8\u30EF\u30FC\u30AF\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F"
|
|
1508
|
+
}
|
|
1509
|
+
};
|
|
1510
|
+
}
|
|
1511
|
+
let parsed;
|
|
1512
|
+
try {
|
|
1513
|
+
parsed = await response.json();
|
|
1514
|
+
} catch (parseError) {
|
|
1515
|
+
logger.error("Parse error:", parseError, "Status:", response.status);
|
|
1516
|
+
return {
|
|
1517
|
+
error: {
|
|
1518
|
+
code: errorCodes.PARSE_ERROR,
|
|
1519
|
+
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})`
|
|
1520
|
+
}
|
|
1521
|
+
};
|
|
1522
|
+
}
|
|
1523
|
+
if (!parsed || typeof parsed !== "object") {
|
|
1524
|
+
return {
|
|
1525
|
+
error: {
|
|
1526
|
+
code: errorCodes.PARSE_ERROR,
|
|
1527
|
+
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})`
|
|
1528
|
+
}
|
|
1529
|
+
};
|
|
1530
|
+
}
|
|
1531
|
+
const raw = parsed;
|
|
1532
|
+
logger.debug("Response (public):", response.status, raw);
|
|
1533
|
+
checkVersionHeader(response, logger);
|
|
1534
|
+
if (!response.ok) {
|
|
1535
|
+
return {
|
|
1536
|
+
error: raw.error ?? {
|
|
1537
|
+
code: errorCodes.UNKNOWN_ERROR,
|
|
1538
|
+
message: "\u4E0D\u660E\u306A\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F"
|
|
1539
|
+
}
|
|
1540
|
+
};
|
|
1541
|
+
}
|
|
1542
|
+
if (raw.data === void 0) {
|
|
1543
|
+
return {
|
|
1544
|
+
error: {
|
|
1545
|
+
code: errorCodes.UNKNOWN_ERROR,
|
|
1546
|
+
message: "\u30B5\u30FC\u30D0\u30FC\u304B\u3089\u30C7\u30FC\u30BF\u304C\u8FD4\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F"
|
|
1547
|
+
}
|
|
1548
|
+
};
|
|
1549
|
+
}
|
|
1550
|
+
return { data: raw.data };
|
|
1551
|
+
}
|
|
1552
|
+
async function getOrganizationProfile(organizationIdOrParams) {
|
|
1553
|
+
const modeError = serviceKeyModeError();
|
|
1554
|
+
if (modeError) return { error: modeError };
|
|
1555
|
+
const organizationId = resolveOrganizationId(organizationIdOrParams);
|
|
1556
|
+
const idError = requireOrganizationId(organizationId);
|
|
1557
|
+
if (idError) return { error: idError };
|
|
1558
|
+
return fetchWithAuth(
|
|
1559
|
+
`${EXT_PROFILE_ENDPOINT}?${profileQuery(organizationId)}`
|
|
1560
|
+
);
|
|
1561
|
+
}
|
|
1562
|
+
async function upsertOrganizationProfile(organizationIdOrParams, payload) {
|
|
1563
|
+
const modeError = serviceKeyModeError();
|
|
1564
|
+
if (modeError) return { error: modeError };
|
|
1565
|
+
const params = resolveUpsertParams(organizationIdOrParams, payload);
|
|
1566
|
+
const idError = requireOrganizationId(params.organizationId);
|
|
1567
|
+
if (idError) return { error: idError };
|
|
1568
|
+
const consentError = listingConsentValidationError(params.listingConsent, createError);
|
|
1569
|
+
if (consentError) return { error: consentError };
|
|
1570
|
+
return fetchWithAuth(
|
|
1571
|
+
`${EXT_PROFILE_ENDPOINT}?${profileQuery(params.organizationId)}`,
|
|
1572
|
+
{
|
|
1573
|
+
method: "PUT",
|
|
1574
|
+
body: JSON.stringify(buildUpsertBody(params))
|
|
1575
|
+
}
|
|
1576
|
+
);
|
|
1577
|
+
}
|
|
1578
|
+
async function uploadOrganizationLogo(organizationIdOrParams, file) {
|
|
1579
|
+
const modeError = serviceKeyModeError();
|
|
1580
|
+
if (modeError) return { error: modeError };
|
|
1581
|
+
const params = resolveUploadParams(organizationIdOrParams, file);
|
|
1582
|
+
const idError = requireOrganizationId(params.organizationId);
|
|
1583
|
+
if (idError) return { error: idError };
|
|
1584
|
+
const logoFile = resolveLogoFile(params.file, createError);
|
|
1585
|
+
if (!logoFile.ok) return { error: logoFile.error };
|
|
1586
|
+
const form = new FormData();
|
|
1587
|
+
form.append("file", logoFile.file, logoUploadFilename(logoFile.file));
|
|
1588
|
+
return fetchWithAuth(
|
|
1589
|
+
`${EXT_PROFILE_LOGO_ENDPOINT}?${profileQuery(params.organizationId)}`,
|
|
1590
|
+
{ method: "POST", body: form }
|
|
1591
|
+
);
|
|
1592
|
+
}
|
|
1593
|
+
async function getPublicLogoWall() {
|
|
1594
|
+
return fetchPublic(LOGO_WALL_ENDPOINT);
|
|
1595
|
+
}
|
|
1596
|
+
return {
|
|
1597
|
+
getOrganizationProfile,
|
|
1598
|
+
upsertOrganizationProfile,
|
|
1599
|
+
uploadOrganizationLogo,
|
|
1600
|
+
getPublicLogoWall
|
|
1601
|
+
};
|
|
1602
|
+
}
|
|
1603
|
+
|
|
1300
1604
|
// src/client/provisioning-methods.ts
|
|
1301
1605
|
var USER_PROVISION_ENDPOINT = "/api/v1/ext/users/provision";
|
|
1302
1606
|
var USER_WELCOME_EMAIL_ENDPOINT = "/api/v1/ext/users/welcome-email";
|
|
@@ -1440,7 +1744,7 @@ function createSeatMethods(deps) {
|
|
|
1440
1744
|
}
|
|
1441
1745
|
|
|
1442
1746
|
// src/client/profile-methods.ts
|
|
1443
|
-
var
|
|
1747
|
+
var EXT_PROFILE_ENDPOINT2 = "/api/v1/users/ext/me";
|
|
1444
1748
|
function resolveAuthOverride(options, createError) {
|
|
1445
1749
|
if (!options || options.accessToken === void 0) {
|
|
1446
1750
|
return {};
|
|
@@ -1461,7 +1765,7 @@ function createProfileMethods(deps) {
|
|
|
1461
1765
|
async function getProfile(options) {
|
|
1462
1766
|
const { override, error } = resolveAuthOverride(options, createError);
|
|
1463
1767
|
if (error) return { error };
|
|
1464
|
-
return fetchWithAuth(
|
|
1768
|
+
return fetchWithAuth(EXT_PROFILE_ENDPOINT2, void 0, override);
|
|
1465
1769
|
}
|
|
1466
1770
|
async function updateProfile(data, options) {
|
|
1467
1771
|
if (data === null || typeof data !== "object" || Array.isArray(data)) {
|
|
@@ -1477,7 +1781,7 @@ function createProfileMethods(deps) {
|
|
|
1477
1781
|
const { override, error } = resolveAuthOverride(options, createError);
|
|
1478
1782
|
if (error) return { error };
|
|
1479
1783
|
return fetchWithAuth(
|
|
1480
|
-
|
|
1784
|
+
EXT_PROFILE_ENDPOINT2,
|
|
1481
1785
|
{
|
|
1482
1786
|
method: "PUT",
|
|
1483
1787
|
body: JSON.stringify(data)
|
|
@@ -1670,50 +1974,6 @@ function validateTokenResponse(tokenResponse) {
|
|
|
1670
1974
|
};
|
|
1671
1975
|
}
|
|
1672
1976
|
|
|
1673
|
-
// src/client/version-check.ts
|
|
1674
|
-
var SDK_VERSION = "6.0.0";
|
|
1675
|
-
var SDK_USER_AGENT = `FFID-SDK/${SDK_VERSION} (TypeScript)`;
|
|
1676
|
-
var SDK_VERSION_HEADER = "X-FFID-SDK-Version";
|
|
1677
|
-
function sdkHeaders() {
|
|
1678
|
-
if (typeof window !== "undefined") return {};
|
|
1679
|
-
return {
|
|
1680
|
-
"User-Agent": SDK_USER_AGENT,
|
|
1681
|
-
[SDK_VERSION_HEADER]: SDK_VERSION
|
|
1682
|
-
};
|
|
1683
|
-
}
|
|
1684
|
-
var LATEST_VERSION_HEADER = "X-FFID-SDK-Latest-Version";
|
|
1685
|
-
var SEMVER_PATTERN = /^\d+(\.\d+)*$/;
|
|
1686
|
-
var _versionWarningShown = false;
|
|
1687
|
-
function compareSemver(a, b) {
|
|
1688
|
-
const cleanA = a.replace(/^v/, "");
|
|
1689
|
-
const cleanB = b.replace(/^v/, "");
|
|
1690
|
-
if (!SEMVER_PATTERN.test(cleanA) || !SEMVER_PATTERN.test(cleanB)) return 0;
|
|
1691
|
-
const partsA = cleanA.split(".").map(Number);
|
|
1692
|
-
const partsB = cleanB.split(".").map(Number);
|
|
1693
|
-
const maxLen = Math.max(partsA.length, partsB.length);
|
|
1694
|
-
for (let i = 0; i < maxLen; i++) {
|
|
1695
|
-
const numA = partsA[i] ?? 0;
|
|
1696
|
-
const numB = partsB[i] ?? 0;
|
|
1697
|
-
if (numA < numB) return -1;
|
|
1698
|
-
if (numA > numB) return 1;
|
|
1699
|
-
}
|
|
1700
|
-
return 0;
|
|
1701
|
-
}
|
|
1702
|
-
function checkVersionHeader(response, logger) {
|
|
1703
|
-
if (_versionWarningShown) return;
|
|
1704
|
-
if (typeof process !== "undefined" && process.env?.NODE_ENV === "production") return;
|
|
1705
|
-
if (!response.headers?.get) return;
|
|
1706
|
-
const latestVersion = response.headers.get(LATEST_VERSION_HEADER);
|
|
1707
|
-
if (!latestVersion) return;
|
|
1708
|
-
if (compareSemver(SDK_VERSION, latestVersion) < 0) {
|
|
1709
|
-
_versionWarningShown = true;
|
|
1710
|
-
logger.warn(
|
|
1711
|
-
`\u65B0\u3057\u3044\u30D0\u30FC\u30B8\u30E7\u30F3\u304C\u5229\u7528\u53EF\u80FD\u3067\u3059: v${latestVersion} (\u73FE\u5728: v${SDK_VERSION})
|
|
1712
|
-
npm install @feelflow/ffid-sdk@latest \u3067\u30A2\u30C3\u30D7\u30C7\u30FC\u30C8\u3067\u304D\u307E\u3059`
|
|
1713
|
-
);
|
|
1714
|
-
}
|
|
1715
|
-
}
|
|
1716
|
-
|
|
1717
1977
|
// src/client/oauth-token.ts
|
|
1718
1978
|
var OAUTH_TOKEN_ENDPOINT = "/api/v1/oauth/token";
|
|
1719
1979
|
var OAUTH_REVOKE_ENDPOINT = "/api/v1/oauth/revoke";
|
|
@@ -2534,7 +2794,7 @@ function normalizeRedirectUri(input) {
|
|
|
2534
2794
|
|
|
2535
2795
|
// src/client/password-reset.ts
|
|
2536
2796
|
var RESET_PASSWORD_BASE = "/api/v1/auth/reset-password";
|
|
2537
|
-
function
|
|
2797
|
+
function isBlank2(value) {
|
|
2538
2798
|
return !value || !value.trim();
|
|
2539
2799
|
}
|
|
2540
2800
|
function createPasswordResetMethods(deps) {
|
|
@@ -2595,7 +2855,7 @@ function createPasswordResetMethods(deps) {
|
|
|
2595
2855
|
return { data: raw.data };
|
|
2596
2856
|
}
|
|
2597
2857
|
async function requestPasswordReset(email) {
|
|
2598
|
-
if (
|
|
2858
|
+
if (isBlank2(email)) {
|
|
2599
2859
|
return {
|
|
2600
2860
|
error: createError("VALIDATION_ERROR", "\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u306F\u5FC5\u9808\u3067\u3059")
|
|
2601
2861
|
};
|
|
@@ -2609,7 +2869,7 @@ function createPasswordResetMethods(deps) {
|
|
|
2609
2869
|
);
|
|
2610
2870
|
}
|
|
2611
2871
|
async function verifyPasswordResetToken(accessToken) {
|
|
2612
|
-
if (
|
|
2872
|
+
if (isBlank2(accessToken)) {
|
|
2613
2873
|
return {
|
|
2614
2874
|
error: createError("VALIDATION_ERROR", "\u30A2\u30AF\u30BB\u30B9\u30C8\u30FC\u30AF\u30F3\u306F\u5FC5\u9808\u3067\u3059")
|
|
2615
2875
|
};
|
|
@@ -2623,12 +2883,12 @@ function createPasswordResetMethods(deps) {
|
|
|
2623
2883
|
);
|
|
2624
2884
|
}
|
|
2625
2885
|
async function establishResetSession(accessToken, refreshToken) {
|
|
2626
|
-
if (
|
|
2886
|
+
if (isBlank2(accessToken)) {
|
|
2627
2887
|
return {
|
|
2628
2888
|
error: createError("VALIDATION_ERROR", "\u30A2\u30AF\u30BB\u30B9\u30C8\u30FC\u30AF\u30F3\u306F\u5FC5\u9808\u3067\u3059")
|
|
2629
2889
|
};
|
|
2630
2890
|
}
|
|
2631
|
-
if (
|
|
2891
|
+
if (isBlank2(refreshToken)) {
|
|
2632
2892
|
return {
|
|
2633
2893
|
error: createError("VALIDATION_ERROR", "\u30EA\u30D5\u30EC\u30C3\u30B7\u30E5\u30C8\u30FC\u30AF\u30F3\u306F\u5FC5\u9808\u3067\u3059")
|
|
2634
2894
|
};
|
|
@@ -2642,7 +2902,7 @@ function createPasswordResetMethods(deps) {
|
|
|
2642
2902
|
);
|
|
2643
2903
|
}
|
|
2644
2904
|
async function confirmPasswordReset(password) {
|
|
2645
|
-
if (
|
|
2905
|
+
if (isBlank2(password)) {
|
|
2646
2906
|
return {
|
|
2647
2907
|
error: createError("VALIDATION_ERROR", "\u30D1\u30B9\u30EF\u30FC\u30C9\u306F\u5FC5\u9808\u3067\u3059")
|
|
2648
2908
|
};
|
|
@@ -2665,7 +2925,7 @@ function createPasswordResetMethods(deps) {
|
|
|
2665
2925
|
|
|
2666
2926
|
// src/client/otp.ts
|
|
2667
2927
|
var OTP_BASE = "/api/v1/auth/otp";
|
|
2668
|
-
function
|
|
2928
|
+
function isBlank3(value) {
|
|
2669
2929
|
return !value || !value.trim();
|
|
2670
2930
|
}
|
|
2671
2931
|
function createOtpMethods(deps) {
|
|
@@ -2726,7 +2986,7 @@ function createOtpMethods(deps) {
|
|
|
2726
2986
|
return { data: raw.data };
|
|
2727
2987
|
}
|
|
2728
2988
|
async function sendOtp(email, options) {
|
|
2729
|
-
if (
|
|
2989
|
+
if (isBlank3(email)) {
|
|
2730
2990
|
return {
|
|
2731
2991
|
error: createError("VALIDATION_ERROR", "\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u306F\u5FC5\u9808\u3067\u3059")
|
|
2732
2992
|
};
|
|
@@ -2743,12 +3003,12 @@ function createOtpMethods(deps) {
|
|
|
2743
3003
|
);
|
|
2744
3004
|
}
|
|
2745
3005
|
async function verifyOtp(params) {
|
|
2746
|
-
if (
|
|
3006
|
+
if (isBlank3(params.accessToken)) {
|
|
2747
3007
|
return {
|
|
2748
3008
|
error: createError("VALIDATION_ERROR", "\u30A2\u30AF\u30BB\u30B9\u30C8\u30FC\u30AF\u30F3\u306F\u5FC5\u9808\u3067\u3059")
|
|
2749
3009
|
};
|
|
2750
3010
|
}
|
|
2751
|
-
if (
|
|
3011
|
+
if (isBlank3(params.refreshToken)) {
|
|
2752
3012
|
return {
|
|
2753
3013
|
error: createError("VALIDATION_ERROR", "\u30EA\u30D5\u30EC\u30C3\u30B7\u30E5\u30C8\u30FC\u30AF\u30F3\u306F\u5FC5\u9808\u3067\u3059")
|
|
2754
3014
|
};
|
|
@@ -3239,6 +3499,12 @@ function resolveRedirectUri(raw, logger) {
|
|
|
3239
3499
|
return raw;
|
|
3240
3500
|
}
|
|
3241
3501
|
}
|
|
3502
|
+
function jsonContentTypeHeader(body) {
|
|
3503
|
+
if (typeof FormData !== "undefined" && body instanceof FormData) {
|
|
3504
|
+
return {};
|
|
3505
|
+
}
|
|
3506
|
+
return { "Content-Type": "application/json" };
|
|
3507
|
+
}
|
|
3242
3508
|
function createFFIDClient(config) {
|
|
3243
3509
|
if (!config.serviceCode || !config.serviceCode.trim()) {
|
|
3244
3510
|
throw new Error("FFID Client: serviceCode \u304C\u672A\u8A2D\u5B9A\u3067\u3059");
|
|
@@ -3291,7 +3557,7 @@ function createFFIDClient(config) {
|
|
|
3291
3557
|
...options,
|
|
3292
3558
|
credentials: "omit",
|
|
3293
3559
|
headers: {
|
|
3294
|
-
|
|
3560
|
+
...jsonContentTypeHeader(options.body),
|
|
3295
3561
|
...sdkHeaders(),
|
|
3296
3562
|
...options.headers,
|
|
3297
3563
|
Authorization: `Bearer ${authOverride.accessToken}`
|
|
@@ -3303,7 +3569,7 @@ function createFFIDClient(config) {
|
|
|
3303
3569
|
...options,
|
|
3304
3570
|
credentials: "omit",
|
|
3305
3571
|
headers: {
|
|
3306
|
-
|
|
3572
|
+
...jsonContentTypeHeader(options.body),
|
|
3307
3573
|
...sdkHeaders(),
|
|
3308
3574
|
"X-Service-Api-Key": serviceApiKey,
|
|
3309
3575
|
...options.headers
|
|
@@ -3313,7 +3579,7 @@ function createFFIDClient(config) {
|
|
|
3313
3579
|
if (authMode === "token") {
|
|
3314
3580
|
const tokens = tokenStore.getTokens();
|
|
3315
3581
|
const headers = {
|
|
3316
|
-
|
|
3582
|
+
...jsonContentTypeHeader(options.body),
|
|
3317
3583
|
...sdkHeaders(),
|
|
3318
3584
|
...options.headers
|
|
3319
3585
|
};
|
|
@@ -3330,7 +3596,7 @@ function createFFIDClient(config) {
|
|
|
3330
3596
|
...options,
|
|
3331
3597
|
credentials: "include",
|
|
3332
3598
|
headers: {
|
|
3333
|
-
|
|
3599
|
+
...jsonContentTypeHeader(options.body),
|
|
3334
3600
|
...sdkHeaders(),
|
|
3335
3601
|
...options.headers
|
|
3336
3602
|
}
|
|
@@ -3547,6 +3813,19 @@ function createFFIDClient(config) {
|
|
|
3547
3813
|
createError,
|
|
3548
3814
|
serviceCode: config.serviceCode
|
|
3549
3815
|
});
|
|
3816
|
+
const {
|
|
3817
|
+
getOrganizationProfile,
|
|
3818
|
+
upsertOrganizationProfile,
|
|
3819
|
+
uploadOrganizationLogo,
|
|
3820
|
+
getPublicLogoWall
|
|
3821
|
+
} = createOrganizationProfileMethods({
|
|
3822
|
+
fetchWithAuth,
|
|
3823
|
+
createError,
|
|
3824
|
+
authMode,
|
|
3825
|
+
baseUrl,
|
|
3826
|
+
logger,
|
|
3827
|
+
errorCodes: FFID_ERROR_CODES
|
|
3828
|
+
});
|
|
3550
3829
|
const { provisionUser, sendProvisionWelcomeEmail, provisionOrganization } = createProvisioningMethods({
|
|
3551
3830
|
fetchWithAuth,
|
|
3552
3831
|
createError,
|
|
@@ -3647,6 +3926,10 @@ function createFFIDClient(config) {
|
|
|
3647
3926
|
addMember,
|
|
3648
3927
|
updateMemberRole,
|
|
3649
3928
|
removeMember,
|
|
3929
|
+
getOrganizationProfile,
|
|
3930
|
+
upsertOrganizationProfile,
|
|
3931
|
+
uploadOrganizationLogo,
|
|
3932
|
+
getPublicLogoWall,
|
|
3650
3933
|
provisionUser,
|
|
3651
3934
|
sendProvisionWelcomeEmail,
|
|
3652
3935
|
provisionOrganization,
|
|
@@ -4104,4 +4387,4 @@ function clear(opts = {}) {
|
|
|
4104
4387
|
}
|
|
4105
4388
|
var sessionCookies = { serialize, read, clear };
|
|
4106
4389
|
|
|
4107
|
-
export { ALL_DENIED_EXCEPT_NECESSARY, CATALOG_HASH_PATTERN, CONSENT_COOKIE_NAME, COOKIE_VERSION, FFIDCatalogHashError, FFID_CATALOG_ENVIRONMENTS, FFID_CATALOG_PUBLICATION_STATUSES, FFID_ERROR_CODES, FFID_SESSION_COOKIE_NAME, canonicalizeCatalogValue, computeFFIDCheckoutCopyHash, computeLegalDisclosureHash, computePaymentConfigurationHash, computePraxisCopyHash, computeScopeHash, computeTaxConfigurationHash, createFFIDClient, createKVCacheAdapter, createMemoryCacheAdapter, createServerAuthClient, createTokenStore, createVerifyAccessToken, decodeConsentCookie, encodeConsentCookie, generateServerState, getFFIDConsentFromCookieHeader, getFFIDConsentFromCookies, hashCanonicalJson, sessionCookies, sha256Hex, validatePublishedCatalog };
|
|
4390
|
+
export { ALL_DENIED_EXCEPT_NECESSARY, CATALOG_HASH_PATTERN, CONSENT_COOKIE_NAME, COOKIE_VERSION, FFIDCatalogHashError, FFID_ALLOWED_ORGANIZATION_LOGO_MIME_TYPES, FFID_CATALOG_ENVIRONMENTS, FFID_CATALOG_PUBLICATION_STATUSES, FFID_COMPANY_SIZE_CODES, FFID_ERROR_CODES, FFID_INDUSTRY_CODES, FFID_MAX_ORGANIZATION_LOGO_FILE_SIZE_BYTES, FFID_MAX_ORGANIZATION_LOGO_FILE_SIZE_MB, FFID_ORGANIZATION_PROFILE_ERROR_CODES, FFID_SESSION_COOKIE_NAME, canonicalizeCatalogValue, computeFFIDCheckoutCopyHash, computeLegalDisclosureHash, computePaymentConfigurationHash, computePraxisCopyHash, computeScopeHash, computeTaxConfigurationHash, createFFIDClient, createKVCacheAdapter, createMemoryCacheAdapter, createServerAuthClient, createTokenStore, createVerifyAccessToken, decodeConsentCookie, encodeConsentCookie, generateServerState, getFFIDConsentFromCookieHeader, getFFIDConsentFromCookies, hashCanonicalJson, sessionCookies, sha256Hex, validatePublishedCatalog };
|