Socket
Socket
Sign inDemoInstall

@hubspot/cms-lib

Package Overview
Dependencies
Maintainers
12
Versions
115
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@hubspot/cms-lib - npm Package Compare versions

Comparing version 1.1.9-beta.0 to 1.1.9-beta.1

__tests__/fixtures/hubdb/hubdbCreateRowsResponse.json

3

__mocks__/fs-extra.js

@@ -33,3 +33,6 @@ const { MODULE_EXTENSION } = require('../lib/constants');

fs.unlinkSync = () => true;
fs.outputFile = jest.fn((dest, data) => {
return data;
});
module.exports = fs;

@@ -45,3 +45,7 @@ const { shouldIgnoreFile } = require('../ignoreRules');

});
it('does not ignore the current folder', () => {
expect(shouldIgnoreFile('.', process.cwd())).toBe(false);
});
});
});

26

api/fileManager.js

@@ -28,3 +28,3 @@ const fs = require('fs');

async function getStat(portalId, src) {
async function fetchStat(portalId, src) {
return http.get(portalId, {

@@ -35,11 +35,21 @@ uri: `${FILE_MANAGER_API_PATH}/files/stat/${src}`,

async function getFilesByPath(portalId, src) {
async function fetchFiles(portalId, folderId, { offset, archived }) {
return http.get(portalId, {
uri: `${FILE_MANAGER_API_PATH}/files/path/${src}`,
uri: `${FILE_MANAGER_API_PATH}/files/`,
qs: {
hidden: 0,
offset: offset,
folder_id: folderId || 'None',
...(!archived && { archived: 0 }),
},
});
}
async function getFoldersByPath(portalId, src) {
async function fetchFolders(portalId, folderId) {
return http.get(portalId, {
uri: `${FILE_MANAGER_API_PATH}/folders/path/${src}`,
uri: `${FILE_MANAGER_API_PATH}/folders/`,
qs: {
hidden: 0,
parent_folder_id: folderId || 'None',
},
});

@@ -50,5 +60,5 @@ }

uploadFile,
getStat,
getFilesByPath,
getFoldersByPath,
fetchStat,
fetchFiles,
fetchFolders,
};
const http = require('../http');
const HUBDB_API_PATH = 'hubdb/api/v2';
const HUBDB_API_PATH = 'cms/v3/hubdb';

@@ -31,4 +31,4 @@ async function fetchTables(portalId) {

async function publishTable(portalId, tableId) {
return http.put(portalId, {
uri: `${HUBDB_API_PATH}/tables/${tableId}/publish`,
return http.post(portalId, {
uri: `${HUBDB_API_PATH}/tables/${tableId}/draft/push-live`,
});

@@ -45,3 +45,3 @@ }

return http.post(portalId, {
uri: `${HUBDB_API_PATH}/tables/${tableId}/rows/batch/update`,
uri: `${HUBDB_API_PATH}/tables/${tableId}/rows/draft/batch/update`,
body: rows,

@@ -53,4 +53,4 @@ });

return http.post(portalId, {
uri: `${HUBDB_API_PATH}/tables/${tableId}/rows/batch/create`,
body: rows,
uri: `${HUBDB_API_PATH}/tables/${tableId}/rows/draft/batch/create`,
body: { inputs: rows },
});

@@ -61,3 +61,3 @@ }

return http.get(portalId, {
uri: `${HUBDB_API_PATH}/tables/${tableId}/rows`,
uri: `${HUBDB_API_PATH}/tables/${tableId}/rows/draft`,
query,

@@ -69,4 +69,4 @@ });

return http.post(portalId, {
uri: `${HUBDB_API_PATH}/tables/${tableId}/rows/batch/delete`,
body: rowIds,
uri: `${HUBDB_API_PATH}/tables/${tableId}/rows/draft/batch/purge`,
body: { inputs: rowIds },
});

@@ -73,0 +73,0 @@ }

@@ -6,5 +6,5 @@ const fs = require('fs-extra');

uploadFile,
getStat,
getFilesByPath,
getFoldersByPath,
fetchStat,
fetchFiles,
fetchFolders,
} = require('./api/fileManager');

@@ -27,2 +27,3 @@ const { walk } = require('./lib/walk');

logFileSystemErrorInstance,
logApiErrorInstance,
logErrorInstance,

@@ -148,3 +149,3 @@ } = require('./errorHandlers');

*/
async function getAllPagedFiles(portalId, folderPath) {
async function fetchAllPagedFiles(portalId, folderId, { includeArchived }) {
let totalFiles = null;

@@ -155,3 +156,6 @@ let files = [];

while (totalFiles === null || count < totalFiles) {
const response = await getFilesByPath(portalId, folderPath, { offset });
const response = await fetchFiles(portalId, folderId, {
offset,
archived: includeArchived,
});

@@ -177,3 +181,3 @@ if (totalFiles === null) {

async function fetchFolderContents(portalId, folder, dest, options) {
const files = await getAllPagedFiles(portalId, folder.full_path);
const files = await fetchAllPagedFiles(portalId, folder.id, options);
for (const file of files) {

@@ -183,6 +187,3 @@ await downloadFile(portalId, file, dest, options);

const { objects: folders } = await getFoldersByPath(
portalId,
folder.full_path
);
const { objects: folders } = await fetchFolders(portalId, folder.id);
for (const folder of folders) {

@@ -195,3 +196,3 @@ const nestedFolder = path.join(dest, folder.name);

/**
* Fetch a file/folder and write to local file system.
* Download a folder and write to local file system.
*

@@ -201,26 +202,53 @@ * @param {number} portalId

* @param {string} dest
* @param {object} file
* @param {object} options
*/
async function downloadFileOrFolder(portalId, src, dest, options) {
const { file, folder } = await getStat(portalId, src);
if (file) {
async function downloadFolder(portalId, src, dest, folder, options) {
try {
const rootPath =
dest === getCwd()
? convertToLocalFileSystemPath(path.resolve(dest, folder.name))
: dest;
logger.log(
'Fetching file from "%s" to "%s" in the File Manager of portal %s',
'Fetching folder from "%s" to "%s" in the File Manager of portal %s',
src,
dest,
rootPath,
portalId
);
try {
await downloadFile(portalId, file, dest, options);
logger.success(
'Completed fetch of file "%s" to "%s" from the File Manager',
src,
dest
);
} catch (err) {
logErrorInstance(err);
}
} else if (folder) {
await fetchFolderContents(portalId, folder, rootPath, options);
logger.success(
'Completed fetch of folder "%s" to "%s" from the File Manager',
src,
dest
);
} catch (err) {
logErrorInstance(err);
}
}
/**
* Download a single file and write to local file system.
*
* @param {number} portalId
* @param {string} src
* @param {string} dest
* @param {object} file
* @param {object} options
*/
async function downloadSingleFile(portalId, src, dest, file, options) {
if (!options.includeArchived && file.archived) {
logger.error(
'"%s" in the File Manager is an archived file. Try fetching again with the "--include-archived" flag.',
src
);
return;
}
if (file.hidden) {
logger.error('"%s" in the File Manager is a hidden file.', src);
return;
}
try {
logger.log(
'Fetching files from "%s" to "%s" in the File Manager of portal %s',
'Fetching file from "%s" to "%s" in the File Manager of portal %s',
src,

@@ -230,15 +258,41 @@ dest,

);
await downloadFile(portalId, file, dest, options);
logger.success(
'Completed fetch of file "%s" to "%s" from the File Manager',
src,
dest
);
} catch (err) {
logErrorInstance(err);
}
}
/**
* Lookup path in file manager and initiate download
*
* @param {number} portalId
* @param {string} src
* @param {string} dest
* @param {object} options
*/
async function downloadFileOrFolder(portalId, src, dest, options) {
if (src === '/') {
await downloadFolder(portalId, src, dest, '', options);
} else {
try {
const rootPath =
dest === getCwd()
? convertToLocalFileSystemPath(path.resolve(dest, folder.name))
: dest;
await fetchFolderContents(portalId, folder, rootPath, options);
logger.success(
'Completed fetch of folder "%s" to "%s" from the File Manager',
src,
dest
const { file, folder } = await fetchStat(portalId, src);
if (file) {
downloadSingleFile(portalId, src, dest, file, options);
} else if (folder) {
downloadFolder(portalId, src, dest, folder, options);
}
} catch (err) {
logApiErrorInstance(
err,
new ApiErrorContext({
request: src,
portalId,
})
);
} catch (err) {
logger.error('Failed fetch of folder "%s" to "%s"', src, dest);
}

@@ -245,0 +299,0 @@ }

@@ -396,3 +396,7 @@ const fs = require('fs-extra');

await queue.onIdle();
logger.log('Completed fetch of file "%s" to "%s"', input.src, localFsPath);
logger.success(
'Completed fetch of file "%s" to "%s" from the Design Manager',
input.src,
localFsPath
);
} catch (err) {

@@ -402,3 +406,7 @@ if (isHubspot && isTimeout(err)) {

} else {
logger.error('Failed fetch of file "%s" to "%s"', input.src, input.dest);
logger.error(
'Failed fetch of file "%s" to "%s" from the Design Manager',
input.src,
input.dest
);
}

@@ -426,3 +434,7 @@ }

: await download(portalId, srcPath, { qs });
logger.log('Fetched "%s" from portal %d successfully', src, portalId);
logger.log(
'Fetched "%s" from portal %d from the Desing Manager successfully',
src,
portalId
);
return node;

@@ -470,5 +482,13 @@ } catch (err) {

await queue.onIdle();
logger.log('Completed fetch of folder "%s" to "%s"', input.src, input.dest);
logger.success(
'Completed fetch of folder "%s" to "%s" from the Design Manager',
input.src,
input.dest
);
} catch (err) {
logger.error('Failed fetch of folder "%s" to "%s"', input.src, input.dest);
logger.error(
'Failed fetch of folder "%s" to "%s" from the Design Manager',
input.src,
input.dest
);
}

@@ -475,0 +495,0 @@ }

@@ -35,15 +35,6 @@ const path = require('path');

async function addRowsToHubDbTable(portalId, tableId, rows, columns) {
async function addRowsToHubDbTable(portalId, tableId, rows) {
const rowsToUpdate = rows.map(row => {
const values = {};
const values = row.values;
columns.forEach(col => {
const { name, id } = col;
if (typeof row.values[name] !== 'undefined') {
values[id] = row.values[name];
} else {
values[id] = null;
}
});
return {

@@ -57,15 +48,11 @@ childTableId: 0,

let response;
if (rowsToUpdate.length > 0) {
response = await createRows(portalId, tableId, rowsToUpdate);
await createRows(portalId, tableId, rowsToUpdate);
}
await publishTable(portalId, tableId);
const { rowCount } = await publishTable(portalId, tableId);
return {
tableId,
rowCount:
response && Array.isArray(response) && response.length
? response[0].rows.length
: 0,
rowCount,
};

@@ -106,3 +93,3 @@ }

const cleanedColumns = columns
.filter(column => !column.deleted)
.filter(column => !column.deleted || !column.archived)
.map(column => {

@@ -115,2 +102,3 @@ const cleanedColumn = {

delete cleanedColumn.deleted;
delete cleanedColumn.archived;
delete cleanedColumn.foreignIdsByName;

@@ -123,15 +111,6 @@ delete cleanedColumn.foreignIdsById;

const cleanedRows = rows.map(row => {
const values = {};
columns.forEach(col => {
const { name, id } = col;
if (row.values[id] !== null) {
values[name] = row.values[id];
}
});
return {
path: row.path,
name: row.name,
isSoftEditable: row.isSoftEditable,
values,
values: row.values,
};

@@ -174,5 +153,5 @@ });

count += response.objects.length;
offset += response.objects.length;
rows = rows.concat(response.objects);
count += response.results.length;
offset += response.results.length;
rows = rows.concat(response.results);
}

@@ -201,8 +180,12 @@

count += response.objects.length;
offset += response.objects.length;
const rowIds = response.objects.map(row => row.id);
count += response.results.length;
offset += response.results.length;
const rowIds = response.results.map(row => row.id);
rows = rows.concat(rowIds);
}
return deleteRows(portalId, tableId, rows);
await deleteRows(portalId, tableId, rows);
return {
deletedRowCount: rows.length,
};
}

@@ -209,0 +192,0 @@

@@ -49,3 +49,4 @@ const fs = require('fs');

const relativeTo = configPath || cwd;
return ignoreRules.ignores(path.relative(relativeTo, file));
const relativePath = path.relative(relativeTo, file);
return !!relativePath && ignoreRules.ignores(relativePath);
}

@@ -52,0 +53,0 @@

@@ -113,3 +113,3 @@ const path = require('path');

.then(() => {
logger.log(
logger.success(
`Completed uploading files in ${src} to ${dest} in ${portalId}`

@@ -116,0 +116,0 @@ );

{
"name": "@hubspot/cms-lib",
"version": "1.1.9-beta.0",
"version": "1.1.9-beta.1",
"description": "Library for working with the HubSpot CMS",

@@ -34,3 +34,3 @@ "license": "Apache-2.0",

},
"gitHead": "053bc099d3cdaa0b897e98d08d3bd2f104eced4c"
"gitHead": "0bef59cbe5db6e5e64c60eea365efa5c4da4b232"
}
SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc