/*eslint-env node */
module.exports = function(grunt) {
var packageData = grunt.file.readJSON("package.json");
var changelogLine = grunt.file.read("changelog.txt").toString().split("\n")[0];
packageData.version = /^Version ([0-9xabrc.]+)/.exec(changelogLine)[1];
packageData.date = /^Version [^\(]+\(([^\)]+)\)/.exec(changelogLine)[1];
grunt.initConfig({
pkg: packageData,
eslint: {
options: {
config: ".eslintrc"
},
core: ["js/tinymce/classes/**/*.js"],
plugins: [
"js/tinymce/plugins/*/plugin.js",
"js/tinymce/plugins/*/classes/**/*.js",
"!js/tinymce/plugins/paste/plugin.js",
"!js/tinymce/plugins/table/plugin.js",
"!js/tinymce/plugins/spellchecker/plugin.js",
"!js/tinymce/plugins/imagetools/plugin.js"
],
themes: ["js/tinymce/themes/*/theme.js"]
},
jscs: {
options: {
config: ".jscsrc"
},
core: ["js/tinymce/classes/**/*.js"],
plugins: [
"js/tinymce/plugins/*/plugin.js",
"js/tinymce/plugins/*/classes/**.js",
"!js/tinymce/plugins/paste/plugin.js",
"!js/tinymce/plugins/table/plugin.js",
"!js/tinymce/plugins/spellchecker/plugin.js",
"!js/tinymce/plugins/imagetools/plugin.js"
],
themes: ["js/tinymce/themes/*/theme.js"]
},
qunit: {
core: {
options: {
urls: [
"tests/index.html"
]
}
}
},
amdlc: {
core: {
options: {
version: packageData.version,
releaseDate: packageData.date,
baseDir: "js/tinymce/classes",
rootNS: "tinymce",
outputSource: "js/tinymce/tinymce.js",
outputMinified: "js/tinymce/tinymce.min.js",
outputDev: "js/tinymce/tinymce.dev.js",
verbose: false,
expose: "public",
compress: true,
from: [
"dom/DomQuery.js",
"EditorManager.js",
"LegacyInput.js",
"util/XHR.js",
"util/JSONRequest.js",
"util/JSONP.js",
"util/LocalStorage.js",
"Compat.js",
"ui/*.js"
]
}
},
"core-jquery": {
options: {
moduleOverrides: {
"tinymce/dom/Sizzle": "js/tinymce/classes/dom/Sizzle.jQuery.js"
},
version: packageData.version,
releaseDate: packageData.date,
baseDir: "js/tinymce/classes",
rootNS: "tinymce",
outputSource: "js/tinymce/tinymce.jquery.js",
outputMinified: "js/tinymce/tinymce.jquery.min.js",
outputDev: "js/tinymce/tinymce.jquery.dev.js",
verbose: false,
expose: "public",
compress: true,
from: [
"dom/DomQuery.js",
"EditorManager.js",
"LegacyInput.js",
"util/XHR.js",
"util/JSONRequest.js",
"util/JSONP.js",
"util/LocalStorage.js",
"Compat.js",
"ui/*.js"
]
}
},
"paste-plugin": {
options: {
baseDir: "js/tinymce/plugins/paste/classes",
rootNS: "tinymce.pasteplugin",
outputSource: "js/tinymce/plugins/paste/plugin.js",
outputMinified: "js/tinymce/plugins/paste/plugin.min.js",
outputDev: "js/tinymce/plugins/paste/plugin.dev.js",
verbose: false,
expose: "public",
compress: true,
from: "Plugin.js"
}
},
"table-plugin": {
options: {
baseDir: "js/tinymce/plugins/table/classes",
rootNS: "tinymce.tableplugin",
outputSource: "js/tinymce/plugins/table/plugin.js",
outputMinified: "js/tinymce/plugins/table/plugin.min.js",
outputDev: "js/tinymce/plugins/table/plugin.dev.js",
verbose: false,
expose: "public",
compress: true,
from: "Plugin.js"
}
},
"spellchecker-plugin": {
options: {
baseDir: "js/tinymce/plugins/spellchecker/classes",
rootNS: "tinymce.spellcheckerplugin",
outputSource: "js/tinymce/plugins/spellchecker/plugin.js",
outputMinified: "js/tinymce/plugins/spellchecker/plugin.min.js",
outputDev: "js/tinymce/plugins/spellchecker/plugin.dev.js",
verbose: false,
expose: "public",
compress: true,
from: "Plugin.js"
}
},
"imagetools-plugin": {
options: {
baseDir: "js/tinymce/plugins/imagetools/classes",
rootNS: "tinymce.imagetoolsplugin",
outputSource: "js/tinymce/plugins/imagetools/plugin.js",
outputMinified: "js/tinymce/plugins/imagetools/plugin.min.js",
outputDev: "js/tinymce/plugins/imagetools/plugin.dev.js",
verbose: false,
expose: "public",
compress: true,
from: "Plugin.js"
}
}
},
skin: {
modern: {
options: {
prepend: [
"Variables.less",
"Reset.less",
"Mixins.less",
"Animations.less",
"TinyMCE.less",
"CropRect.less",
"ImagePanel.less"
],
append: ["Icons.less"],
importFrom: "js/tinymce/tinymce.js",
path: "js/tinymce/skins",
devLess: "skin.dev.less",
srcLess: "skin.less"
}
},
ie7: {
options: {
prepend: [
"Variables.less",
"Reset.less",
"Mixins.less",
"Animations.less",
"TinyMCE.less",
"CropRect.less",
"ImagePanel.less"
],
append: ["Icons.Ie7.less"],
importFrom: "js/tinymce/tinymce.js",
path: "js/tinymce/skins",
devLess: "skin.ie7.dev.less",
srcLess: "skin.ie7.less"
}
}
},
less: {
modern: {
options: {
cleancss: true,
strictImports: true
},
expand: true,
src: ["js/tinymce/skins/**/skin.dev.less"],
ext: ".min.css"
},
ie7: {
options: {
compress: true,
strictImports: true,
ieCompat: true
},
expand: true,
src: ["js/tinymce/skins/**/skin.ie7.dev.less"],
ext: ".ie7.min.css"
},
content: {
options: {
cleancss: true,
strictImports: true
},
rename: function(dest, src) {
return src.toLowerCase();
},
expand: true,
src: ["js/tinymce/skins/**/Content.less"],
ext: ".min.css"
},
"content-inline": {
options: {
cleancss: true,
strictImports: true
},
rename: function(dest, src) {
return src.toLowerCase();
},
expand: true,
src: ["js/tinymce/skins/**/Content.Inline.less"],
ext: ".inline.min.css"
}
},
uglify: {
options: {
beautify: {
ascii_only: true
}
},
themes: {
src: ["js/tinymce/themes/*/theme.js"],
expand: true,
ext: ".min.js"
},
plugins: {
src: ["js/tinymce/plugins/*/plugin.js"],
expand: true,
ext: ".min.js"
},
"jquery-plugin": {
src: ["js/tinymce/classes/jquery.tinymce.js"],
dest: "js/tinymce/jquery.tinymce.min.js"
}
},
moxiezip: {
production: {
options: {
baseDir: "tinymce",
excludes: [
"js/tinymce/plugins/moxiemanager",
"js/tinymce/plugins/compat3x",
"js/tinymce/plugins/visualblocks/img",
"js/tinymce/plugins/*/classes/**",
"js/tinymce/plugins/*/plugin.js",
"js/tinymce/plugins/*/plugin.dev.js",
"js/tinymce/themes/*/theme.js",
"js/tinymce/skins/*/*.less",
"js/tinymce/skins/*/fonts/*.json",
"js/tinymce/skins/*/fonts/*.dev.svg",
"js/tinymce/skins/*/fonts/readme.md",
"readme.md"
],
to: "tmp/tinymce_<%= pkg.version %>.zip"
},
src: [
"js/tinymce/langs",
"js/tinymce/plugins",
"js/tinymce/skins",
"js/tinymce/themes",
"js/tinymce/tinymce.min.js",
"js/tinymce/license.txt",
"changelog.txt",
"LICENSE.TXT",
"readme.md"
]
},
jquery: {
options: {
baseDir: "tinymce",
excludes: [
"js/tinymce/plugins/moxiemanager",
"js/tinymce/plugins/compat3x",
"js/tinymce/plugins/visualblocks/img",
"js/tinymce/plugins/*/classes/**",
"js/tinymce/plugins/*/plugin.js",
"js/tinymce/plugins/*/plugin.dev.js",
"js/tinymce/themes/*/theme.js",
"js/tinymce/skins/*/*.less",
"js/tinymce/skins/*/fonts/*.json",
"js/tinymce/skins/*/fonts/*.dev.svg",
"js/tinymce/skins/*/fonts/readme.md",
"readme.md"
],
pathFilter: function(args) {
if (args.zipFilePath == "js/tinymce/tinymce.jquery.min.js") {
args.zipFilePath = "js/tinymce/tinymce.min.js";
}
},
to: "tmp/tinymce_<%= pkg.version %>_jquery.zip"
},
src: [
"js/tinymce/langs",
"js/tinymce/plugins",
"js/tinymce/skins",
"js/tinymce/themes",
"js/tinymce/tinymce.jquery.min.js",
"js/tinymce/jquery.tinymce.min.js",
"js/tinymce/license.txt",
"changelog.txt",
"LICENSE.TXT",
"readme.md"
]
},
development: {
options: {
baseDir: "tinymce",
excludes: [
"js/tinymce/tinymce.full.min.js",
"js/tinymce/plugins/moxiemanager",
"js/tests/.jshintrc"
],
to: "tmp/tinymce_<%= pkg.version %>_dev.zip"
},
src: [
"js",
"tests",
"tools",
"changelog.txt",
"LICENSE.TXT",
"Gruntfile.js",
"readme.md",
"package.json",
".eslintrc",
".jscsrc",
".jshintrc"
]
},
component: {
options: {
excludes: [
"js/tinymce/plugins/moxiemanager",
"js/tinymce/plugins/example",
"js/tinymce/plugins/example_dependency",
"js/tinymce/plugins/compat3x",
"js/tinymce/plugins/visualblocks/img",
"js/tinymce/plugins/*/classes/**",
"js/tinymce/plugins/*/plugin.dev.js",
"js/tinymce/skins/*/*.less",
"js/tinymce/skins/*/fonts/*.json",
"js/tinymce/skins/*/fonts/*.dev.svg",
"js/tinymce/skins/*/fonts/readme.md",
"readme.md"
],
pathFilter: function(args) {
if (args.zipFilePath.indexOf("js/tinymce/") === 0) {
args.zipFilePath = args.zipFilePath.substr("js/tinymce/".length);
}
},
onBeforeSave: function(zip) {
function jsonToBuffer(json) {
return new Buffer(JSON.stringify(json, null, '\t'));
}
zip.addData("bower.json", jsonToBuffer({
"name": "tinymce",
"version": packageData.version,
"description": "Web based JavaScript HTML WYSIWYG editor control.",
"license": "http://www.tinymce.com/license",
"keywords": ["editor", "wysiwyg", "tinymce", "richtext", "javascript", "html"],
"homepage": "http://www.tinymce.com",
"main": "tinymce.min.js",
"ignore": ["readme.md", "composer.json", "package.json"]
}));
zip.addData("package.json", jsonToBuffer({
"name": "tinymce",
"version": packageData.version,
"description": "Web based JavaScript HTML WYSIWYG editor control.",
"license": "LGPL-2.1",
"keywords": ["editor", "wysiwyg", "tinymce", "richtext", "javascript", "html"],
"bugs": {"url": "http://www.tinymce.com/develop/bugtracker.php"}
}));
zip.addData("composer.json", jsonToBuffer({
"name": "tinymce/tinymce",
"version": packageData.version,
"description": "Web based JavaScript HTML WYSIWYG editor control.",
"license": ["LGPL-2.1"],
"keywords": ["editor", "wysiwyg", "tinymce", "richtext", "javascript", "html"],
"homepage": "http://www.tinymce.com",
"type": "component",
"extra": {
"component": {
"scripts": [
"tinymce.js",
"plugins/*/plugin.js",
"themes/*/theme.js"
],
"files": [
"tinymce.min.js",
"plugins/*/plugin.min.js",
"themes/*/theme.min.js",
"skins/**"
]
}
},
"archive": {
"exclude": ["readme.md", "bower.js", "package.json"]
}
}));
},
to: "tmp/tinymce_<%= pkg.version %>_component.zip"
},
src: [
"js/tinymce/skins",
"js/tinymce/plugins",
"js/tinymce/themes",
"js/tinymce/tinymce.js",
"js/tinymce/tinymce.min.js",
"js/tinymce/jquery.tinymce.min.js",
"js/tinymce/tinymce.jquery.js",
"js/tinymce/tinymce.jquery.min.js",
"js/tinymce/license.txt",
"changelog.txt"
]
}
},
connect: {
server: {
options: {
port: 9999
}
}
},
"saucelabs-qunit": {
all: {
options: {
urls: ["127.0.0.1:9999/tests/index.html?min=true"],
testname: "TinyMCE QUnit Tests",
browsers: [
{browserName: "firefox", platform: "XP"},
{browserName: "googlechrome", platform: "XP"},
{browserName: "firefox", platform: "Linux"},
{browserName: "googlechrome", platform: "Linux"},
{browserName: "internet explorer", platform: "XP", version: "8"},
{browserName: "internet explorer", platform: "Windows 7", version: "9"},
{browserName: "internet explorer", platform: "Windows 7", version: "10"},
{browserName: "internet explorer", platform: "Windows 7", version: "11"},
{browserName: "microsoftedge", platform: "Windows 10", version: "20.10240"},
{browserName: "safari", platform: "OS X 10.9", version: "7"},
{browserName: "safari", platform: "OS X 10.8", version: "6"}
]
}
}
},
nugetpack: {
main: {
options: {
id: "TinyMCE",
version: packageData.version,
authors: "Ephox Corp",
owners: "Ephox Corp",
description: "The best WYSIWYG editor! TinyMCE is a platform independent web based Javascript HTML WYSIWYG editor " +
"control released as Open Source under LGPL by Ephox Corp. TinyMCE has the ability to convert HTML " +
"TEXTAREA fields or other HTML elements to editor instances. TinyMCE is very easy to integrate " +
"into other Content Management Systems.",
releaseNotes: "Release notes for my package.",
summary: "TinyMCE is a platform independent web based Javascript HTML WYSIWYG editor " +
"control released as Open Source under LGPL by Ephox Corp.",
projectUrl: "http://www.tinymce.com/",
iconUrl: "http://www.tinymce.com/favicon.ico",
licenseUrl: "http://www.tinymce.com/license",
requireLicenseAcceptance: true,
tags: "Editor TinyMCE HTML HTMLEditor",
excludes: [
"js/tinymce/skins/**/*.dev.svg",
"js/tinymce/skins/**/*.less",
"js/tinymce/plugins/**/classes",
"js/tinymce/plugins/**/*.dev.js"
],
outputDir: "tmp"
},
files: [
{src: "js/tinymce/langs", dest: "/content/scripts/tinymce/langs"},
{src: "js/tinymce/plugins", dest: "/content/scripts/tinymce/plugins"},
{src: "js/tinymce/themes", dest: "/content/scripts/tinymce/themes"},
{src: "js/tinymce/skins", dest: "/content/scripts/tinymce/skins"},
{src: "js/tinymce/tinymce.js", dest: "/content/scripts/tinymce/tinymce.js"},
{src: "js/tinymce/tinymce.min.js", dest: "/content/scripts/tinymce/tinymce.min.js"},
{src: "js/tinymce/license.txt", dest: "/content/scripts/tinymce/license.txt"}
]
},
jquery: {
options: {
id: "TinyMCE.jQuery",
version: packageData.version,
authors: "Ephox Corp",
owners: "Ephox Corp",
description: "The best WYSIWYG editor! TinyMCE is a platform independent web based Javascript HTML WYSIWYG editor " +
"control released as Open Source under LGPL by Ephox Corp. TinyMCE has the ability to convert HTML " +
"TEXTAREA fields or other HTML elements to editor instances. TinyMCE is very easy to integrate " +
"into other Content Management Systems.",
releaseNotes: "Release notes for my package.",
summary: "TinyMCE is a platform independent web based Javascript HTML WYSIWYG editor " +
"control released as Open Source under LGPL by Ephox Corp.",
projectUrl: "http://www.tinymce.com/",
iconUrl: "http://www.tinymce.com/favicon.ico",
licenseUrl: "http://www.tinymce.com/license",
requireLicenseAcceptance: true,
tags: "Editor TinyMCE HTML HTMLEditor",
excludes: [
"js/tinymce/skins/**/*.dev.svg",
"js/tinymce/skins/**/*.less",
"js/tinymce/plugins/**/classes",
"js/tinymce/plugins/**/*.dev.js"
],
outputDir: "tmp"
},
files: [
{src: "js/tinymce/langs", dest: "/content/scripts/tinymce/langs"},
{src: "js/tinymce/plugins", dest: "/content/scripts/tinymce/plugins"},
{src: "js/tinymce/themes", dest: "/content/scripts/tinymce/themes"},
{src: "js/tinymce/skins", dest: "/content/scripts/tinymce/skins"},
{src: "js/tinymce/tinymce.js", dest: "/content/scripts/tinymce/tinymce.js"},
{src: "js/tinymce/tinymce.min.js", dest: "/content/scripts/tinymce/tinymce.min.js"},
{src: "js/tinymce/jquery.tinymce.min.js", dest: "/content/scripts/tinymce/jquery.tinymce.min.js"},
{src: "js/tinymce/license.txt", dest: "/content/scripts/tinymce/license.txt"}
]
}
},
bundle: {
minified: {
options: {
themesDir: "js/tinymce/themes",
pluginsDir: "js/tinymce/plugins",
pluginFileName: "plugin.min.js",
themeFileName: "theme.min.js",
outputPath: "js/tinymce/tinymce.full.min.js"
},
src: [
"js/tinymce/tinymce.min.js"
]
},
source: {
options: {
themesDir: "js/tinymce/themes",
pluginsDir: "js/tinymce/plugins",
pluginFileName: "plugin.js",
themeFileName: "theme.js",
outputPath: "js/tinymce/tinymce.full.js"
},
src: [
"js/tinymce/tinymce.js"
]
}
},
clean: {
release: ["tmp"],
core: [
"js/tinymce/tinymce*",
"js/tinymce/*.min.js",
"js/tinymce/*.dev.js"
],
plugins: [
"js/tinymce/plugins/**/*.min.js",
"js/tinymce/plugins/**/*.dev.js",
"js/tinymce/plugins/table/plugin.js",
"js/tinymce/plugins/paste/plugin.js",
"js/tinymce/plugins/spellchecker/plugin.js"
],
skins: [
"js/tinymce/skins/**/*.min.css",
"js/tinymce/skins/**/*.dev.less"
],
npm: [
"node_modules",
"npm-debug.log"
],
saucelabs: [
"?sc.log",
"sc_*.log"
]
},
watch: {
core: {
files: ["js/tinymce/classes/**/*.js"],
tasks: ["eslint:core", "jscs:core", "amdlc:core", "amdlc:core-jquery", "skin"],
options: {
spawn: false
}
},
plugins: {
files: ["js/tinymce/plugins/**/*.js"],
tasks: [
"amdlc:paste-plugin", "amdlc:imagetools-plugin",
"amdlc:table-plugin", "amdlc:spellchecker-plugin", "uglify:plugins",
"eslint:plugins", "jscs:plugins"
],
options: {
spawn: false
}
},
themes: {
files: ["js/tinymce/themes/**/*.js"],
tasks: ["eslint:themes", "jscs:themes", "uglify:themes"],
options: {
spawn: false
}
},
skins: {
files: ["js/tinymce/skins/**/*"],
tasks: ["less"],
options: {
spawn: false
}
}
}
});
require("load-grunt-tasks")(grunt);
grunt.loadTasks("tools/tasks");
grunt.registerTask("lint", ["eslint", "jscs"]);
grunt.registerTask("minify", ["amdlc", "uglify", "skin", "less"]);
grunt.registerTask("test", ["qunit"]);
grunt.registerTask("sc-test", ["connect", "clean:saucelabs", "saucelabs-qunit"]);
grunt.registerTask("default", ["lint", "minify", "test", "clean:release", "moxiezip", "nugetpack"]);
};
|