From 00374f7f1343c8004271090f43dc97878a677390 Mon Sep 17 00:00:00 2001 From: Matthias Hauch Date: Mon, 27 Jun 2016 21:12:15 +0200 Subject: [PATCH] added source code --- .gitignore | 12 + .npmignore | 2 + LICENSE | 177 ++++++++++++ index.js | 263 ++++++++++++++++++ package.json | 44 +++ test/TestCase.test.js | 75 +++++ test/clientlib.conf.js | 80 ++++++ .../test.base.apps.mainapp.json | 6 + .../test.base.apps.mainapp/css.txt | 4 + .../test.base.apps.mainapp/css/lib.css | 5 + .../test.base.apps.mainapp/css/styling.css | 3 + .../test.base.apps.mainapp/js.txt | 4 + .../test.base.apps.mainapp/js/app.js | 5 + .../test.base.apps.mainapp/js/libs/mylib.js | 5 + .../test.base.apps.secondapp.json | 12 + .../test.base.apps.secondapp/css.txt | 3 + .../test.base.apps.secondapp/js.txt | 3 + .../js/secondapp-lib.js | 5 + .../resources/template.html | 10 + .../test.base.apps.secondapp/style/main.css | 3 + .../test.base.apps.thirdapp.json | 6 + .../test.base.apps.thirdapp/notice.txt | 1 + test/src/frontend/css/lib.css | 5 + test/src/frontend/css/styling.css | 3 + test/src/frontend/js/app.js | 5 + test/src/frontend/js/libs/mylib.js | 5 + test/src/frontend/resources/notice.txt | 1 + test/src/frontend/resources/template.html | 10 + test/src/frontend/secondapp/js/lib.js | 5 + test/src/frontend/secondapp/main.css | 3 + 30 files changed, 765 insertions(+) create mode 100644 .gitignore create mode 100644 .npmignore create mode 100644 LICENSE create mode 100644 index.js create mode 100644 package.json create mode 100644 test/TestCase.test.js create mode 100644 test/clientlib.conf.js create mode 100644 test/expected/clientlibs-root/test.base.apps.mainapp.json create mode 100644 test/expected/clientlibs-root/test.base.apps.mainapp/css.txt create mode 100644 test/expected/clientlibs-root/test.base.apps.mainapp/css/lib.css create mode 100644 test/expected/clientlibs-root/test.base.apps.mainapp/css/styling.css create mode 100644 test/expected/clientlibs-root/test.base.apps.mainapp/js.txt create mode 100644 test/expected/clientlibs-root/test.base.apps.mainapp/js/app.js create mode 100644 test/expected/clientlibs-root/test.base.apps.mainapp/js/libs/mylib.js create mode 100644 test/expected/clientlibs-root/test.base.apps.secondapp.json create mode 100644 test/expected/clientlibs-root/test.base.apps.secondapp/css.txt create mode 100644 test/expected/clientlibs-root/test.base.apps.secondapp/js.txt create mode 100644 test/expected/clientlibs-root/test.base.apps.secondapp/js/secondapp-lib.js create mode 100644 test/expected/clientlibs-root/test.base.apps.secondapp/resources/template.html create mode 100644 test/expected/clientlibs-root/test.base.apps.secondapp/style/main.css create mode 100644 test/expected/clientlibs-root/test.base.apps.thirdapp.json create mode 100644 test/expected/clientlibs-root/test.base.apps.thirdapp/notice.txt create mode 100644 test/src/frontend/css/lib.css create mode 100644 test/src/frontend/css/styling.css create mode 100644 test/src/frontend/js/app.js create mode 100644 test/src/frontend/js/libs/mylib.js create mode 100644 test/src/frontend/resources/notice.txt create mode 100644 test/src/frontend/resources/template.html create mode 100644 test/src/frontend/secondapp/js/lib.js create mode 100644 test/src/frontend/secondapp/main.css diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bc4f551 --- /dev/null +++ b/.gitignore @@ -0,0 +1,12 @@ +node_modules +npm*.log +tmp +.idea +.DS_Store +.project +.sublime-* +.project +.settings + +# ignore result folder from mocha test +result/ \ No newline at end of file diff --git a/.npmignore b/.npmignore new file mode 100644 index 0000000..1e0c2bf --- /dev/null +++ b/.npmignore @@ -0,0 +1,2 @@ +node_modules/ +npm*.log diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..2bf3c6a --- /dev/null +++ b/LICENSE @@ -0,0 +1,177 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS \ No newline at end of file diff --git a/index.js b/index.js new file mode 100644 index 0000000..a82d00b --- /dev/null +++ b/index.js @@ -0,0 +1,263 @@ +/* + * Copyright (c) 2016 pro!vision GmbH and Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +"use strict"; + +var async = require("async"); +var path = require("path"); +var _ = require("lodash"); +var fs = require("fs"); +var fse = require("fs-extra"); + +/** + * @typedef {Object} ClientLibItem + * @property {String} path - Clientlib root path (optional if `options.clientLibRoot` is set) + * @property {String} name - Clientlib name + * @property {Array} [embed] - other Clientlib names that should be embedded + * @property {Array} [dependencies] - other Clientlib names that should be included + * @property {Array} assets - content that should be copied to the clientlib folder, more details below + */ + +/** + * Check if the given file exists + * @param file + * @returns {boolean} + */ +function fileExists(file) { + try { + fs.accessSync(file); + return true; + } catch(e) { + return false; + } +} + +/** + * Removes clientlib folder and configuration file (JSON) for the given + * clientlib item. + * @param {ClientLibItem} item - clientlib properties + * @param {Function} done - callback to be invoked after + */ +function removeClientLib(item, done) { + var configJson = path.join(item.path, item.name + ".json"); + var clientLibPath = path.join(item.path, item.name); + var files = []; + if (fileExists(configJson)) { + files.push(configJson); + } + if (fileExists(clientLibPath)) { + files.push(clientLibPath); + } + + if (files.length === 0) { + return done(); + } + + async.eachSeries(files, function(file, doneClean) { + fse.remove(file, doneClean); + }, done); +} + +/** + * Write the clientlib asset TXT file (js or css) that describes the + * base and contains all resource paths. + * @param {String} clientLibPath - path to the clientlib folder + * @param {Object} asset - asset object + */ +function writeAssetTxt(clientLibPath, asset) { + + if (!asset || !asset.type || !_.isArray(asset.files)) { + return; + } + var outputFile = path.join(clientLibPath, asset.type + ".txt"); + var basePath = path.join(clientLibPath, asset.base); + + // determines file path relative to the base + var filenames = []; + asset.files.forEach(function(file){ + var rel = path.relative(basePath, file.dest); + filenames.push(rel); + }); + + var content = "#base=" + asset.base + "\n\n" + filenames.join("\n"); + content.trim(); + + fs.writeFileSync(outputFile, content); +} + +/** + * Write a configuration JSON file for a clientlib + * with the given properties in `item` + * @param {ClientLibItem} item - clientlib configuration properties + */ +function writeClientLibJson(item) { + var content = { + 'jcr:primaryType': 'cq:ClientLibraryFolder', + 'categories': [item.name] + }; + + if (item.embed) { + content.embed = item.embed; + } + + if (item.dependencies) { + content.dependencies = item.dependencies; + } + + var jsonFile = path.join(item.path, item.name + ".json"); + fse.writeJsonSync(jsonFile, content, {spaces: 2}); +} + +/** + * Iterate through the given array of clientlib configuration objects and + * process them asynchronously. + * @param {Array} itemList - array of clientlib configuration items + * @param {Object} [options] - global configuration options + * @param {Function} done - to be called if everything is done + */ +function start(itemList, options, done) { + + if (_.isFunction(options)) { + done = options; + options = {}; + } + + if (!_.isArray(itemList)) { + itemList = [itemList]; + } + + if (options.cwd) { + process.chdir(options.cwd); + } + + async.eachSeries(itemList, function(item, processItemDone){ + processItem(item, options, processItemDone); + }, done); +} + +/** + * Normalize different asset configuration options. + * @param {String} clientLibPath - clientlib subfolder + * @param {Object} assets - asset configuration object + * @returns {*} + */ +function normalizeAssets(clientLibPath, assets) { + + var list = assets; + + // transform object to array + if (!_.isArray(assets)) { + list = []; + _.keys(assets).forEach(function(assetKey){ + var assetItem = assets[assetKey]; + var obj; + + // check/transform short version + if (_.isArray(assetItem)) { + obj = { + base: assetKey, + files: assetItem + }; + assetItem = obj; + } + assetItem.type = assetKey; + list.push(assetItem); + }); + } + + // transform files to scr-dest mapping + list.forEach(function(asset){ + + var mapping = []; + asset.files.forEach(function(file){ + var fileItem = file; + + // convert simple syntax to object + if (_.isString(file)) { + fileItem = { + src: file + }; + } + // determine default dest + if (!fileItem.dest) { + fileItem.dest = path.basename(file); + } + // generate full path + fileItem.dest = path.join(clientLibPath, asset.base, fileItem.dest); + mapping.push(fileItem); + }); + + asset.files = mapping; + }); + + return list; +} + +/** + * Process the given clientlib configuration object. + * @param {ClientLibItem} item - clientlib configuration object + * @param {Object} options - configuration options + * @param {Function} processDone - to be called if everything is done + */ +function processItem(item, options, processDone) { + + if (!item.path) { + item.path = options.clientLibRoot; + } + + // remove current files if exists + removeClientLib(item, function(err) { + + var clientLibPath = path.join(item.path, item.name); + + // create clientlib directory + fse.mkdirsSync(clientLibPath); + + // write configuration JSON + writeClientLibJson(item); + + var assetList = normalizeAssets(clientLibPath, item.assets); + + // iterate through assets + async.eachSeries(assetList, function(asset, assetDone){ + + // write clientlib creator files + if (asset.type === "js" || asset.type === "css") { + writeAssetTxt(clientLibPath, asset); + } + + // copy files for given asset + async.eachSeries(asset.files, function(fileItem, copyDone) { + + console.log("copy:", fileItem.src, fileItem.dest); + + // create directories separately or it will be copied recursively + if (fs.lstatSync(fileItem.src).isDirectory()) { + fs.mkdir(fileItem.dest, copyDone); + } + else { + fse.copy(fileItem.src, fileItem.dest, copyDone); + } + }, assetDone); + + }, processDone); + }); +} + +module.exports = start; +module.exports.removeClientLib = removeClientLib; +module.exports.fileExists = fileExists; \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..5885c0b --- /dev/null +++ b/package.json @@ -0,0 +1,44 @@ +{ + "name": "aem-clientlib-generator", + "version": "1.0.0", + "description": "Creates configuration files for AEM ClientLibs and synchronizes assets.", + "author": { + "name": "pro!vision GmbH", + "url": "http://www.pro-vision.de" + }, + "contributors": [{ + "name": "Matthias Hauch", + "email": "mhauch@pro-vision.de" + }], + "homepage": "https://github.com/wcm-io-frontend/aem-clientlib-generator", + "bugs": { + "url": "https://github.com/wcm-io-frontend/aem-clientlib-generator/issues" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/wcm-io-frontend/aem-clientlib-generator.git" + }, + "engines": { + "node": ">=0.12" + }, + "keywords": [ + "aem", + "clientlib", + "clientlibs", + "generator", + "sync" + ], + "main": "index.js", + "dependencies": { + "async": "^1.5.2", + "fs-extra": "^0.30.0", + "lodash": "^4.6.1" + }, + "devDependencies": { + "mocha": "^2.5.3" + }, + "license": "Apache-2.0", + "scripts": { + "test": "mocha" + } +} diff --git a/test/TestCase.test.js b/test/TestCase.test.js new file mode 100644 index 0000000..15ebc30 --- /dev/null +++ b/test/TestCase.test.js @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2016 pro!vision GmbH and Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +"use strict"; + +var fs = require("fs"); +var fse = require("fs-extra"); +var clientlib = require("../index"); +var fileExists = require("../index").fileExists; +var path = require("path"); +var assert = require('assert'); + +var clientLibConf = require("./clientlib.conf"); + +var resultDir = path.join(__dirname, "result"); +var expectedDir = path.join(__dirname, "expected"); + + +describe("Test output", function() { + + // cleanup result folder + beforeEach(function(){ + fse.removeSync(resultDir); + fs.mkdirSync(resultDir); + }); + + it("should create files correctly", function(done) { + + clientlib(clientLibConf.list, clientLibConf.options, function() { + + var items = []; // files, directories, symlinks, etc + fse.walk(expectedDir) + .on("data", function (item) { + items.push(item.path) + }) + .on("end", function () { + + items.forEach(function(expectedFile) { + var subFilePath = path.relative(expectedDir, expectedFile); + if (!subFilePath) { + return; + } + + var resultFile = path.join(resultDir, subFilePath); + + assert.ok(fileExists(resultFile), "file does not exist in result: " + subFilePath); + + if (!fs.lstatSync(expectedFile).isDirectory()) { + var result = fs.readFileSync(resultFile, "utf-8"); + var expected = fs.readFileSync(expectedFile, "utf-8"); + + assert.equal(result, expected, "content of " + subFilePath + " is not expected"); + } + + }); + + done(); + }); + }); + }); +}); diff --git a/test/clientlib.conf.js b/test/clientlib.conf.js new file mode 100644 index 0000000..7e46dd7 --- /dev/null +++ b/test/clientlib.conf.js @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2016 pro!vision GmbH and Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +"use strict"; + +var path = require("path"); +module.exports = { + + options: { + cwd: __dirname, + clientLibRoot: path.join(__dirname, "result/clientlibs-root") + }, + + list: [ + { + name: "test.base.apps.mainapp", + assets: { + js: [ + {src: "src/frontend/js/app.js", dest: "app.js"}, + {src: "src/frontend/js/libs/mylib.js", dest: "libs/mylib.js"} + ], + css: [ + "src/frontend/css/styling.css", + "src/frontend/css/lib.css" + ] + } + }, + { + name: "test.base.apps.secondapp", + embed: [ + "test.base.apps.thirdapp" // this clientlib will be auto embedded in AEM (kind of `merging`) + ], + dependencies: [ + "test.base.apps.mainapp" // define clientlib dependency + ], + assets: { + js: { + base: "js", // by default the `base` is the asset key property + files: [ + {src: "src/frontend/secondapp/js/lib.js", dest: "secondapp-lib.js"} + ] + }, + css: { + base: "style", // changes the `base` from `css` (default) to `style` + files: [ + "src/frontend/secondapp/main.css" + ] + }, + resources: [ + "src/frontend/resources/template.html" + ] + } + }, + { + name: "test.base.apps.thirdapp", + assets: { + resources: { + base: ".", // copy the file into `test.base.apps.thirdapp` (root) instead of `test.base.apps.thirdapp/resources` + files: [ + "src/frontend/resources/notice.txt" + ] + } + } + } + ] +}; \ No newline at end of file diff --git a/test/expected/clientlibs-root/test.base.apps.mainapp.json b/test/expected/clientlibs-root/test.base.apps.mainapp.json new file mode 100644 index 0000000..6d5d3b7 --- /dev/null +++ b/test/expected/clientlibs-root/test.base.apps.mainapp.json @@ -0,0 +1,6 @@ +{ + "jcr:primaryType": "cq:ClientLibraryFolder", + "categories": [ + "test.base.apps.mainapp" + ] +} diff --git a/test/expected/clientlibs-root/test.base.apps.mainapp/css.txt b/test/expected/clientlibs-root/test.base.apps.mainapp/css.txt new file mode 100644 index 0000000..63304c2 --- /dev/null +++ b/test/expected/clientlibs-root/test.base.apps.mainapp/css.txt @@ -0,0 +1,4 @@ +#base=css + +styling.css +lib.css \ No newline at end of file diff --git a/test/expected/clientlibs-root/test.base.apps.mainapp/css/lib.css b/test/expected/clientlibs-root/test.base.apps.mainapp/css/lib.css new file mode 100644 index 0000000..3fa079f --- /dev/null +++ b/test/expected/clientlibs-root/test.base.apps.mainapp/css/lib.css @@ -0,0 +1,5 @@ +/* lib styles here */ + +.lib { + font-size: 30px; +} \ No newline at end of file diff --git a/test/expected/clientlibs-root/test.base.apps.mainapp/css/styling.css b/test/expected/clientlibs-root/test.base.apps.mainapp/css/styling.css new file mode 100644 index 0000000..a21e336 --- /dev/null +++ b/test/expected/clientlibs-root/test.base.apps.mainapp/css/styling.css @@ -0,0 +1,3 @@ +body { + color: #000; +} \ No newline at end of file diff --git a/test/expected/clientlibs-root/test.base.apps.mainapp/js.txt b/test/expected/clientlibs-root/test.base.apps.mainapp/js.txt new file mode 100644 index 0000000..7773175 --- /dev/null +++ b/test/expected/clientlibs-root/test.base.apps.mainapp/js.txt @@ -0,0 +1,4 @@ +#base=js + +app.js +libs/mylib.js \ No newline at end of file diff --git a/test/expected/clientlibs-root/test.base.apps.mainapp/js/app.js b/test/expected/clientlibs-root/test.base.apps.mainapp/js/app.js new file mode 100644 index 0000000..9ec1456 --- /dev/null +++ b/test/expected/clientlibs-root/test.base.apps.mainapp/js/app.js @@ -0,0 +1,5 @@ + +"use strict"; +var Test = function() { + this.test = "test"; +}; \ No newline at end of file diff --git a/test/expected/clientlibs-root/test.base.apps.mainapp/js/libs/mylib.js b/test/expected/clientlibs-root/test.base.apps.mainapp/js/libs/mylib.js new file mode 100644 index 0000000..801b0e7 --- /dev/null +++ b/test/expected/clientlibs-root/test.base.apps.mainapp/js/libs/mylib.js @@ -0,0 +1,5 @@ + +"use strict"; +var MyLib = function() { + this.test = "MyLib"; +}; \ No newline at end of file diff --git a/test/expected/clientlibs-root/test.base.apps.secondapp.json b/test/expected/clientlibs-root/test.base.apps.secondapp.json new file mode 100644 index 0000000..73c5cff --- /dev/null +++ b/test/expected/clientlibs-root/test.base.apps.secondapp.json @@ -0,0 +1,12 @@ +{ + "jcr:primaryType": "cq:ClientLibraryFolder", + "categories": [ + "test.base.apps.secondapp" + ], + "embed": [ + "test.base.apps.thirdapp" + ], + "dependencies": [ + "test.base.apps.mainapp" + ] +} diff --git a/test/expected/clientlibs-root/test.base.apps.secondapp/css.txt b/test/expected/clientlibs-root/test.base.apps.secondapp/css.txt new file mode 100644 index 0000000..0c37a26 --- /dev/null +++ b/test/expected/clientlibs-root/test.base.apps.secondapp/css.txt @@ -0,0 +1,3 @@ +#base=style + +main.css \ No newline at end of file diff --git a/test/expected/clientlibs-root/test.base.apps.secondapp/js.txt b/test/expected/clientlibs-root/test.base.apps.secondapp/js.txt new file mode 100644 index 0000000..aed07fa --- /dev/null +++ b/test/expected/clientlibs-root/test.base.apps.secondapp/js.txt @@ -0,0 +1,3 @@ +#base=js + +secondapp-lib.js \ No newline at end of file diff --git a/test/expected/clientlibs-root/test.base.apps.secondapp/js/secondapp-lib.js b/test/expected/clientlibs-root/test.base.apps.secondapp/js/secondapp-lib.js new file mode 100644 index 0000000..9ec1456 --- /dev/null +++ b/test/expected/clientlibs-root/test.base.apps.secondapp/js/secondapp-lib.js @@ -0,0 +1,5 @@ + +"use strict"; +var Test = function() { + this.test = "test"; +}; \ No newline at end of file diff --git a/test/expected/clientlibs-root/test.base.apps.secondapp/resources/template.html b/test/expected/clientlibs-root/test.base.apps.secondapp/resources/template.html new file mode 100644 index 0000000..7152983 --- /dev/null +++ b/test/expected/clientlibs-root/test.base.apps.secondapp/resources/template.html @@ -0,0 +1,10 @@ + + + + + + + +

