UNPKG

vtex

Version:

The platform for e-commerce apps

117 lines (116 loc) 5.58 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const tslib_1 = require("tslib"); const async_retry_1 = tslib_1.__importDefault(require("async-retry")); const chalk_1 = tslib_1.__importDefault(require("chalk")); const ramda_1 = require("ramda"); const api_1 = require("../../api"); const Builder_1 = require("../../api/clients/IOClients/apps/Builder"); const utils_1 = require("../../api/error/utils"); const ProjectFilesManager_1 = require("../../api/files/ProjectFilesManager"); const YarnFilesManager_1 = require("../../api/files/YarnFilesManager"); const logger_1 = tslib_1.__importDefault(require("../../api/logger")); const ManifestUtil_1 = require("../../api/manifest/ManifestUtil"); const file_1 = require("../../api/modules/apps/file"); const ProjectUploader_1 = require("../../api/modules/apps/ProjectUploader"); const build_1 = require("../../api/modules/build"); const utils_2 = require("../../api/modules/utils"); const pinnedDependencies_1 = require("../../api/pinnedDependencies"); const utils_3 = require("../utils"); const buildersToRunLocalYarn = ['react', 'node']; const RETRY_OPTS_TEST = { retries: 2, minTimeout: 1000, factor: 2, }; const performTest = async (root, projectUploader, extraData, unsafe) => { const yarnFilesManager = await YarnFilesManager_1.YarnFilesManager.createFilesManager(root); extraData.yarnFilesManager = yarnFilesManager; yarnFilesManager.logSymlinkedDependencies(); const testApp = async (bail, tryCount) => { const test = true; const [localFiles, linkedFiles] = await Promise.all([ file_1.listLocalFiles(root, test).then(paths => ramda_1.map(ProjectFilesManager_1.createPathToFileObject(root), paths)), yarnFilesManager.getYarnLinkedFiles(), ]); const filesWithContent = ramda_1.concat(localFiles, linkedFiles); if (tryCount === 1) { const linkedFilesInfo = linkedFiles.length ? `(${linkedFiles.length} from linked node modules)` : ''; logger_1.default.info(`Sending ${filesWithContent.length} file${filesWithContent.length > 1 ? 's' : ''} ${linkedFilesInfo}`); logger_1.default.debug('Sending files'); filesWithContent.forEach(p => logger_1.default.debug(p.path)); } if (tryCount > 1) { logger_1.default.info(`Retrying...${tryCount - 1}`); } try { const { code } = await projectUploader.sendToTest(filesWithContent, { tsErrorsAsWarnings: unsafe }); if (code !== 'build.accepted') { bail(new Error('Please, update your builder-hub to the latest version!')); } } catch (err) { const { response } = err; const { status } = response; const data = response === null || response === void 0 ? void 0 : response.data; const { message } = data; const statusMessage = status ? `: Status ${status}` : ''; logger_1.default.error(`Error testing app${statusMessage} (try: ${tryCount})`); if (message) { logger_1.default.error(`Message: ${message}`); } if (status && status < 500) { return; } throw err; } }; await async_retry_1.default(testApp, RETRY_OPTS_TEST); }; exports.default = async (options) => { await utils_2.validateAppAction('test'); const unsafe = !!(options.unsafe || options.u); const root = ManifestUtil_1.getAppRoot(); const manifest = await api_1.ManifestEditor.getManifestEditor(); await manifest.writeSchema(); const appId = manifest.appLocator; const builder = Builder_1.Builder.createClient({}, { timeout: 60000 }); const projectUploader = ProjectUploader_1.ProjectUploader.getProjectUploader(appId, builder); try { const pinnedDeps = await builder.getPinnedDependencies(); await pinnedDependencies_1.fixPinnedDependencies(pinnedDeps, buildersToRunLocalYarn, manifest.builders); } catch (e) { logger_1.default.info('Failed to check for pinned dependencies'); } // Always run yarn locally for some builders ramda_1.map(utils_3.runYarnIfPathExists, buildersToRunLocalYarn); const onError = { // eslint-disable-next-line @typescript-eslint/camelcase build_failed: () => { logger_1.default.error(`App build failed. Waiting for changes...`); }, }; const onBuild = async () => { process.exit(); }; logger_1.default.info(`Testing app ${appId}`); const extraData = { linkConfig: null }; try { const buildTrigger = performTest.bind(this, root, projectUploader, extraData, unsafe); const [subject] = appId.split('@'); await build_1.listenBuild(subject, buildTrigger, { waitCompletion: false, onBuild, onError }).then(ramda_1.prop('unlisten')); } catch (e) { if (e.response) { const { data } = e.response; if (data.code === 'routing_error' && /app_not_found.*vtex\.builder-hub/.test(data.message)) { return logger_1.default.error('Please install vtex.builder-hub in your account to enable app testing (vtex install vtex.builder-hub)'); } if (data.code === 'link_on_production') { throw utils_1.createFlowIssueError(`Please use a dev workspace to test apps. Create one with (${chalk_1.default.blue('vtex use <workspace> -rp')}) to be able to test apps`); } } throw e; } };