1
1
/** @module hubspot/upload */
2
2
/// <reference path="../types/types.js" />
3
+ import fsPromises from 'fs/promises'
3
4
import uploadFolder from '@hubspot/local-dev-lib/cms/uploadFolder'
4
5
import { deleteFile , getDirectoryContentsByPath } from '@hubspot/local-dev-lib/api/fileMapper'
5
6
import { setLogLevel , LOG_LEVEL } from '@hubspot/local-dev-lib/logger'
@@ -9,6 +10,7 @@ import { walk } from '@hubspot/local-dev-lib/fs'
9
10
import * as ui from '../utils/ui.js'
10
11
import { getThemeOptions } from '../utils/options.js'
11
12
import { throwErrorIfMissingScope } from './auth/scopes.js'
13
+ import { isFileDir } from '../utils/fs.js'
12
14
import ora from 'ora'
13
15
import chalk from 'chalk'
14
16
@@ -47,6 +49,59 @@ const getUploadableFileList = async (src) => {
47
49
return allowedFiles
48
50
}
49
51
52
+ /**
53
+ * #### Reads the .cihsignore file and returns the list of files to ignore.
54
+ * @private
55
+ * @async
56
+ * @returns {Promise<string[]> } List of files to ignore.
57
+ */
58
+ async function readCihsIgnore ( ) {
59
+ try {
60
+ if ( await isFileDir ( `${ process . cwd ( ) } /.cihsignore` ) ) {
61
+ const ignoreContent = await fsPromises . readFile ( `${ process . cwd ( ) } /.cihsignore` , 'utf8' )
62
+ return ignoreContent . split ( '\n' ) . map ( line => line . trim ( ) ) . filter ( line => line && ! line . startsWith ( '#' ) )
63
+ } else {
64
+ return [ ]
65
+ }
66
+ } catch ( error ) {
67
+ console . error ( 'Error reading .cihsignore file:' , error )
68
+ return [ ]
69
+ }
70
+ }
71
+
72
+ /**
73
+ * #### Walks the src folder for files, filters them based on ignore filter and CI .cihsignore file.
74
+ * @async
75
+ * @private
76
+ * @param {string } src - src folder
77
+ * @returns {Promise<Array<string>> } src file list
78
+ */
79
+ const getCiUploadableFileList = async ( src ) => {
80
+ /**
81
+ * @type {Array<string> }
82
+ */
83
+ let filePaths = [ ]
84
+ try {
85
+ filePaths = await walk ( src )
86
+ } catch ( error ) {
87
+ console . error ( error )
88
+ }
89
+ let allowedFiles = filePaths . filter ( ( /** @type {any } */ file ) => {
90
+ if ( ! isAllowedExtension ( file ) ) {
91
+ return false
92
+ }
93
+ return true
94
+ // @ts -ignore
95
+ } ) . filter ( createIgnoreFilter ( ) )
96
+
97
+ async function filterFiles ( /** @type {any } */ files ) {
98
+ const ignoredPaths = await readCihsIgnore ( )
99
+ return files . filter ( ( /** @type {any } */ file ) => ! ignoredPaths . some ( ignoredPath => file . includes ( ignoredPath ) ) )
100
+ }
101
+ allowedFiles = await filterFiles ( allowedFiles )
102
+ return allowedFiles
103
+ }
104
+
50
105
/**
51
106
* #### upload all HubSpot theme files
52
107
* @async
@@ -111,8 +166,8 @@ async function cleanUploadThemeTemplates (config, themeName) {
111
166
setLogLevel ( LOG_LEVEL . NONE )
112
167
const uploadableFileList = await getUploadableFileList ( src )
113
168
const filesToDelete = await getDirectoryContentsByPath ( portalId , dest )
114
- if ( filesToDelete !== undefined && filesToDelete . children . length > 0 ) {
115
- for await ( const file of filesToDelete . children ) {
169
+ if ( filesToDelete !== undefined && filesToDelete . data . children . length > 0 ) {
170
+ for await ( const file of filesToDelete . data . children ) {
116
171
// @ts -ignore
117
172
if ( file . includes ( '.html' ) ) {
118
173
await deleteFile ( portalId , `${ dest } /${ file } ` )
@@ -168,8 +223,8 @@ async function cleanUploadTheme (config, themeName) {
168
223
const uploadableFileList = await getUploadableFileList ( src )
169
224
spinner . start ( )
170
225
const filesToDelete = await getDirectoryContentsByPath ( portalId , '/' )
171
- if ( filesToDelete !== undefined && filesToDelete . children . length > 0 ) {
172
- for await ( const file of filesToDelete . children ) {
226
+ if ( filesToDelete !== undefined && filesToDelete . data . children . length > 0 ) {
227
+ for await ( const file of filesToDelete . data . children ) {
173
228
// @ts -ignore
174
229
if ( file === dest ) {
175
230
await deleteFile ( portalId , file )
@@ -204,4 +259,61 @@ async function cleanUploadTheme (config, themeName) {
204
259
}
205
260
}
206
261
207
- export { uploadTheme , cleanUploadThemeTemplates , cleanUploadTheme }
262
+ /**
263
+ * #### CI clean theme upload
264
+ * @async
265
+ * @param {HUBSPOT_AUTH_CONFIG } config - hubspot authentication config
266
+ * @param {string } themeName - theme name
267
+ * @returns undefined
268
+ */
269
+ async function ciUploadTheme ( config , themeName ) {
270
+ const timeStart = ui . startTask ( 'ciUpload' )
271
+ const dest = themeName
272
+ const spinner = ora ( `Clean ${ dest } folder before upload` )
273
+ try {
274
+ const cmslibOptions = getThemeOptions ( )
275
+ const src = `${ process . cwd ( ) } /${ cmslibOptions . themeFolder } `
276
+ const portalId = config . portals [ 0 ] . portalId
277
+
278
+ throwErrorIfMissingScope ( config , 'design_manager' )
279
+ setLogLevel ( LOG_LEVEL . LOG )
280
+ const uploadableFileList = await getCiUploadableFileList ( src )
281
+ spinner . start ( )
282
+ const filesToDelete = await getDirectoryContentsByPath ( portalId , '/' )
283
+ if ( filesToDelete !== undefined && filesToDelete . data . children . length > 0 ) {
284
+ for await ( const file of filesToDelete . data . children ) {
285
+ // @ts -ignore
286
+ if ( file === dest ) {
287
+ await deleteFile ( portalId , file )
288
+ }
289
+ }
290
+ }
291
+ spinner . succeed ( )
292
+ await uploadFolder . uploadFolder (
293
+ portalId ,
294
+ src ,
295
+ dest ,
296
+ { overwrite : false } ,
297
+ { saveOutput : true , convertFields : false } ,
298
+ uploadableFileList ,
299
+ cmsMode
300
+ )
301
+ ui . endTask ( { taskName : 'ciUpload' , timeStart } )
302
+ } catch ( error ) {
303
+ spinner . fail ( )
304
+ if ( error . cause . response . data . errorType === 'TEMPLATE_VALIDATION_FAILED' ) {
305
+ console . error ( chalk . red ( error . cause . response . data . errorType ) )
306
+ console . error ( error . message )
307
+ process . exitCode = 1
308
+ } else {
309
+ console . error ( error . message )
310
+ process . exitCode = 1
311
+ }
312
+ if ( process . env . DEBUG_MODE === 'debug' ) {
313
+ console . error ( error )
314
+ process . exitCode = 1
315
+ }
316
+ }
317
+ }
318
+
319
+ export { uploadTheme , cleanUploadThemeTemplates , cleanUploadTheme , ciUploadTheme }
0 commit comments