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