Test file

+ + \ No newline at end of file diff --git a/test/expected/clientlibs-root/test.base.apps.secondapp/style/main.css b/test/expected/clientlibs-root/test.base.apps.secondapp/style/main.css new file mode 100644 index 0000000..a21e336 --- /dev/null +++ b/test/expected/clientlibs-root/test.base.apps.secondapp/style/main.css @@ -0,0 +1,3 @@ +body { + color: #000; +} \ No newline at end of file diff --git a/test/expected/clientlibs-root/test.base.apps.thirdapp.json b/test/expected/clientlibs-root/test.base.apps.thirdapp.json new file mode 100644 index 0000000..8fd771f --- /dev/null +++ b/test/expected/clientlibs-root/test.base.apps.thirdapp.json @@ -0,0 +1,6 @@ +{ + "jcr:primaryType": "cq:ClientLibraryFolder", + "categories": [ + "test.base.apps.thirdapp" + ] +} diff --git a/test/expected/clientlibs-root/test.base.apps.thirdapp/notice.txt b/test/expected/clientlibs-root/test.base.apps.thirdapp/notice.txt new file mode 100644 index 0000000..2d4ade0 --- /dev/null +++ b/test/expected/clientlibs-root/test.base.apps.thirdapp/notice.txt @@ -0,0 +1 @@ +This is a txt file and the content does not make any sense... \ No newline at end of file diff --git a/test/src/frontend/css/lib.css b/test/src/frontend/css/lib.css new file mode 100644 index 0000000..3fa079f --- /dev/null +++ b/test/src/frontend/css/lib.css @@ -0,0 +1,5 @@ +/* lib styles here */ + +.lib { + font-size: 30px; +} \ No newline at end of file diff --git a/test/src/frontend/css/styling.css b/test/src/frontend/css/styling.css new file mode 100644 index 0000000..a21e336 --- /dev/null +++ b/test/src/frontend/css/styling.css @@ -0,0 +1,3 @@ +body { + color: #000; +} \ No newline at end of file diff --git a/test/src/frontend/js/app.js b/test/src/frontend/js/app.js new file mode 100644 index 0000000..9ec1456 --- /dev/null +++ b/test/src/frontend/js/app.js @@ -0,0 +1,5 @@ + +"use strict"; +var Test = function() { + this.test = "test"; +}; \ No newline at end of file diff --git a/test/src/frontend/js/libs/mylib.js b/test/src/frontend/js/libs/mylib.js new file mode 100644 index 0000000..801b0e7 --- /dev/null +++ b/test/src/frontend/js/libs/mylib.js @@ -0,0 +1,5 @@ + +"use strict"; +var MyLib = function() { + this.test = "MyLib"; +}; \ No newline at end of file diff --git a/test/src/frontend/resources/notice.txt b/test/src/frontend/resources/notice.txt new file mode 100644 index 0000000..2d4ade0 --- /dev/null +++ b/test/src/frontend/resources/notice.txt @@ -0,0 +1 @@ +This is a txt file and the content does not make any sense... \ No newline at end of file diff --git a/test/src/frontend/resources/template.html b/test/src/frontend/resources/template.html new file mode 100644 index 0000000..7152983 --- /dev/null +++ b/test/src/frontend/resources/template.html @@ -0,0 +1,10 @@ + + + + + + + +

Test file

+ + \ No newline at end of file diff --git a/test/src/frontend/secondapp/js/lib.js b/test/src/frontend/secondapp/js/lib.js new file mode 100644 index 0000000..9ec1456 --- /dev/null +++ b/test/src/frontend/secondapp/js/lib.js @@ -0,0 +1,5 @@ + +"use strict"; +var Test = function() { + this.test = "test"; +}; \ No newline at end of file diff --git a/test/src/frontend/secondapp/main.css b/test/src/frontend/secondapp/main.css new file mode 100644 index 0000000..a21e336 --- /dev/null +++ b/test/src/frontend/secondapp/main.css @@ -0,0 +1,3 @@ +body { + color: #000; +} \ No newline at end of file