diff --git a/maintenance/projects/js-themes-toolkit-v8-x/packages/liferay-theme-tasks/lib/doctor.js b/maintenance/projects/js-themes-toolkit-v8-x/packages/liferay-theme-tasks/lib/doctor.js index 3b5e3d34be..f7e2dcda41 100644 --- a/maintenance/projects/js-themes-toolkit-v8-x/packages/liferay-theme-tasks/lib/doctor.js +++ b/maintenance/projects/js-themes-toolkit-v8-x/packages/liferay-theme-tasks/lib/doctor.js @@ -86,6 +86,7 @@ function assertTasksSupported(version, tasks) { default: { const message = getSupportedTasks(task)[version] || ''; + if (message !== true) { log( colors.yellow( diff --git a/maintenance/projects/js-themes-toolkit-v8-x/packages/liferay-theme-tasks/lib/prompts/__tests__/extend_prompt.test.js b/maintenance/projects/js-themes-toolkit-v8-x/packages/liferay-theme-tasks/lib/prompts/__tests__/extend_prompt.test.js index 65b6fd422d..f31a8c5d59 100644 --- a/maintenance/projects/js-themes-toolkit-v8-x/packages/liferay-theme-tasks/lib/prompts/__tests__/extend_prompt.test.js +++ b/maintenance/projects/js-themes-toolkit-v8-x/packages/liferay-theme-tasks/lib/prompts/__tests__/extend_prompt.test.js @@ -438,6 +438,7 @@ it('_promptThemeSource should prompt correct workflow', () => { prototype._promptThemeSource(); const args = inquirer.prompt.getCall(0).args; + const questions = args[0]; const extendType = questions[0]; diff --git a/maintenance/projects/js-themes-toolkit-v8-x/packages/liferay-theme-tasks/lib/prompts/__tests__/prompt_util.test.js b/maintenance/projects/js-themes-toolkit-v8-x/packages/liferay-theme-tasks/lib/prompts/__tests__/prompt_util.test.js index 4a8aef046b..8015ca437e 100644 --- a/maintenance/projects/js-themes-toolkit-v8-x/packages/liferay-theme-tasks/lib/prompts/__tests__/prompt_util.test.js +++ b/maintenance/projects/js-themes-toolkit-v8-x/packages/liferay-theme-tasks/lib/prompts/__tests__/prompt_util.test.js @@ -66,6 +66,7 @@ it('getModuleChoices should get module choices that are appropriate for extend t _.forEach(choices, (item, index) => { const number = index + 1; + const name = 'themelet-' + number; expect(item.name).toBe(name); @@ -78,6 +79,7 @@ it('getModuleChoices should get module choices that are appropriate for extend t _.forEach(choices, (item, index) => { const number = index + 1; + const name = 'themelet-' + number; if (number === 1) { @@ -93,6 +95,7 @@ it('getModuleChoices should get module choices that are appropriate for extend t _.forEach(choices, (item, index) => { const number = index + 1; + const name = 'themelet-' + number; expect(!item.checked).toBe(true); @@ -106,6 +109,7 @@ it('getModuleChoices should get module choices that are appropriate for extend t _.forEach(choices, (item, index) => { const number = index + 1; + const name = 'themelet-' + number; if (number === 1) { diff --git a/maintenance/projects/js-themes-toolkit-v8-x/packages/liferay-theme-tasks/lib/prompts/extend_prompt.js b/maintenance/projects/js-themes-toolkit-v8-x/packages/liferay-theme-tasks/lib/prompts/extend_prompt.js index 01b91ee7c9..9263aab317 100644 --- a/maintenance/projects/js-themes-toolkit-v8-x/packages/liferay-theme-tasks/lib/prompts/extend_prompt.js +++ b/maintenance/projects/js-themes-toolkit-v8-x/packages/liferay-theme-tasks/lib/prompts/extend_prompt.js @@ -71,6 +71,7 @@ class ExtendPrompt { const baseTheme = this.themeConfig.baseTheme; const module = answers.module; const modulePackages = answers.modules; + const pkg = modulePackages[module]; if (!module) { diff --git a/maintenance/projects/js-themes-toolkit-v8-x/packages/liferay-theme-tasks/lib/theme_finder.js b/maintenance/projects/js-themes-toolkit-v8-x/packages/liferay-theme-tasks/lib/theme_finder.js index 30e073b0d6..caf7c395d1 100644 --- a/maintenance/projects/js-themes-toolkit-v8-x/packages/liferay-theme-tasks/lib/theme_finder.js +++ b/maintenance/projects/js-themes-toolkit-v8-x/packages/liferay-theme-tasks/lib/theme_finder.js @@ -114,9 +114,11 @@ function getLiferayThemeModuleFromURL(url) { // Just in case package name doesn't match URL basename, read it. const {dependencies} = JSON.parse(fs.readFileSync('package.json')); + const themeName = Object.keys(dependencies)[0]; const json = path.join('node_modules', themeName, 'package.json'); + config = JSON.parse(fs.readFileSync(json)); }); @@ -183,6 +185,7 @@ module.exports = { */ function withScratchDirectory(cb) { const template = path.join(os.tmpdir(), 'theme-finder-'); + const directory = fs.mkdtempSync(template); const cwd = process.cwd(); diff --git a/maintenance/projects/js-themes-toolkit-v8-x/packages/liferay-theme-tasks/lib/upgrade/6.2/upgrade.js b/maintenance/projects/js-themes-toolkit-v8-x/packages/liferay-theme-tasks/lib/upgrade/6.2/upgrade.js index a1158c28da..a995f26be4 100644 --- a/maintenance/projects/js-themes-toolkit-v8-x/packages/liferay-theme-tasks/lib/upgrade/6.2/upgrade.js +++ b/maintenance/projects/js-themes-toolkit-v8-x/packages/liferay-theme-tasks/lib/upgrade/6.2/upgrade.js @@ -281,6 +281,7 @@ module.exports = function (options) { .pipe( plugins.filter((file) => { const extname = path.extname(file.path).slice(1); + const basename = path.basename(file.path, `.${extname}`); if (promptResults[basename][extname]) { diff --git a/maintenance/projects/js-themes-toolkit-v8-x/packages/liferay-theme-tasks/lib/util.js b/maintenance/projects/js-themes-toolkit-v8-x/packages/liferay-theme-tasks/lib/util.js index e3f15286c6..1b1a567ea1 100644 --- a/maintenance/projects/js-themes-toolkit-v8-x/packages/liferay-theme-tasks/lib/util.js +++ b/maintenance/projects/js-themes-toolkit-v8-x/packages/liferay-theme-tasks/lib/util.js @@ -18,6 +18,7 @@ const lfrThemeConfig = require('./liferay_theme_config'); const argv = minimist(process.argv.slice(2)); const pkg = lfrThemeConfig.getConfig(true); + const themeConfig = pkg.liferayTheme; const CUSTOM_DEP_PATH_ENV_VARIABLE_MAP = { diff --git a/maintenance/projects/js-themes-toolkit-v8-x/packages/liferay-theme-tasks/tasks/__tests__/build.test.js b/maintenance/projects/js-themes-toolkit-v8-x/packages/liferay-theme-tasks/tasks/__tests__/build.test.js index d229525156..624124fe15 100644 --- a/maintenance/projects/js-themes-toolkit-v8-x/packages/liferay-theme-tasks/tasks/__tests__/build.test.js +++ b/maintenance/projects/js-themes-toolkit-v8-x/packages/liferay-theme-tasks/tasks/__tests__/build.test.js @@ -147,6 +147,7 @@ describe('using lib_sass', () => { function _assertFixAtDirectives(cb) { const cssPath = path.join(buildPath, 'css'); + const mainCssPath = path.join(cssPath, 'main.css'); expect(fs.existsSync(cssPath)).toBe(true); @@ -195,6 +196,7 @@ describe('using lib_sass', () => { expect(fs.existsSync(templatesPath)).toBe(true); const customCSSFileName = '_custom.scss'; + const customCSSPath = path.join(cssPath, customCSSFileName); const fileContent = testUtil.stripNewlines( @@ -288,6 +290,7 @@ describe('using lib_sass', () => { expect(fs.existsSync(velocityPath)).toBe(true); const customCSSFileName = '_custom.scss'; + const customCSSPath = path.join(buildPath, 'css', customCSSFileName); expect(fs.readFileSync(customCSSPath).toString()).toMatch( diff --git a/maintenance/projects/js-themes-toolkit-v8-x/packages/liferay-theme-tasks/tasks/__tests__/status.test.js b/maintenance/projects/js-themes-toolkit-v8-x/packages/liferay-theme-tasks/tasks/__tests__/status.test.js index 62c4769696..038e87f5e2 100644 --- a/maintenance/projects/js-themes-toolkit-v8-x/packages/liferay-theme-tasks/tasks/__tests__/status.test.js +++ b/maintenance/projects/js-themes-toolkit-v8-x/packages/liferay-theme-tasks/tasks/__tests__/status.test.js @@ -16,6 +16,7 @@ beforeEach(() => { namespace: 'status_task', registerTasks: true, }); + runSequence = config.runSequence; }); diff --git a/maintenance/projects/js-themes-toolkit-v8-x/packages/liferay-theme-tasks/tasks/deploy.js b/maintenance/projects/js-themes-toolkit-v8-x/packages/liferay-theme-tasks/tasks/deploy.js index d8c918ef79..77b0fc1e56 100644 --- a/maintenance/projects/js-themes-toolkit-v8-x/packages/liferay-theme-tasks/tasks/deploy.js +++ b/maintenance/projects/js-themes-toolkit-v8-x/packages/liferay-theme-tasks/tasks/deploy.js @@ -12,6 +12,7 @@ const DEPLOYMENT_STRATEGIES = themeUtil.DEPLOYMENT_STRATEGIES; function registerTasks(options) { const {argv, gulp, pathDist} = options; + const {storage} = gulp; const runSequence = require('run-sequence').use(gulp); diff --git a/maintenance/projects/js-themes-toolkit-v8-x/packages/liferay-theme-tasks/tasks/watch.js b/maintenance/projects/js-themes-toolkit-v8-x/packages/liferay-theme-tasks/tasks/watch.js index 0ccae4ba92..be48ea5e09 100644 --- a/maintenance/projects/js-themes-toolkit-v8-x/packages/liferay-theme-tasks/tasks/watch.js +++ b/maintenance/projects/js-themes-toolkit-v8-x/packages/liferay-theme-tasks/tasks/watch.js @@ -185,8 +185,11 @@ module.exports = function (options) { gulp.task('watch:reload', (cb) => { const changedFile = storage.get('changedFile'); + const srcPath = path.relative(process.cwd(), changedFile.path); + const dstPath = srcPath.replace(/^src\//, ''); + const urlPath = `${resourcePrefix}/${distName}/${dstPath}`; livereload.changed({ @@ -276,8 +279,10 @@ module.exports = function (options) { const requestUrl = url.parse(req.url); const match = themePattern.exec(requestUrl.pathname); + if (match) { const filepath = path.resolve('build', match[3]); + const ext = path.extname(filepath); isReadable(filepath).then((exists) => { @@ -307,9 +312,11 @@ module.exports = function (options) { `Watch mode is now active at: ${url}`, `Proxying: ${proxyUrl}`, ]; + const width = messages.reduce((max, line) => { return Math.max(line.length, max); }, 0); + const ruler = '-'.repeat(width); // eslint-disable-next-line no-console diff --git a/maintenance/projects/js-themes-toolkit-v9-x/packages/generator-liferay-theme/generators/layout/standalone-layout.js b/maintenance/projects/js-themes-toolkit-v9-x/packages/generator-liferay-theme/generators/layout/standalone-layout.js index e4ce12aa57..d5ab3abbb4 100644 --- a/maintenance/projects/js-themes-toolkit-v9-x/packages/generator-liferay-theme/generators/layout/standalone-layout.js +++ b/maintenance/projects/js-themes-toolkit-v9-x/packages/generator-liferay-theme/generators/layout/standalone-layout.js @@ -30,7 +30,9 @@ module.exports = class extends Generator { const cp = new Copier(this); const {layoutId, liferayVersion} = this.answers; + const layoutName = snakeCase(layoutId); + const templateFilename = `${layoutName}.ftl`; const thumbnailFilename = `${layoutName}.png`; @@ -71,6 +73,7 @@ module.exports = class extends Generator { _getDevDependencies() { const {liferayVersion} = this.answers; + const devDependencies = devDependenciesMap[liferayVersion].default; return JSON.stringify(devDependencies, null, 2) diff --git a/maintenance/projects/js-themes-toolkit-v9-x/packages/generator-liferay-theme/generators/layout/theme-layout.js b/maintenance/projects/js-themes-toolkit-v9-x/packages/generator-liferay-theme/generators/layout/theme-layout.js index 309f44aacb..08f367603e 100644 --- a/maintenance/projects/js-themes-toolkit-v9-x/packages/generator-liferay-theme/generators/layout/theme-layout.js +++ b/maintenance/projects/js-themes-toolkit-v9-x/packages/generator-liferay-theme/generators/layout/theme-layout.js @@ -25,7 +25,9 @@ module.exports = class extends Generator { const cp = new Copier(this); const {layoutId, liferayVersion} = this.answers; + const layoutName = snakeCase(layoutId); + const templateFilename = `${layoutName}.ftl`; const thumbnailFilename = `${layoutName}.png`; diff --git a/maintenance/projects/js-themes-toolkit-v9-x/packages/generator-liferay-theme/lib/Copier.js b/maintenance/projects/js-themes-toolkit-v9-x/packages/generator-liferay-theme/lib/Copier.js index 31a9af7328..fb992e76a6 100644 --- a/maintenance/projects/js-themes-toolkit-v9-x/packages/generator-liferay-theme/lib/Copier.js +++ b/maintenance/projects/js-themes-toolkit-v9-x/packages/generator-liferay-theme/lib/Copier.js @@ -51,6 +51,7 @@ module.exports = class Copier { */ copyDir(src, {context = {}} = {}) { const gen = this._generator; + const files = fs.readdirSync(gen.templatePath(src)); files.forEach((file) => { diff --git a/maintenance/projects/js-themes-toolkit-v9-x/packages/generator-liferay-theme/lib/Project.js b/maintenance/projects/js-themes-toolkit-v9-x/packages/generator-liferay-theme/lib/Project.js index 13a8273ee4..61ea65fa1f 100644 --- a/maintenance/projects/js-themes-toolkit-v9-x/packages/generator-liferay-theme/lib/Project.js +++ b/maintenance/projects/js-themes-toolkit-v9-x/packages/generator-liferay-theme/lib/Project.js @@ -15,6 +15,7 @@ class Project { get type() { const {fs} = this._generator; + const pkgJson = fs.readJSON('package.json'); if (pkgJson === undefined) { diff --git a/maintenance/projects/js-themes-toolkit-v9-x/packages/generator-liferay-theme/lib/generation/theme-based.js b/maintenance/projects/js-themes-toolkit-v9-x/packages/generator-liferay-theme/lib/generation/theme-based.js index 2be6ffeb03..592ba29653 100644 --- a/maintenance/projects/js-themes-toolkit-v9-x/packages/generator-liferay-theme/lib/generation/theme-based.js +++ b/maintenance/projects/js-themes-toolkit-v9-x/packages/generator-liferay-theme/lib/generation/theme-based.js @@ -28,6 +28,7 @@ const pipeline = promisify(stream.pipeline); async function writing(generator, themeName) { const project = new Project(generator); + const {liferayVersion} = project; print( diff --git a/maintenance/projects/js-themes-toolkit-v9-x/packages/liferay-theme-tasks/index.js b/maintenance/projects/js-themes-toolkit-v9-x/packages/liferay-theme-tasks/index.js index 7015af767e..08c5531f5c 100644 --- a/maintenance/projects/js-themes-toolkit-v9-x/packages/liferay-theme-tasks/index.js +++ b/maintenance/projects/js-themes-toolkit-v9-x/packages/liferay-theme-tasks/index.js @@ -42,6 +42,7 @@ module.exports.registerTasks = function (options) { function register(options) { const gulp = (options.gulp = plugins.help(options.gulp)); + const store = gulp.storage; store.set('changedFile'); diff --git a/maintenance/projects/js-themes-toolkit-v9-x/packages/liferay-theme-tasks/lib/__tests__/util.test.js b/maintenance/projects/js-themes-toolkit-v9-x/packages/liferay-theme-tasks/lib/__tests__/util.test.js index 56e29a44ab..9bb8eb2d07 100644 --- a/maintenance/projects/js-themes-toolkit-v9-x/packages/liferay-theme-tasks/lib/__tests__/util.test.js +++ b/maintenance/projects/js-themes-toolkit-v9-x/packages/liferay-theme-tasks/lib/__tests__/util.test.js @@ -61,6 +61,7 @@ describe('resolveDependency()', () => { const resolved = util.resolveDependency( 'liferay-frontend-theme-styled' ); + expect(resolved).toContain(process.cwd()); }); }); diff --git a/maintenance/projects/js-themes-toolkit-v9-x/packages/liferay-theme-tasks/lib/prompts/__tests__/extend_prompt.test.js b/maintenance/projects/js-themes-toolkit-v9-x/packages/liferay-theme-tasks/lib/prompts/__tests__/extend_prompt.test.js index 79bed36799..79051daf10 100644 --- a/maintenance/projects/js-themes-toolkit-v9-x/packages/liferay-theme-tasks/lib/prompts/__tests__/extend_prompt.test.js +++ b/maintenance/projects/js-themes-toolkit-v9-x/packages/liferay-theme-tasks/lib/prompts/__tests__/extend_prompt.test.js @@ -436,6 +436,7 @@ it('_promptThemeSource should prompt correct workflow', () => { prototype._promptThemeSource(); const args = inquirer.prompt.getCall(0).args; + const questions = args[0]; const extendType = questions[0]; diff --git a/maintenance/projects/js-themes-toolkit-v9-x/packages/liferay-theme-tasks/lib/prompts/__tests__/prompt_util.test.js b/maintenance/projects/js-themes-toolkit-v9-x/packages/liferay-theme-tasks/lib/prompts/__tests__/prompt_util.test.js index 4a8aef046b..8015ca437e 100644 --- a/maintenance/projects/js-themes-toolkit-v9-x/packages/liferay-theme-tasks/lib/prompts/__tests__/prompt_util.test.js +++ b/maintenance/projects/js-themes-toolkit-v9-x/packages/liferay-theme-tasks/lib/prompts/__tests__/prompt_util.test.js @@ -66,6 +66,7 @@ it('getModuleChoices should get module choices that are appropriate for extend t _.forEach(choices, (item, index) => { const number = index + 1; + const name = 'themelet-' + number; expect(item.name).toBe(name); @@ -78,6 +79,7 @@ it('getModuleChoices should get module choices that are appropriate for extend t _.forEach(choices, (item, index) => { const number = index + 1; + const name = 'themelet-' + number; if (number === 1) { @@ -93,6 +95,7 @@ it('getModuleChoices should get module choices that are appropriate for extend t _.forEach(choices, (item, index) => { const number = index + 1; + const name = 'themelet-' + number; expect(!item.checked).toBe(true); @@ -106,6 +109,7 @@ it('getModuleChoices should get module choices that are appropriate for extend t _.forEach(choices, (item, index) => { const number = index + 1; + const name = 'themelet-' + number; if (number === 1) { diff --git a/maintenance/projects/js-themes-toolkit-v9-x/packages/liferay-theme-tasks/lib/prompts/extend_prompt.js b/maintenance/projects/js-themes-toolkit-v9-x/packages/liferay-theme-tasks/lib/prompts/extend_prompt.js index faf66bc4bb..966e03843a 100644 --- a/maintenance/projects/js-themes-toolkit-v9-x/packages/liferay-theme-tasks/lib/prompts/extend_prompt.js +++ b/maintenance/projects/js-themes-toolkit-v9-x/packages/liferay-theme-tasks/lib/prompts/extend_prompt.js @@ -69,6 +69,7 @@ class ExtendPrompt { const baseTheme = this.themeConfig.baseTheme; const module = answers.module; const modulePackages = answers.modules; + const pkg = modulePackages[module]; if (!module) { diff --git a/maintenance/projects/js-themes-toolkit-v9-x/packages/liferay-theme-tasks/lib/prompts/url_package_prompt.js b/maintenance/projects/js-themes-toolkit-v9-x/packages/liferay-theme-tasks/lib/prompts/url_package_prompt.js index 7ea049036d..2f0dc80aca 100644 --- a/maintenance/projects/js-themes-toolkit-v9-x/packages/liferay-theme-tasks/lib/prompts/url_package_prompt.js +++ b/maintenance/projects/js-themes-toolkit-v9-x/packages/liferay-theme-tasks/lib/prompts/url_package_prompt.js @@ -82,6 +82,7 @@ class URLPackagePrompt { if (this.themelet && answers.module) { Object.keys(answers.module).forEach((k) => { const moduleName = this.config.selectedModules[k]; + answers.module[moduleName] = answers.module[k]; delete answers.module[k]; }); diff --git a/maintenance/projects/js-themes-toolkit-v9-x/packages/liferay-theme-tasks/lib/r2/liferay-r2/css-parse.js b/maintenance/projects/js-themes-toolkit-v9-x/packages/liferay-theme-tasks/lib/r2/liferay-r2/css-parse.js index 9afd7927ec..96a95614c8 100644 --- a/maintenance/projects/js-themes-toolkit-v9-x/packages/liferay-theme-tasks/lib/r2/liferay-r2/css-parse.js +++ b/maintenance/projects/js-themes-toolkit-v9-x/packages/liferay-theme-tasks/lib/r2/liferay-r2/css-parse.js @@ -26,10 +26,12 @@ module.exports = function (css, options) { function updatePosition(str) { var lines = str.match(/\n/g); + if (lines) { lineno += lines.length; } var i = str.lastIndexOf('\n'); + column = ~i ? str.length - i : column + str.length; } @@ -80,6 +82,7 @@ module.exports = function (css, options) { function error(msg, start) { var err = new Error(`${filename} (${lineno}:${column}) ${msg}`); + err.position = new Position(start); err.filename = filename; err.description = msg; @@ -142,10 +145,12 @@ module.exports = function (css, options) { function match(re) { var m = re.exec(css); + if (!m) { return; } var str = m[0]; + updatePosition(str); css = css.slice(str.length); @@ -211,6 +216,7 @@ module.exports = function (css, options) { function selector() { var m = match(/^([^{]+)/); + if (!m) { return; } @@ -232,6 +238,7 @@ module.exports = function (css, options) { // prop var prop = match(/^(\*?[-#/*\w]+(\[[0-9a-z_-]+\])?)\s*/); + if (!prop) { return; } @@ -246,6 +253,7 @@ module.exports = function (css, options) { // val var val = match(/^((?:'(?:\\'|.)*?'|"(?:\\"|.)*?"|\([^)]*?\)|[^};])+)/); + if (!val) { return error('property missing value'); } @@ -462,6 +470,7 @@ module.exports = function (css, options) { function atpage() { var pos = position(); var m = match(/^@page */); + if (!m) { return; } @@ -499,6 +508,7 @@ module.exports = function (css, options) { function atdocument() { var pos = position(); var m = match(/^@([-\w]+)?document *([^{]+)/); + if (!m) { return; } @@ -585,10 +595,12 @@ module.exports = function (css, options) { function _atrule(name) { var pos = position(); var m = match(new RegExp('^@' + name + ' *([^;\\n]+);')); + if (!m) { return; } var ret = {type: name}; + ret[name] = trim(m[1]); return pos(ret); diff --git a/maintenance/projects/js-themes-toolkit-v9-x/packages/liferay-theme-tasks/lib/r2/liferay-r2/index.js b/maintenance/projects/js-themes-toolkit-v9-x/packages/liferay-theme-tasks/lib/r2/liferay-r2/index.js index 9aae0a42cc..26a96fcd9b 100644 --- a/maintenance/projects/js-themes-toolkit-v9-x/packages/liferay-theme-tasks/lib/r2/liferay-r2/index.js +++ b/maintenance/projects/js-themes-toolkit-v9-x/packages/liferay-theme-tasks/lib/r2/liferay-r2/index.js @@ -67,6 +67,7 @@ function bgPosition(v) { v = v.replace(/\bright\b/, 'left'); } var m = v.trim().split(/\s+/); + if (m && m.length === 1 && v.match(/(\d+)([a-z]{2}|%)/)) { v = 'right ' + v; } @@ -139,6 +140,7 @@ var valueMap = { function processRule(rule, idx, list) { var prev = list[idx - 1]; + if (prev && prev.type === 'comment' && prev.comment.trim() === '@noflip') { return; } @@ -164,9 +166,11 @@ function processDeclaration(declaration, rule) { // RegEx for comments is taken from http://www.w3.org/TR/CSS21/grammar.html var commentRegEx = /\/\*[^*]*\*+([^/*][^*]*\*+)*\//g; + var prop = declaration.property.replace(commentRegEx, ''); // remove comments var val = declaration.value.replace(commentRegEx, ''); var important = /!important/; + var isImportant = val.match(important); var asterisk = prop.match(/^(\*+)(.+)/, ''); diff --git a/maintenance/projects/js-themes-toolkit-v9-x/packages/liferay-theme-tasks/lib/r2/liferay-r2/plugins/yui3.js b/maintenance/projects/js-themes-toolkit-v9-x/packages/liferay-theme-tasks/lib/r2/liferay-r2/plugins/yui3.js index c23f0cc9fd..4a18369f95 100644 --- a/maintenance/projects/js-themes-toolkit-v9-x/packages/liferay-theme-tasks/lib/r2/liferay-r2/plugins/yui3.js +++ b/maintenance/projects/js-themes-toolkit-v9-x/packages/liferay-theme-tasks/lib/r2/liferay-r2/plugins/yui3.js @@ -52,6 +52,7 @@ var plug = function (r2) { if (swap) { var handle = resizeHandleInnerRegexp.exec(swap)[1]; + v = swapHandleInnerBg[handle] || v; } else { diff --git a/maintenance/projects/js-themes-toolkit-v9-x/packages/liferay-theme-tasks/lib/theme_finder.js b/maintenance/projects/js-themes-toolkit-v9-x/packages/liferay-theme-tasks/lib/theme_finder.js index 30e073b0d6..caf7c395d1 100644 --- a/maintenance/projects/js-themes-toolkit-v9-x/packages/liferay-theme-tasks/lib/theme_finder.js +++ b/maintenance/projects/js-themes-toolkit-v9-x/packages/liferay-theme-tasks/lib/theme_finder.js @@ -114,9 +114,11 @@ function getLiferayThemeModuleFromURL(url) { // Just in case package name doesn't match URL basename, read it. const {dependencies} = JSON.parse(fs.readFileSync('package.json')); + const themeName = Object.keys(dependencies)[0]; const json = path.join('node_modules', themeName, 'package.json'); + config = JSON.parse(fs.readFileSync(json)); }); @@ -183,6 +185,7 @@ module.exports = { */ function withScratchDirectory(cb) { const template = path.join(os.tmpdir(), 'theme-finder-'); + const directory = fs.mkdtempSync(template); const cwd = process.cwd(); diff --git a/maintenance/projects/js-themes-toolkit-v9-x/packages/liferay-theme-tasks/tasks/__tests__/build.test.js b/maintenance/projects/js-themes-toolkit-v9-x/packages/liferay-theme-tasks/tasks/__tests__/build.test.js index 3b023468a3..d3dd376342 100644 --- a/maintenance/projects/js-themes-toolkit-v9-x/packages/liferay-theme-tasks/tasks/__tests__/build.test.js +++ b/maintenance/projects/js-themes-toolkit-v9-x/packages/liferay-theme-tasks/tasks/__tests__/build.test.js @@ -158,6 +158,7 @@ describe('using lib_sass', () => { function _assertFixAtDirectives(cb) { const cssPath = path.join(buildPath, 'css'); + const mainCssPath = path.join(cssPath, 'main.css'); expect(fs.existsSync(cssPath)).toBe(true); @@ -206,6 +207,7 @@ describe('using lib_sass', () => { expect(fs.existsSync(templatesPath)).toBe(true); const customCSSFileName = '_custom.scss'; + const customCSSPath = path.join(cssPath, customCSSFileName); const fileContent = testUtil.stripNewlines( @@ -299,6 +301,7 @@ describe('using lib_sass', () => { expect(fs.existsSync(velocityPath)).toBe(true); const customCSSFileName = '_custom.scss'; + const customCSSPath = path.join(buildPath, 'css', customCSSFileName); expect(fs.readFileSync(customCSSPath).toString()).toMatch( diff --git a/maintenance/projects/js-themes-toolkit-v9-x/packages/liferay-theme-tasks/tasks/__tests__/status.test.js b/maintenance/projects/js-themes-toolkit-v9-x/packages/liferay-theme-tasks/tasks/__tests__/status.test.js index 3073e52c4b..bd82083a65 100644 --- a/maintenance/projects/js-themes-toolkit-v9-x/packages/liferay-theme-tasks/tasks/__tests__/status.test.js +++ b/maintenance/projects/js-themes-toolkit-v9-x/packages/liferay-theme-tasks/tasks/__tests__/status.test.js @@ -14,6 +14,7 @@ beforeEach(() => { namespace: 'status_task', registerTasks: true, }); + runSequence = config.runSequence; }); diff --git a/maintenance/projects/js-themes-toolkit-v9-x/packages/liferay-theme-tasks/tasks/build/compile-css.js b/maintenance/projects/js-themes-toolkit-v9-x/packages/liferay-theme-tasks/tasks/build/compile-css.js index 0b7be14568..5f6ffb86ab 100644 --- a/maintenance/projects/js-themes-toolkit-v9-x/packages/liferay-theme-tasks/tasks/build/compile-css.js +++ b/maintenance/projects/js-themes-toolkit-v9-x/packages/liferay-theme-tasks/tasks/build/compile-css.js @@ -144,6 +144,7 @@ function getSassIncludePaths() { includePaths.push(path.dirname(require.resolve('compass-mixins'))); const argv = themeUtil.getArgv(); + if (argv['sass-include-paths']) { const customPaths = argv['sass-include-paths'] .split(',') @@ -156,6 +157,7 @@ function getSassIncludePaths() { } const themeNodeModules = path.resolve('node_modules'); + if (fs.existsSync(themeNodeModules)) { includePaths.push(themeNodeModules); } diff --git a/maintenance/projects/js-themes-toolkit-v9-x/packages/liferay-theme-tasks/tasks/deploy.js b/maintenance/projects/js-themes-toolkit-v9-x/packages/liferay-theme-tasks/tasks/deploy.js index 06e05985b5..8dc2f4c045 100644 --- a/maintenance/projects/js-themes-toolkit-v9-x/packages/liferay-theme-tasks/tasks/deploy.js +++ b/maintenance/projects/js-themes-toolkit-v9-x/packages/liferay-theme-tasks/tasks/deploy.js @@ -12,6 +12,7 @@ const DEPLOYMENT_STRATEGIES = themeUtil.DEPLOYMENT_STRATEGIES; function registerTasks(options) { const {argv, gulp, pathDist} = options; + const {storage} = gulp; const runSequence = require('run-sequence').use(gulp); diff --git a/maintenance/projects/js-themes-toolkit-v9-x/packages/liferay-theme-tasks/tasks/watch.js b/maintenance/projects/js-themes-toolkit-v9-x/packages/liferay-theme-tasks/tasks/watch.js index c2975afc04..56a0ce12ba 100644 --- a/maintenance/projects/js-themes-toolkit-v9-x/packages/liferay-theme-tasks/tasks/watch.js +++ b/maintenance/projects/js-themes-toolkit-v9-x/packages/liferay-theme-tasks/tasks/watch.js @@ -185,8 +185,11 @@ module.exports = function (options) { gulp.task('watch:reload', (cb) => { const changedFile = storage.get('changedFile'); + const srcPath = path.relative(process.cwd(), changedFile.path); + const dstPath = srcPath.replace(/^src\//, ''); + const urlPath = `${resourcePrefix}/${distName}/${dstPath}`; livereload.changed({ @@ -276,8 +279,10 @@ module.exports = function (options) { const requestUrl = url.parse(req.url); const match = themePattern.exec(requestUrl.pathname); + if (match) { const filepath = path.resolve('build', match[3]); + const ext = path.extname(filepath); isReadable(filepath).then((exists) => { @@ -307,9 +312,11 @@ module.exports = function (options) { `Watch mode is now active at: ${url}`, `Proxying: ${proxyUrl}`, ]; + const width = messages.reduce((max, line) => { return Math.max(line.length, max); }, 0); + const ruler = '-'.repeat(width); // eslint-disable-next-line no-console diff --git a/maintenance/projects/js-themes-toolkit-v9-x/scripts/qa.js b/maintenance/projects/js-themes-toolkit-v9-x/scripts/qa.js index cc6e0ef957..f447151c0e 100644 --- a/maintenance/projects/js-themes-toolkit-v9-x/scripts/qa.js +++ b/maintenance/projects/js-themes-toolkit-v9-x/scripts/qa.js @@ -11,6 +11,7 @@ const path = require('path'); const {argv} = require('yargs'); const workDir = path.resolve(__dirname, '..', 'qa'); + const pkgsDir = path.join(workDir, 'packages'); const yoPath = path.join(workDir, 'node_modules', '.bin', 'yo'); diff --git a/maintenance/projects/js-toolkit/packages/babel-plugin-add-module-metadata/src/__tests__/index.test.js b/maintenance/projects/js-toolkit/packages/babel-plugin-add-module-metadata/src/__tests__/index.test.js index d8377706f0..835ae211f2 100644 --- a/maintenance/projects/js-toolkit/packages/babel-plugin-add-module-metadata/src/__tests__/index.test.js +++ b/maintenance/projects/js-toolkit/packages/babel-plugin-add-module-metadata/src/__tests__/index.test.js @@ -15,6 +15,7 @@ import plugin from '../index'; const prjDirPath = path.join(__dirname, '__fixtures__', 'a-project'); const prjRelModulePath = path.join('path', 'to', 'module.js'); + const filename = path.join(prjDirPath, prjRelModulePath); const prjPkgDesc = new PkgDesc('a-project', '1.0.0', null); diff --git a/maintenance/projects/js-toolkit/packages/babel-plugin-add-module-metadata/src/index.js b/maintenance/projects/js-toolkit/packages/babel-plugin-add-module-metadata/src/index.js index 0ea14a2659..873f1fa8eb 100644 --- a/maintenance/projects/js-toolkit/packages/babel-plugin-add-module-metadata/src/index.js +++ b/maintenance/projects/js-toolkit/packages/babel-plugin-add-module-metadata/src/index.js @@ -120,7 +120,9 @@ function addEsModuleFlag(state) { } const {filename} = state.file.opts; + const pkgDir = babelUtil.getPackageDir(filename); + const pkgJson = readJsonSync(npath.join(pkgDir, 'package.json')); const {rootPkgJson} = babelIpc.get(state); diff --git a/maintenance/projects/js-toolkit/packages/babel-plugin-alias-modules/src/index.ts b/maintenance/projects/js-toolkit/packages/babel-plugin-alias-modules/src/index.ts index 9d2358d9bf..212dc8800d 100644 --- a/maintenance/projects/js-toolkit/packages/babel-plugin-alias-modules/src/index.ts +++ b/maintenance/projects/js-toolkit/packages/babel-plugin-alias-modules/src/index.ts @@ -44,6 +44,7 @@ export class Visitor { CallExpression(bpath) { const {_log} = this; const {node} = bpath; + const {callee} = node; if (!t.isIdentifier(callee)) { diff --git a/maintenance/projects/js-toolkit/packages/babel-plugin-name-amd-modules/src/__tests__/index.test.js b/maintenance/projects/js-toolkit/packages/babel-plugin-name-amd-modules/src/__tests__/index.test.js index c6cd88a7e8..0190378245 100644 --- a/maintenance/projects/js-toolkit/packages/babel-plugin-name-amd-modules/src/__tests__/index.test.js +++ b/maintenance/projects/js-toolkit/packages/babel-plugin-name-amd-modules/src/__tests__/index.test.js @@ -12,6 +12,7 @@ import path from 'path'; import plugin from '../index'; const prjDirPath = path.join(__dirname, '__fixtures__', 'a-project'); + const filename = path.join(prjDirPath, 'path', 'to', 'module.js'); beforeAll(() => { diff --git a/maintenance/projects/js-toolkit/packages/babel-plugin-namespace-modules/src/__tests__/index.test.js b/maintenance/projects/js-toolkit/packages/babel-plugin-namespace-modules/src/__tests__/index.test.js index a37c0e960e..dcd4a1f4d3 100644 --- a/maintenance/projects/js-toolkit/packages/babel-plugin-namespace-modules/src/__tests__/index.test.js +++ b/maintenance/projects/js-toolkit/packages/babel-plugin-namespace-modules/src/__tests__/index.test.js @@ -12,6 +12,7 @@ import path from 'path'; import plugin from '../index'; const prjDirPath = path.join(__dirname, '__fixtures__', 'a-project'); + const filename = path.join(prjDirPath, 'path', 'to', 'module.js'); const imports = { diff --git a/maintenance/projects/js-toolkit/packages/babel-plugin-namespace-modules/src/index.js b/maintenance/projects/js-toolkit/packages/babel-plugin-namespace-modules/src/index.js index 6819012432..e3a88483a6 100644 --- a/maintenance/projects/js-toolkit/packages/babel-plugin-namespace-modules/src/index.js +++ b/maintenance/projects/js-toolkit/packages/babel-plugin-namespace-modules/src/index.js @@ -45,6 +45,7 @@ export default function ({types: t}) { node: {expression}, } = path; const {opts} = state; + const {namespaces, unrolledImports} = opts; if (!t.isCallExpression(expression)) { @@ -137,6 +138,7 @@ export default function ({types: t}) { exit(path, state) { const {node} = path; const {opts} = state; + const {namespaces, unrolledImports} = opts; if (node.name !== 'require') { @@ -269,7 +271,9 @@ export default function ({types: t}) { */ function addDependencyNamespace(moduleName, namespacePkg, unrolledImports) { const {pkgName, scope} = mod.splitModuleName(moduleName); + const fullPkgName = mod.joinModuleName(scope, pkgName); + const pkg = unrolledImports[fullPkgName] || namespacePkg; return pkg.name === '' ? moduleName : ns.addNamespace(moduleName, pkg); diff --git a/maintenance/projects/js-toolkit/packages/babel-plugin-wrap-modules-amd/src/index.js b/maintenance/projects/js-toolkit/packages/babel-plugin-wrap-modules-amd/src/index.js index 2d7f6f7f8d..005ba4a6af 100644 --- a/maintenance/projects/js-toolkit/packages/babel-plugin-wrap-modules-amd/src/index.js +++ b/maintenance/projects/js-toolkit/packages/babel-plugin-wrap-modules-amd/src/index.js @@ -105,6 +105,7 @@ export default function ({types: t}) { path.traverse(wrapVisitor, state); const {node} = path; + const {body} = node; dependencies = Object.keys(dependencies).map( diff --git a/maintenance/projects/js-toolkit/packages/generator-liferay-js/src/adapt/index.js b/maintenance/projects/js-toolkit/packages/generator-liferay-js/src/adapt/index.js index 0b922ce2a2..c3699e27ca 100644 --- a/maintenance/projects/js-toolkit/packages/generator-liferay-js/src/adapt/index.js +++ b/maintenance/projects/js-toolkit/packages/generator-liferay-js/src/adapt/index.js @@ -273,6 +273,7 @@ export default class extends Generator { const npmbundlerrc = new NpmbundlerrcModifier(this); const pkgJson = new PkgJsonModifier(this, 2); const projectAnalyzer = new ProjectAnalyzer(this); + const portletName = getPortletName(projectAnalyzer); const {preset} = this._options; diff --git a/maintenance/projects/js-toolkit/packages/generator-liferay-js/src/facet-portlet/index.js b/maintenance/projects/js-toolkit/packages/generator-liferay-js/src/facet-portlet/index.js index 61754e06ad..d8d8cc712b 100644 --- a/maintenance/projects/js-toolkit/packages/generator-liferay-js/src/facet-portlet/index.js +++ b/maintenance/projects/js-toolkit/packages/generator-liferay-js/src/facet-portlet/index.js @@ -46,6 +46,7 @@ export default class extends Generator { const npmbundlerrc = new NpmbundlerrcModifier(this); const pkgJson = new PkgJsonModifier(this); const projectAnalyzer = new ProjectAnalyzer(this); + const portletName = getPortletName(projectAnalyzer); const portletDisplayName = projectAnalyzer.displayName; diff --git a/maintenance/projects/js-toolkit/packages/generator-liferay-js/src/utils/ProjectAnalyzer.js b/maintenance/projects/js-toolkit/packages/generator-liferay-js/src/utils/ProjectAnalyzer.js index c39ecc3a0c..9e54a5bb54 100644 --- a/maintenance/projects/js-toolkit/packages/generator-liferay-js/src/utils/ProjectAnalyzer.js +++ b/maintenance/projects/js-toolkit/packages/generator-liferay-js/src/utils/ProjectAnalyzer.js @@ -84,6 +84,7 @@ export default class ProjectAnalyzer { */ get localizationBundleName() { const bundleName = path.basename(this.localizationFilePath); + const extname = path.extname(bundleName); return bundleName.replace(new RegExp(extname.replace('.', '\\.')), ''); diff --git a/maintenance/projects/js-toolkit/packages/generator-liferay-js/src/utils/index.js b/maintenance/projects/js-toolkit/packages/generator-liferay-js/src/utils/index.js index 4f084883dd..3e1043486e 100644 --- a/maintenance/projects/js-toolkit/packages/generator-liferay-js/src/utils/index.js +++ b/maintenance/projects/js-toolkit/packages/generator-liferay-js/src/utils/index.js @@ -53,6 +53,7 @@ export class Copier { */ copyDir(src, {context = {}} = {}) { const gen = this._generator; + const files = fs.readdirSync(gen.templatePath(src)); files.forEach((file) => { diff --git a/maintenance/projects/js-toolkit/packages/liferay-npm-build-tools-common/src/__tests__/manifest.test.js b/maintenance/projects/js-toolkit/packages/liferay-npm-build-tools-common/src/__tests__/manifest.test.js index 43bd123659..a1830b08f8 100644 --- a/maintenance/projects/js-toolkit/packages/liferay-npm-build-tools-common/src/__tests__/manifest.test.js +++ b/maintenance/projects/js-toolkit/packages/liferay-npm-build-tools-common/src/__tests__/manifest.test.js @@ -48,6 +48,7 @@ describe('save', () => { manifest.addPackage(srcPkg2, destPkg2); const tmpDir = fs.mkdtempSync('manifest'); + const tmpFilePath = path.join(tmpDir, 'manifest.json'); manifest.save(tmpFilePath); @@ -67,6 +68,7 @@ describe('save', () => { it('constructor with file works', () => { const tmpDir = fs.mkdtempSync('manifest'); + const tmpFilePath = path.join(tmpDir, 'manifest.json'); const manifest = new Manifest(tmpFilePath); diff --git a/maintenance/projects/js-toolkit/packages/liferay-npm-build-tools-common/src/alias.ts b/maintenance/projects/js-toolkit/packages/liferay-npm-build-tools-common/src/alias.ts index 33f7b1097e..01b2cd5d13 100644 --- a/maintenance/projects/js-toolkit/packages/liferay-npm-build-tools-common/src/alias.ts +++ b/maintenance/projects/js-toolkit/packages/liferay-npm-build-tools-common/src/alias.ts @@ -99,6 +99,7 @@ export function loadAliases( aliasFields: string[] ): AliasHash { const absPkgJsonFile = pkgJsonFile.resolve(); + const cacheKey = `${absPkgJsonFile.asNative}|${aliasFields.join()}`; let aliases: AliasHash = aliasesCache[cacheKey]; diff --git a/maintenance/projects/js-toolkit/packages/liferay-npm-build-tools-common/src/babel-ipc.ts b/maintenance/projects/js-toolkit/packages/liferay-npm-build-tools-common/src/babel-ipc.ts index 5be0842932..1bac9f1fe7 100644 --- a/maintenance/projects/js-toolkit/packages/liferay-npm-build-tools-common/src/babel-ipc.ts +++ b/maintenance/projects/js-toolkit/packages/liferay-npm-build-tools-common/src/babel-ipc.ts @@ -12,6 +12,7 @@ import FilePath from './file-path'; declare const global: { _babel_ipc_: object; }; + global._babel_ipc_ = global._babel_ipc_ || {}; /** Babel state object view */ diff --git a/maintenance/projects/js-toolkit/packages/liferay-npm-build-tools-common/src/packages.ts b/maintenance/projects/js-toolkit/packages/liferay-npm-build-tools-common/src/packages.ts index 43c56db64e..67870ebc08 100644 --- a/maintenance/projects/js-toolkit/packages/liferay-npm-build-tools-common/src/packages.ts +++ b/maintenance/projects/js-toolkit/packages/liferay-npm-build-tools-common/src/packages.ts @@ -47,6 +47,7 @@ export function resolveModuleFile(pkgPath: string, moduleName: string): string { let fullModulePath = path.resolve( path.join(pkgPath, ...moduleName.split('/')) ); + let moduleStats = safeStat(fullModulePath); if (moduleStats.isDirectory()) { @@ -54,6 +55,7 @@ export function resolveModuleFile(pkgPath: string, moduleName: string): string { // Given module name is a directory const pkgJsonPath = path.join(fullModulePath, 'package.json'); + const pkgJsonStats = safeStat(pkgJsonPath); if (pkgJsonStats.isFile()) { @@ -61,6 +63,7 @@ export function resolveModuleFile(pkgPath: string, moduleName: string): string { // Module directory has package.json file const pkgJson = readJsonSync(pkgJsonPath); + const {main} = pkgJson; if (main) { diff --git a/maintenance/projects/js-toolkit/packages/liferay-npm-build-tools-common/src/project/__tests__/index.test.js b/maintenance/projects/js-toolkit/packages/liferay-npm-build-tools-common/src/project/__tests__/index.test.js index e56a4ee2e5..e2f9ab9ded 100644 --- a/maintenance/projects/js-toolkit/packages/liferay-npm-build-tools-common/src/project/__tests__/index.test.js +++ b/maintenance/projects/js-toolkit/packages/liferay-npm-build-tools-common/src/project/__tests__/index.test.js @@ -640,6 +640,7 @@ describe('deprecated config', () => { const pkgOther = new PkgDesc('other-package', '1.0.0', __dirname); let plugins = project.transform.getPrePluginDescriptors(pkg1); + expect(plugins[0].run({}, {})).toEqual(1); plugins = project.transform.getPrePluginDescriptors(pkg2); diff --git a/maintenance/projects/js-toolkit/packages/liferay-npm-build-tools-common/src/project/index.ts b/maintenance/projects/js-toolkit/packages/liferay-npm-build-tools-common/src/project/index.ts index 42570de327..5d6e2b817b 100644 --- a/maintenance/projects/js-toolkit/packages/liferay-npm-build-tools-common/src/project/index.ts +++ b/maintenance/projects/js-toolkit/packages/liferay-npm-build-tools-common/src/project/index.ts @@ -205,6 +205,7 @@ export class Project { const pkgJsonPath = this.toolResolve( `${packageName}/package.json` ); + const pkgJson = require(pkgJsonPath); map.set(pkgJson.name, { @@ -224,6 +225,7 @@ export class Project { // Get preset version const {_npmbundlerrc} = this; + const preset = _npmbundlerrc['preset']; if (preset) { diff --git a/maintenance/projects/js-toolkit/packages/liferay-npm-build-tools-common/src/project/jar.ts b/maintenance/projects/js-toolkit/packages/liferay-npm-build-tools-common/src/project/jar.ts index 342fa78ea5..2e23c7752c 100644 --- a/maintenance/projects/js-toolkit/packages/liferay-npm-build-tools-common/src/project/jar.ts +++ b/maintenance/projects/js-toolkit/packages/liferay-npm-build-tools-common/src/project/jar.ts @@ -24,6 +24,7 @@ export default class Jar { */ get compressionLevel(): number { const {_project} = this; + const {npmbundlerrc} = _project; if (this._compressionLevel === undefined) { @@ -95,6 +96,7 @@ export default class Jar { */ get outputDir(): FilePath { const {_project} = this; + const {npmbundlerrc} = _project; if (this._outputDir === undefined) { diff --git a/maintenance/projects/js-toolkit/packages/liferay-npm-build-tools-common/src/project/misc.ts b/maintenance/projects/js-toolkit/packages/liferay-npm-build-tools-common/src/project/misc.ts index a24bb22bf8..86b1035be1 100644 --- a/maintenance/projects/js-toolkit/packages/liferay-npm-build-tools-common/src/project/misc.ts +++ b/maintenance/projects/js-toolkit/packages/liferay-npm-build-tools-common/src/project/misc.ts @@ -50,6 +50,7 @@ export default class Misc { */ get noTracking(): boolean { const {_project} = this; + const {npmbundlerrc} = _project; if (!prop.has(npmbundlerrc, 'no-tracking')) { @@ -89,6 +90,7 @@ export default class Misc { */ get reportFile(): FilePath | undefined { const {_project} = this; + const {npmbundlerrc} = _project; const dumpReport = prop.get(npmbundlerrc, 'dump-report', false); diff --git a/maintenance/projects/js-toolkit/packages/liferay-npm-build-tools-common/src/project/rules.ts b/maintenance/projects/js-toolkit/packages/liferay-npm-build-tools-common/src/project/rules.ts index 06ffd2483e..e5e2412ce5 100644 --- a/maintenance/projects/js-toolkit/packages/liferay-npm-build-tools-common/src/project/rules.ts +++ b/maintenance/projects/js-toolkit/packages/liferay-npm-build-tools-common/src/project/rules.ts @@ -106,6 +106,7 @@ export default class Rules { const pkgJsonPath = _project.toolResolve( `${joinModuleName(scope, pkgName, '')}/package.json` ); + const pkgJson = require(pkgJsonPath); map.set(resolvedModule, { diff --git a/maintenance/projects/js-toolkit/packages/liferay-npm-build-tools-common/src/project/transform.ts b/maintenance/projects/js-toolkit/packages/liferay-npm-build-tools-common/src/project/transform.ts index da8479cc84..7c54765fd2 100644 --- a/maintenance/projects/js-toolkit/packages/liferay-npm-build-tools-common/src/project/transform.ts +++ b/maintenance/projects/js-toolkit/packages/liferay-npm-build-tools-common/src/project/transform.ts @@ -43,6 +43,7 @@ export default class Transform { if (this._versionsInfo === undefined) { const {_project} = this; + const {npmbundlerrc} = _project; const map = new Map(); @@ -69,6 +70,7 @@ export default class Transform { const pkgJsonPath = _project.toolResolve( `${pkgName}/package.json` ); + const pkgJson = _project.toolRequire(pkgJsonPath); map.set(pluginName, { diff --git a/maintenance/projects/js-toolkit/packages/liferay-npm-bundler-plugin-exclude-imports/src/__tests__/index.test.js b/maintenance/projects/js-toolkit/packages/liferay-npm-bundler-plugin-exclude-imports/src/__tests__/index.test.js index bdb0c37676..67596f4811 100644 --- a/maintenance/projects/js-toolkit/packages/liferay-npm-bundler-plugin-exclude-imports/src/__tests__/index.test.js +++ b/maintenance/projects/js-toolkit/packages/liferay-npm-bundler-plugin-exclude-imports/src/__tests__/index.test.js @@ -39,6 +39,7 @@ it('empties files when package is listed in imports', () => { it('leaves files untouched when package is missing from imports', () => { const originalFiles = ['1.js', '2.js', '3.js']; + const files = originalFiles.slice(); plugin( @@ -70,6 +71,7 @@ it('leaves files untouched when package is missing from imports', () => { it('leaves files untouched when package is self-imported from project', () => { const originalFiles = ['1.js', '2.js', '3.js']; + const files = originalFiles.slice(); plugin( diff --git a/maintenance/projects/js-toolkit/packages/liferay-npm-bundler-plugin-inject-peer-dependencies/src/index.js b/maintenance/projects/js-toolkit/packages/liferay-npm-bundler-plugin-inject-peer-dependencies/src/index.js index 961d649b33..e06a0f34ab 100644 --- a/maintenance/projects/js-toolkit/packages/liferay-npm-bundler-plugin-inject-peer-dependencies/src/index.js +++ b/maintenance/projects/js-toolkit/packages/liferay-npm-bundler-plugin-inject-peer-dependencies/src/index.js @@ -27,6 +27,7 @@ export default function ({config, log, pkg, source}, {pkgJson}) { .map((posixPath) => new FilePath(posixPath, {posix: true})) .forEach((file) => { const code = fs.readFileSync(file.asNative); + const defineCallOffset = code.indexOf(defineCall); if (defineCallOffset !== -1) { @@ -105,6 +106,7 @@ function processModuleDependencies( } const {pkgName, scope} = mod.splitModuleName(dep); + const scopedPkgName = mod.joinModuleName(scope, pkgName); if (!pkgJson.dependencies[scopedPkgName]) { diff --git a/maintenance/projects/js-toolkit/packages/liferay-npm-bundler-plugin-namespace-packages/src/__tests__/index.test.js b/maintenance/projects/js-toolkit/packages/liferay-npm-bundler-plugin-namespace-packages/src/__tests__/index.test.js index 3bfe1af9c5..18b132e9bc 100644 --- a/maintenance/projects/js-toolkit/packages/liferay-npm-bundler-plugin-namespace-packages/src/__tests__/index.test.js +++ b/maintenance/projects/js-toolkit/packages/liferay-npm-bundler-plugin-namespace-packages/src/__tests__/index.test.js @@ -14,6 +14,7 @@ const fixturesDir = path.join(__dirname, '__fixtures__'); it('namespaces packages correctly for the root package', () => { const pkgJson = readJsonSync(`${fixturesDir}/project/package.json`); + const pkg = new PkgDesc(pkgJson.name, pkgJson.version, fixturesDir, true); const log = new PluginLogger(); @@ -25,7 +26,9 @@ it('namespaces packages correctly for the root package', () => { it('namespaces packages correctly for non-root package', () => { const rootPkgJson = readJsonSync(`${fixturesDir}/project/package.json`); const dir = `${fixturesDir}/project/node_modules/is-finite`; + const pkgJson = readJsonSync(`${dir}/package.json`); + const pkg = new PkgDesc(pkgJson.name, pkgJson.version, dir); const log = new PluginLogger(); @@ -37,7 +40,9 @@ it('namespaces packages correctly for non-root package', () => { it('logs results correctly', () => { const rootPkgJson = readJsonSync(`${fixturesDir}/project/package.json`); const dir = `${fixturesDir}/project/node_modules/is-finite`; + const pkgJson = readJsonSync(`${dir}/package.json`); + const pkg = new PkgDesc(pkgJson.name, pkgJson.version, dir); const log = new PluginLogger(); diff --git a/maintenance/projects/js-toolkit/packages/liferay-npm-bundler/src/__tests__/dependencies.test.js b/maintenance/projects/js-toolkit/packages/liferay-npm-bundler/src/__tests__/dependencies.test.js index f597f7d8b1..1202ba3d69 100644 --- a/maintenance/projects/js-toolkit/packages/liferay-npm-bundler/src/__tests__/dependencies.test.js +++ b/maintenance/projects/js-toolkit/packages/liferay-npm-bundler/src/__tests__/dependencies.test.js @@ -31,6 +31,7 @@ expect.extend({ } else { const pkgIdParts = pkgId.split('@'); + pkgName = pkgIdParts[0]; pkgVersion = pkgIdParts[1]; } diff --git a/maintenance/projects/js-toolkit/packages/liferay-npm-bundler/src/dependencies.js b/maintenance/projects/js-toolkit/packages/liferay-npm-bundler/src/dependencies.js index a657665a1c..4f1f7c5578 100644 --- a/maintenance/projects/js-toolkit/packages/liferay-npm-bundler/src/dependencies.js +++ b/maintenance/projects/js-toolkit/packages/liferay-npm-bundler/src/dependencies.js @@ -12,6 +12,7 @@ import resolveModule from 'resolve'; import report from './report'; const pkgJson = project.pkgJson; + const rootPkg = new PkgDesc(pkgJson.name, pkgJson.version); /** @@ -53,6 +54,7 @@ export function addPackageDependencies( collectedDependencies[pkg.id] = pkg; let dependencies = packageJson.dependencies || {}; + dependencies = Object.keys(dependencies); dependencies = dependencies.concat(extraDependencies); diff --git a/maintenance/projects/js-toolkit/packages/liferay-npm-bundler/src/index.ts b/maintenance/projects/js-toolkit/packages/liferay-npm-bundler/src/index.ts index 40ae0015d0..9cfa5a111d 100644 --- a/maintenance/projects/js-toolkit/packages/liferay-npm-bundler/src/index.ts +++ b/maintenance/projects/js-toolkit/packages/liferay-npm-bundler/src/index.ts @@ -86,6 +86,7 @@ function run(): void { // Report and show execution time const hrtime = process.hrtime(start); + report.executionTime(hrtime); log.info(`Bundling took ${pretty(hrtime)}`); diff --git a/maintenance/projects/js-toolkit/packages/liferay-npm-bundler/src/jar/__tests__/xml.test.js b/maintenance/projects/js-toolkit/packages/liferay-npm-bundler/src/jar/__tests__/xml.test.js index 4a74ed36bd..ed9ebeb4a4 100644 --- a/maintenance/projects/js-toolkit/packages/liferay-npm-bundler/src/jar/__tests__/xml.test.js +++ b/maintenance/projects/js-toolkit/packages/liferay-npm-bundler/src/jar/__tests__/xml.test.js @@ -13,6 +13,7 @@ import { describe('addMetatypeAttr', () => { it('works with just the type', () => { const xml = createMetatype('id', 'name'); + addMetatypeAttr(xml, 'an-attr', { type: 'string', }); @@ -22,6 +23,7 @@ describe('addMetatypeAttr', () => { it('adds description if present', () => { const xml = createMetatype('id', 'name'); + addMetatypeAttr(xml, 'an-attr', { type: 'string', description: 'a-description', @@ -32,6 +34,7 @@ describe('addMetatypeAttr', () => { it('adds required if present', () => { const xml = createMetatype('id', 'name'); + addMetatypeAttr(xml, 'an-attr', { type: 'string', required: true, @@ -42,6 +45,7 @@ describe('addMetatypeAttr', () => { it('adds default if present', () => { const xml = createMetatype('id', 'name'); + addMetatypeAttr(xml, 'an-attr', { type: 'string', default: 'default-value', @@ -52,6 +56,7 @@ describe('addMetatypeAttr', () => { it('adds options if present', () => { const xml = createMetatype('id', 'name'); + addMetatypeAttr(xml, 'an-attr', { type: 'string', options: { @@ -66,6 +71,7 @@ describe('addMetatypeAttr', () => { it('addMetatypeLocalization works', () => { const xml = createMetatype('id', 'name'); + addMetatypeLocalization(xml, 'localization/file.properties'); expect(xml).toMatchSnapshot(); @@ -79,6 +85,7 @@ it('createMetatype works', () => { it('all together works', () => { const xml = createMetatype('id', 'name'); + addMetatypeLocalization(xml, 'localization/file.properties'); addMetatypeAttr(xml, 'a-number', {type: 'number'}); addMetatypeAttr(xml, 'a-float', {type: 'float'}); diff --git a/maintenance/projects/js-toolkit/packages/liferay-npm-bundler/src/jar/index.js b/maintenance/projects/js-toolkit/packages/liferay-npm-bundler/src/jar/index.js index be920c669c..c48c82d587 100644 --- a/maintenance/projects/js-toolkit/packages/liferay-npm-bundler/src/jar/index.js +++ b/maintenance/projects/js-toolkit/packages/liferay-npm-bundler/src/jar/index.js @@ -75,6 +75,7 @@ function addFiles(srcDirPath, srcGlobs, destFolder) { filePaths.forEach((filePath) => { const parts = filePath.split(path.sep); + const dirs = parts.slice(0, parts.length - 1); const name = parts[parts.length - 1]; @@ -290,6 +291,7 @@ function getPortletInstanceConfigurationJson() { } const filePath = project.jar.configurationFile.asNative; + const configurationJson = fs.readJSONSync(filePath); if ( @@ -313,6 +315,7 @@ function getSystemConfigurationJson() { } const filePath = project.jar.configurationFile.asNative; + const configurationJson = fs.readJSONSync(filePath); if ( diff --git a/maintenance/projects/js-toolkit/packages/liferay-npm-bundler/src/jar/osgi.js b/maintenance/projects/js-toolkit/packages/liferay-npm-bundler/src/jar/osgi.js index 40cb979de7..5493512db5 100644 --- a/maintenance/projects/js-toolkit/packages/liferay-npm-bundler/src/jar/osgi.js +++ b/maintenance/projects/js-toolkit/packages/liferay-npm-bundler/src/jar/osgi.js @@ -10,6 +10,7 @@ */ export function getBundleVersionAndClassifier(pkgJsonVersion) { const parts = pkgJsonVersion.split('-'); + if (parts.length > 1) { return parts[0] + '.' + parts.slice(1).join('-'); } diff --git a/maintenance/projects/js-toolkit/packages/liferay-npm-bundler/src/jar/xml.js b/maintenance/projects/js-toolkit/packages/liferay-npm-bundler/src/jar/xml.js index 90888edb6e..6f18788123 100644 --- a/maintenance/projects/js-toolkit/packages/liferay-npm-bundler/src/jar/xml.js +++ b/maintenance/projects/js-toolkit/packages/liferay-npm-bundler/src/jar/xml.js @@ -22,7 +22,9 @@ const TYPES = { */ export function addMetatypeAttr(metatype, id, desc) { const metadata = findChild(metatype, 'metatype:MetaData'); + const ocd = findChild(metadata, 'OCD'); + const ad = addChild(ocd, 'AD'); addAttr(ad, 'id', id); diff --git a/maintenance/projects/js-toolkit/packages/liferay-npm-bundler/src/report/__tests__/index.test.js b/maintenance/projects/js-toolkit/packages/liferay-npm-bundler/src/report/__tests__/index.test.js index 0b75d89893..de3cf772fd 100644 --- a/maintenance/projects/js-toolkit/packages/liferay-npm-bundler/src/report/__tests__/index.test.js +++ b/maintenance/projects/js-toolkit/packages/liferay-npm-bundler/src/report/__tests__/index.test.js @@ -73,6 +73,7 @@ describe('when describing the run', () => { name: 'a-package', version: '1.1.0', }; + report.dependencies([pkg]); report.linkedDependency(pkg.name, 'file:../a-package', pkg.version); }); diff --git a/maintenance/projects/js-toolkit/packages/liferay-npm-bundler/src/report/html.js b/maintenance/projects/js-toolkit/packages/liferay-npm-bundler/src/report/html.js index 692b2e5897..6713e14f97 100644 --- a/maintenance/projects/js-toolkit/packages/liferay-npm-bundler/src/report/html.js +++ b/maintenance/projects/js-toolkit/packages/liferay-npm-bundler/src/report/html.js @@ -125,7 +125,9 @@ export function htmlDump(report) { const packageProcessesPresent = Object.keys(_packages).reduce( (found, pkgId) => { const pkg = _packages[pkgId]; + const {babel, copy, post, pre} = pkg.process; + const copyKeys = Object.keys(copy); const preKeys = Object.keys(pre); const postKeys = Object.keys(post); @@ -154,7 +156,9 @@ export function htmlDump(report) { .sort() .map((pkgId) => { const pkg = _packages[pkgId]; + const {babel, copy, post, pre} = pkg.process; + const copyKeys = Object.keys(copy); const preKeys = Object.keys(pre); const postKeys = Object.keys(post); @@ -211,7 +215,9 @@ export function htmlDump(report) { .sort() .map((pkgId) => { const pkg = _packages[pkgId]; + const {copy, post, pre} = pkg.process; + const copyKeys = Object.keys(copy); const preKeys = Object.keys(pre); const postKeys = Object.keys(post); @@ -298,7 +304,9 @@ export function htmlDump(report) { .sort() .map((pkgId) => { const pkg = _packages[pkgId]; + const {babel} = pkg.process; + const babelKeys = Object.keys(babel.files); return htmlIf(babelKeys.length > 0, () => diff --git a/maintenance/projects/js-toolkit/packages/liferay-npm-bundler/src/report/index.js b/maintenance/projects/js-toolkit/packages/liferay-npm-bundler/src/report/index.js index 8395eb101f..5637789eb7 100644 --- a/maintenance/projects/js-toolkit/packages/liferay-npm-bundler/src/report/index.js +++ b/maintenance/projects/js-toolkit/packages/liferay-npm-bundler/src/report/index.js @@ -117,6 +117,7 @@ export class Report { */ linkedDependency(packageName, packageLink, packageVersion) { const pkgId = `${packageName}@${packageVersion}`; + const pkg = this._getPackage(pkgId, false); if (pkg) { diff --git a/maintenance/projects/js-toolkit/packages/liferay-npm-bundler/src/steps/rules.js b/maintenance/projects/js-toolkit/packages/liferay-npm-bundler/src/steps/rules.js index 8220fb79ff..3f1a4d67cf 100644 --- a/maintenance/projects/js-toolkit/packages/liferay-npm-bundler/src/steps/rules.js +++ b/maintenance/projects/js-toolkit/packages/liferay-npm-bundler/src/steps/rules.js @@ -104,6 +104,7 @@ function runLoaders(loaders, firstLoaderIndex, context) { } const loader = loaders[firstLoaderIndex]; + const encoding = loader.metadata.encoding; let result; diff --git a/maintenance/projects/js-toolkit/packages/liferay-npm-bundler/src/steps/transform.js b/maintenance/projects/js-toolkit/packages/liferay-npm-bundler/src/steps/transform.js index b658e3959c..d4dfbe07cb 100644 --- a/maintenance/projects/js-toolkit/packages/liferay-npm-bundler/src/steps/transform.js +++ b/maintenance/projects/js-toolkit/packages/liferay-npm-bundler/src/steps/transform.js @@ -287,6 +287,7 @@ export function loadSourceMap(filePath) { const annotation = fileContent.toString().substring(offset); let matches = annotation.match(/\/\/# sourceMappingURL=(.*)/); + if (!matches) { matches = annotation.match(/\/\*# sourceMappingURL=(.*) \*\//); diff --git a/maintenance/projects/js-toolkit/packages/liferay-npm-imports-checker/src/__tests__/config.test.js b/maintenance/projects/js-toolkit/packages/liferay-npm-imports-checker/src/__tests__/config.test.js index 09ab093ed4..d4b7eb2d5c 100644 --- a/maintenance/projects/js-toolkit/packages/liferay-npm-imports-checker/src/__tests__/config.test.js +++ b/maintenance/projects/js-toolkit/packages/liferay-npm-imports-checker/src/__tests__/config.test.js @@ -21,6 +21,7 @@ beforeEach(() => { 'modules', 'a-project' ); + process.chdir(testDir); cfg = require('../config'); cfg.reloadConfig(); diff --git a/maintenance/projects/js-toolkit/packages/liferay-npm-imports-checker/src/config.js b/maintenance/projects/js-toolkit/packages/liferay-npm-imports-checker/src/config.js index 4db31bff2d..11ac47ec0f 100644 --- a/maintenance/projects/js-toolkit/packages/liferay-npm-imports-checker/src/config.js +++ b/maintenance/projects/js-toolkit/packages/liferay-npm-imports-checker/src/config.js @@ -217,6 +217,7 @@ function safeReadJsonSync(filePath) { catch (err) { if (err.code !== 'ENOENT') { const msg = `(at ${filePath}) ${err.message}`; + err.message = msg; throw err; } diff --git a/maintenance/projects/js-toolkit/packages/liferay-npm-imports-checker/src/liferay-npm-imports-checker.js b/maintenance/projects/js-toolkit/packages/liferay-npm-imports-checker/src/liferay-npm-imports-checker.js index 4ca36b92a2..743e3e6bfb 100644 --- a/maintenance/projects/js-toolkit/packages/liferay-npm-imports-checker/src/liferay-npm-imports-checker.js +++ b/maintenance/projects/js-toolkit/packages/liferay-npm-imports-checker/src/liferay-npm-imports-checker.js @@ -114,6 +114,7 @@ function loadProjects() { try { const pkgJson = readJsonSync(pkgJsonPath); + const project = projects[pkgJson.name]; if (project) { diff --git a/maintenance/projects/js-toolkit/resources/devtools/find-generator/find-generator.js b/maintenance/projects/js-toolkit/resources/devtools/find-generator/find-generator.js index 3007c0ab50..c18f7cfe7a 100755 --- a/maintenance/projects/js-toolkit/resources/devtools/find-generator/find-generator.js +++ b/maintenance/projects/js-toolkit/resources/devtools/find-generator/find-generator.js @@ -9,6 +9,7 @@ const fs = require('fs'); const yeoman = require('yeoman-environment'); const env = yeoman.createEnv(); + const paths = env.getNpmPaths(); paths.forEach((path) => { diff --git a/maintenance/projects/js-toolkit/resources/devtools/link-js-toolkit/link-dependencies.js b/maintenance/projects/js-toolkit/resources/devtools/link-js-toolkit/link-dependencies.js index c9111b3b6c..9352b9b1d5 100644 --- a/maintenance/projects/js-toolkit/resources/devtools/link-js-toolkit/link-dependencies.js +++ b/maintenance/projects/js-toolkit/resources/devtools/link-js-toolkit/link-dependencies.js @@ -15,6 +15,7 @@ function linkDependencies(extraDependencies = []) { // Read package.json const pkgJson = readJsonSync(path.join('.', 'package.json')); + pkgJson.dependencies = pkgJson.dependencies || {}; pkgJson.devDependencies = pkgJson.devDependencies || {}; diff --git a/maintenance/projects/js-toolkit/scripts/level-deps.js b/maintenance/projects/js-toolkit/scripts/level-deps.js index 1a2c41b3fa..cc6fbdb863 100755 --- a/maintenance/projects/js-toolkit/scripts/level-deps.js +++ b/maintenance/projects/js-toolkit/scripts/level-deps.js @@ -25,6 +25,7 @@ Object.values(depVersions[dep]).forEach((prjs) => { prjs.forEach((prj) => { const pkgJsonPath = path.join('packages', prj, 'package.json'); + const pkgJson = JSON.parse(fs.readFileSync(pkgJsonPath)); console.log(` ${prj}`); diff --git a/maintenance/projects/js-toolkit/scripts/qa/generate-samples.js b/maintenance/projects/js-toolkit/scripts/qa/generate-samples.js index aaae36e39c..0db54fc803 100755 --- a/maintenance/projects/js-toolkit/scripts/qa/generate-samples.js +++ b/maintenance/projects/js-toolkit/scripts/qa/generate-samples.js @@ -25,6 +25,7 @@ function generateSamples() { ensureDirectories(); writeConfigurations(); const configs = getUsedConfigurations(); + generateLiferaySamples(configs); prepareManualProjects(); generateCreateReactAppSample(); @@ -157,6 +158,7 @@ function prepareManualProjects() { // Change deploy directory const npmbuildrcPath = path.join(packagesDir, prj, '.npmbuildrc'); + const npmbuildrc = JSON.parse(fs.readFileSync(npmbuildrcPath)); npmbuildrc.liferayDir = liferayDir; @@ -174,6 +176,7 @@ function generateCreateReactAppSample() { // to our QA folder. const tmpDir = path.join(qaDir, 'tmp'); + const tmpPrjDir = path.join(tmpDir, 'create-react-app'); fs.emptyDirSync(tmpPrjDir); diff --git a/maintenance/projects/js-toolkit/scripts/qa/index.js b/maintenance/projects/js-toolkit/scripts/qa/index.js index 0db496186a..7f28a58a03 100644 --- a/maintenance/projects/js-toolkit/scripts/qa/index.js +++ b/maintenance/projects/js-toolkit/scripts/qa/index.js @@ -68,6 +68,7 @@ if (argv['install']) { fs.readdirSync(projectsDir).forEach((projectName) => { const projectDir = path.join(projectsDir, projectName); + const pkgJson = fs.readJsonSync(path.join(projectDir, 'package.json')); if (pkgJson.bin) { diff --git a/maintenance/projects/js-toolkit/scripts/qa/resources.js b/maintenance/projects/js-toolkit/scripts/qa/resources.js index 40aede2c8d..be7250ff6e 100644 --- a/maintenance/projects/js-toolkit/scripts/qa/resources.js +++ b/maintenance/projects/js-toolkit/scripts/qa/resources.js @@ -8,9 +8,12 @@ const os = require('os'); const path = require('path'); const workspaceDir = path.join(__dirname, '..', '..'); + const projectsDir = path.join(workspaceDir, 'packages'); const qaDir = path.join(workspaceDir, 'qa'); + const samplesDir = path.join(qaDir, 'samples'); + const packagesDir = path.join(samplesDir, 'packages'); const {version: currentSDKVersion} = require(path.join( @@ -101,6 +104,7 @@ function findLiferayDir() { path.join(os.homedir(), '.generator-liferay-js.json') ) ); + liferayDir = json.answers['*'].liferayDir; } catch (err) { diff --git a/maintenance/projects/senna/examples/blog/js/spa.js b/maintenance/projects/senna/examples/blog/js/spa.js index 67b0dab5d9..9a1e9446f7 100644 --- a/maintenance/projects/senna/examples/blog/js/spa.js +++ b/maintenance/projects/senna/examples/blog/js/spa.js @@ -14,6 +14,7 @@ document.addEventListener('DOMContentLoaded', () => { console.log('Senna version:', senna.version); var app = new senna.App(); + app.setBasePath('/examples/blog'); app.addSurfaces('posts'); app.addRoutes(new senna.Route(/\w+\.html/, senna.HtmlScreen)); diff --git a/maintenance/projects/senna/examples/form/server.js b/maintenance/projects/senna/examples/form/server.js index 9045749e5c..b27afa22ec 100644 --- a/maintenance/projects/senna/examples/form/server.js +++ b/maintenance/projects/senna/examples/form/server.js @@ -16,6 +16,7 @@ app.use(express.static('../../')); app.post('/post', upload.array(), (req, res, _next) => { var content = '
'; + content += JSON.stringify(req.body, 5); content += '
'; res.end(content); diff --git a/maintenance/projects/senna/examples/gallery/js/dynamic.js b/maintenance/projects/senna/examples/gallery/js/dynamic.js index 89e8e7c273..84b622162f 100644 --- a/maintenance/projects/senna/examples/gallery/js/dynamic.js +++ b/maintenance/projects/senna/examples/gallery/js/dynamic.js @@ -12,6 +12,7 @@ document.addEventListener('DOMContentLoaded', () => { ========================================================================== */ var app = new senna.App(); + app.addSurfaces('preview'); app.addRoutes( new senna.Route( @@ -36,6 +37,7 @@ document.addEventListener('DOMContentLoaded', () => { function customScreenRouteHandler() { var screenInstance = new senna.Screen(); + screenInstance.cached = true; screenInstance.getSurfaceContent = function (surfaceId) { if (surfaceId === 'preview') { diff --git a/maintenance/projects/senna/examples/gallery/js/static.js b/maintenance/projects/senna/examples/gallery/js/static.js index 7a1b070843..bc5aa7253d 100644 --- a/maintenance/projects/senna/examples/gallery/js/static.js +++ b/maintenance/projects/senna/examples/gallery/js/static.js @@ -5,6 +5,7 @@ document.addEventListener('DOMContentLoaded', () => { var app = new senna.App(); + app.setBasePath('/examples/gallery'); app.addSurfaces('preview'); app.addRoutes(new senna.Route(/\w+\.html/, senna.HtmlScreen)); diff --git a/maintenance/projects/senna/src/app/App.js b/maintenance/projects/senna/src/app/App.js index 357e10774e..7781eb5904 100644 --- a/maintenance/projects/senna/src/app/App.js +++ b/maintenance/projects/senna/src/app/App.js @@ -396,6 +396,7 @@ class App extends EventEmitter { } /* jshint newcap: false */ var screen = this.screens[path]; + if (!screen) { var handler = route.getHandler(); if ( @@ -444,6 +445,7 @@ class App extends EventEmitter { */ doNavigate_(path, opt_replaceHistory) { var route = this.findRoute(path); + if (!route) { this.pendingNavigate = CancellablePromise.reject( new CancellablePromise.CancellationError('No route for ' + path) @@ -555,6 +557,7 @@ class App extends EventEmitter { path = this.getRoutePath(path); for (var i = 0; i < this.routes.length; i++) { var route = this.routes[i]; + if (route.matchesPath(path)) { return route; } @@ -720,6 +723,7 @@ class App extends EventEmitter { */ lockHistoryScrollPosition_() { var state = globals.window.history.state; + if (!state) { return; } @@ -908,14 +912,17 @@ class App extends EventEmitter { */ maybeRepositionScrollToHashedAnchor() { const hash = globals.window.location.hash; + if (hash) { const anchorElement = globals.document.getElementById( hash.substring(1) ); + if (anchorElement) { const {offsetLeft, offsetTop} = utils.getNodeOffset( anchorElement ); + globals.window.scrollTo(offsetLeft, offsetTop); } } @@ -956,9 +963,12 @@ class App extends EventEmitter { */ maybeUpdateScrollPositionState_() { var hash = globals.window.location.hash; + var anchorElement = globals.document.getElementById(hash.substring(1)); + if (anchorElement) { const {offsetLeft, offsetTop} = utils.getNodeOffset(anchorElement); + this.saveHistoryCurrentPageScrollPosition_(offsetTop, offsetLeft); } } @@ -1046,6 +1056,7 @@ class App extends EventEmitter { */ onBeforeUnloadDefault_(event) { var func = window._onbeforeunload; + if (func && !func._overloaded && func()) { event.preventDefault(); } @@ -1082,6 +1093,7 @@ class App extends EventEmitter { */ onDocSubmitDelegate_(event) { var form = event.delegateTarget; + if (form.method === 'get') { console.log('GET method not supported'); @@ -1090,6 +1102,7 @@ class App extends EventEmitter { event.capturedFormElement = form; const buttonSelector = 'button:not([type]),button[type=submit],input[type=submit]'; + if (match(globals.document.activeElement, buttonSelector)) { event.capturedFormButtonElement = globals.document.activeElement; } @@ -1186,12 +1199,14 @@ class App extends EventEmitter { } }); const uri = new Uri(state.path); + uri.setHostname(globals.window.location.hostname); uri.setPort(globals.window.location.port); const isNavigationScheduled = this.maybeScheduleNavigation_( uri.toString(), {} ); + if (isNavigationScheduled) { return; } @@ -1262,6 +1277,7 @@ class App extends EventEmitter { */ prefetch(path) { var route = this.findRoute(path); + if (!route) { return CancellablePromise.reject( new CancellablePromise.CancellationError('No route for ' + path) @@ -1293,6 +1309,7 @@ class App extends EventEmitter { */ prepareNavigateHistory_(path, nextScreen, opt_replaceHistory) { let title = nextScreen.getTitle(); + if (!isString(title)) { title = this.getDefaultTitle(); } @@ -1333,6 +1350,7 @@ class App extends EventEmitter { prepareNavigateSurfaces_(nextScreen, surfaces, params) { Object.keys(surfaces).forEach((id) => { var surfaceContent = nextScreen.getSurfaceContent(id, params); + surfaces[id].addContent(nextScreen.getId(), surfaceContent); console.log( 'Screen [' + @@ -1369,6 +1387,7 @@ class App extends EventEmitter { */ removeScreen(path) { var screen = this.screens[path]; + if (screen) { Object.keys(this.surfaces).forEach((surfaceId) => this.surfaces[surfaceId].remove(screen.getId()) @@ -1385,6 +1404,7 @@ class App extends EventEmitter { */ saveHistoryCurrentPageScrollPosition_(scrollTop, scrollLeft) { var state = globals.window.history.state; + if (state && state.senna) { [state.scrollTop, state.scrollLeft] = [scrollTop, scrollLeft]; globals.window.history.replaceState(state, null, null); @@ -1495,6 +1515,7 @@ class App extends EventEmitter { */ syncScrollPositionSyncThenAsync_() { var state = globals.window.history.state; + if (!state) { return; } @@ -1538,6 +1559,7 @@ class App extends EventEmitter { utils.setReferrer(referrer); const titleNode = globals.document.querySelector('title'); + if (titleNode) { titleNode.innerHTML = title; } diff --git a/maintenance/projects/senna/src/app/AppDataAttributeHandler.js b/maintenance/projects/senna/src/app/AppDataAttributeHandler.js index dd44fd5032..c85d9a0f61 100644 --- a/maintenance/projects/senna/src/app/AppDataAttributeHandler.js +++ b/maintenance/projects/senna/src/app/AppDataAttributeHandler.js @@ -110,6 +110,7 @@ class AppDataAttributeHandler extends Disposable { */ maybeAddRoutes_() { var routesSelector = 'link[rel="senna-route"]'; + this.querySelectorAllAsArray_(routesSelector).forEach((link) => this.maybeParseLinkRoute_(link) ); @@ -124,6 +125,7 @@ class AppDataAttributeHandler extends Disposable { */ maybeAddSurfaces_() { var surfacesSelector = '[' + dataAttributes.surface + ']'; + this.querySelectorAllAsArray_(surfacesSelector).forEach( (surfaceElement) => { this.updateElementIdIfSpecialSurface_(surfaceElement); @@ -151,6 +153,7 @@ class AppDataAttributeHandler extends Disposable { this.maybeParseLinkRoutePath_(link), this.maybeParseLinkRouteHandler_(link) ); + this.app.addRoutes(route); console.log('Senna scanned route ' + route.getPath()); } @@ -162,6 +165,7 @@ class AppDataAttributeHandler extends Disposable { */ maybeParseLinkRouteHandler_(link) { var handler = link.getAttribute('type'); + if (isDefAndNotNull(handler)) { handler = object.getObjectByName(handler); } @@ -176,6 +180,7 @@ class AppDataAttributeHandler extends Disposable { */ maybeParseLinkRoutePath_(link) { var path = link.getAttribute('href'); + if (isDefAndNotNull(path)) { if (path.indexOf('regex:') === 0) { path = new RegExp(path.substring(6)); @@ -190,6 +195,7 @@ class AppDataAttributeHandler extends Disposable { */ maybeSetBasePath_() { var basePath = this.baseElement.getAttribute(dataAttributes.basePath); + if (isDefAndNotNull(basePath)) { this.app.setBasePath(basePath); console.log('Senna scanned base path ' + basePath); @@ -204,6 +210,7 @@ class AppDataAttributeHandler extends Disposable { var linkSelector = this.baseElement.getAttribute( dataAttributes.linkSelector ); + if (isDefAndNotNull(linkSelector)) { this.app.setLinkSelector(linkSelector); console.log('Senna scanned link selector ' + linkSelector); @@ -218,6 +225,7 @@ class AppDataAttributeHandler extends Disposable { var loadingCssClass = this.baseElement.getAttribute( dataAttributes.loadingCssClass ); + if (isDefAndNotNull(loadingCssClass)) { this.app.setLoadingCssClass(loadingCssClass); console.log('Senna scanned loading css class ' + loadingCssClass); @@ -232,6 +240,7 @@ class AppDataAttributeHandler extends Disposable { var updateScrollPosition = this.baseElement.getAttribute( dataAttributes.updateScrollPosition ); + if (isDefAndNotNull(updateScrollPosition)) { if (updateScrollPosition === 'false') { this.app.setUpdateScrollPosition(false); diff --git a/maintenance/projects/senna/src/route/Route.js b/maintenance/projects/senna/src/route/Route.js index 1e8bc53220..e90c73bf38 100644 --- a/maintenance/projects/senna/src/route/Route.js +++ b/maintenance/projects/senna/src/route/Route.js @@ -48,6 +48,7 @@ class Route { buildParsedData_() { if (!this.parsedData_) { var tokens = parse(this.path); + var regex = toRegex(tokens); this.parsedData_ = { regex, diff --git a/maintenance/projects/senna/src/screen/HtmlScreen.js b/maintenance/projects/senna/src/screen/HtmlScreen.js index 22a9101f8e..8ce38e1b77 100644 --- a/maintenance/projects/senna/src/screen/HtmlScreen.js +++ b/maintenance/projects/senna/src/screen/HtmlScreen.js @@ -81,11 +81,13 @@ class HtmlScreen extends RequestScreen { newStyle, HtmlScreen.selectors.stylesTemporary ); + if (isTemporaryStyle) { this.pendingStyles.push(newStyle); } if (newStyle.id) { var styleInDoc = globals.document.getElementById(newStyle.id); + if (styleInDoc) { styleInDoc.parentNode.insertBefore( newStyle, @@ -123,6 +125,7 @@ class HtmlScreen extends RequestScreen { const tempNode = globals.document .createRange() .createContextualFragment(content); + placeholder = tempNode.querySelector('senna'); } else { @@ -233,6 +236,7 @@ class HtmlScreen extends RequestScreen { permanentsInDoc.forEach((resource) => { var resourceKey = this.getResourceKey_(resource); + if (resourceKey) { HtmlScreen.permanentResourcesInDoc[resourceKey] = true; } @@ -310,10 +314,12 @@ class HtmlScreen extends RequestScreen { */ getSurfaceContent(surfaceId) { var surface = this.virtualDocument.querySelector('#' + surfaceId); + if (surface) { var defaultChild = surface.querySelector( '#' + surfaceId + '-' + Surface.DEFAULT ); + if (defaultChild) { return defaultChild.innerHTML; } @@ -356,6 +362,7 @@ class HtmlScreen extends RequestScreen { var temporariesInDoc = this.virtualQuerySelectorAll_( HtmlScreen.selectors.stylesTemporary ); + temporariesInDoc.forEach((style) => this.replaceStyleAndMakeUnique_(style) ); @@ -426,6 +433,7 @@ class HtmlScreen extends RequestScreen { */ resolveTitleFromVirtualDocument() { const title = this.virtualDocument.querySelector(this.titleSelector); + if (title) { this.setTitle(title.textContent.trim()); } @@ -433,6 +441,7 @@ class HtmlScreen extends RequestScreen { resolveMetaTagsFromVirtualDocument() { const metas = this.virtualQuerySelectorAll_(this.metaTagsSelector); + if (metas) { this.setMetas(metas); } diff --git a/maintenance/projects/senna/src/screen/RequestScreen.js b/maintenance/projects/senna/src/screen/RequestScreen.js index 537e4f3d97..1303c88976 100644 --- a/maintenance/projects/senna/src/screen/RequestScreen.js +++ b/maintenance/projects/senna/src/screen/RequestScreen.js @@ -81,6 +81,7 @@ class RequestScreen extends Screen { assertValidResponseStatusCode(status) { if (!this.isValidResponseStatusCode(status)) { var error = new Error(errors.INVALID_STATUS); + error.invalidStatus = true; error.statusCode = status; throw error; @@ -92,6 +93,7 @@ class RequestScreen extends Screen { */ beforeUpdateHistoryPath(path) { var redirectPath = this.getRequestPath(); + if (redirectPath && redirectPath !== path) { return redirectPath; } @@ -160,9 +162,11 @@ class RequestScreen extends Screen { */ getRequestPath() { var request = this.getRequest(); + if (request) { var requestPath = request.requestPath; var responseUrl = this.maybeExtractResponseUrlFromRequest(request); + if (responseUrl) { requestPath = responseUrl; } @@ -210,6 +214,7 @@ class RequestScreen extends Screen { */ getFormData(formElement, submittedButtonElement) { const formData = new FormData(formElement); + this.maybeAppendSubmitButtonValue_(formData, submittedButtonElement); return formData; @@ -220,6 +225,7 @@ class RequestScreen extends Screen { */ load(path) { const cache = this.getCache(); + if (isDefAndNotNull(cache)) { return CancellablePromise.resolve(cache); } @@ -310,6 +316,7 @@ class RequestScreen extends Screen { */ maybeExtractResponseUrlFromRequest(request) { var responseUrl = request.responseURL; + if (responseUrl) { return responseUrl; } @@ -330,8 +337,10 @@ class RequestScreen extends Screen { const inputs = globals.capturedFormElement.querySelectorAll( 'input[type="file"]:not([disabled])' ); + for (let index = 0; index < inputs.length; index++) { const input = inputs[index]; + if (input.files.length > 0) { return; } @@ -353,8 +362,10 @@ class RequestScreen extends Screen { const inputs = globals.capturedFormElement.querySelectorAll( 'input[type="file"][data-safari-temp-disabled]' ); + for (let index = 0; index < inputs.length; index++) { const input = inputs[index]; + input.removeAttribute('data-safari-temp-disabled'); input.removeAttribute('disabled'); } diff --git a/maintenance/projects/senna/src/screen/Screen.js b/maintenance/projects/senna/src/screen/Screen.js index 05945dde25..66ca27e4ed 100644 --- a/maintenance/projects/senna/src/screen/Screen.js +++ b/maintenance/projects/senna/src/screen/Screen.js @@ -158,7 +158,9 @@ class Screen extends Cacheable { Object.keys(surfaces).forEach((sId) => { var surface = surfaces[sId]; + var deferred = surface.show(this.id); + transitions.push(deferred); }); diff --git a/maintenance/projects/senna/src/surface/Surface.js b/maintenance/projects/senna/src/surface/Surface.js index b26af76a1b..9bc491c93a 100644 --- a/maintenance/projects/senna/src/surface/Surface.js +++ b/maintenance/projects/senna/src/surface/Surface.js @@ -115,6 +115,7 @@ class Surface extends Disposable { */ createChild(screenId) { var child = globals.document.createElement('div'); + child.setAttribute('id', this.makeId_(screenId)); return child; @@ -179,6 +180,7 @@ class Surface extends Disposable { */ maybeWrapContentAsDefault_() { var element = this.getElement(); + if (element && !this.defaultChild) { var fragment = globals.document.createDocumentFragment(); while (element.firstChild) { @@ -214,6 +216,7 @@ class Surface extends Disposable { show(screenId) { var from = this.activeChild; var to = this.getChild(screenId); + if (!to) { to = this.defaultChild; } @@ -232,6 +235,7 @@ class Surface extends Disposable { */ remove(screenId) { var child = this.getChild(screenId); + if (child) { exitDocument(child); } diff --git a/maintenance/projects/senna/src/utils/utils.js b/maintenance/projects/senna/src/utils/utils.js index ac44a432ea..4483852c12 100644 --- a/maintenance/projects/senna/src/utils/utils.js +++ b/maintenance/projects/senna/src/utils/utils.js @@ -178,6 +178,7 @@ class utils { */ static removePathTrailingSlash(path) { var length = path ? path.length : 0; + if (length > 1 && path[length - 1] === '/') { path = path.substr(0, length - 1); } diff --git a/maintenance/projects/senna/test/app/App.js b/maintenance/projects/senna/test/app/App.js index cb36ff2c15..e5e398ef5c 100644 --- a/maintenance/projects/senna/test/app/App.js +++ b/maintenance/projects/senna/test/app/App.js @@ -48,6 +48,7 @@ describe('App', function () { }; const beforeunload = sinon.spy(); + window.onbeforeunload = beforeunload; }); @@ -77,6 +78,7 @@ describe('App', function () { it('removes route', () => { this.app = new App(); var route = new Route('/path', Screen); + this.app.addRoutes(route); assert.ok(this.app.removeRoute(route)); }); @@ -109,6 +111,7 @@ describe('App', function () { assert.strictEqual('/path', route.getPath()); assert.strictEqual(Screen, route.getHandler()); var routeOther = this.app.findRoute('/pathOther'); + assert.ok(routeOther instanceof Route); assert.strictEqual('/pathOther', routeOther.getPath()); assert.strictEqual(Screen, routeOther.getHandler()); @@ -222,6 +225,7 @@ describe('App', function () { '/path', new Route('/path', Screen) ); + assert.ok(screen instanceof Screen); }); @@ -231,13 +235,16 @@ describe('App', function () { '/path', new Route('/path', HtmlScreen) ); + assert.ok(screen instanceof HtmlScreen); }); it('creates screen instance to a route with function handler', () => { this.app = new App(); var stub = sinon.stub(); + var route = new Route('/path', stub); + var screen = this.app.createScreenInstance('/path', route); assert.strictEqual(1, stub.callCount); assert.strictEqual(route, stub.args[0][0]); @@ -248,7 +255,9 @@ describe('App', function () { it('gets same screen instance to a route', () => { this.app = new App(); var route = new Route('/path', Screen); + var screen = this.app.createScreenInstance('/path', route); + this.app.screens['/path'] = screen; assert.strictEqual( screen, @@ -259,11 +268,14 @@ describe('App', function () { it('uses same screen instance when simulating navigate refresh', () => { this.app = new App(); var route = new Route('/path', HtmlScreen); + var screen = this.app.createScreenInstance('/path', route); + this.app.screens['/path'] = screen; this.app.activePath = '/path'; this.app.activeScreen = screen; var screenRefresh = this.app.createScreenInstance('/path', route); + assert.strictEqual(screen, screenRefresh); }); @@ -390,6 +402,7 @@ describe('App', function () { it('clears screen cache and remove surfaces', () => { this.app = new App(); var surface = new Surface('surfaceId'); + surface.remove = sinon.stub(); this.app.addSurfaces(surface); this.app.screens['/path'] = this.app.createScreenInstance( @@ -622,6 +635,7 @@ describe('App', function () { this.app.addRoutes(new Route('/path', Screen)); this.app.navigate('/path').then(() => { const state = globals.window.history.state; + assert.equal(state.path, '/path'); assert.equal(state.redirectPath, '/path'); assert.equal(state.scrollLeft, 0); @@ -763,6 +777,7 @@ describe('App', function () { .then(() => this.app.navigate('/path1#hash')) .then(() => { var startNavigate = sinon.stub(); + this.app.on('startNavigate', startNavigate); dom.once(globals.window, 'popstate', () => { assert.strictEqual(0, startNavigate.callCount); @@ -1151,6 +1166,7 @@ describe('App', function () { this.app = new App(); this.app.addRoutes(new Route('/path', Screen)); const link = enterDocumentLinkElement('/path'); + link.setAttribute('target', '_blank'); link.addEventListener('click', (event) => event.preventDefault()); dom.triggerEvent(link, 'click'); @@ -1342,10 +1358,12 @@ describe('App', function () { it('does not navigate on clicking links when onbeforeunload returns truthy value', () => { const beforeunload = sinon.spy(); + window.onbeforeunload = beforeunload; this.app = new App(); this.app.addRoutes(new Route('/path', Screen)); const link = enterDocumentLinkElement('/path'); + dom.triggerEvent(link, 'click'); exitDocumentLinkElement(); assert.strictEqual(1, beforeunload.callCount); @@ -1353,6 +1371,7 @@ describe('App', function () { it('does not navigate back to the previous page on navigate back when onbeforeunload returns a truthy value', (done) => { const beforeunload = sinon.spy(); + window.onbeforeunload = beforeunload; this.app = new App(); this.app.addRoutes(new Route('/path1', Screen)); @@ -1379,6 +1398,7 @@ describe('App', function () { showPageScrollbar(); var link = enterDocumentLinkElement('/path'); + link.style.position = 'absolute'; link.style.top = '1000px'; link.style.left = '1000px'; @@ -1408,6 +1428,7 @@ describe('App', function () { this.app = new App(); this.app.addRoutes(new Route('/path', Screen)); const form = enterDocumentFormElement('/path', 'post'); + dom.triggerEvent(form, 'submit'); assert.ok(this.app.pendingNavigate); @@ -1454,6 +1475,7 @@ describe('App', function () { this.app = new App(); this.app.addRoutes(new Route('/path', Screen)); const form = enterDocumentFormElement('/path', 'post'); + dom.triggerEvent(form, 'submit'); this.app.on('startNavigate', (data) => { assert.ok(data.form); @@ -1536,6 +1558,7 @@ describe('App', function () { it('captures form button when submitting', () => { const form = enterDocumentFormElement('/path', 'post'); const button = globals.document.createElement('button'); + form.appendChild(button); this.app = new App(); this.app.setAllowPreventNavigate(false); @@ -1558,6 +1581,7 @@ describe('App', function () { it('captures form button when clicking submit button', () => { const form = enterDocumentFormElement('/path', 'post'); const button = globals.document.createElement('button'); + button.type = 'submit'; button.tabindex = 1; form.appendChild(button); @@ -1669,6 +1693,7 @@ describe('App', function () { StubScreen2.prototype.activate, StubScreen.prototype.disposeInternal, ]; + for (var i = 1; i < lifecycleOrder.length - 1; i++) { assert.ok( lifecycleOrder[i - 1].calledBefore(lifecycleOrder[i]) @@ -1688,6 +1713,7 @@ describe('App', function () { } } var surface = new Surface('surfaceId'); + surface.addContent = sinon.stub(); this.app = new App(); this.app.addRoutes(new Route('/path', ContentScreen)); @@ -1779,11 +1805,13 @@ describe('App', function () { this.app = new App(); this.app.setBasePath('/path'); var route = new Route('/:foo(\\d+)/:bar', () => {}); + var params = this.app.extractParams(route, '/path/123/abc'); var expectedParams = { foo: '123', bar: 'abc', }; + assert.deepEqual(expectedParams, params); }); @@ -1853,6 +1881,7 @@ describe('App', function () { it('adds surface content after history path is updated', (done) => { var surface = new Surface('surfaceId'); + surface.addContent = () => { assert.strictEqual('/path', globals.window.location.pathname); }; @@ -2027,6 +2056,7 @@ describe('App', function () { } var app = new App(); + this.app = app; app.addRoutes(new Route('/path1', CacheScreen)); app.addRoutes(new Route('/path2', CacheScreen)); @@ -2075,7 +2105,9 @@ describe('App', function () { this.app.addSurfaces(['surfaceId1']); this.app.navigate('/path1#surfaceId1').then(() => { const surfaceNode = document.querySelector('#surfaceId1'); + const {offsetLeft, offsetTop} = utils.getNodeOffset(surfaceNode); + assert.strictEqual(window.pageYOffset, offsetTop); assert.strictEqual(window.pageXOffset, offsetLeft); hidePageScrollbar(); @@ -2217,7 +2249,9 @@ const originalReplaceState = globals.window.history.replaceState; const syncTimeout = (fn, ms) => { const start = Date.now(); + let now = start; + while (now - start < ms) { now = Date.now(); } diff --git a/maintenance/projects/senna/test/app/AppDataAttributeHandler.js b/maintenance/projects/senna/test/app/AppDataAttributeHandler.js index ced6f56530..6bde87e0f7 100644 --- a/maintenance/projects/senna/test/app/AppDataAttributeHandler.js +++ b/maintenance/projects/senna/test/app/AppDataAttributeHandler.js @@ -38,6 +38,7 @@ describe('AppDataAttributeHandler', () => { it('throws error when base element not valid', () => { assert.throws(() => { var appDataAttributeHandler = new AppDataAttributeHandler(); + appDataAttributeHandler.setBaseElement({}); appDataAttributeHandler.handle(); }, Error); @@ -46,6 +47,7 @@ describe('AppDataAttributeHandler', () => { it('throws error when already handled', () => { assert.throws(() => { var appDataAttributeHandler = new AppDataAttributeHandler(); + appDataAttributeHandler.setBaseElement(globals.document.body); appDataAttributeHandler.handle(); appDataAttributeHandler.handle(); @@ -55,6 +57,7 @@ describe('AppDataAttributeHandler', () => { it('does not throw error when base element specified', () => { assert.doesNotThrow(() => { var appDataAttributeHandler = new AppDataAttributeHandler(); + appDataAttributeHandler.setBaseElement(globals.document.body); appDataAttributeHandler.handle(); appDataAttributeHandler.dispose(); @@ -63,6 +66,7 @@ describe('AppDataAttributeHandler', () => { it('disposes internal app when disposed', () => { var appDataAttributeHandler = new AppDataAttributeHandler(); + appDataAttributeHandler.setBaseElement(globals.document.body); appDataAttributeHandler.handle(); appDataAttributeHandler.dispose(); @@ -72,12 +76,14 @@ describe('AppDataAttributeHandler', () => { it('disposes when not handled', () => { assert.doesNotThrow(() => { var appDataAttributeHandler = new AppDataAttributeHandler(); + appDataAttributeHandler.dispose(); }); }); it('gets app', () => { var appDataAttributeHandler = new AppDataAttributeHandler(); + appDataAttributeHandler.setBaseElement(globals.document.body); appDataAttributeHandler.handle(); assert.ok(appDataAttributeHandler.getApp()); @@ -86,6 +92,7 @@ describe('AppDataAttributeHandler', () => { it('gets base element', () => { var appDataAttributeHandler = new AppDataAttributeHandler(); + appDataAttributeHandler.setBaseElement(globals.document.body); assert.strictEqual( globals.document.body, @@ -96,6 +103,7 @@ describe('AppDataAttributeHandler', () => { it('adds app surfaces from document', () => { enterDocumentSurfaceElement('surfaceId'); var appDataAttributeHandler = new AppDataAttributeHandler(); + appDataAttributeHandler.setBaseElement(globals.document.body); appDataAttributeHandler.handle(); assert.ok('surfaceId' in appDataAttributeHandler.getApp().surfaces); @@ -106,6 +114,7 @@ describe('AppDataAttributeHandler', () => { it('adds random id to body without id when used as app surface', () => { globals.document.body.setAttribute('data-senna-surface', ''); var appDataAttributeHandler = new AppDataAttributeHandler(); + appDataAttributeHandler.setBaseElement(globals.document.body); appDataAttributeHandler.handle(); assert.ok(globals.document.body); @@ -117,6 +126,7 @@ describe('AppDataAttributeHandler', () => { enterDocumentSurfaceElementMissingId('surfaceId'); assert.throws(() => { var appDataAttributeHandler = new AppDataAttributeHandler(); + appDataAttributeHandler.setBaseElement(globals.document.body); appDataAttributeHandler.handle(); }, Error); @@ -125,6 +135,7 @@ describe('AppDataAttributeHandler', () => { it('adds default route if not found in document', () => { var appDataAttributeHandler = new AppDataAttributeHandler(); + appDataAttributeHandler.setBaseElement(globals.document.body); appDataAttributeHandler.handle(); assert.ok(appDataAttributeHandler.getApp().hasRoutes()); @@ -135,6 +146,7 @@ describe('AppDataAttributeHandler', () => { enterDocumentRouteElement('/path1'); enterDocumentRouteElement('/path2'); var appDataAttributeHandler = new AppDataAttributeHandler(); + appDataAttributeHandler.setBaseElement(globals.document.body); appDataAttributeHandler.handle(); assert.strictEqual(2, appDataAttributeHandler.getApp().routes.length); @@ -146,6 +158,7 @@ describe('AppDataAttributeHandler', () => { it('adds routes from document with regex paths', () => { enterDocumentRouteElement('regex:[a-z]'); var appDataAttributeHandler = new AppDataAttributeHandler(); + appDataAttributeHandler.setBaseElement(globals.document.body); appDataAttributeHandler.handle(); assert.ok( @@ -160,6 +173,7 @@ describe('AppDataAttributeHandler', () => { enterDocumentRouteElementMissingScreenType('/path'); assert.throws(() => { var appDataAttributeHandler = new AppDataAttributeHandler(); + appDataAttributeHandler.setBaseElement(globals.document.body); appDataAttributeHandler.handle(); }, Error); @@ -170,6 +184,7 @@ describe('AppDataAttributeHandler', () => { enterDocumentRouteElementMissingPath(); assert.throws(() => { var appDataAttributeHandler = new AppDataAttributeHandler(); + appDataAttributeHandler.setBaseElement(globals.document.body); appDataAttributeHandler.handle(); }, Error); @@ -179,6 +194,7 @@ describe('AppDataAttributeHandler', () => { it('sets base path from data attribute', () => { globals.document.body.setAttribute('data-senna-base-path', '/base'); var appDataAttributeHandler = new AppDataAttributeHandler(); + appDataAttributeHandler.setBaseElement(globals.document.body); appDataAttributeHandler.handle(); assert.strictEqual( @@ -192,6 +208,7 @@ describe('AppDataAttributeHandler', () => { it('sets link selector from data attribute', () => { globals.document.body.setAttribute('data-senna-link-selector', 'a'); var appDataAttributeHandler = new AppDataAttributeHandler(); + appDataAttributeHandler.setBaseElement(globals.document.body); appDataAttributeHandler.handle(); assert.strictEqual( @@ -208,6 +225,7 @@ describe('AppDataAttributeHandler', () => { 'loading' ); var appDataAttributeHandler = new AppDataAttributeHandler(); + appDataAttributeHandler.setBaseElement(globals.document.body); appDataAttributeHandler.handle(); assert.strictEqual( @@ -224,6 +242,7 @@ describe('AppDataAttributeHandler', () => { 'false' ); var appDataAttributeHandler = new AppDataAttributeHandler(); + appDataAttributeHandler.setBaseElement(globals.document.body); appDataAttributeHandler.handle(); assert.strictEqual( @@ -242,6 +261,7 @@ describe('AppDataAttributeHandler', () => { 'true' ); var appDataAttributeHandler = new AppDataAttributeHandler(); + appDataAttributeHandler.setBaseElement(globals.document.body); appDataAttributeHandler.handle(); assert.strictEqual( @@ -257,6 +277,7 @@ describe('AppDataAttributeHandler', () => { it('dispatches app from data attribute', () => { globals.document.body.setAttribute('data-senna-dispatch', ''); var appDataAttributeHandler = new AppDataAttributeHandler(); + appDataAttributeHandler.setBaseElement(globals.document.body); appDataAttributeHandler.handle(); diff --git a/maintenance/projects/senna/test/cacheable/Cacheable.js b/maintenance/projects/senna/test/cacheable/Cacheable.js index b8b6f17482..80adc0a093 100644 --- a/maintenance/projects/senna/test/cacheable/Cacheable.js +++ b/maintenance/projects/senna/test/cacheable/Cacheable.js @@ -14,12 +14,14 @@ describe('Cacheable', () => { it('is cacheable', () => { var cacheable = new Cacheable(); + cacheable.setCacheable(true); assert.ok(cacheable.isCacheable()); }); it('clears cache when toggle cacheable state', () => { var cacheable = new Cacheable(); + cacheable.setCacheable(true); cacheable.addCache('data'); assert.strictEqual('data', cacheable.getCache()); @@ -29,6 +31,7 @@ describe('Cacheable', () => { it('clears cache on dispose', () => { var cacheable = new Cacheable(); + cacheable.setCacheable(true); cacheable.addCache('data'); cacheable.dispose(); diff --git a/maintenance/projects/senna/test/route/Route.js b/maintenance/projects/senna/test/route/Route.js index 9f3fbdbac0..e56b7f7a20 100644 --- a/maintenance/projects/senna/test/route/Route.js +++ b/maintenance/projects/senna/test/route/Route.js @@ -49,6 +49,7 @@ describe('Route', () => { it('sets path and handler from constructor', () => { var route = new Route('/path', core.nullFunction); + assert.strictEqual('/path', route.getPath()); assert.strictEqual(core.nullFunction, route.getHandler()); }); @@ -57,11 +58,13 @@ describe('Route', () => { describe('Matching', () => { it('matches route by string path', () => { var route = new Route('/path', core.nullFunction); + assert.ok(route.matchesPath('/path')); }); it('matches route by string path with params', () => { var route = new Route('/path/:foo(\\d+)', core.nullFunction); + assert.ok(route.matchesPath('/path/10')); assert.ok(route.matchesPath('/path/10/')); assert.ok(!route.matchesPath('/path/abc')); @@ -70,6 +73,7 @@ describe('Route', () => { it('matches route by regex path', () => { var route = new Route(/\/path/, core.nullFunction); + assert.ok(route.matchesPath('/path')); }); @@ -77,16 +81,19 @@ describe('Route', () => { var route = new Route((path) => { return path === '/path'; }, core.nullFunction); + assert.ok(route.matchesPath('/path')); }); it('does not match any route', () => { var route = new Route('/path', core.nullFunction); + assert.ok(!route.matchesPath('/invalid')); }); it('does not match any route for invalid path', () => { var route = new Route({}, core.nullFunction); + assert.ok(!route.matchesPath('/invalid')); }); }); @@ -97,11 +104,13 @@ describe('Route', () => { '/path/:foo(\\d+)/:bar(\\w+)', core.nullFunction ); + var params = route.extractParams('/path/123/abc'); var expected = { foo: '123', bar: 'abc', }; + assert.deepEqual(expected, params); }); @@ -110,13 +119,17 @@ describe('Route', () => { '/path/:foo(\\d+)/:bar(\\w+)', core.nullFunction ); + var params = route.extractParams('/path/abc/123'); + assert.strictEqual(null, params); }); it('returns empty object if trying to extract params from path given as function', () => { var route = new Route(core.nullFunction, core.nullFunction); + var params = route.extractParams('/path/123/abc'); + assert.deepEqual({}, params); }); }); diff --git a/maintenance/projects/senna/test/screen/HtmlScreen.js b/maintenance/projects/senna/test/screen/HtmlScreen.js index 335a8a7d6a..24507abd59 100644 --- a/maintenance/projects/senna/test/screen/HtmlScreen.js +++ b/maintenance/projects/senna/test/screen/HtmlScreen.js @@ -33,6 +33,7 @@ describe('HtmlScreen', function () { it('gets title selector', () => { var screen = new HtmlScreen(); + assert.strictEqual('title', screen.getTitleSelector()); screen.setTitleSelector('div.title'); assert.strictEqual('div.title', screen.getTitleSelector()); @@ -40,6 +41,7 @@ describe('HtmlScreen', function () { it('returns loaded content', (done) => { var screen = new HtmlScreen(); + screen.load('/url').then((content) => { assert.strictEqual('content', content); done(); @@ -49,6 +51,7 @@ describe('HtmlScreen', function () { it('sets title from response content', (done) => { var screen = new HtmlScreen(); + screen.load('/url').then(() => { assert.strictEqual('new', screen.getTitle()); done(); @@ -58,6 +61,7 @@ describe('HtmlScreen', function () { it('does not set title from response content if not present', (done) => { var screen = new HtmlScreen(); + screen.load('/url').then(() => { assert.strictEqual(null, screen.getTitle()); done(); @@ -67,6 +71,7 @@ describe('HtmlScreen', function () { it('cancels load request to an url', (done) => { var screen = new HtmlScreen(); + screen .load('/url') .catch((reason) => { @@ -78,6 +83,7 @@ describe('HtmlScreen', function () { it('copies surface root node attributes from response content', (done) => { var screen = new HtmlScreen(); + screen.allocateVirtualDocumentForContent( '
surface
' ); @@ -92,6 +98,7 @@ describe('HtmlScreen', function () { it('extracts surface content from response content', () => { var screen = new HtmlScreen(); + screen.allocateVirtualDocumentForContent( '
surface
' ); @@ -107,6 +114,7 @@ describe('HtmlScreen', function () { it('extracts surface content from response content default child if present', () => { var screen = new HtmlScreen(); + screen.allocateVirtualDocumentForContent( '
static
surface
' ); @@ -122,6 +130,7 @@ describe('HtmlScreen', function () { it('releases virtual document after activate', () => { var screen = new HtmlScreen(); + screen.allocateVirtualDocumentForContent(''); assert.ok(screen.virtualDocument); screen.activate(); @@ -171,6 +180,7 @@ describe('HtmlScreen', function () { ); var surface = new Surface('surfaceId'); var screen = new HtmlScreen(); + screen.allocateVirtualDocumentForContent(''); assert.ok(!window.sentinel); screen @@ -192,6 +202,7 @@ describe('HtmlScreen', function () { ); var surface = new Surface('surfaceId'); var screen = new HtmlScreen(); + screen.allocateVirtualDocumentForContent(''); screen .evaluateStyles({ @@ -208,12 +219,15 @@ describe('HtmlScreen', function () { enterDocumentSurfaceElement('surfaceId', ''); new Surface('surfaceId'); var screen = new HtmlScreen(); + screen.allocateVirtualDocumentForContent( '' ); screen.evaluateFavicon_().then(() => { var element = document.querySelector('link[rel="Shortcut Icon"]'); + var uri = new Uri(element.href); + assert.strictEqual('/for/favicon.ico', uri.getPathname()); exitDocumentElement('surfaceId'); done(); @@ -222,6 +236,7 @@ describe('HtmlScreen', function () { it('always evaluate tracked favicon', (done) => { var screen = new HtmlScreen(); + screen.allocateVirtualDocumentForContent( '' ); @@ -234,6 +249,7 @@ describe('HtmlScreen', function () { var element = document.querySelector( 'link[rel="Shortcut Icon"]' ); + assert.ok(element); new Uri(element.href); exitDocumentElement('favicon'); @@ -256,6 +272,7 @@ describe('HtmlScreen', function () { ); new Surface('surfaceId'); var screen = new HtmlScreen(); + screen.allocateVirtualDocumentForContent( '' ); @@ -263,7 +280,9 @@ describe('HtmlScreen', function () { var element = document.querySelector( 'link[rel="Shortcut Icon"]' ); + var uri = new Uri(element.href); + assert.strictEqual('/for/favicon.ico', uri.getPathname()); assert.ok(uri.hasParameter('q') === false); exitDocumentElement('surfaceId'); @@ -286,6 +305,7 @@ describe('HtmlScreen', function () { ); new Surface('surfaceId'); var screen = new HtmlScreen(); + screen.allocateVirtualDocumentForContent( '' ); @@ -293,7 +313,9 @@ describe('HtmlScreen', function () { var element = document.querySelector( 'link[rel="Shortcut Icon"]' ); + var uri = new Uri(element.href); + assert.strictEqual('/for/favicon.ico', uri.getPathname()); assert.ok(uri.hasParameter('q')); exitDocumentElement('surfaceId'); @@ -304,6 +326,7 @@ describe('HtmlScreen', function () { it('always evaluate tracked temporary scripts', (done) => { var screen = new HtmlScreen(); + screen.allocateVirtualDocumentForContent( '' ); @@ -324,6 +347,7 @@ describe('HtmlScreen', function () { it('always evaluate tracked temporary styles', (done) => { var screen = new HtmlScreen(); + screen.allocateVirtualDocumentForContent( '' ); @@ -342,6 +366,7 @@ describe('HtmlScreen', function () { it('appends existing teporary styles with id in the same place as the reference', (done) => { var screen = new HtmlScreen(); + screen.allocateVirtualDocumentForContent( '' ); @@ -366,6 +391,7 @@ describe('HtmlScreen', function () { it('evaluates tracked permanent scripts only once', (done) => { var screen = new HtmlScreen(); + screen.allocateVirtualDocumentForContent( '' ); @@ -385,6 +411,7 @@ describe('HtmlScreen', function () { it('evaluates tracked permanent styles only once', (done) => { var screen = new HtmlScreen(); + screen.allocateVirtualDocumentForContent( '' ); @@ -421,6 +448,7 @@ describe('HtmlScreen', function () { it('clears pendingStyles after screen activates', (done) => { var screen = new HtmlScreen(); + screen.allocateVirtualDocumentForContent( '' ); @@ -476,6 +504,7 @@ describe('HtmlScreen', function () { screen.load('/url').then(() => { var style = screen.virtualQuerySelectorAll_('#style')[0]; + style.addEventListener('load', () => { window.sentinelLoadCount++; }); @@ -501,6 +530,7 @@ describe('HtmlScreen', function () { it('has correct title', (done) => { var screen = new HtmlScreen(); + screen.allocateVirtualDocumentForContent('left'); screen.resolveTitleFromVirtualDocument(); screen.flip([]).then(() => { @@ -511,6 +541,7 @@ describe('HtmlScreen', function () { it('has correct title when the title contains html entities', (done) => { var screen = new HtmlScreen(); + screen.allocateVirtualDocumentForContent( 'left & right' ); diff --git a/maintenance/projects/senna/test/screen/RequestScreen.js b/maintenance/projects/senna/test/screen/RequestScreen.js index b62a305ef6..1db5c47a3c 100644 --- a/maintenance/projects/senna/test/screen/RequestScreen.js +++ b/maintenance/projects/senna/test/screen/RequestScreen.js @@ -39,11 +39,13 @@ describe('RequestScreen', function () { it('is cacheable', () => { var screen = new RequestScreen(); + assert.ok(screen.isCacheable()); }); it('sets HTTP method', () => { var screen = new RequestScreen(); + assert.strictEqual(RequestScreen.GET, screen.getHttpMethod()); screen.setHttpMethod(RequestScreen.POST); assert.strictEqual(RequestScreen.POST, screen.getHttpMethod()); @@ -64,6 +66,7 @@ describe('RequestScreen', function () { it('sets timeout', () => { var screen = new RequestScreen(); + assert.strictEqual(30000, screen.getTimeout()); screen.setTimeout(0); assert.strictEqual(0, screen.getTimeout()); @@ -71,6 +74,7 @@ describe('RequestScreen', function () { it('screen beforeUpdateHistoryPath return request path if responseURL or X-Request-URL not present', () => { var screen = new RequestScreen(); + sinon.stub(screen, 'getRequest', () => { return { requestPath: '/path', @@ -84,6 +88,7 @@ describe('RequestScreen', function () { it('screen beforeUpdateHistoryPath return responseURL if present', () => { var screen = new RequestScreen(); + sinon.stub(screen, 'getRequest', () => { return { requestPath: '/path', @@ -98,6 +103,7 @@ describe('RequestScreen', function () { it('screen beforeUpdateHistoryPath return X-Request-URL if present and responseURL is not', () => { var screen = new RequestScreen(); + sinon.stub(screen, 'getRequest', () => { return { requestPath: '/path', @@ -129,6 +135,7 @@ describe('RequestScreen', function () { it('requests path return null if no requests were made', () => { var screen = new RequestScreen(); + assert.strictEqual(null, screen.getRequestPath()); }); @@ -141,6 +148,7 @@ describe('RequestScreen', function () { } else { var screen = new RequestScreen(); + screen.load('/url').then(() => { assert.strictEqual( globals.window.location.origin + '/url', @@ -162,6 +170,7 @@ describe('RequestScreen', function () { it('loads response content from cache', (done) => { var screen = new RequestScreen(); var cache = {}; + screen.addCache(cache); screen.load('/url').then((cachedContent) => { assert.strictEqual(cache, cachedContent); @@ -185,6 +194,7 @@ describe('RequestScreen', function () { it('cancels load request to an url', (done) => { var screen = new RequestScreen(); + screen .load('/url') .then(() => assert.fail()) @@ -197,6 +207,7 @@ describe('RequestScreen', function () { it('fails for timeout request', (done) => { var screen = new RequestScreen(); + screen.setTimeout(0); screen.load('/url').catch((reason) => { assert.ok(reason.timeout); @@ -241,6 +252,7 @@ describe('RequestScreen', function () { it('form navigate force post method and request body wrapped in FormData', (done) => { globals.capturedFormElement = globals.document.createElement('form'); var screen = new RequestScreen(); + screen.load('/url').then(() => { assert.strictEqual(RequestScreen.POST, screen.getRequest().method); assert.ok(screen.getRequest().requestBody instanceof FormData); @@ -253,6 +265,7 @@ describe('RequestScreen', function () { it('adds submit input button value into request FormData', (done) => { globals.capturedFormElement = globals.document.createElement('form'); const submitButton = globals.document.createElement('button'); + submitButton.name = 'submitButton'; submitButton.type = 'submit'; submitButton.value = 'Send'; @@ -280,6 +293,7 @@ describe('RequestScreen', function () { else { var url = '/url'; var screen = new RequestScreen(); + screen.load(url).then(() => { assert.notStrictEqual(url, screen.getRequest().url); assert.strictEqual(url, screen.getRequestPath()); @@ -299,6 +313,7 @@ describe('RequestScreen', function () { else { var url = '/url'; var screen = new RequestScreen(); + screen.load(url).then(() => { assert.notStrictEqual(url, screen.getRequest().url); done(); @@ -320,6 +335,7 @@ describe('RequestScreen', function () { ); var url = '/url'; var screen = new RequestScreen(); + screen.load(url).then(() => { assert.ok( '"0"', @@ -337,8 +353,10 @@ describe('RequestScreen', function () { 'http', 'https' ); + screen.load(wrongProtocol + '/url').then(() => { var url = screen.getRequest().url; + assert.ok(url.indexOf('http:') === 0); done(); }); diff --git a/maintenance/projects/senna/test/screen/Screen.js b/maintenance/projects/senna/test/screen/Screen.js index 8ae6a34996..9054660efd 100644 --- a/maintenance/projects/senna/test/screen/Screen.js +++ b/maintenance/projects/senna/test/screen/Screen.js @@ -97,6 +97,7 @@ describe('Screen', () => { it('gets screen id', () => { var screen = new Screen(); + assert.ok(screen.getId()); screen.setId('otherId'); assert.strictEqual('otherId', screen.getId()); @@ -104,6 +105,7 @@ describe('Screen', () => { it('gets screen title', () => { var screen = new Screen(); + assert.strictEqual(null, screen.getTitle()); screen.setTitle('other'); assert.strictEqual('other', screen.getTitle()); @@ -140,6 +142,7 @@ describe('Screen', () => { ); var surface = new Surface('surfaceId'); var screen = new Screen(); + screen .evaluateStyles({ surfaceId: surface, diff --git a/maintenance/projects/senna/test/surface/Surface.js b/maintenance/projects/senna/test/surface/Surface.js index b3720aad08..d0c8eca04c 100644 --- a/maintenance/projects/senna/test/surface/Surface.js +++ b/maintenance/projects/senna/test/surface/Surface.js @@ -30,20 +30,25 @@ describe('Surface', () => { it('creates surface child when adding screen content to surface', () => { enterDocumentSurfaceElement('surfaceId'); var surface = new Surface('surfaceId'); + var surfaceChild = surface.addContent('screenId', 'content'); + assert.ok(core.isElement(surfaceChild)); exitDocumentSurfaceElement('surfaceId'); }); it('creates surface child when adding screen content to surface outside document', () => { var surface = new Surface('virtualSurfaceId'); + var surfaceChild = surface.addContent('screenId', 'content'); + assert.strictEqual('content', surfaceChild.innerHTML); }); it('wraps initial surface content as default child if default wrapper missing', () => { enterDocumentSurfaceElement('surfaceId', 'default'); var surface = new Surface('surfaceId'); + assert.strictEqual('default', surface.defaultChild.innerHTML); exitDocumentSurfaceElement('surfaceId'); }); @@ -51,7 +56,9 @@ describe('Surface', () => { it('adds screen content to surface child', () => { enterDocumentSurfaceElement('surfaceId'); var surface = new Surface('surfaceId'); + var surfaceChild = surface.addContent('screenId', 'content'); + assert.strictEqual('content', surfaceChild.innerHTML); exitDocumentSurfaceElement('surfaceId'); }); @@ -59,7 +66,9 @@ describe('Surface', () => { it('adds empty string as screen content to surface child', () => { enterDocumentSurfaceElement('surfaceId'); var surface = new Surface('surfaceId'); + var surfaceChild = surface.addContent('screenId', ''); + assert.strictEqual('', surfaceChild.innerHTML); exitDocumentSurfaceElement('surfaceId'); }); @@ -67,7 +76,9 @@ describe('Surface', () => { it('does not add null/undefined as screen content to surface child', () => { enterDocumentSurfaceElement('surfaceId'); var surface = new Surface('surfaceId'); + var surfaceChild = surface.addContent('screenId', undefined); + assert.strictEqual(surface.defaultChild, surfaceChild); surfaceChild = surface.addContent('screenId', null); assert.strictEqual(surface.defaultChild, surfaceChild); @@ -77,7 +88,9 @@ describe('Surface', () => { it('surface child be inserted into surface element', () => { enterDocumentSurfaceElement('surfaceId'); var surface = new Surface('surfaceId'); + var surfaceChild = surface.addContent('screenId', 'content'); + assert.strictEqual(surface.getElement(), surfaceChild.parentNode); exitDocumentSurfaceElement('surfaceId'); }); @@ -85,7 +98,9 @@ describe('Surface', () => { it('surface child enter document invisible', () => { enterDocumentSurfaceElement('surfaceId'); var surface = new Surface('surfaceId'); + var surfaceChild = surface.addContent('screenId', 'content'); + assert.strictEqual('none', surfaceChild.style.display); exitDocumentSurfaceElement('surfaceId'); }); @@ -93,6 +108,7 @@ describe('Surface', () => { it('surface child become visible for its screen', () => { enterDocumentSurfaceElement('surfaceId'); var surface = new Surface('surfaceId'); + var surfaceChild = surface.addContent('screenId', 'content'); surface.show('screenId'); assert.strictEqual('block', surfaceChild.style.display); @@ -102,12 +118,14 @@ describe('Surface', () => { it('only one surface child be visible at time', () => { enterDocumentSurfaceElement('surfaceId'); var surface = new Surface('surfaceId'); + var surfaceChild = surface.addContent('screenId', 'content'); surface.show('screenId'); var surfaceChildNext = surface.addContent( 'screenNextId', 'content' ); + assert.strictEqual('none', surfaceChildNext.style.display); surface.show('screenNextId'); assert.strictEqual('none', surfaceChild.style.display); @@ -118,6 +136,7 @@ describe('Surface', () => { it('removes screen content from surface child', () => { enterDocumentSurfaceElement('surfaceId'); var surface = new Surface('surfaceId'); + surface.addContent('screenId', 'content'); surface.remove('screenId'); assert.strictEqual(null, surface.getChild('screenId')); @@ -127,6 +146,7 @@ describe('Surface', () => { it('removes screen content from surface child outside document', () => { enterDocumentSurfaceElement('surfaceId'); var surface = new Surface('surfaceId'); + surface.remove('screenId'); assert.strictEqual(null, surface.getChild('screenId')); exitDocumentSurfaceElement('surfaceId'); @@ -134,19 +154,23 @@ describe('Surface', () => { it('creates surface child relating surface id and screen id', () => { var surface = new Surface('surfaceId'); + var surfaceChild = surface.createChild('screenId'); + assert.strictEqual('surfaceId-screenId', surfaceChild.id); }); it('gets surface element by surfaceId', () => { var surfaceElement = enterDocumentSurfaceElement('surfaceId'); var surface = new Surface('surfaceId'); + assert.strictEqual(surfaceElement, surface.getElement()); exitDocumentSurfaceElement('surfaceId'); }); it('gets surface id', () => { var surface = new Surface('surfaceId'); + assert.strictEqual('surfaceId', surface.getId()); surface.setId('otherId'); assert.strictEqual('otherId', surface.getId()); @@ -154,10 +178,13 @@ describe('Surface', () => { it('shows default surface child if screen id not found and hide when found', () => { var defaultChild = enterDocumentSurfaceElement('surfaceId-default'); + enterDocumentSurfaceElement('surfaceId').appendChild(defaultChild); var surface = new Surface('surfaceId'); + surface.show('screenId'); var surfaceChild = surface.addContent('screenId', 'content'); + assert.strictEqual('none', surfaceChild.style.display); assert.strictEqual('block', defaultChild.style.display); surface.show('screenId'); @@ -170,9 +197,11 @@ describe('Surface', () => { var surfaceChild = enterDocumentSurfaceElement( 'surfaceId-screenId' ); + enterDocumentSurfaceElement('surfaceId').appendChild(surfaceChild); surfaceChild.innerHTML = 'temp'; var surface = new Surface('surfaceId'); + surface.addContent('screenId', 'content'); assert.strictEqual('content', surfaceChild.innerHTML); exitDocumentSurfaceElement('surfaceId'); @@ -181,8 +210,10 @@ describe('Surface', () => { it('is able to overwrite default transition', () => { enterDocumentSurfaceElement('surfaceId'); var surface = new Surface('surfaceId'); + surface.addContent('screenId', 'content'); var transitionFn = sinon.stub(); + surface.setTransitionFn(transitionFn); surface.show('screenId'); assert.strictEqual(1, transitionFn.callCount); @@ -193,12 +224,14 @@ describe('Surface', () => { it('is able to wait deferred transition before removing visible surface child', (done) => { enterDocumentSurfaceElement('surfaceId'); var surface = new Surface('surfaceId'); + var surfaceChild = surface.addContent('screenId', 'content'); var surfaceChildNext = surface.addContent( 'screenNextId', 'content' ); var transitionFn = () => CancellablePromise.resolve(); + surface.setTransitionFn(transitionFn); surface.show('screenId'); surface.show('screenNextId').then(() => { @@ -214,6 +247,7 @@ describe('Surface', () => { it('transition deferred be cancellable', (done) => { var surface = new Surface('surfaceId'); var transitionFn = () => CancellablePromise.resolve(); + surface.setTransitionFn(transitionFn); surface .transition(null, null) diff --git a/maintenance/projects/senna/test/utils/utils.js b/maintenance/projects/senna/test/utils/utils.js index 2043ffa9c9..f92f89617f 100644 --- a/maintenance/projects/senna/test/utils/utils.js +++ b/maintenance/projects/senna/test/utils/utils.js @@ -31,10 +31,12 @@ describe('utils', () => { it('copies attributes from source node to target node', () => { var nodeA = document.createElement('div'); + nodeA.setAttribute('a', 'valueA'); nodeA.setAttribute('b', 'valueB'); var nodeB = document.createElement('div'); + utils.copyNodeAttributes(nodeA, nodeB); assert.strictEqual(nodeA.attributes.length, nodeB.attributes.length); @@ -46,6 +48,7 @@ describe('utils', () => { it('clears attributes from a given node', () => { var node = document.createElement('div'); + node.setAttribute('a', 'valueA'); node.setAttribute('b', 'valueB'); diff --git a/projects/amd-loader/bin/build-demo.js b/projects/amd-loader/bin/build-demo.js index 2f5107ed44..0a72b9539e 100644 --- a/projects/amd-loader/bin/build-demo.js +++ b/projects/amd-loader/bin/build-demo.js @@ -39,6 +39,7 @@ globby.sync('src/demo/modules/**/*.js').forEach((file) => { const filePath = file.substring( path.join(DEMO_SRC, 'modules').length + path.sep.length ); + const dirname = path.dirname(filePath); fs.mkdirsSync(DEMO_BUILD, 'modules', dirname); diff --git a/projects/amd-loader/src/loader/bootstrap.js b/projects/amd-loader/src/loader/bootstrap.js index c40ff41e55..9ba0c96351 100644 --- a/projects/amd-loader/src/loader/bootstrap.js +++ b/projects/amd-loader/src/loader/bootstrap.js @@ -6,12 +6,14 @@ import Loader from './loader'; const cfg = window.__CONFIG__ || {}; + const namespace = typeof cfg.namespace === 'string' ? cfg.namespace : undefined; const exposeGlobal = cfg.exposeGlobal === undefined ? true : cfg.exposeGlobal; const loader = new Loader(cfg); if (namespace) { const ns = window[namespace] ? window[namespace] : {}; + ns.Loader = loader; window[namespace] = ns; } diff --git a/projects/amd-loader/src/loader/dependency-resolver.js b/projects/amd-loader/src/loader/dependency-resolver.js index 994b47adf7..b49cf525fc 100644 --- a/projects/amd-loader/src/loader/dependency-resolver.js +++ b/projects/amd-loader/src/loader/dependency-resolver.js @@ -43,6 +43,7 @@ export default class DependencyResolver { } const modulesParam = `modules=${encodeURIComponent(modules)}`; + let url = `${config.resolvePath}?${modulesParam}`; let options = {}; @@ -58,6 +59,7 @@ export default class DependencyResolver { .then((response) => response.text()) .then((text) => { const resolution = JSON.parse(text); + this._cachedResolutions[modules] = resolution; resolve(resolution); }) diff --git a/projects/amd-loader/src/loader/script-loader.js b/projects/amd-loader/src/loader/script-loader.js index 46553844f8..6b59af4063 100644 --- a/projects/amd-loader/src/loader/script-loader.js +++ b/projects/amd-loader/src/loader/script-loader.js @@ -58,6 +58,7 @@ export default class ScriptLoader { */ _loadScript(modulesURL) { const config = this._config; + const modules = config.getModules(modulesURL.modules); let script = this._injectedScripts[modulesURL.url]; diff --git a/projects/amd-loader/src/loader/url-builder.js b/projects/amd-loader/src/loader/url-builder.js index f9d44fda1e..010c9c26d4 100644 --- a/projects/amd-loader/src/loader/url-builder.js +++ b/projects/amd-loader/src/loader/url-builder.js @@ -38,6 +38,7 @@ export default class URLBuilder { moduleNames.forEach((moduleName) => { const module = config.getModule(moduleName); + const path = this._getModulePath(module); if (config.combine) { diff --git a/projects/amd-loader/test/loader/script-loader.js b/projects/amd-loader/test/loader/script-loader.js index 3005caa643..ebd7e0ad8d 100644 --- a/projects/amd-loader/test/loader/script-loader.js +++ b/projects/amd-loader/test/loader/script-loader.js @@ -32,6 +32,7 @@ describe('ScriptLoader', () => { it('inserts synchronous DOM script nodes', (done) => { const config = new Config({combine: false, url: 'http://localhost'}); + const scriptLoader = new ScriptLoader(document, config); config.addModule('a@1.0.0'); @@ -50,6 +51,7 @@ describe('ScriptLoader', () => { it('works without combine flag', (done) => { const config = new Config({combine: false, url: 'http://localhost'}); + const scriptLoader = new ScriptLoader(document, config); const moduleNames = ['a@1.0.0', 'b@1.2.0']; @@ -75,6 +77,7 @@ describe('ScriptLoader', () => { it('works with combine flag', (done) => { const config = new Config({combine: true, url: 'http://localhost'}); + const scriptLoader = new ScriptLoader(document, config); const moduleNames = ['a@1.0.0', 'b@1.2.0']; @@ -96,6 +99,7 @@ describe('ScriptLoader', () => { it('rejects on error', (done) => { const config = new Config({combine: true, url: 'http://localhost'}); + const scriptLoader = new ScriptLoader(document, config); const moduleNames = ['a@1.0.0', 'b@1.2.0']; diff --git a/projects/eslint-plugin/configs/general.js b/projects/eslint-plugin/configs/general.js index d52a53311c..cb5134ff24 100644 --- a/projects/eslint-plugin/configs/general.js +++ b/projects/eslint-plugin/configs/general.js @@ -93,6 +93,7 @@ const config = { '@liferay/aui/no-node': 'error', '@liferay/aui/no-object': 'error', '@liferay/aui/no-one': 'error', + '@liferay/blank-line-declaration-usage': 'error', '@liferay/destructure-requires': 'error', '@liferay/empty-line-between-elements': 'error', '@liferay/expect-assert': 'error', diff --git a/projects/eslint-plugin/rules/general/index.js b/projects/eslint-plugin/rules/general/index.js index 0a0bcaa3a4..dc05e29803 100644 --- a/projects/eslint-plugin/rules/general/index.js +++ b/projects/eslint-plugin/rules/general/index.js @@ -6,6 +6,7 @@ module.exports = { 'array-is-array': require('./lib/rules/array-is-array'), 'destructure-requires': require('./lib/rules/destructure-requires'), + 'blank-line-declaration-usage': require('./lib/rules/blank-line-declaration-usage'), 'empty-line-between-elements': require('./lib/rules/empty-line-between-elements'), 'expect-assert': require('./lib/rules/expect-assert'), 'group-imports': require('./lib/rules/group-imports'), diff --git a/projects/eslint-plugin/rules/general/lib/rules/blank-line-declaration-usage.js b/projects/eslint-plugin/rules/general/lib/rules/blank-line-declaration-usage.js new file mode 100644 index 0000000000..80f14e3dd4 --- /dev/null +++ b/projects/eslint-plugin/rules/general/lib/rules/blank-line-declaration-usage.js @@ -0,0 +1,72 @@ +/** + * SPDX-FileCopyrightText: © 2017 Liferay, Inc. + * SPDX-License-Identifier: MIT + */ + +const message = + 'Expected an empty line between variable declaration and usage.'; + +module.exports = { + create(context) { + const sourceCode = context.getSourceCode(); + + return { + VariableDeclaration(node) { + if ( + node.parent.type === 'ForStatement' || + node.parent.type === 'ForInStatement' || + node.parent.type === 'ForOfStatement' || + node.parent.type === 'WhileStatement' + ) { + return; + } + + const varsDeclaredOnLine = context.getDeclaredVariables(node); + + const declarationLine = + varsDeclaredOnLine[0].identifiers[0].loc.start.line; + + varsDeclaredOnLine.forEach((reference) => { + const varReference = reference.references[1]; + + if (varReference === undefined) { + return; + } + + const referenceLine = + varReference.identifier.loc.start.line; + + if ( + sourceCode.lines + .slice(declarationLine, referenceLine - 1) + .indexOf('') === -1 + ) { + context.report({ + fix: (fixer) => { + const declarationEndLine = node.loc.end.line; + + if (referenceLine === declarationEndLine + 1) { + return fixer.insertTextAfter(node, '\n'); + } + }, + message, + node: reference.references[1].identifier, + }); + } + }); + }, + }; + }, + + meta: { + docs: { + category: 'Best Practices', + description: message, + recommended: false, + url: 'https://github.com/liferay/eslint-config-liferay/issues/139', + }, + fixable: 'code', + schema: [], + type: 'problem', + }, +}; diff --git a/projects/eslint-plugin/rules/general/lib/rules/group-imports.js b/projects/eslint-plugin/rules/general/lib/rules/group-imports.js index 47b44d3d0a..fcb661d9c7 100644 --- a/projects/eslint-plugin/rules/general/lib/rules/group-imports.js +++ b/projects/eslint-plugin/rules/general/lib/rules/group-imports.js @@ -23,7 +23,9 @@ module.exports = { function expectBlankLines(node, count = 1) { const comments = getLeadingComments(node, context); + const initial = comments[0] || node; + const token = context.getTokenBefore(initial, { includeComments: true, }); diff --git a/projects/eslint-plugin/rules/general/lib/rules/padded-test-blocks.js b/projects/eslint-plugin/rules/general/lib/rules/padded-test-blocks.js index f4343c02e9..b4644faac6 100644 --- a/projects/eslint-plugin/rules/general/lib/rules/padded-test-blocks.js +++ b/projects/eslint-plugin/rules/general/lib/rules/padded-test-blocks.js @@ -122,6 +122,7 @@ module.exports = { ) { const start = previous.range[1]; const end = node.range[0]; + const between = source.text.slice(start, end); let newlines = 0; diff --git a/projects/eslint-plugin/rules/general/lib/rules/ref-name-suffix.js b/projects/eslint-plugin/rules/general/lib/rules/ref-name-suffix.js index 7f2d54f6b0..38e4dd6e4b 100644 --- a/projects/eslint-plugin/rules/general/lib/rules/ref-name-suffix.js +++ b/projects/eslint-plugin/rules/general/lib/rules/ref-name-suffix.js @@ -26,6 +26,7 @@ module.exports = { !variableName.match(NAME_PATTERN) ) { const [variable] = context.getDeclaredVariables(node); + const newVariableName = variable.name + 'Ref'; for (const reference of variable.references) { diff --git a/projects/eslint-plugin/rules/general/lib/rules/sort-imports.js b/projects/eslint-plugin/rules/general/lib/rules/sort-imports.js index a232da6b44..1332f7a4ea 100644 --- a/projects/eslint-plugin/rules/general/lib/rules/sort-imports.js +++ b/projects/eslint-plugin/rules/general/lib/rules/sort-imports.js @@ -290,7 +290,9 @@ module.exports = { for (let i = firstMismatch; i <= lastMismatch; i++) { const node = actual[i]; + const range = getRangeForNode(node); + const text = code.getText().slice(...range); sources.set(actual[i], {text}); diff --git a/projects/eslint-plugin/rules/general/tests/lib/rules/blank-line-declaration-usage.js b/projects/eslint-plugin/rules/general/tests/lib/rules/blank-line-declaration-usage.js new file mode 100644 index 0000000000..b9d57fe9f7 --- /dev/null +++ b/projects/eslint-plugin/rules/general/tests/lib/rules/blank-line-declaration-usage.js @@ -0,0 +1,243 @@ +/** + * SPDX-FileCopyrightText: © 2017 Liferay, Inc. + * SPDX-License-Identifier: MIT + */ + +const MultiTester = require('../../../../../scripts/MultiTester'); +const rule = require('../../../lib/rules/blank-line-declaration-usage'); + +const parserOptions = { + parserOptions: { + ecmaVersion: 6, + }, +}; + +const message = + 'Expected an empty line between variable declaration and usage.'; + +const ruleTester = new MultiTester(parserOptions); + +ruleTester.run('blank-line-declaration-usage', rule, { + invalid: [ + { + code: ` + const test = 'test'; + const testLength = test.length; + `, + errors: [ + { + message, + type: 'Identifier', + }, + ], + output: ` + const test = 'test'; + + const testLength = test.length; + `, + }, + { + code: ` + const obj = { + foo: 'bar', + bar: 'foo', + life: 'ray', + } + Object.keys(obj) + `, + errors: [ + { + message, + type: 'Identifier', + }, + ], + output: ` + const obj = { + foo: 'bar', + bar: 'foo', + life: 'ray', + } + + Object.keys(obj) + `, + }, + { + code: ` + function updateData() { + const obj = { + foo: 'bar', + bar: 'foo', + life: 'ray', + } + + const ids = Object.keys(obj).length + ? 'superLongStringSoThatItForcesTheLineToBeWrapped' + : 'justASimpleString'; + ids.length; + } + `, + errors: [ + { + message, + type: 'Identifier', + }, + ], + output: ` + function updateData() { + const obj = { + foo: 'bar', + bar: 'foo', + life: 'ray', + } + + const ids = Object.keys(obj).length + ? 'superLongStringSoThatItForcesTheLineToBeWrapped' + : 'justASimpleString'; + + ids.length; + } + `, + }, + { + code: ` + const obj = { + foo: 'bar', + bar: 'foo', + life: 'ray', + } + + const {foo} = obj; + const length = foo.length; + `, + errors: [ + { + message, + type: 'Identifier', + }, + ], + output: ` + const obj = { + foo: 'bar', + bar: 'foo', + life: 'ray', + } + + const {foo} = obj; + + const length = foo.length; + `, + }, + { + code: ` + const {foo, bar, life} = obj; + const length = life.length; + `, + errors: [ + { + message, + type: 'Identifier', + }, + ], + output: ` + const {foo, bar, life} = obj; + + const length = life.length; + `, + }, + { + code: ` + const filePath = context.getFilename(); + const filename = path.basename(something, filePath); + `, + errors: [ + { + message, + type: 'Identifier', + }, + ], + output: ` + const filePath = context.getFilename(); + + const filename = path.basename(something, filePath); + `, + }, + { + code: ` + for (const file of files) { + const contents = readFileAsync(file, 'utf8'); + const length = contents.length; + } + `, + errors: [ + { + message, + type: 'Identifier', + }, + ], + output: ` + for (const file of files) { + const contents = readFileAsync(file, 'utf8'); + + const length = contents.length; + } + `, + }, + { + code: ` + const cbSpy = sinon.spy(); + prototype.rows = [cbSpy]; + `, + errors: [ + { + message, + type: 'Identifier', + }, + ], + output: ` + const cbSpy = sinon.spy(); + + prototype.rows = [cbSpy]; + `, + }, + ], + valid: [ + { + code: ` + const test = 'test'; + + const testLength = test.length; + `, + }, + { + code: ` + const obj = { + foo: 'bar', + bar: 'foo', + life: 'ray', + } + + Object.keys(obj).map(key => {}); + `, + }, + { + code: ` + const obj = { + foo: 'bar', + bar: 'foo', + life: 'ray', + } + + const {foo} = obj; + + const length = foo.length; + `, + }, + { + code: ` + for (const file of files) { + const contents = readFileAsync(file, 'utf8'); + } + `, + }, + ], +}); diff --git a/projects/eslint-plugin/rules/portal/lib/rules/no-localhost-reference.js b/projects/eslint-plugin/rules/portal/lib/rules/no-localhost-reference.js index 9783819879..dba552dd33 100644 --- a/projects/eslint-plugin/rules/portal/lib/rules/no-localhost-reference.js +++ b/projects/eslint-plugin/rules/portal/lib/rules/no-localhost-reference.js @@ -10,6 +10,7 @@ const DESCRIPTION = 'do not make explicit references to localhost.'; module.exports = { create(context) { const filePath = context.getFilename(); + const filename = path.basename(filePath); if ( diff --git a/projects/eslint-plugin/scripts/MultiTester.js b/projects/eslint-plugin/scripts/MultiTester.js index aa0e99c232..2093d7bfd6 100644 --- a/projects/eslint-plugin/scripts/MultiTester.js +++ b/projects/eslint-plugin/scripts/MultiTester.js @@ -44,6 +44,7 @@ class MultiTester extends RuleTester { const handleSkips = (test) => { const {skip, ...config} = test; + if (skip && skip.includes(key)) { return false; } diff --git a/projects/js-themes-toolkit/packages/generator-liferay-theme/generators/layout/standalone-layout.js b/projects/js-themes-toolkit/packages/generator-liferay-theme/generators/layout/standalone-layout.js index 20d72e70b1..09692eccef 100644 --- a/projects/js-themes-toolkit/packages/generator-liferay-theme/generators/layout/standalone-layout.js +++ b/projects/js-themes-toolkit/packages/generator-liferay-theme/generators/layout/standalone-layout.js @@ -30,7 +30,9 @@ module.exports = class extends Generator { const cp = new Copier(this); const {layoutId, liferayVersion} = this.answers; + const layoutName = snakeCase(layoutId); + const templateFilename = `${layoutName}.ftl`; const thumbnailFilename = `${layoutName}.png`; @@ -71,6 +73,7 @@ module.exports = class extends Generator { _getDevDependencies() { const {liferayVersion} = this.answers; + const devDependencies = devDependenciesMap[liferayVersion].default; return JSON.stringify(devDependencies, null, 2) diff --git a/projects/js-themes-toolkit/packages/generator-liferay-theme/generators/layout/theme-layout.js b/projects/js-themes-toolkit/packages/generator-liferay-theme/generators/layout/theme-layout.js index 9a2eb0564f..a3150260f5 100644 --- a/projects/js-themes-toolkit/packages/generator-liferay-theme/generators/layout/theme-layout.js +++ b/projects/js-themes-toolkit/packages/generator-liferay-theme/generators/layout/theme-layout.js @@ -25,7 +25,9 @@ module.exports = class extends Generator { const cp = new Copier(this); const {layoutId, liferayVersion} = this.answers; + const layoutName = snakeCase(layoutId); + const templateFilename = `${layoutName}.ftl`; const thumbnailFilename = `${layoutName}.png`; diff --git a/projects/js-themes-toolkit/packages/generator-liferay-theme/lib/generation/theme-based.js b/projects/js-themes-toolkit/packages/generator-liferay-theme/lib/generation/theme-based.js index 0e19e84efc..adf51bb10b 100644 --- a/projects/js-themes-toolkit/packages/generator-liferay-theme/lib/generation/theme-based.js +++ b/projects/js-themes-toolkit/packages/generator-liferay-theme/lib/generation/theme-based.js @@ -29,6 +29,7 @@ const pipeline = promisify(stream.pipeline); async function writing(generator, themeName) { const project = new Project(generator); + const {liferayVersion} = project; let {themeVersion} = argv; diff --git a/projects/js-themes-toolkit/packages/generator-liferay-theme/lib/utils/Copier.js b/projects/js-themes-toolkit/packages/generator-liferay-theme/lib/utils/Copier.js index 31a9af7328..fb992e76a6 100644 --- a/projects/js-themes-toolkit/packages/generator-liferay-theme/lib/utils/Copier.js +++ b/projects/js-themes-toolkit/packages/generator-liferay-theme/lib/utils/Copier.js @@ -51,6 +51,7 @@ module.exports = class Copier { */ copyDir(src, {context = {}} = {}) { const gen = this._generator; + const files = fs.readdirSync(gen.templatePath(src)); files.forEach((file) => { diff --git a/projects/js-themes-toolkit/packages/generator-liferay-theme/lib/utils/Project.js b/projects/js-themes-toolkit/packages/generator-liferay-theme/lib/utils/Project.js index 13a8273ee4..61ea65fa1f 100644 --- a/projects/js-themes-toolkit/packages/generator-liferay-theme/lib/utils/Project.js +++ b/projects/js-themes-toolkit/packages/generator-liferay-theme/lib/utils/Project.js @@ -15,6 +15,7 @@ class Project { get type() { const {fs} = this._generator; + const pkgJson = fs.readJSON('package.json'); if (pkgJson === undefined) { diff --git a/projects/js-themes-toolkit/packages/liferay-theme-tasks/lib/__tests__/util.test.js b/projects/js-themes-toolkit/packages/liferay-theme-tasks/lib/__tests__/util.test.js index 154287285b..6c53526d08 100644 --- a/projects/js-themes-toolkit/packages/liferay-theme-tasks/lib/__tests__/util.test.js +++ b/projects/js-themes-toolkit/packages/liferay-theme-tasks/lib/__tests__/util.test.js @@ -63,6 +63,7 @@ describe('resolveDependency()', () => { const resolved = util.resolveDependency( 'liferay-frontend-theme-styled' ); + expect(resolved).toContain(process.cwd()); }); }); diff --git a/projects/js-themes-toolkit/packages/liferay-theme-tasks/lib/project/__tests__/index.test.js b/projects/js-themes-toolkit/packages/liferay-theme-tasks/lib/project/__tests__/index.test.js index 989ef43ee9..095be62ebb 100644 --- a/projects/js-themes-toolkit/packages/liferay-theme-tasks/lib/project/__tests__/index.test.js +++ b/projects/js-themes-toolkit/packages/liferay-theme-tasks/lib/project/__tests__/index.test.js @@ -9,6 +9,7 @@ const path = require('path'); const project = require('../index'); const prjPath = path.join(__dirname, 'fixtures', 'a-project'); + const pkgJsonPath = path.join(prjPath, 'package.json'); const savedCwd = process.cwd(); diff --git a/projects/js-themes-toolkit/packages/liferay-theme-tasks/lib/r2/liferay-r2/css-parse.js b/projects/js-themes-toolkit/packages/liferay-theme-tasks/lib/r2/liferay-r2/css-parse.js index fe486ff053..76a19a9d29 100644 --- a/projects/js-themes-toolkit/packages/liferay-theme-tasks/lib/r2/liferay-r2/css-parse.js +++ b/projects/js-themes-toolkit/packages/liferay-theme-tasks/lib/r2/liferay-r2/css-parse.js @@ -26,10 +26,12 @@ module.exports = function (css, options) { function updatePosition(str) { var lines = str.match(/\n/g); + if (lines) { lineno += lines.length; } var i = str.lastIndexOf('\n'); + column = ~i ? str.length - i : column + str.length; } @@ -80,6 +82,7 @@ module.exports = function (css, options) { function error(msg, start) { var errorThrown = new Error(`${filename} (${lineno}:${column}) ${msg}`); + errorThrown.position = new Position(start); errorThrown.filename = filename; errorThrown.description = msg; @@ -142,10 +145,12 @@ module.exports = function (css, options) { function match(re) { var m = re.exec(css); + if (!m) { return; } var str = m[0]; + updatePosition(str); css = css.slice(str.length); @@ -211,6 +216,7 @@ module.exports = function (css, options) { function selector() { var m = match(/^([^{]+)/); + if (!m) { return; } @@ -232,6 +238,7 @@ module.exports = function (css, options) { // prop var prop = match(/^(\*?[-#/*\w]+(\[[0-9a-z_-]+\])?)\s*/); + if (!prop) { return; } @@ -246,6 +253,7 @@ module.exports = function (css, options) { // val var val = match(/^((?:'(?:\\'|.)*?'|"(?:\\"|.)*?"|\([^)]*?\)|[^};])+)/); + if (!val) { return error('property missing value'); } @@ -462,6 +470,7 @@ module.exports = function (css, options) { function atpage() { var pos = position(); var m = match(/^@page */); + if (!m) { return; } @@ -499,6 +508,7 @@ module.exports = function (css, options) { function atdocument() { var pos = position(); var m = match(/^@([-\w]+)?document *([^{]+)/); + if (!m) { return; } @@ -585,10 +595,12 @@ module.exports = function (css, options) { function _atrule(name) { var pos = position(); var m = match(new RegExp('^@' + name + ' *([^;\\n]+);')); + if (!m) { return; } var ret = {type: name}; + ret[name] = trim(m[1]); return pos(ret); diff --git a/projects/js-themes-toolkit/packages/liferay-theme-tasks/lib/r2/liferay-r2/index.js b/projects/js-themes-toolkit/packages/liferay-theme-tasks/lib/r2/liferay-r2/index.js index f7f190efd0..64735095e6 100644 --- a/projects/js-themes-toolkit/packages/liferay-theme-tasks/lib/r2/liferay-r2/index.js +++ b/projects/js-themes-toolkit/packages/liferay-theme-tasks/lib/r2/liferay-r2/index.js @@ -67,6 +67,7 @@ function bgPosition(v) { v = v.replace(/\bright\b/, 'left'); } var m = v.trim().split(/\s+/); + if (m && m.length === 1 && v.match(/(\d+)([a-z]{2}|%)/)) { v = 'right ' + v; } @@ -151,6 +152,7 @@ var valueMap = { function processRule(rule, index, list) { var prev = list[index - 1]; + if (prev && prev.type === 'comment' && prev.comment.trim() === '@noflip') { return; } @@ -176,9 +178,11 @@ function processDeclaration(declaration, rule) { // RegEx for comments is taken from http://www.w3.org/TR/CSS21/grammar.html var commentRegEx = /\/\*[^*]*\*+([^/*][^*]*\*+)*\//g; + var prop = declaration.property.replace(commentRegEx, ''); // remove comments var val = declaration.value.replace(commentRegEx, ''); var important = /!important/; + var isImportant = val.match(important); var asterisk = prop.match(/^(\*+)(.+)/, ''); diff --git a/projects/js-themes-toolkit/packages/liferay-theme-tasks/lib/r2/liferay-r2/plugins/yui3.js b/projects/js-themes-toolkit/packages/liferay-theme-tasks/lib/r2/liferay-r2/plugins/yui3.js index c23f0cc9fd..4a18369f95 100644 --- a/projects/js-themes-toolkit/packages/liferay-theme-tasks/lib/r2/liferay-r2/plugins/yui3.js +++ b/projects/js-themes-toolkit/packages/liferay-theme-tasks/lib/r2/liferay-r2/plugins/yui3.js @@ -52,6 +52,7 @@ var plug = function (r2) { if (swap) { var handle = resizeHandleInnerRegexp.exec(swap)[1]; + v = swapHandleInnerBg[handle] || v; } else { diff --git a/projects/js-themes-toolkit/packages/liferay-theme-tasks/plugin/tasks/deploy.js b/projects/js-themes-toolkit/packages/liferay-theme-tasks/plugin/tasks/deploy.js index 6f6f2bf593..e75e68cb70 100644 --- a/projects/js-themes-toolkit/packages/liferay-theme-tasks/plugin/tasks/deploy.js +++ b/projects/js-themes-toolkit/packages/liferay-theme-tasks/plugin/tasks/deploy.js @@ -11,6 +11,7 @@ const project = require('../../lib/project'); module.exports = function () { const {gulp, store} = project; + const {runSequence} = gulp; gulp.task('plugin:deploy', () => { diff --git a/projects/js-themes-toolkit/packages/liferay-theme-tasks/plugin/tasks/init.js b/projects/js-themes-toolkit/packages/liferay-theme-tasks/plugin/tasks/init.js index 2228537855..49bac8095c 100644 --- a/projects/js-themes-toolkit/packages/liferay-theme-tasks/plugin/tasks/init.js +++ b/projects/js-themes-toolkit/packages/liferay-theme-tasks/plugin/tasks/init.js @@ -12,6 +12,7 @@ const InitPrompt = require('../prompts/init_prompt'); module.exports = function () { const {gulp, store} = project; + const {appServerPath, dockerContainerName} = store; gulp.task('plugin:init', (callback) => { diff --git a/projects/js-themes-toolkit/packages/liferay-theme-tasks/plugin/tasks/war.js b/projects/js-themes-toolkit/packages/liferay-theme-tasks/plugin/tasks/war.js index 03b8308853..03c5bf56dd 100644 --- a/projects/js-themes-toolkit/packages/liferay-theme-tasks/plugin/tasks/war.js +++ b/projects/js-themes-toolkit/packages/liferay-theme-tasks/plugin/tasks/war.js @@ -11,6 +11,7 @@ const project = require('../../lib/project'); module.exports = function () { const {gulp} = project; + const {runSequence} = gulp; gulp.task('plugin:war', () => { diff --git a/projects/js-themes-toolkit/packages/liferay-theme-tasks/theme/lib/theme_finder.js b/projects/js-themes-toolkit/packages/liferay-theme-tasks/theme/lib/theme_finder.js index a591a8b771..9f0ea4785e 100644 --- a/projects/js-themes-toolkit/packages/liferay-theme-tasks/theme/lib/theme_finder.js +++ b/projects/js-themes-toolkit/packages/liferay-theme-tasks/theme/lib/theme_finder.js @@ -112,9 +112,11 @@ function getLiferayThemeModuleFromURL(url) { // Just in case package name doesn't match URL basename, read it. const {dependencies} = JSON.parse(fs.readFileSync('package.json')); + const themeName = Object.keys(dependencies)[0]; const json = path.join('node_modules', themeName, 'package.json'); + config = JSON.parse(fs.readFileSync(json)); }); @@ -184,6 +186,7 @@ module.exports = { */ function withScratchDirectory(callback) { const template = path.join(os.tmpdir(), 'theme-finder-'); + const directory = fs.mkdtempSync(template); const cwd = process.cwd(); diff --git a/projects/js-themes-toolkit/packages/liferay-theme-tasks/theme/prompts/__tests__/extend_prompt.test.js b/projects/js-themes-toolkit/packages/liferay-theme-tasks/theme/prompts/__tests__/extend_prompt.test.js index fd6dd00b2d..7104f28928 100644 --- a/projects/js-themes-toolkit/packages/liferay-theme-tasks/theme/prompts/__tests__/extend_prompt.test.js +++ b/projects/js-themes-toolkit/packages/liferay-theme-tasks/theme/prompts/__tests__/extend_prompt.test.js @@ -332,6 +332,7 @@ it('_promptThemeSource should prompt correct workflow', () => { prototype._promptThemeSource(); const args = inquirer.prompt.getCall(0).args; + const questions = args[0]; const extendType = questions[0]; diff --git a/projects/js-themes-toolkit/packages/liferay-theme-tasks/theme/prompts/__tests__/prompt_util.test.js b/projects/js-themes-toolkit/packages/liferay-theme-tasks/theme/prompts/__tests__/prompt_util.test.js index 2c9deb079f..54948b8963 100644 --- a/projects/js-themes-toolkit/packages/liferay-theme-tasks/theme/prompts/__tests__/prompt_util.test.js +++ b/projects/js-themes-toolkit/packages/liferay-theme-tasks/theme/prompts/__tests__/prompt_util.test.js @@ -66,6 +66,7 @@ it('getModuleChoices should get module choices that are appropriate for extend t _.forEach(choices, (item, index) => { const number = index + 1; + const name = 'themelet-' + number; expect(item.name).toBe(name); @@ -78,6 +79,7 @@ it('getModuleChoices should get module choices that are appropriate for extend t _.forEach(choices, (item, index) => { const number = index + 1; + const name = 'themelet-' + number; if (number === 1) { @@ -93,6 +95,7 @@ it('getModuleChoices should get module choices that are appropriate for extend t _.forEach(choices, (item, index) => { const number = index + 1; + const name = 'themelet-' + number; expect(!item.checked).toBe(true); @@ -106,6 +109,7 @@ it('getModuleChoices should get module choices that are appropriate for extend t _.forEach(choices, (item, index) => { const number = index + 1; + const name = 'themelet-' + number; if (number === 1) { diff --git a/projects/js-themes-toolkit/packages/liferay-theme-tasks/theme/prompts/extend_prompt.js b/projects/js-themes-toolkit/packages/liferay-theme-tasks/theme/prompts/extend_prompt.js index cd3eef3a0f..76f291daa4 100644 --- a/projects/js-themes-toolkit/packages/liferay-theme-tasks/theme/prompts/extend_prompt.js +++ b/projects/js-themes-toolkit/packages/liferay-theme-tasks/theme/prompts/extend_prompt.js @@ -63,6 +63,7 @@ class ExtendPrompt { const {baseTheme} = project.themeConfig.config; const module = answers.module; const modulePackages = answers.modules; + const pkg = modulePackages[module]; if (!module) { diff --git a/projects/js-themes-toolkit/packages/liferay-theme-tasks/theme/prompts/url_package_prompt.js b/projects/js-themes-toolkit/packages/liferay-theme-tasks/theme/prompts/url_package_prompt.js index 636bdf3c9d..bfb46bb92c 100644 --- a/projects/js-themes-toolkit/packages/liferay-theme-tasks/theme/prompts/url_package_prompt.js +++ b/projects/js-themes-toolkit/packages/liferay-theme-tasks/theme/prompts/url_package_prompt.js @@ -82,6 +82,7 @@ class URLPackagePrompt { if (this.themelet && answers.module) { Object.keys(answers.module).forEach((k) => { const moduleName = this.config.selectedModules[k]; + answers.module[moduleName] = answers.module[k]; delete answers.module[k]; }); diff --git a/projects/js-themes-toolkit/packages/liferay-theme-tasks/theme/tasks/__tests__/build.test.js b/projects/js-themes-toolkit/packages/liferay-theme-tasks/theme/tasks/__tests__/build.test.js index 7f50fa801c..aacfce12a9 100644 --- a/projects/js-themes-toolkit/packages/liferay-theme-tasks/theme/tasks/__tests__/build.test.js +++ b/projects/js-themes-toolkit/packages/liferay-theme-tasks/theme/tasks/__tests__/build.test.js @@ -237,6 +237,7 @@ describe('using lib_sass', () => { function _assertFixAtDirectives(callback) { const cssPath = path.join(buildPath, 'css'); + const mainCssPath = path.join(cssPath, 'main.css'); assertExists(cssPath); @@ -286,6 +287,7 @@ describe('using lib_sass', () => { assertExists(templatesPath); const customCSSFileName = '_custom.scss'; + const customCSSPath = path.join(cssPath, customCSSFileName); const fileContent = stripNewlines( @@ -393,6 +395,7 @@ describe('using lib_sass', () => { assertExists(velocityPath); const customCSSFileName = '_custom.scss'; + const customCSSPath = path.join(buildPath, 'css', customCSSFileName); assertMatches( diff --git a/projects/js-themes-toolkit/packages/liferay-theme-tasks/theme/tasks/build/compile-css.js b/projects/js-themes-toolkit/packages/liferay-theme-tasks/theme/tasks/build/compile-css.js index 04c8b33c0b..f8a308797b 100644 --- a/projects/js-themes-toolkit/packages/liferay-theme-tasks/theme/tasks/build/compile-css.js +++ b/projects/js-themes-toolkit/packages/liferay-theme-tasks/theme/tasks/build/compile-css.js @@ -18,6 +18,7 @@ const {createBourbonFile} = require('../../lib/bourbon_dependencies'); module.exports = function () { const {gulp, options} = project; + const {pathBuild} = options; const handleScssError = (error) => { @@ -154,6 +155,7 @@ function getSassIncludePaths() { includePaths.push(path.dirname(require.resolve('compass-mixins'))); const argv = themeUtil.getArgv(); + if (argv['sass-include-paths']) { const customPaths = argv['sass-include-paths'] .split(',') @@ -166,6 +168,7 @@ function getSassIncludePaths() { } const themeNodeModules = path.resolve('node_modules'); + if (fs.existsSync(themeNodeModules)) { includePaths.push(themeNodeModules); } diff --git a/projects/js-themes-toolkit/packages/liferay-theme-tasks/theme/tasks/build/index.js b/projects/js-themes-toolkit/packages/liferay-theme-tasks/theme/tasks/build/index.js index 4327fa6194..eec49acf75 100644 --- a/projects/js-themes-toolkit/packages/liferay-theme-tasks/theme/tasks/build/index.js +++ b/projects/js-themes-toolkit/packages/liferay-theme-tasks/theme/tasks/build/index.js @@ -74,6 +74,7 @@ function injectJS() { module.exports = function () { const {gulp, options} = project; + const {runSequence} = gulp; const {pathBuild, pathSrc} = options; diff --git a/projects/js-themes-toolkit/packages/liferay-theme-tasks/theme/tasks/build/sass.js b/projects/js-themes-toolkit/packages/liferay-theme-tasks/theme/tasks/build/sass.js index 6f326f9df7..6ed95b2630 100644 --- a/projects/js-themes-toolkit/packages/liferay-theme-tasks/theme/tasks/build/sass.js +++ b/projects/js-themes-toolkit/packages/liferay-theme-tasks/theme/tasks/build/sass.js @@ -66,6 +66,7 @@ module.exports = (options) => catch (error) { const filePath = (error.file === 'stdin' ? file.path : error.file) || file.path; + const relativePath = path.relative(process.cwd(), filePath); const message = [ chalk.underline(relativePath), diff --git a/projects/js-themes-toolkit/packages/liferay-theme-tasks/theme/tasks/build/themelets.js b/projects/js-themes-toolkit/packages/liferay-theme-tasks/theme/tasks/build/themelets.js index 8f187c7328..e1d1b2739b 100644 --- a/projects/js-themes-toolkit/packages/liferay-theme-tasks/theme/tasks/build/themelets.js +++ b/projects/js-themes-toolkit/packages/liferay-theme-tasks/theme/tasks/build/themelets.js @@ -25,6 +25,7 @@ const defaultTemplateLanguage = 'ftl'; module.exports = function () { const {gulp, options} = project; + const {runSequence} = gulp; const {pathBuild} = options; diff --git a/projects/js-themes-toolkit/packages/liferay-theme-tasks/theme/tasks/deploy.js b/projects/js-themes-toolkit/packages/liferay-theme-tasks/theme/tasks/deploy.js index f67bcb2e9d..5bce6aaf8a 100644 --- a/projects/js-themes-toolkit/packages/liferay-theme-tasks/theme/tasks/deploy.js +++ b/projects/js-themes-toolkit/packages/liferay-theme-tasks/theme/tasks/deploy.js @@ -12,6 +12,7 @@ const DEPLOYMENT_STRATEGIES = themeUtil.DEPLOYMENT_STRATEGIES; function registerTasks() { const {gulp, options, store} = project; + const {runSequence} = gulp; const {argv, pathDist} = options; const { diff --git a/projects/js-themes-toolkit/packages/liferay-theme-tasks/theme/tasks/upgrade.js b/projects/js-themes-toolkit/packages/liferay-theme-tasks/theme/tasks/upgrade.js index f9a0bafd0b..7edb5ffb75 100644 --- a/projects/js-themes-toolkit/packages/liferay-theme-tasks/theme/tasks/upgrade.js +++ b/projects/js-themes-toolkit/packages/liferay-theme-tasks/theme/tasks/upgrade.js @@ -116,7 +116,9 @@ module.exports = function () { gulp.task('upgrade:config', () => { const {targetVersion} = versionUpgrade; + const dotTargetVersion = targetVersion + '.0'; + const underscoreTargetVersion = dotTargetVersion.replace(/\./g, '_'); project.themeConfig.setConfig({ diff --git a/projects/js-themes-toolkit/packages/liferay-theme-tasks/theme/tasks/watch.js b/projects/js-themes-toolkit/packages/liferay-theme-tasks/theme/tasks/watch.js index 6bea8324f5..e425306555 100644 --- a/projects/js-themes-toolkit/packages/liferay-theme-tasks/theme/tasks/watch.js +++ b/projects/js-themes-toolkit/packages/liferay-theme-tasks/theme/tasks/watch.js @@ -66,6 +66,7 @@ function isReadable(file) { module.exports = function () { const {gulp, options, store} = project; + const {runSequence} = gulp; const {argv, distName, pathBuild, pathSrc, resourcePrefix} = options; const {deploymentStrategy, dockerContainerName} = store; @@ -176,8 +177,11 @@ module.exports = function () { gulp.task('watch:reload', (callback) => { const {changedFile} = store; + const srcPath = path.relative(project.dir, changedFile.path); + const dstPath = srcPath.replace(/^src\//, ''); + const urlPath = `${resourcePrefix}/${distName}/${dstPath}`; livereload.changed({ @@ -267,8 +271,10 @@ module.exports = function () { const requestUrl = url.parse(req.url); const match = themePattern.exec(requestUrl.pathname); + if (match) { const filepath = path.resolve('build', match[3]); + const ext = path.extname(filepath); // eslint-disable-next-line promise/catch-or-return @@ -299,9 +305,11 @@ module.exports = function () { `Watch mode is now active at: ${url}`, `Proxying: ${proxyUrl}`, ]; + const width = messages.reduce((max, line) => { return Math.max(line.length, max); }, 0); + const ruler = '-'.repeat(width); // eslint-disable-next-line no-console diff --git a/projects/js-themes-toolkit/scripts/qa.js b/projects/js-themes-toolkit/scripts/qa.js index 8872ac1ca8..87b1adbafa 100644 --- a/projects/js-themes-toolkit/scripts/qa.js +++ b/projects/js-themes-toolkit/scripts/qa.js @@ -12,7 +12,9 @@ const path = require('path'); const {argv} = require('yargs'); const projectDir = path.resolve(__dirname, '..'); + const workDir = path.join(projectDir, 'qa'); + const pkgsDir = path.join(workDir, 'packages'); const yoPath = path.join(workDir, 'node_modules', '.bin', 'yo'); const generatorsPath = path.join( @@ -21,6 +23,7 @@ const generatorsPath = path.join( 'generator-liferay-theme', 'generators' ); + const generatorPath = path.join(generatorsPath, 'app', 'index.js'); const classicGeneratorPath = path.join(generatorsPath, 'classic', 'index.js'); const adminGeneratorPath = path.join(generatorsPath, 'admin', 'index.js'); diff --git a/projects/js-toolkit/packages/dev-server/src/server.ts b/projects/js-toolkit/packages/dev-server/src/server.ts index 4531ae104f..af711e4d6e 100644 --- a/projects/js-toolkit/packages/dev-server/src/server.ts +++ b/projects/js-toolkit/packages/dev-server/src/server.ts @@ -76,6 +76,7 @@ async function getModulePaths( regenerate = false ): Promise> { const mappingsTmpDirPath = resolve(tmpdir(), 'liferay-dev-server'); + const mappingsTmpFilePath = resolve(mappingsTmpDirPath, 'mappings.json'); if (!regenerate) { diff --git a/projects/js-toolkit/packages/js-toolkit-core/src/project/Adapt.ts b/projects/js-toolkit/packages/js-toolkit-core/src/project/Adapt.ts index cd6f2c17da..2b27c8b0e8 100644 --- a/projects/js-toolkit/packages/js-toolkit-core/src/project/Adapt.ts +++ b/projects/js-toolkit/packages/js-toolkit-core/src/project/Adapt.ts @@ -33,6 +33,7 @@ export default class Adapt { _lazyInit(): void { const {_project} = this; + const {probe} = _project; switch (probe.type) { diff --git a/projects/js-toolkit/packages/js-toolkit-core/src/project/Jar.ts b/projects/js-toolkit/packages/js-toolkit-core/src/project/Jar.ts index c74cf05786..113fb07301 100644 --- a/projects/js-toolkit/packages/js-toolkit-core/src/project/Jar.ts +++ b/projects/js-toolkit/packages/js-toolkit-core/src/project/Jar.ts @@ -90,6 +90,7 @@ export default class Jar { } const {_project} = this; + const {configuration} = _project; if (this._outputDir === undefined) { @@ -202,6 +203,7 @@ different: using the one in liferay-npm-bundler.config.js _getBndWebContextPath(): string { const {dir} = this._project; + const bndFile = dir.join('bnd.bnd'); if (fs.existsSync(bndFile.asNative)) { diff --git a/projects/js-toolkit/packages/js-toolkit-core/src/project/Misc.ts b/projects/js-toolkit/packages/js-toolkit-core/src/project/Misc.ts index b3604747dd..f5e33b94c8 100644 --- a/projects/js-toolkit/packages/js-toolkit-core/src/project/Misc.ts +++ b/projects/js-toolkit/packages/js-toolkit-core/src/project/Misc.ts @@ -105,6 +105,7 @@ export default class Misc { get reportFile(): FilePath | undefined { if (this._reportFile === undefined) { const {_project} = this; + const {configuration} = _project; const dumpReport = prop.get(configuration, 'dump-report', false); @@ -123,6 +124,7 @@ export default class Misc { get reportLevel(): LogLevel { if (this._reportLevel === undefined) { const {_project} = this; + const {configuration} = _project; let dumpReport = prop.get( diff --git a/projects/js-toolkit/packages/js-toolkit-core/src/project/Probe.ts b/projects/js-toolkit/packages/js-toolkit-core/src/project/Probe.ts index fdda4551fc..76481b2333 100644 --- a/projects/js-toolkit/packages/js-toolkit-core/src/project/Probe.ts +++ b/projects/js-toolkit/packages/js-toolkit-core/src/project/Probe.ts @@ -69,6 +69,7 @@ export default class Probe { _hasScriptCalling(tool: string): boolean { const {pkgJson} = this._project; + const {scripts} = pkgJson; if (!scripts) { diff --git a/projects/js-toolkit/packages/js-toolkit-core/src/project/Project.ts b/projects/js-toolkit/packages/js-toolkit-core/src/project/Project.ts index 356818816d..1ed7a23623 100644 --- a/projects/js-toolkit/packages/js-toolkit-core/src/project/Project.ts +++ b/projects/js-toolkit/packages/js-toolkit-core/src/project/Project.ts @@ -336,6 +336,7 @@ export default class Project { // Get preset version const {_configuration} = this; + const preset = _configuration['preset']; if (preset) { @@ -446,6 +447,7 @@ export default class Project { _loadConfiguration(): void { const {_configFile} = this; + const configDir = _configFile.dirname(); if (fs.existsSync(configDir.join('.npmbundlerrc').asNative)) { diff --git a/projects/js-toolkit/packages/liferay-cli/src/adapt/index.ts b/projects/js-toolkit/packages/liferay-cli/src/adapt/index.ts index c58e474c0c..6657d10630 100644 --- a/projects/js-toolkit/packages/liferay-cli/src/adapt/index.ts +++ b/projects/js-toolkit/packages/liferay-cli/src/adapt/index.ts @@ -151,6 +151,7 @@ async function performBaseAdaptation(options: Options): Promise { ); /* eslint-disable-next-line @liferay/no-dynamic-require, @typescript-eslint/no-var-requires */ const pkgJson = require(pkgJsonFile.asNative); + const portletDisplayName = toHumanReadable(pkgJson['name']); const portletName = getPortletName(pkgJson['name']); diff --git a/projects/js-toolkit/packages/liferay-cli/src/index.ts b/projects/js-toolkit/packages/liferay-cli/src/index.ts index 215f768179..d32035d900 100644 --- a/projects/js-toolkit/packages/liferay-cli/src/index.ts +++ b/projects/js-toolkit/packages/liferay-cli/src/index.ts @@ -46,6 +46,7 @@ async function warnIfNewerVersionAvailable(): Promise { try { /* eslint-disable-next-line @typescript-eslint/no-var-requires */ const packageJson = require('../package.json'); + const update = await checkForUpdate(packageJson, { // Check every 3 days diff --git a/projects/js-toolkit/packages/liferay-cli/src/new/facet-portlet/index.ts b/projects/js-toolkit/packages/liferay-cli/src/new/facet-portlet/index.ts index b74d3629fb..546dc07242 100644 --- a/projects/js-toolkit/packages/liferay-cli/src/new/facet-portlet/index.ts +++ b/projects/js-toolkit/packages/liferay-cli/src/new/facet-portlet/index.ts @@ -55,6 +55,7 @@ const facet: Facet = { /* eslint-disable-next-line @liferay/no-dynamic-require, @typescript-eslint/no-var-requires */ const pkgJson = require(pkgJsonFile.asNative); + const portletDisplayName = toHumanReadable(pkgJson['name']); const portletName = getPortletName(pkgJson['name']); diff --git a/projects/js-toolkit/packages/liferay-cli/src/runLiferayCli.ts b/projects/js-toolkit/packages/liferay-cli/src/runLiferayCli.ts index 3c3e1b370a..7ae3989e3f 100644 --- a/projects/js-toolkit/packages/liferay-cli/src/runLiferayCli.ts +++ b/projects/js-toolkit/packages/liferay-cli/src/runLiferayCli.ts @@ -40,6 +40,7 @@ export default async function runLiferayCli(...args: string[]): Promise { } const packageJson = projectRequire(`${targetPlatformName}/package.json`); + const liferayBin = packageJson.bin['liferay']; if (!liferayBin) { diff --git a/projects/js-toolkit/packages/npm-bundler/src/adapt/bundler-project/index.ts b/projects/js-toolkit/packages/npm-bundler/src/adapt/bundler-project/index.ts index 75462fb2d7..3a8938aa26 100644 --- a/projects/js-toolkit/packages/npm-bundler/src/adapt/bundler-project/index.ts +++ b/projects/js-toolkit/packages/npm-bundler/src/adapt/bundler-project/index.ts @@ -108,6 +108,7 @@ async function transformBundles(): Promise { */ async function writeManifestModule(): Promise { const {name, version} = project.pkgJson; + const moduleName = `${name}@${version}/webpack.manifest`; const renderer = new TemplateRenderer( diff --git a/projects/js-toolkit/packages/npm-bundler/src/index.ts b/projects/js-toolkit/packages/npm-bundler/src/index.ts index 04a6bde2e4..1868bec8e9 100644 --- a/projects/js-toolkit/packages/npm-bundler/src/index.ts +++ b/projects/js-toolkit/packages/npm-bundler/src/index.ts @@ -30,6 +30,7 @@ export default async function (argv: {version: boolean}): Promise { try { const {pkgJson, versionsInfo} = project; + const rootPkg = new PkgDesc(pkgJson.name, pkgJson.version); const start = process.hrtime(); @@ -73,6 +74,7 @@ export default async function (argv: {version: boolean}): Promise { // Report and show execution time const hrtime = process.hrtime(start); + report.executionTime(hrtime); log.success(`Bundled {${pkgJson.name}} in`, pretty(hrtime)); diff --git a/projects/js-toolkit/packages/npm-bundler/src/transform/js/operation/transformImports.ts b/projects/js-toolkit/packages/npm-bundler/src/transform/js/operation/transformImports.ts index 1b9bba80fe..497d5bb78c 100644 --- a/projects/js-toolkit/packages/npm-bundler/src/transform/js/operation/transformImports.ts +++ b/projects/js-toolkit/packages/npm-bundler/src/transform/js/operation/transformImports.ts @@ -107,6 +107,7 @@ function transformImportDeclaration( ): boolean { const {imports} = project; const moduleName = node.source.value as string; + const config = imports[moduleName]; if (!config) { diff --git a/projects/js-toolkit/packages/portal-base/src/build.ts b/projects/js-toolkit/packages/portal-base/src/build.ts index a34063472f..2c87cfc652 100644 --- a/projects/js-toolkit/packages/portal-base/src/build.ts +++ b/projects/js-toolkit/packages/portal-base/src/build.ts @@ -46,6 +46,7 @@ function copyAssets(): void { assetFiles.forEach((assetFile) => { const srcDirRelAssetFile = srcDir.relative(assetFile); + const outFile = buildDir.join(srcDirRelAssetFile); try { @@ -112,6 +113,7 @@ function runBundler(): void { const bundlerPkgJsonPath = require.resolve( 'liferay-npm-bundler/package.json' ); + const bundlerDir = path.dirname(bundlerPkgJsonPath); /* eslint-disable-next-line */ diff --git a/projects/js-toolkit/packages/portal-base/src/deploy.ts b/projects/js-toolkit/packages/portal-base/src/deploy.ts index b6227265b9..b66dd04846 100644 --- a/projects/js-toolkit/packages/portal-base/src/deploy.ts +++ b/projects/js-toolkit/packages/portal-base/src/deploy.ts @@ -15,6 +15,7 @@ const {fail, print, question, success} = format; const outputDir = new FilePath(project.jar.outputDir.asNative); const outputFilename = project.jar.outputFilename; + const outputFile = outputDir.join(outputFilename); export default async function deploy(): Promise { diff --git a/projects/js-toolkit/packages/portal-base/src/util/sassImporter.ts b/projects/js-toolkit/packages/portal-base/src/util/sassImporter.ts index 8d9b2170a3..88503efc93 100644 --- a/projects/js-toolkit/packages/portal-base/src/util/sassImporter.ts +++ b/projects/js-toolkit/packages/portal-base/src/util/sassImporter.ts @@ -54,6 +54,7 @@ function sassResolve(module: string): string { /* eslint-disable-next-line */ const packageJson = require(resolvedPath); + const entryPoint = packageJson.style || packageJson.main; return resolve(module + '/' + entryPoint, {basedir: '.'}); diff --git a/projects/js-toolkit/resources/devtools/find-generator/find-generator.js b/projects/js-toolkit/resources/devtools/find-generator/find-generator.js index f0f33b634f..55f0cacd64 100755 --- a/projects/js-toolkit/resources/devtools/find-generator/find-generator.js +++ b/projects/js-toolkit/resources/devtools/find-generator/find-generator.js @@ -12,6 +12,7 @@ const path = require('path'); const yeoman = require('yeoman-environment'); const env = yeoman.createEnv(); + const paths = env.getNpmPaths(); paths.forEach((candidate) => { diff --git a/projects/js-toolkit/resources/devtools/link-js-toolkit/link-dependencies.js b/projects/js-toolkit/resources/devtools/link-js-toolkit/link-dependencies.js index 9a2d49b435..0c5d0a004e 100644 --- a/projects/js-toolkit/resources/devtools/link-js-toolkit/link-dependencies.js +++ b/projects/js-toolkit/resources/devtools/link-js-toolkit/link-dependencies.js @@ -17,6 +17,7 @@ function linkDependencies(extraDependencies = []) { // Read package.json const pkgJson = readJsonSync(path.join('.', 'package.json')); + pkgJson.dependencies = pkgJson.dependencies || {}; pkgJson.devDependencies = pkgJson.devDependencies || {}; diff --git a/projects/js-toolkit/scripts/qa/resources.js b/projects/js-toolkit/scripts/qa/resources.js index 9f82206848..a759485720 100644 --- a/projects/js-toolkit/scripts/qa/resources.js +++ b/projects/js-toolkit/scripts/qa/resources.js @@ -38,6 +38,7 @@ function findLiferayDir() { const json = JSON.parse( fs.readFileSync(path.join(os.homedir(), '.liferay.json')) ); + liferayDir = json.deploy.path; } catch (error) { diff --git a/projects/npm-tools/packages/changelog-generator/src/index.js b/projects/npm-tools/packages/changelog-generator/src/index.js index 5fcc1a1a77..3d373658d6 100644 --- a/projects/npm-tools/packages/changelog-generator/src/index.js +++ b/projects/npm-tools/packages/changelog-generator/src/index.js @@ -135,7 +135,9 @@ async function getChanges(from, to) { if (info) { const [subject, description] = message.split(/\n+/); + const metadata = subject.match(/Merge pull request #(\d+)/); + const number = metadata ? metadata[1] : NaN; if (description) { @@ -191,12 +193,14 @@ async function getRemote(options) { } const remotes = await git('remote', '-v'); + const lines = remotes.split('\n'); for (let i = 0; i < lines.length; i++) { const match = lines[i].match( /\bgithub\.com[/:]liferay\/(\S+?)(?:\.git)?\s/i ); + if (match) { return `https://github.com/liferay/${match[1]}`; } @@ -452,6 +456,7 @@ async function go(options) { to: from, version: from, }); + contents += '\n' + chunk; from = previousVersion; diff --git a/projects/npm-tools/packages/js-publish/src/index.js b/projects/npm-tools/packages/js-publish/src/index.js index c182259bb7..6651cdfe6a 100644 --- a/projects/npm-tools/packages/js-publish/src/index.js +++ b/projects/npm-tools/packages/js-publish/src/index.js @@ -128,6 +128,7 @@ function confirm(prompt, answer = 'y', matcher = YES_REGEX) { const promise = new Promise((resolve) => { const question = answer === 'y' ? `${prompt} [y/n] ` : `${prompt} `; + readline.question(question, resolve); }).then((result) => { if (answer === 'y') { diff --git a/projects/npm-tools/packages/npm-scripts/src/jsp/Lexer.js b/projects/npm-tools/packages/npm-scripts/src/jsp/Lexer.js index ddd1c10a17..7e69c39adc 100644 --- a/projects/npm-tools/packages/npm-scripts/src/jsp/Lexer.js +++ b/projects/npm-tools/packages/npm-scripts/src/jsp/Lexer.js @@ -441,6 +441,7 @@ class Lexer { for (let i = 0; i < matchers.length; i++) { const matcher = lookup(matchers[i]); + const match = matcher.exec(remaining); if (match !== null) { diff --git a/projects/npm-tools/packages/npm-scripts/src/jsp/getPaddedReplacement.js b/projects/npm-tools/packages/npm-scripts/src/jsp/getPaddedReplacement.js index 48f7c7c301..bac3f97475 100644 --- a/projects/npm-tools/packages/npm-scripts/src/jsp/getPaddedReplacement.js +++ b/projects/npm-tools/packages/npm-scripts/src/jsp/getPaddedReplacement.js @@ -41,6 +41,7 @@ const IDENTIFIER = new RegExp(`${ID_START}[^${ID_END}]+${ID_END}`); */ function getPaddedReplacement(match, template) { const paddingLength = Math.max(match.length - template.length - 2, 0); + const padding = '_'.repeat(paddingLength); return ID_START + template + padding + ID_END; diff --git a/projects/npm-tools/packages/npm-scripts/src/jsp/processJSP.js b/projects/npm-tools/packages/npm-scripts/src/jsp/processJSP.js index 6d7d8fcc5a..b431271921 100644 --- a/projects/npm-tools/packages/npm-scripts/src/jsp/processJSP.js +++ b/projects/npm-tools/packages/npm-scripts/src/jsp/processJSP.js @@ -97,6 +97,7 @@ async function processJSP(source, {onFormat, onLint, onMinify}) { for (let i = 0; i < transformed.length; i++) { const {closeTag, contents, openTag, range} = transformed[i]; + const {index, length} = range; result += diff --git a/projects/npm-tools/packages/npm-scripts/src/jsp/restoreTags.js b/projects/npm-tools/packages/npm-scripts/src/jsp/restoreTags.js index 93287be792..c6571821c6 100644 --- a/projects/npm-tools/packages/npm-scripts/src/jsp/restoreTags.js +++ b/projects/npm-tools/packages/npm-scripts/src/jsp/restoreTags.js @@ -57,6 +57,7 @@ function restoreTags(source, tags) { for (let i = 0; i < tokens.length; i++) { const token = tokens[i]; + const {contents, name} = token; switch (name) { @@ -125,6 +126,7 @@ function restoreTags(source, tags) { for (let i = 0; i < tokens.length; i++) { const token = tokens[i]; + const {contents, name} = token; switch (name) { @@ -218,6 +220,7 @@ function appendScriptlet(scriptlet, token, output) { // invalidated by previous edits. const whitespace = tokens[-1].contents; + output = output.slice(0, -whitespace.length); // Add newline to force blank line, then re-add trimmed whitespace. @@ -315,6 +318,7 @@ function getIndentedTag(tag, token) { // Look at last line to figure out original indent. const last = lines.pop(); + const {0: original} = last.match(new RegExp(`^${TAB_CHAR}*`)); // Restore original indent to first line, then dedent the whole tag. diff --git a/projects/npm-tools/packages/npm-scripts/src/prettier/rules/newline-before-block-statements.js b/projects/npm-tools/packages/npm-scripts/src/prettier/rules/newline-before-block-statements.js index 86bc29c85b..efc7611cf7 100644 --- a/projects/npm-tools/packages/npm-scripts/src/prettier/rules/newline-before-block-statements.js +++ b/projects/npm-tools/packages/npm-scripts/src/prettier/rules/newline-before-block-statements.js @@ -15,6 +15,7 @@ module.exports = { // We only fix if on same line. let last = source.getLastToken(node); + const keyword = source.getTokenAfter(last); if (last.loc.end.line === keyword.loc.start.line) { diff --git a/projects/npm-tools/packages/npm-scripts/src/scripts/format.js b/projects/npm-tools/packages/npm-scripts/src/scripts/format.js index 01fcf52cf7..ed2175f9f4 100644 --- a/projects/npm-tools/packages/npm-scripts/src/scripts/format.js +++ b/projects/npm-tools/packages/npm-scripts/src/scripts/format.js @@ -101,6 +101,7 @@ async function format(options = {}) { } else { const formatted = await format(source, prettierOptions); + fs.writeFileSync(filepath, formatted || ''); fixed++; } diff --git a/projects/npm-tools/packages/npm-scripts/src/scripts/test.js b/projects/npm-tools/packages/npm-scripts/src/scripts/test.js index 86c9ceb795..97cbe3077a 100644 --- a/projects/npm-tools/packages/npm-scripts/src/scripts/test.js +++ b/projects/npm-tools/packages/npm-scripts/src/scripts/test.js @@ -106,6 +106,7 @@ function removeBabelConfig() { if (fs.existsSync('package.json')) { const configFile = fs.readFileSync('package.json', 'utf8'); + const config = JSON.parse(configFile); if (config && config[PREFIX_BACKUP + 'babel']) { diff --git a/projects/npm-tools/packages/npm-scripts/src/scripts/theme.js b/projects/npm-tools/packages/npm-scripts/src/scripts/theme.js index c2264d2961..dcf86ab5c9 100644 --- a/projects/npm-tools/packages/npm-scripts/src/scripts/theme.js +++ b/projects/npm-tools/packages/npm-scripts/src/scripts/theme.js @@ -60,11 +60,13 @@ function checkExistingBuildArgs(args) { */ function prepareAdditionalBuildArgs() { const modules = findModulesDirectory(); + if (!modules) { throw new Error('Unable to find "modules" directory'); } const themes = path.join(modules, 'apps/frontend-theme'); + if (!fs.existsSync(themes)) { throw new Error('Unable to find "frontend-theme" directory'); } @@ -72,6 +74,7 @@ function prepareAdditionalBuildArgs() { const args = []; Object.keys(BUILD_ARGS).forEach((key) => { const value = BUILD_ARGS[key]; + args.push(key, value.replace(MODULES_DIR, modules)); }); @@ -83,6 +86,7 @@ function prepareAdditionalBuildArgs() { */ function run(...subcommandAndArgs) { const [subcommand, ...args] = subcommandAndArgs; + switch (subcommand) { case 'build': checkExistingBuildArgs(args); diff --git a/projects/npm-tools/packages/npm-scripts/src/utils/createTempFile.js b/projects/npm-tools/packages/npm-scripts/src/utils/createTempFile.js index cd2623f9db..cd16c97a2b 100644 --- a/projects/npm-tools/packages/npm-scripts/src/utils/createTempFile.js +++ b/projects/npm-tools/packages/npm-scripts/src/utils/createTempFile.js @@ -25,6 +25,7 @@ const getMergedConfig = require('./getMergedConfig'); */ function createTempFile(filename, content, {autoDelete = true} = {}) { const build = getMergedConfig('npmscripts', 'build'); + const tempDirPath = path.join(build.temp, 'tmp'); fs.ensureDirSync(tempDirPath); diff --git a/projects/npm-tools/packages/npm-scripts/src/utils/deepMerge.js b/projects/npm-tools/packages/npm-scripts/src/utils/deepMerge.js index 8993e515bf..5e8a64f6d5 100644 --- a/projects/npm-tools/packages/npm-scripts/src/utils/deepMerge.js +++ b/projects/npm-tools/packages/npm-scripts/src/utils/deepMerge.js @@ -6,6 +6,7 @@ const merge = require('deepmerge'); const emptyTarget = (value) => (Array.isArray(value) ? [] : {}); + const clone = (value, options) => merge(emptyTarget(value), value, options); /** @@ -19,6 +20,7 @@ function combineMerge(target, source, options) { const cloneRequested = options.clone !== false; const shouldClone = cloneRequested && options.isMergeableObject(item); + destination[i] = shouldClone ? clone(item, options) : item; } else if (options.isMergeableObject(item)) { @@ -90,8 +92,10 @@ function checkBabelName(name, kind) { Object.entries(NORMALIZERS[kind]).reduce((done, [pattern, replacement]) => { if (!done) { const regExp = new RegExp(pattern); + if (regExp.test(name)) { const normalized = name.replace(regExp, replacement); + if (normalized !== name) { throw new Error( `checkBabelName(): expected "${normalized}", got "${name}"` diff --git a/projects/npm-tools/packages/npm-scripts/src/utils/expandGlobs.js b/projects/npm-tools/packages/npm-scripts/src/utils/expandGlobs.js index 9b714dc9d5..614a05dcf4 100644 --- a/projects/npm-tools/packages/npm-scripts/src/utils/expandGlobs.js +++ b/projects/npm-tools/packages/npm-scripts/src/utils/expandGlobs.js @@ -128,6 +128,7 @@ function expandGlobs(matchGlobs, ignoreGlobs = [], options = {}) { currentDepth++; const entries = fs.readdirSync(directory); + entries.forEach((entry) => { const file = path.posix.join(directory, entry); const testedFilePath = path.isAbsolute(baseDir) diff --git a/projects/npm-tools/packages/npm-scripts/src/utils/generateSoyDependencies.js b/projects/npm-tools/packages/npm-scripts/src/utils/generateSoyDependencies.js index 0661fc9281..c2810e8483 100644 --- a/projects/npm-tools/packages/npm-scripts/src/utils/generateSoyDependencies.js +++ b/projects/npm-tools/packages/npm-scripts/src/utils/generateSoyDependencies.js @@ -14,6 +14,7 @@ const resolve = require('resolve'); */ function generateSoyDependencies(dependencies) { const cwd = process.cwd(); + const projectName = path.basename(cwd); const stringDependencies = dependencies diff --git a/projects/npm-tools/packages/npm-scripts/src/utils/getRegExpForGlob.js b/projects/npm-tools/packages/npm-scripts/src/utils/getRegExpForGlob.js index 567bb36a1a..0d069fed75 100644 --- a/projects/npm-tools/packages/npm-scripts/src/utils/getRegExpForGlob.js +++ b/projects/npm-tools/packages/npm-scripts/src/utils/getRegExpForGlob.js @@ -97,6 +97,7 @@ function getRegExpForGlob(glob) { } const result = new RegExp(`^${pattern}$`); + result.glob = glob; if (negated) { diff --git a/projects/npm-tools/packages/npm-scripts/src/utils/instrument.js b/projects/npm-tools/packages/npm-scripts/src/utils/instrument.js index ca5497ebd7..5ea8f60619 100644 --- a/projects/npm-tools/packages/npm-scripts/src/utils/instrument.js +++ b/projects/npm-tools/packages/npm-scripts/src/utils/instrument.js @@ -109,6 +109,7 @@ function instrument(callbacks) { for (const [label, timestamps] of Object.entries(metrics)) { for (const {end, start} of timestamps) { const delta = end - start; + events.push({delta, end, label, start}); } } diff --git a/projects/npm-tools/packages/npm-scripts/src/utils/parseBnd.js b/projects/npm-tools/packages/npm-scripts/src/utils/parseBnd.js index 9414be0d06..6414576f4b 100644 --- a/projects/npm-tools/packages/npm-scripts/src/utils/parseBnd.js +++ b/projects/npm-tools/packages/npm-scripts/src/utils/parseBnd.js @@ -36,6 +36,7 @@ function parseBnd(filePath = 'bnd.bnd') { } const i = line.indexOf(':'); + const key = line.substring(0, i); const value = line.substring(i + 1).trimLeft(); diff --git a/projects/npm-tools/packages/npm-scripts/src/utils/preprocessGlob.js b/projects/npm-tools/packages/npm-scripts/src/utils/preprocessGlob.js index 6099839739..da873db8d5 100644 --- a/projects/npm-tools/packages/npm-scripts/src/utils/preprocessGlob.js +++ b/projects/npm-tools/packages/npm-scripts/src/utils/preprocessGlob.js @@ -44,6 +44,7 @@ function preprocessGlob(glob) { } const index = substitutions.length - 1; + if (substitutions[index] === '') { // There were no substitutions at all; braces are literal. @@ -61,6 +62,7 @@ function preprocessGlob(glob) { // We are capturing normal text. const index = template.length - 1; + template[index] = template[index] + char; } else { @@ -68,6 +70,7 @@ function preprocessGlob(glob) { // We are capturing substitution(s). const index = substitutions.length - 1; + substitutions[index] += char; } } diff --git a/projects/npm-tools/packages/npm-scripts/src/utils/soy.js b/projects/npm-tools/packages/npm-scripts/src/utils/soy.js index 865c64821e..97442234cb 100644 --- a/projects/npm-tools/packages/npm-scripts/src/utils/soy.js +++ b/projects/npm-tools/packages/npm-scripts/src/utils/soy.js @@ -14,6 +14,7 @@ const runBabel = require('./runBabel'); const spawnSync = require('./spawnSync'); const BUILD_CONFIG = getMergedConfig('npmscripts', 'build'); + const SOY_TEMP_DIR = path.join(BUILD_CONFIG.temp, 'soy'); /** diff --git a/projects/npm-tools/packages/npm-scripts/src/utils/spawnMultiple.js b/projects/npm-tools/packages/npm-scripts/src/utils/spawnMultiple.js index 4a29da2c4d..3c6964159b 100644 --- a/projects/npm-tools/packages/npm-scripts/src/utils/spawnMultiple.js +++ b/projects/npm-tools/packages/npm-scripts/src/utils/spawnMultiple.js @@ -35,6 +35,7 @@ async function spawnMultiple(...callbacks) { if (failedCount) { const jobCount = callbacks.length; + const jobs = jobCount === 1 ? 'job' : 'jobs'; throw new SpawnError(`${failedCount} of ${jobCount} ${jobs} failed`); diff --git a/projects/npm-tools/packages/npm-scripts/src/utils/spawnSync.js b/projects/npm-tools/packages/npm-scripts/src/utils/spawnSync.js index 20ec39f95f..b667cc4bef 100644 --- a/projects/npm-tools/packages/npm-scripts/src/utils/spawnSync.js +++ b/projects/npm-tools/packages/npm-scripts/src/utils/spawnSync.js @@ -31,6 +31,7 @@ function spawnSync(command, args = [], options = {}) { '../../node_modules/.bin', command ); + const executable = fs.existsSync(localCommand) ? localCommand : command; const {error, signal, status} = spawn.sync(executable, args, { diff --git a/projects/npm-tools/packages/npm-scripts/src/webpack/createWebpackSoyResolver.js b/projects/npm-tools/packages/npm-scripts/src/webpack/createWebpackSoyResolver.js index 6cacc925ec..021abf64ec 100644 --- a/projects/npm-tools/packages/npm-scripts/src/webpack/createWebpackSoyResolver.js +++ b/projects/npm-tools/packages/npm-scripts/src/webpack/createWebpackSoyResolver.js @@ -26,6 +26,7 @@ module.exports = () => ({apply}); function apply(resolver) { const config = getMergedConfig('npmscripts'); + const soyDir = path.join(config.build.temp, 'soy'); resolver.hooks.describedResolve.tapAsync( diff --git a/projects/npm-tools/packages/npm-scripts/support/dedent.js b/projects/npm-tools/packages/npm-scripts/support/dedent.js index b4e795f5fa..ec4743cf92 100644 --- a/projects/npm-tools/packages/npm-scripts/support/dedent.js +++ b/projects/npm-tools/packages/npm-scripts/support/dedent.js @@ -10,6 +10,7 @@ */ function dedent(tabs) { const indent = '\t'.repeat(tabs); + const regExp = new RegExp(`^${indent}`, 'gm'); return (strings, ...interpolations) => { diff --git a/projects/npm-tools/packages/npm-scripts/test/jsp/Lexer.js b/projects/npm-tools/packages/npm-scripts/test/jsp/Lexer.js index bb72e03e23..7fe694db57 100644 --- a/projects/npm-tools/packages/npm-scripts/test/jsp/Lexer.js +++ b/projects/npm-tools/packages/npm-scripts/test/jsp/Lexer.js @@ -188,6 +188,7 @@ describe('Lexer()', () => { const ORIGINAL = match('foo') .name('ORIGINAL') .onMatch(() => calls.push('ORIGINAL')); + const COPY = an(ORIGINAL) .name('COPY') .onMatch(() => calls.push('COPY')); diff --git a/projects/npm-tools/packages/npm-scripts/test/scripts/theme.js b/projects/npm-tools/packages/npm-scripts/test/scripts/theme.js index 2575e3e828..5b4931a440 100644 --- a/projects/npm-tools/packages/npm-scripts/test/scripts/theme.js +++ b/projects/npm-tools/packages/npm-scripts/test/scripts/theme.js @@ -16,7 +16,9 @@ jest.mock('../../src/utils/spawnSync'); const {normalize} = path; const FIXTURES = getFixturePath('scripts', 'theme'); + const MODULES = path.join(FIXTURES, 'modules'); + const APPS = path.join(MODULES, 'apps'); const NODE_MODULES = path.join(MODULES, 'node_modules'); const FJORD = path.join(APPS, 'frontend-theme-fjord', 'frontend-theme-fjord'); diff --git a/projects/npm-tools/packages/npm-scripts/test/typescript/configureTypeScript.js b/projects/npm-tools/packages/npm-scripts/test/typescript/configureTypeScript.js index 33be32d227..9a1fad4188 100644 --- a/projects/npm-tools/packages/npm-scripts/test/typescript/configureTypeScript.js +++ b/projects/npm-tools/packages/npm-scripts/test/typescript/configureTypeScript.js @@ -11,6 +11,7 @@ const configureTypeScript = require('../../src/typescript/configureTypeScript'); const expandGlobs = require('../../src/utils/expandGlobs'); const FIXTURES = path.join(__dirname, '..', '..', '__fixtures__', 'typescript'); + const MODULES = path.join(FIXTURES, 'modules'); const EXPECT_HASH = expect.stringMatching(/^[0-9a-f]{40}$/); diff --git a/projects/npm-tools/packages/npm-scripts/test/utils/expandGlobs.js b/projects/npm-tools/packages/npm-scripts/test/utils/expandGlobs.js index 00d15db309..7684fb1bf6 100644 --- a/projects/npm-tools/packages/npm-scripts/test/utils/expandGlobs.js +++ b/projects/npm-tools/packages/npm-scripts/test/utils/expandGlobs.js @@ -88,6 +88,7 @@ describe('expandGlobs()', () => { cwd = process.cwd(); const directory = fs.mkdtempSync(path.join(os.tmpdir(), 'scripts-')); + process.chdir(directory); FIXTURES.forEach((fixture) => { diff --git a/projects/npm-tools/packages/npm-scripts/test/utils/findRoot.js b/projects/npm-tools/packages/npm-scripts/test/utils/findRoot.js index 775540e98b..52c9ca12f3 100644 --- a/projects/npm-tools/packages/npm-scripts/test/utils/findRoot.js +++ b/projects/npm-tools/packages/npm-scripts/test/utils/findRoot.js @@ -10,7 +10,9 @@ const findRoot = require('../../src/utils/findRoot'); const getFixturePath = require('../../support/getFixturePath'); const FIXTURES = getFixturePath('utils', 'findRoot'); + const MODULES = path.join(FIXTURES, 'modules'); + const PUBLIC_PROJECT = path.join(MODULES, 'apps', 'some', 'project'); const PRIVATE_PROJECT = path.join( MODULES, diff --git a/support/packages/local-npm/lib/index.js b/support/packages/local-npm/lib/index.js index 66b9ed4faa..1eeb62dae1 100644 --- a/support/packages/local-npm/lib/index.js +++ b/support/packages/local-npm/lib/index.js @@ -90,6 +90,7 @@ function publish(projects) { projects.forEach((dir) => { const {name, version} = require(`${dir}/package.json`); + const pkgId = `${name}@${version}`; console.log(` ${pkgId}`); @@ -102,6 +103,7 @@ function publish(projects) { projects.forEach((dir) => { const {name, version} = require(`${dir}/package.json`); + const pkgId = `${name}@${version}`; console.log(` ${pkgId}`); diff --git a/target-platforms/packages/create-platform/bin/create-platform.js b/target-platforms/packages/create-platform/bin/create-platform.js index ddac0463b6..fe5f5a84bd 100755 --- a/target-platforms/packages/create-platform/bin/create-platform.js +++ b/target-platforms/packages/create-platform/bin/create-platform.js @@ -85,6 +85,7 @@ const dependencies = Object.entries(config.build.bundler.config.imports).reduce( paths: [providerDir], } ); + const packageJson = require(packageJsonPath); dependencies[packageName] = packageJson.version; diff --git a/target-platforms/scripts/qa.js b/target-platforms/scripts/qa.js index e970c17f9b..2f8cee393d 100644 --- a/target-platforms/scripts/qa.js +++ b/target-platforms/scripts/qa.js @@ -112,6 +112,7 @@ function runQAFor(projectName) { run(projectName, 'yarn', 'build'); const projectDir = path.resolve(__dirname, '..', 'qa', projectName); + const actualBuildDir = path.join(projectDir, 'build'); const expectedBuildDir = path.join(projectDir, 'build.expected');