Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
dd00ff7
Release/25.7.8.2 (#615)
skyflow-bharti Jul 29, 2025
f13b04e
[AUTOMATED] Release - 2.5.0-beta.8
skyflow-bharti Jul 29, 2025
de01056
Release/25.7.8.2 (#616)
skyflow-bharti Jul 29, 2025
c482a14
SK-2239: add file metadata in file render and wcag keyboard actions
saileshwar-skyflow Aug 14, 2025
1ea0873
[AUTOMATED] Release - 2.4.3-dev.c482a14
saileshwar-skyflow Aug 14, 2025
15b2419
SK-2239: remove console log
saileshwar-skyflow Aug 14, 2025
6e78ac2
[AUTOMATED] Release - 2.4.3-dev.15b2419
saileshwar-skyflow Aug 14, 2025
f6980e9
Merge pull request #621 from skyflowapi/release/25.8.4
saileshwar-skyflow Aug 14, 2025
a4369f1
[AUTOMATED] Release - 2.5.0-beta.9
saileshwar-skyflow Aug 14, 2025
99fa815
SK-2254: fix 0px height in composable container
saileshwar-skyflow Aug 19, 2025
afa4277
[AUTOMATED] Release - 2.5.0-beta.9-dev.99fa815
saileshwar-skyflow Aug 19, 2025
fcfbd99
SK-2254: fix 0px height in composable reveal
saileshwar-skyflow Aug 19, 2025
3e89042
[AUTOMATED] Release - 2.5.0-beta.9-dev.fcfbd99
saileshwar-skyflow Aug 19, 2025
ff71850
SK-2254: add resize observer for multiple iframes
saileshwar-skyflow Aug 19, 2025
f295fe0
[AUTOMATED] Release - 2.5.0-beta.9-dev.ff71850
saileshwar-skyflow Aug 19, 2025
3d1ed74
SK-2254: add undefined check for resize observer for multiple iframes
saileshwar-skyflow Aug 19, 2025
fcc6e87
[AUTOMATED] Release - 2.5.0-beta.9-dev.3d1ed74
saileshwar-skyflow Aug 19, 2025
6d339a3
Merge pull request #622 from skyflowapi/release/25.8.5
saileshwar-skyflow Aug 19, 2025
dd803c1
[AUTOMATED] Release - 2.5.0-beta.10
saileshwar-skyflow Aug 19, 2025
c2310ae
Merge branch 'main' into beta-release/25.8.2
skyflow-bharti Oct 16, 2025
08ce547
SK-2330 fix the lint error
skyflow-bharti Oct 16, 2025
6d64db0
[AUTOMATED] Release - 2.5.0-beta.10-dev.08ce547
skyflow-bharti Oct 16, 2025
32d8779
Release/25.7.8.2 (#615)
skyflow-bharti Jul 29, 2025
de5826b
[AUTOMATED] Release - 2.5.0-beta.8
skyflow-bharti Jul 29, 2025
612083a
Release/25.7.8.2 (#616)
skyflow-bharti Jul 29, 2025
fd4c85f
SK-2239: add file metadata in file render and wcag keyboard actions
saileshwar-skyflow Aug 14, 2025
df2f10b
[AUTOMATED] Release - 2.4.3-dev.c482a14
saileshwar-skyflow Aug 14, 2025
b4ad374
SK-2239: remove console log
saileshwar-skyflow Aug 14, 2025
e149568
[AUTOMATED] Release - 2.4.3-dev.15b2419
saileshwar-skyflow Aug 14, 2025
c41bd46
[AUTOMATED] Release - 2.5.0-beta.9
saileshwar-skyflow Aug 14, 2025
0584100
SK-2254: fix 0px height in composable container
saileshwar-skyflow Aug 19, 2025
ad9d4ce
[AUTOMATED] Release - 2.5.0-beta.9-dev.99fa815
saileshwar-skyflow Aug 19, 2025
bbaf520
SK-2254: fix 0px height in composable reveal
saileshwar-skyflow Aug 19, 2025
159dda9
[AUTOMATED] Release - 2.5.0-beta.9-dev.fcfbd99
saileshwar-skyflow Aug 19, 2025
9a7a6cc
SK-2254: add resize observer for multiple iframes
saileshwar-skyflow Aug 19, 2025
1170930
[AUTOMATED] Release - 2.5.0-beta.9-dev.ff71850
saileshwar-skyflow Aug 19, 2025
2328f56
SK-2254: add undefined check for resize observer for multiple iframes
saileshwar-skyflow Aug 19, 2025
844a151
[AUTOMATED] Release - 2.5.0-beta.9-dev.3d1ed74
saileshwar-skyflow Aug 19, 2025
df87b1a
[AUTOMATED] Release - 2.5.0-beta.10
saileshwar-skyflow Aug 19, 2025
31f06b9
SK-2330 fix the lint error
skyflow-bharti Oct 16, 2025
1734710
[AUTOMATED] Release - 2.5.0-beta.10-dev.08ce547
skyflow-bharti Oct 16, 2025
9309abf
SK-2360 fix conflicts
skyflow-bharti Oct 30, 2025
379940c
[AUTOMATED] Release - 2.4.4-dev.9309abf
skyflow-bharti Oct 30, 2025
af74922
SK-2360 fix errors
skyflow-bharti Oct 30, 2025
e37a584
[AUTOMATED] Release - 2.4.4-dev.af74922
skyflow-bharti Oct 30, 2025
761cf54
SK-2360 fix errors
skyflow-bharti Oct 30, 2025
097701e
SK-2360 apply internal typescript changes
skyflow-bharti Oct 31, 2025
ec39118
SK-2360 update import statements
skyflow-bharti Nov 6, 2025
d179f43
SK-2360 added unit tests
skyflow-bharti Nov 14, 2025
4d1d0a9
SK-2360 fix unit tests
skyflow-bharti Nov 14, 2025
11155c3
SK-2360 fix unit tests
skyflow-bharti Nov 14, 2025
4b050d9
Merge branch 'release/25.11.3' into SK-2360-apply-the-typescript-supp…
skyflow-bharti Nov 14, 2025
014608d
SK-2360 added uni tests
skyflow-bharti Nov 17, 2025
641a405
SK-2360 test commit
skyflow-bharti Nov 17, 2025
b418697
[AUTOMATED] Release - 2.5.0-dev.641a405
skyflow-bharti Nov 17, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"name": "skyflow-js",
"preferGlobal": true,
"analyze": false,
"version": "2.5.0",
"version": "2.5.0-dev.641a405",
"author": "Skyflow",
"description": "Skyflow JavaScript SDK",
"homepage": "https://github.com/skyflowapi/skyflow-js",
Expand Down
147 changes: 146 additions & 1 deletion src/core-utils/collect.ts
Original file line number Diff line number Diff line change
Expand Up @@ -242,7 +242,7 @@ const updateRecordsInVault = (
options,
) => {
const table = skyflowIdRecord.fields.table;
const skyflowID = skyflowIdRecord.skyflowID;
const skyflowID = skyflowIdRecord?.skyflowID;
skyflowIdRecord.fields = omit(skyflowIdRecord.fields, 'table');
skyflowIdRecord.fields = omit(skyflowIdRecord.fields, 'skyflowID');
return client.request({
Expand Down Expand Up @@ -316,6 +316,151 @@ export const updateRecordsBySkyflowID = async (
});
});

export const updateRecordsBySkyflowIDComposable = async (
skyflowIdRecords,
client: Client,
options,
authToken: string,
) => new Promise((rootResolve, rootReject) => {
let updateResponseSet: Promise<any>[];
// eslint-disable-next-line prefer-const
updateResponseSet = skyflowIdRecords?.updateRecords?.map(
(skyflowIdRecord: IInsertRecord) => new Promise((resolve, reject) => {
updateRecordsInVault(skyflowIdRecord, client, authToken, options)
?.then((resolvedResult: any) => {
const resp = constructFinalUpdateRecordResponse(
resolvedResult,
options?.tokens,
skyflowIdRecord,
);
resolve(resp);
},
(rejectedResult) => {
let errorResponse = rejectedResult;
if (rejectedResult?.error) {
errorResponse = {
error: {
code: rejectedResult?.error?.code,
description: rejectedResult?.error?.description,
},
};
}
printLog(rejectedResult?.error?.description ?? '', MessageType.ERROR, LogLevel.ERROR);
reject(errorResponse);
})?.catch((error) => {
reject(error);
});
}),
);
Promise.allSettled(updateResponseSet)?.then((resultSet: any) => {
const recordsResponse: any[] = [];
const errorsResponse: any[] = [];
resultSet?.forEach((result: { status: string; value: any; reason?: any; }) => {
if (result?.status === 'fulfilled') {
recordsResponse?.push(result?.value);
} else {
errorsResponse?.push(result?.reason);
}
});

if (errorsResponse?.length === 0) {
rootResolve({ records: recordsResponse });
} else if (recordsResponse?.length === 0) {
rootReject({ errors: errorsResponse });
} else {
rootReject({ records: recordsResponse, errors: errorsResponse });
}
});
});

export const insertDataInCollect = async (
records,
client: Client,
options,
finalInsertRecords,
authToken: string,
) => new Promise((resolve) => {
let insertResponse: any;
let insertErrorResponse: any;
client
?.request({
body: JSON.stringify({
records,
}),
requestMethod: 'POST',
url: `${client.config.vaultURL}/v1/vaults/${client.config.vaultID}`,
headers: {
authorization: `Bearer ${authToken}`,
'content-type': 'application/json',
},
})
?.then((response: any) => {
insertResponse = constructInsertRecordResponse(
response,
options?.tokens,
finalInsertRecords?.records,
);
resolve(insertResponse);
})
?.catch((error) => {
insertErrorResponse = {
errors: [
{
error: {
code: error?.error?.code,
description: error?.error?.description,
},
},
],
};
resolve(insertErrorResponse);
});
});

export const insertDataInMultipleFiles = async (
records,
client: Client,
options,
finalInsertRecords,
authToken: string,
) => new Promise((resolve) => {
let insertResponse: any;
let insertErrorResponse: any;
client
?.request({
body: JSON.stringify({
records,
}),
requestMethod: 'POST',
url: `${client.config.vaultURL}/v1/vaults/${client.config.vaultID}`,
headers: {
authorization: `Bearer ${authToken}`,
'content-type': 'application/json',
},
})
?.then((response: any) => {
insertResponse = constructInsertRecordResponse(
response,
options?.tokens,
finalInsertRecords?.records,
);
resolve(insertResponse);
})
?.catch((error) => {
insertErrorResponse = {
errors: [
{
error: {
code: error?.error?.code,
description: error?.error?.description,
},
},
],
};
resolve(insertErrorResponse);
});
});

export const checkForElementMatchRule = (validations: IValidationRule[]) => {
if (!validations) return false;
for (let i = 0; i < validations.length; i += 1) {
Expand Down
112 changes: 111 additions & 1 deletion src/core-utils/reveal.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import {
GetResponseRecord,
GetByIdResponse,
GetByIdResponseRecord,
IRevealRecordComposable,
} from '../utils/common';
import { printLog } from '../utils/logs-helper';
import { FILE_DOWNLOAD_URL_PARAM } from '../core/constants';
Expand Down Expand Up @@ -145,7 +146,7 @@ export const getFileURLForRender = (

paramList += `${skyflowIdRecord.skyflowID}?`;

paramList += `fields=${skyflowIdRecord.column}&${FILE_DOWNLOAD_URL_PARAM}`;
paramList += `fields=${skyflowIdRecord.column}&${FILE_DOWNLOAD_URL_PARAM}&returnFileMetadata=true`;

const vaultEndPointurl: string = `${client.config.vaultURL}/v1/vaults/${client.config.vaultID}/${skyflowIdRecord.table}/${paramList}`;
return client.request({
Expand Down Expand Up @@ -182,6 +183,27 @@ export const getFileURLFromVaultBySkyflowID = (
rootReject(err);
}
});

export const getFileURLFromVaultBySkyflowIDComposable = (
skyflowIdRecord: IRevealRecord,
client: Client,
authToken: string,
): Promise<IRenderResponseType> => new Promise((rootResolve, rootReject) => {
try {
getFileURLForRender(
skyflowIdRecord, client, authToken as string,
).then((resolvedResult: IRenderResponseType) => {
rootResolve(resolvedResult);
}).catch((err: any) => {
const errorData = formatForRenderFileFailure(err, skyflowIdRecord.skyflowID as string,
skyflowIdRecord.column as string);
printLog(errorData.error?.description || '', MessageType.ERROR, LogLevel.ERROR);
rootReject(errorData);
});
} catch (err) {
rootReject(err);
}
});
export const fetchRecordsByTokenId = (
tokenIdRecords: IRevealRecord[],
client: Client,
Expand Down Expand Up @@ -235,6 +257,65 @@ export const fetchRecordsByTokenId = (
rootReject(err);
});
});

export const fetchRecordsByTokenIdComposable = (
tokenIdRecords: IRevealRecordComposable[],
client: Client,
authToken: string,
): Promise<IRevealResponseType> => new Promise((rootResolve, rootReject) => {
const vaultResponseSet: Promise<any>[] = tokenIdRecords?.map(
(tokenRecord) => new Promise((resolve) => {
const apiResponse: any = [];
const redaction: RedactionType = tokenRecord?.redaction ?? RedactionType.PLAIN_TEXT;

getTokenRecordsFromVault(tokenRecord?.token ?? '', redaction, client, authToken)
?.then(
(response: IApiSuccessResponse) => {
const fieldsData = formatForPureJsSuccess(response);
apiResponse?.push({
...fieldsData,
frameId: tokenRecord?.iframeName ?? '',
});
},
(cause: any) => {
const errorData = formatForPureJsFailure(cause, tokenRecord?.token ?? '');
printLog(errorData?.error?.description ?? '', MessageType.ERROR, LogLevel.ERROR);
apiResponse?.push({
...errorData,
frameId: tokenRecord?.iframeName ?? '',
});
},
)
?.finally(() => {
resolve(apiResponse);
});
}),
);

Promise.allSettled(vaultResponseSet)?.then((resultSet) => {
const recordsResponse: Record<string, any>[] = [];
const errorResponse: Record<string, any>[] = [];
resultSet?.forEach((result) => {
if (result?.status === 'fulfilled') {
result?.value?.forEach((res: Record<string, any>) => {
if (Object.prototype.hasOwnProperty.call(res, 'error')) {
errorResponse?.push(res);
} else {
recordsResponse?.push(res);
}
});
}
});
if (errorResponse?.length === 0) {
rootResolve({ records: recordsResponse });
} else if (recordsResponse?.length === 0) {
rootReject({ errors: errorResponse });
} else {
rootReject({ records: recordsResponse, errors: errorResponse });
}
});
});

export const formatRecordsForIframe = (response: IRevealResponseType) => {
const result: Record<string, string> = {};
if (response.records) {
Expand Down Expand Up @@ -264,6 +345,7 @@ export const formatForRenderClient = (response: IRenderResponseType, column: str
const successRecord = {
skyflow_id: response.fields.skyflow_id,
column,
fileMetadata: response.fileMetadata,
};
formattedResponse.success = successRecord;
} else if (response.errors) {
Expand Down Expand Up @@ -295,6 +377,34 @@ export const formatRecordsForClient = (response: IRevealResponseType): RevealRes
return revealResponse;
};

export const formatRecordsForClientComposable = (response) => {
let successRecords = [];
let errorRecords = [];

if (response?.errors && response?.errors?.length > 0) {
errorRecords = response?.errors?.map((errors) => ({
error: errors?.error ?? {},
}));
}

if (response?.records) {
successRecords = response?.records?.map((record) => ({
token: record?.[0]?.token ?? '',
valueType: record?.[0]?.valueType ?? '',
}));
}

if (successRecords?.length > 0 && errorRecords?.length > 0) {
return { success: successRecords, errors: errorRecords };
}

if (successRecords?.length > 0) {
return { success: successRecords };
}

return { errors: errorRecords };
};

export const fetchRecordsGET = async (
skyflowIdRecords: IGetRecord[],
client: Client,
Expand Down
24 changes: 24 additions & 0 deletions src/core/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,13 @@ export const SDK_IFRAME_EVENT = 'SDK IFRAME EVENT';
export const DOMAIN = 'US2';
export const CORALOGIX_DOMAIN = 'https://cdn.rum-ingress-coralogix.com/coralogix/browser/latest/coralogix-browser-sdk.js';
export const FRAME_ELEMENT = 'element';
export const COMPOSABLE_REVEAL = 'reveal-composable';

export const ELEMENT_TYPES = {
COLLECT: 'COLLECT',
REVEAL: 'REVEAL',
COMPOSE: 'COMPOSABLE',
REVEAL_COMPOSE: 'REVEAL_COMPOSE',
};

export const EVENT_TYPES = {
Expand Down Expand Up @@ -105,8 +107,19 @@ export const ELEMENT_EVENTS_TO_CLIENT = {
};

export const ELEMENT_EVENTS_TO_IFRAME = {
MULTIPLE_UPLOAD_FILES_RESPONSE: 'MULTIPLE_UPLOAD_FILES_RESPONSE',
RENDER_MOUNTED: 'RENDER_MOUNTED',
HEIGHT_CALLBACK: 'HEIGHT_CALLBACK',
HEIGHT_CALLBACK_COMPOSABLE: 'HEIGHT_CALLBACK_COMPOSABLE',
COMPOSABLE_REVEAL: 'COMPOSABLE_REVEAL',
MULTIPLE_UPLOAD_FILES: 'MULTIPLE_UPLOAD_FILES',
COLLECT_CALL_REQUESTS: 'COLLECT_CALL_REQUESTS',
COMPOSABLE_CALL_REQUESTS: 'COMPOSABLE_CALL_REQUESTS',
COMPOSABLE_CALL_RESPONSE: 'COMPOSABLE_CALL_RESPONSE',
COMPOSABLE_FILE_CALL_RESPONSE: 'COMPOSABLE_FILE_CALL_RESPONSE',
COMPOSABLE_CONTAINER: 'COMPOSABLE_CONTAINER',
REVEAL_CALL_REQUESTS: 'REVEAL_CALL_REQUESTS',
REVEAL_CALL_RESPONSE: 'REVEAL_CALL_RESPONSE',
FRAME_READY: 'FRAME_READY',
READY_FOR_CLIENT: 'READY_FOR_CLIENT',
TOKENIZATION_REQUEST: 'TOKENIZATION_REQUEST',
Expand Down Expand Up @@ -163,6 +176,7 @@ export enum ElementType {
EXPIRATION_MONTH = 'EXPIRATION_MONTH',
EXPIRATION_YEAR = 'EXPIRATION_YEAR',
FILE_INPUT = 'FILE_INPUT',
MULTI_FILE_INPUT = 'MULTI_FILE_INPUT',
}

export enum CardType {
Expand Down Expand Up @@ -325,6 +339,14 @@ export const ELEMENTS = {
type: 'file',
},
},
[ElementType.MULTI_FILE_INPUT]: {
name: 'MULTI_FILE_INPUT',
sensitive: true,
attributes: {
type: 'file',
multiple: '',
},
},
};

export const CARDNUMBER_INPUT_FORMAT = {
Expand Down Expand Up @@ -638,6 +660,7 @@ export const DEFAULT_ERROR_TEXT_ELEMENT_TYPES = {
[ElementType.EXPIRATION_MONTH]: 'Invalid expiration month',
[ElementType.EXPIRATION_YEAR]: 'Invalid expiration year',
[ElementType.FILE_INPUT]: logs.errorLogs.INVALID_COLLECT_VALUE,
[ElementType.MULTI_FILE_INPUT]: logs.errorLogs.INVALID_COLLECT_VALUE,
};

export const DEFAULT_REQUIRED_TEXT_ELEMENT_TYPES = {
Expand All @@ -650,6 +673,7 @@ export const DEFAULT_REQUIRED_TEXT_ELEMENT_TYPES = {
[ElementType.EXPIRATION_MONTH]: 'expiration month is required',
[ElementType.EXPIRATION_YEAR]: 'expiration year is required',
[ElementType.FILE_INPUT]: logs.errorLogs.DEFAULT_REQUIRED_COLLECT_VALUE,
[ElementType.MULTI_FILE_INPUT]: logs.errorLogs.DEFAULT_REQUIRED_COLLECT_VALUE,
};

export const INPUT_KEYBOARD_EVENTS = {
Expand Down
Loading