{"version":3,"sources":["jsdelivr-header.js","/npm/nodebb-plugin-import-wordpress@0.1.9/index.js"],"names":[],"mappings":"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","file":"/npm/nodebb-plugin-import-wordpress@0.1.9/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/nodebb-plugin-import-wordpress@0.1.9/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","\nvar async = require('async');\nvar mysql = require('mysql');\nvar moment = require('moment');\nvar _ = require('underscore');\nvar noop = function(){};\n\nvar logPrefix = '[nodebb-plugin-import-wordpress]';\nvar WPShortcode = require('./wp.shortcode').shortcode;\n\n(function(Exporter) {\n\n    Exporter.setup = function(config, callback) {\n        Exporter.log('setup');\n\n        // mysql db only config\n        // extract them from the configs passed by the nodebb-plugin-import adapter\n        var _config = {\n            host: config.dbhost || config.host || 'localhost',\n            user: config.dbuser || config.user || 'root',\n            password: config.dbpass || config.pass || config.password || '',\n            port: config.dbport || config.port || 3306,\n            database: config.dbname || config.name || config.database || 'wordpress'\n        };\n\n        Exporter.config(_config);\n        Exporter.config('prefix', config.prefix || config.tablePrefix || '');\n\n        if (config.custom && typeof config.custom === 'string') {\n            try {\n                config.custom = JSON.parse(config.custom)\n            } catch (e) {\n                config.custom = null\n            }\n        }\n\n        Exporter.config('custom', config.custom || {\n            galleryShortcodes: 'toHTML',\n\n            // bbpress used 2.5.4\n            bbpress: false\n        });\n\n        Exporter.connection = mysql.createConnection(_config);\n        Exporter.connection.connect();\n\n        callback(null, Exporter.config());\n    };\n\n    Exporter.getUsers = function(callback) {\n        return Exporter.getPaginatedUsers(0, -1, callback);\n    };\n    Exporter.getPaginatedUsers = function(start, limit, callback) {\n        callback = !_.isFunction(callback) ? noop : callback;\n        var prefix = Exporter.config('prefix');\n        var startms = +new Date();\n        var query = 'SELECT '\n            + prefix + 'users.ID as _uid, '\n            + prefix + 'users.user_nicename as _username, '\n            + prefix + 'users.user_login as _alternativeUsername, '\n\n            + prefix + 'users.user_pass as _hashed_password, '\n            // passwords import not supported yet, but let's save the MD5 password anyways\n            // https://github.com/akhoury/nodebb-plugin-import/issues/64\n\n            + prefix + 'users.user_email as _registrationEmail, '\n            + prefix + 'users.user_email as _email, '\n            + prefix + 'users.user_registered as _joindate, '\n            + prefix + 'users.user_url as _website, '\n\n            + prefix + 'capabilities.meta_value as _wp_capabilities, '\n            + 'last_activity.meta_value as _lastonline, '\n            + 'description.meta_value as _signature '\n\n            + 'FROM ' + prefix + 'users '\n\n            + 'LEFT JOIN ' + prefix + 'usermeta AS ' + prefix + 'capabilities ON ' + prefix + 'capabilities.user_id=' + prefix + 'users.ID AND ' + prefix + 'capabilities.meta_key=\"' + prefix + 'capabilities\" '\n            + 'LEFT JOIN ' + prefix + 'usermeta AS last_activity ON last_activity.user_id=' + prefix + 'users.ID AND last_activity.meta_key=\"last_activity\" '\n            + 'LEFT JOIN ' + prefix + 'usermeta AS description ON description.user_id=' + prefix + 'users.ID AND description.meta_key=\"description\" '\n\n\n            + (start >= 0 && limit >= 0 ? ' LIMIT ' + start + ',' + limit : '');\n\n        Exporter.query(query,\n            function(err, rows) {\n                if (err) {\n                    Exporter.error(err);\n                    return callback(err);\n                }\n                //normalize here\n                var map = {};\n                rows.forEach(function(row) {\n                    row._signature = row._signature || '';\n\n                    // from ISO date to timestamp (ms)\n                    row._joindate = row._joindate ? moment(row._joindate).unix() * 1000 : startms;\n                    row._lastonline = row._lastonline ? moment(row._lastonline).unix() * 1000 : undefined;\n\n                    // lower case the email for consistency\n                    row._email = (row._email || '').toLowerCase();\n\n                    row._level = (row._wp_capabilities || '').indexOf('s:13:\"administrator\";b:1') !== -1 ? 'administrator' : 'member';\n\n                    // I don't know about you about I noticed a lot my users have incomplete urls, urls like: http://\n                    row._picture = Exporter.validateUrl(row._picture);\n                    row._website = Exporter.validateUrl(row._website);\n\n                    map[row._uid] = row;\n                });\n\n                callback(null, map);\n            });\n    };\n\n    Exporter.getCategories = function(callback) {\n        return Exporter.getPaginatedCategories(0, -1, callback);\n    };\n    Exporter.getPaginatedCategories = function(start, limit, callback) {\n        callback = !_.isFunction(callback) ? noop : callback;\n\n        var prefix = Exporter.config('prefix');\n        var custom = Exporter.config('custom');\n        var startms = +new Date();\n\n        var query = 'SELECT ';\n        if (custom && custom.bbpress) {\n            // if bbpress\n            query += ''\n            + prefix + 'posts.ID as _cid, '\n            + prefix + 'posts.post_title as _name, '\n            + prefix + 'posts.post_name as _slug, '\n            + prefix + 'posts.post_content as _description, '\n            + prefix + 'posts.menu_order as _order, '\n            + prefix + 'posts.post_date as _timestamp, '\n            + prefix + 'posts.post_status as _wp_status, '\n            + prefix + 'posts.post_parent as _parentCid '\n            + 'FROM ' + prefix + 'posts '\n            + 'WHERE ' + prefix + 'posts.post_type=\"forum\" '\n        } else {\n            // if core wp\n            query += ''\n                + prefix + 'terms.term_id as _cid, '\n                + prefix + 'terms.name as _name, '\n                + prefix + 'terms.slug as _slug, '\n                + prefix + 'term_taxonomy.description as _description, '\n                + prefix + 'term_taxonomy.parent as _parentCid '\n                + 'FROM ' + prefix + 'terms '\n                + 'LEFT JOIN ' + prefix + 'term_taxonomy ON ' + prefix + 'term_taxonomy.term_id=' + prefix + 'terms.term_id '\n                + 'WHERE ' + prefix + 'term_taxonomy.taxonomy=\"category\" ';\n        }\n        query += (start >= 0 && limit >= 0 ? 'LIMIT ' + start + ',' + limit : '');\n\n        Exporter.query(query,\n            function(err, rows) {\n                if (err) {\n                    Exporter.error(err);\n                    return callback(err);\n                }\n                var map = {};\n                rows.forEach(function(row, i) {\n                    row._name = row._name || ('Category ' + (i + 1));\n                    row._description = row._description || 'No description available';\n                    row._disabled = row._wp_status === \"private\" || row._wp_status === \"hidden\" ? 1 : 0 ;\n                    row._timestamp = row._timestamp ? moment(row._timestamp).unix() * 1000 : startms;\n                    map[row._cid] = row;\n                });\n                callback(null, map);\n            });\n    };\n\n\n\n    //todo : combine the getTags query with the getTopics?\n    // I don't know how to do, need mysql guru\n    // http://wordpress.stackexchange.com/questions/169863/wordpress-custom-sql-query-get-all-posts-with-category-id-and-a-concated-list\n\n    var getTags = function(callback) {\n        return getPaginatedTags(0, -1, callback);\n    };\n    var getPaginatedTags = function(start, limit, callback) {\n        callback = !_.isFunction(callback) ? noop : callback;\n\n        var prefix = Exporter.config('prefix');\n\n        var query = 'SELECT '\n            + prefix + 'terms.term_id as _tag_id, '\n            + prefix + 'terms.name as _name, '\n            + prefix + 'terms.slug as _slug, '\n            + prefix + 'term_relationships.object_id as _tid '\n\n            + 'FROM ' + prefix + 'terms '\n\n            + 'LEFT JOIN ' + prefix + 'term_relationships '\n            + 'ON ' + prefix + 'terms.term_id = ' + prefix + 'term_relationships.term_taxonomy_id '\n\n            + 'LEFT JOIN ' + prefix + 'term_taxonomy '\n            + 'ON ' + prefix + 'term_relationships.term_taxonomy_id = ' + prefix + 'term_taxonomy.term_taxonomy_id '\n\n            + 'WHERE ' + prefix + 'term_taxonomy.count > 0 '\n            + 'AND (' + prefix + 'term_taxonomy.taxonomy = \"post_tag\"  OR ' + prefix + 'term_taxonomy.taxonomy = \"topic-tag\") '\n            + (start >= 0 && limit >= 0 ? 'LIMIT ' + start + ',' + limit : '');\n\n        Exporter.query(query,\n            function(err, rows) {\n                if (err) {\n                    Exporter.error(err);\n                    return callback(err);\n                }\n                //normalize here\n                var topicsTagsMap = {};\n                rows.forEach(function(row) {\n                    topicsTagsMap[row._tid] = topicsTagsMap[row._tid] || [];\n                    topicsTagsMap[row._tid].push(row._name);\n                });\n\n                // return a map of all topics with values each as an array of tags\n                callback(null, topicsTagsMap);\n            });\n    };\n\n    var getAttachmentsIdsUrlsMap = function(callback) {\n        return getPaginatedAttachmentsIdsUrlsMap(0, -1, callback);\n    };\n\n    var getPaginatedAttachmentsIdsUrlsMap = function(start, limit, callback) {\n        callback = !_.isFunction(callback) ? noop : callback;\n        var prefix = Exporter.config('prefix');\n\n        var query =\n            'SELECT '\n            + prefix + 'posts.ID as _aid, '\n            + prefix + 'posts.post_parent as _tid, ' // i dont need this really right now\n            + prefix + 'posts.guid as _url '\n\n            + 'FROM ' + prefix + 'posts '\n            + 'WHERE '\n            + prefix + 'posts.post_type = \"attachment\" '\n            + 'AND ' + prefix + 'posts.post_mime_type like \\'image%\\' '\n            + 'AND ' + prefix + 'posts.post_parent > 0 '\n\n            + (start >= 0 && limit >= 0 ? 'LIMIT ' + start + ',' + limit : '');\n\n        Exporter.query(query,\n            function(err, rows) {\n                if (err) {\n                    Exporter.error(err);\n                    return callback(err);\n                }\n                //normalize here\n                var attachmentsIdsUrlsMap = {};\n                rows.forEach(function(row) {\n                    attachmentsIdsUrlsMap[row._aid] = row._url;\n                });\n\n                // return a map of all topics with values each as an array of tags\n                callback(null, attachmentsIdsUrlsMap);\n            });\n    };\n\n    var replaceGalleryTags = function(text, attachmentsIdsUrlsMap, galleryShortcodesSetting) {\n        // uncomment this line to disable auto replacement\n        // return text;\n\n        text = text || '';\n        attachmentsIdsUrlsMap = attachmentsIdsUrlsMap || {};\n        galleryShortcodesSetting = galleryShortcodesSetting || 'toHTML';\n\n        var result = WPShortcode.next('gallery', text);\n        var container = '';\n        while (result) {\n            if (result.shortcode && result.shortcode.attrs && result.shortcode.attrs.named) {\n                var ids = result.shortcode.attrs.named.ids || '';\n\n                if (galleryShortcodesSetting === 'toHTML') {\n                    container = '<div data-content-index=\"' + result.index + '\" class=\"imported-wp-gallery\" ';\n                    _.forEach(result.shortcode.attrs.named, function(value, key) {\n                        container += ' data-imported-wp-gallery-' + key + '=\"' +  value + '\" '\n                    });\n                    container += '>';\n                    ids.split(',').forEach(function(id, i) {\n                        if (attachmentsIdsUrlsMap[id]) {\n                            container += '<img src=\"' + attachmentsIdsUrlsMap[id] + '\" data-id=\"' + id + '\" data-index=\"' + i + '\" class=\"imported-wp-gallery-img\" /> ' ;\n                        }\n                    });\n                    container += '</div>';\n\n                    text = text.replace(result.content, container);\n                    result = WPShortcode.next('gallery', text);\n\n                } else if (galleryShortcodesSetting == 'toURLs') {\n                    var urls = '';\n                    var idsArr = ids.split(',');\n                    idsArr.forEach(function(id, i) {\n                        if (attachmentsIdsUrlsMap[id]) {\n                            urls += attachmentsIdsUrlsMap[id] + (i === idsArr.length - 1 ? '' : ',');\n                        }\n                    });\n\n                    text = text.replace(result.shortcode.attrs.named.ids, urls);\n                    result = WPShortcode.next('gallery', text, result.index + result.content.length);\n                }\n            } else {\n                result = null;\n            }\n        }\n        return text;\n    };\n\n    Exporter.getTopics = function(callback) {\n        return Exporter.getPaginatedTopics(0, -1, callback);\n    };\n    Exporter.getPaginatedTopics = function(start, limit, callback) {\n        callback = !_.isFunction(callback) ? noop : callback;\n        var prefix = Exporter.config('prefix');\n        var custom = Exporter.config('custom');\n        var galleryShortcodesSetting = Exporter.config('custom').galleryShortcodes;\n        var startms = +new Date();\n\n        var query = 'SELECT ';\n        if (custom && custom.bbpress) {\n            // if bbpress\n            query += ''\n            + prefix + 'posts.ID as _tid, '\n            + prefix + 'posts.post_author as _uid, '\n            + prefix + 'posts.post_parent as _cid, '\n            + prefix + 'posts.post_title as _title, '\n            + prefix + 'posts.post_content as _content, '\n            + prefix + 'posts.post_date as _timestamp, '\n            + prefix + 'posts.post_name as _slug, '\n            + prefix + 'posts.post_status as _wp_status, '\n            + prefix + 'posts.post_type as _wp_type '\n\n            + 'FROM ' + prefix + 'posts '\n            + 'WHERE ' + prefix + 'posts.post_type=\"topic\" '\n        } else {\n            query += ''\n            + prefix + 'posts.ID as _tid, '\n            + prefix + 'posts.post_title as _title, '\n            + prefix + 'posts.post_content as _content, '\n            + prefix + 'posts.post_author as _uid, '\n            + prefix + 'posts.post_date as _timestamp, '\n            + prefix + 'posts.post_name as _slug, '\n            + prefix + 'posts.post_status as _wp_status, '\n            + prefix + 'posts.post_type as _wp_type, '\n\n            + prefix + 'terms.term_id as _cid '\n\n            + 'FROM ' + prefix + 'posts '\n\n                // all this crap to get the _cid\n            + 'LEFT JOIN ' + prefix + 'term_relationships '\n            + 'ON ' + prefix + 'posts.ID = ' + prefix + 'term_relationships.object_ID '\n            + 'LEFT JOIN ' + prefix + 'term_taxonomy '\n            + 'ON ' + prefix + 'term_relationships.term_taxonomy_id = ' + prefix + 'term_taxonomy.term_taxonomy_id '\n            + 'LEFT JOIN ' + prefix + 'terms '\n            + 'ON ' + prefix + 'terms.term_id = ' + prefix + 'term_taxonomy.term_id '\n            + 'WHERE ' + prefix + 'term_taxonomy.taxonomy = \"category\" '\n\n            + 'AND ' + prefix + 'posts.post_type=\"post\" '\n            + 'AND ' + prefix + 'posts.post_status=\"publish\" '\n        }\n        query += (start >= 0 && limit >= 0 ? 'LIMIT ' + start + ',' + limit : '');\n\n        getAttachmentsIdsUrlsMap(function(err, attachmentsIdsUrlsMap) {\n            getTags(function(err, topicsTagsMap) {\n                Exporter.query(query,\n                    function(err, rows) {\n                        if (err) {\n                            Exporter.error(err);\n                            return callback(err);\n                        }\n                        //normalize here\n                        var map = {};\n                        rows.forEach(function(row) {\n                            row._title = row._title ? row._title[0].toUpperCase() + row._title.substr(1) : '';\n                            row._timestamp = row._timestamp ? moment(row._timestamp).unix() * 1000 : startms;\n                            row._tags = topicsTagsMap[row._tid] || undefined;\n                            row._content = replaceGalleryTags(row._content, attachmentsIdsUrlsMap, galleryShortcodesSetting);\n                            map[row._tid] = row;\n                        });\n                        callback(null, map);\n                    });\n            });\n        });\n    };\n\n    Exporter.getPosts = function(callback) {\n        return Exporter.getPaginatedPosts(0, -1, callback);\n    };\n    Exporter.getPaginatedPosts = function(start, limit, callback) {\n        callback = !_.isFunction(callback) ? noop : callback;\n\n        var prefix = Exporter.config('prefix');\n        var custom = Exporter.config('custom');\n        var startms = +new Date();\n\n        var query = 'SELECT ';\n        if (custom && custom.bbpress) {\n            // if bbpress\n            query += ''\n            + prefix + 'posts.ID as _pid, '\n            + prefix + 'posts.post_author as _uid, '\n            + prefix + 'posts.post_parent as _tid, '\n            + prefix + 'posts.post_content as _content, '\n            + prefix + 'posts.post_date as _timestamp, '\n            + prefix + 'posts.post_status as _wp_status, '\n            + prefix + 'posts.post_type as _wp_type '\n\n            + 'FROM ' + prefix + 'posts '\n            + 'WHERE ' + prefix + 'posts.post_type=\"reply\" ';\n        } else {\n            query += ''\n            + prefix + 'comments.comment_ID as _pid, '\n            + prefix + 'comments.comment_post_ID as _tid, '\n            + prefix + 'comments.comment_content as _content, '\n            + prefix + 'comments.user_id as _uid, '\n            + prefix + 'comments.comment_date as _timestamp, '\n            + prefix + 'comments.comment_author as _guest, '\n            + prefix + 'comments.comment_approved as _approved, '\n            + prefix + 'comments.comment_author_email as _guest_email, '\n            + prefix + 'comments.comment_author_IP as _ip '\n            + 'FROM ' + prefix + 'comments ';\n        }\n\n        query += (start >= 0 && limit >= 0 ? 'LIMIT ' + start + ',' + limit : '');\n\n        Exporter.query(query,\n            function(err, rows) {\n                if (err) {\n                    Exporter.error(err);\n                    return callback(err);\n                }\n                //normalize here\n                var map = {};\n                rows.forEach(function(row) {\n                    row._deleted = row._wp_status ? row._wp_status === \"publish\" ? 0 : 1 : row._approved === 'spam' || !row._approved ? 1 : 0;\n                    row._timestamp = row._timestamp ? moment(row._timestamp).unix() * 1000 : startms;\n                    map[row._pid] = row;\n                });\n                callback(null, map);\n            });\n    };\n\n    Exporter.query = function(query, callback) {\n        if (!Exporter.connection) {\n            var err = {error: 'MySQL connection is not setup. Run setup(config) first'};\n            Exporter.error(err.error);\n            return callback(err);\n        }\n        //console.log('\\n\\n====QUERY====\\n\\n' + query + '\\n');\n        Exporter.connection.query(query, function(err, rows) {\n            callback(err, rows)\n        });\n    };\n\n    Exporter.teardown = function(callback) {\n        Exporter.log('teardown');\n        Exporter.connection.end();\n\n        Exporter.log('Done');\n        callback();\n    };\n\n    Exporter.testrun = function(config, callback) {\n        async.series([\n            function(next) {\n                Exporter.setup(config, next);\n            },\n            function(next) {\n                Exporter.getUsers(next);\n            },\n            function(next) {\n                Exporter.getCategories(next);\n            },\n            function(next) {\n                Exporter.getTopics(next);\n            },\n            function(next) {\n                Exporter.getPosts(next);\n            },\n            function(next) {\n                Exporter.teardown(next);\n            }\n        ], callback);\n    };\n\n    Exporter.warn = function() {\n        var args = _.toArray(arguments);\n        args.unshift(logPrefix);\n        console.warn.apply(console, args);\n    };\n\n    Exporter.log = function() {\n        var args = _.toArray(arguments);\n        args.unshift(logPrefix);\n        console.log.apply(console, args);\n    };\n\n    Exporter.error = function() {\n        var args = _.toArray(arguments);\n        args.unshift(logPrefix);\n        console.error.apply(console, args);\n    };\n\n    Exporter.config = function(config, val) {\n        if (config != null) {\n            if (typeof config === 'object') {\n                Exporter._config = config;\n            } else if (typeof config === 'string') {\n                if (val != null) {\n                    Exporter._config = Exporter._config || {};\n                    Exporter._config[config] = val;\n                }\n                return Exporter._config[config];\n            }\n        }\n        return Exporter._config;\n    };\n\n    // from Angular https://github.com/angular/angular.js/blob/master/src/ng/directive/input.js#L11\n    Exporter.validateUrl = function(url) {\n        var pattern = /^(ftp|http|https):\\/\\/(\\w+:{0,1}\\w*@)?(\\S+)(:[0-9]+)?(\\/|\\/([\\w#!:.?+=&%@!\\-\\/]))?$/;\n        return url && url.length < 2083 && url.match(pattern) ? url : '';\n    };\n\n    Exporter.truncateStr = function(str, len) {\n        if (typeof str != 'string') return str;\n        len = _.isNumber(len) && len > 3 ? len : 20;\n        return str.length <= len ? str : str.substr(0, len - 3) + '...';\n    };\n\n    Exporter.whichIsFalsy = function(arr) {\n        for (var i = 0; i < arr.length; i++) {\n            if (!arr[i])\n                return i;\n        }\n        return null;\n    };\n\n})(module.exports);\n"]}