@hubspot/cms-lib
Advanced tools
Comparing version 1.1.9-beta.0 to 1.1.9-beta.1
@@ -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); | ||
}); | ||
}); | ||
}); |
@@ -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 @@ } |
55
hubdb.js
@@ -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" | ||
} |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
205741
70
6755
28