{"version":3,"sources":["jsdelivr-header.js","/npm/axloader@1.0.6/src/axloader-gen.js"],"names":[],"mappings":"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","file":"/npm/axloader@1.0.6/src/axloader-gen.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/axloader@1.0.6/src/axloader-gen.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","/*\r\n * Namespace: AxLoaderGen\r\n * \r\n * Development server and patch generator for the AxLoader library.\r\n */\r\n\r\n\r\n(function () {\r\n    \"use strict\";\r\n\r\n\r\n    var express = require(\"express\"),\r\n        wrench = require(\"wrench\"),\r\n        QuickArchive = require(\"quickarchive\"),\r\n        jsmin = require(\"jsmin\").jsmin,\r\n        fs = require(\"fs\"),\r\n        url = require(\"url\"),\r\n        path = require(\"path\"),\r\n        INDEX_FILE_NAME = \"axloaderindex.json\",\r\n        BASE = \"base\",\r\n        EXT = \".qcv\",\r\n        config = {\r\n    \r\n            //Set this to the directory your assets are in. You can list multiple locations\r\n            //to generate multiple archives. The last name of each path should be unique.\r\n            \"assetFolders\": [\"demo\"],\r\n            \r\n            //Set this to the HTML file that should be served on /.\r\n            \"index\": \"./static/demo.html\",\r\n            \r\n            //Set this to the port you want to use.\r\n            \"port\": 8000,\r\n            \r\n            //Set this to the folder you want to output generated files.\r\n            \"output\": \"./output\"\r\n        };\r\n\r\n\r\n    \r\n    \r\n        \r\n    \r\n    /**\r\n     * Function: makeArchive\r\n     * \r\n     * Builds a archive based on a configuration.\r\n     * \r\n     * Parameters:\r\n     *      genconf - (Obejct) the configuration.\r\n     * \r\n     * Returns:\r\n     * (QuickArchive) A archive object.\r\n     */\r\n    function makeArchive(genconf) {\r\n        var ar = new QuickArchive(),\r\n            fileList = wrench.readdirSyncRecursive(genconf.folder);\r\n        \r\n        for (var i = 0; i < fileList.length; i++) {\r\n            if (!fs.lstatSync(path.join(genconf.folder, fileList[i])).isDirectory()) {\r\n                \r\n                var data = fs.readFileSync(path.join(genconf.folder, fileList[i]));\r\n                if (config.preprocess) {\r\n                    data = config.preprocess(fileList[i], data);\r\n                }\r\n                ar.addData(fileList[i], data);\r\n                \r\n            }\r\n        }\r\n        \r\n        var comment = clone(genconf);\r\n        comment.folder = genconf.folder.split(/\\/|\\\\/).pop();\r\n        \r\n        ar.comment(JSON.stringify(comment));\r\n        return ar;\r\n    }\r\n\r\n    \r\n    \r\n    \r\n    \r\n    /**\r\n     * Function: getFilename\r\n     */\r\n    function getFilename(folder, patchversion, version) {\r\n        return folder + \"_\" + patchversion + \"_\" + version + EXT;\r\n    }\r\n    \r\n    \r\n    \r\n    \r\n    /**\r\n     * Function: diffArchives\r\n     * \r\n     * Creates a new archive that contains all the files in b that are not in a or\r\n     * have changed since a, and has it's comment set to metadata the same as that\r\n     * in a except the patchVersion property, which will be the version of a, and\r\n     * the removedFiles property which contains a list of files in a but not in b.\r\n     * \r\n     * Parameters:\r\n     *      a - (QuickArchive) The old version we want to generate a patch from.\r\n     *      b - (QuickArchive) The new version we want to generate a patch to.\r\n     * \r\n     * Returns:\r\n     * (QuickArchive) The patch.\r\n     */\r\n    function diffArchives(a, b) {\r\n        var entriesA = a.listEntries();\r\n        var entriesB = b.listEntries();\r\n        \r\n        var c = new QuickArchive();\r\n        \r\n        \r\n        //first, put all the names of a into a hashtable\r\n        var oldEntriesTable = {};\r\n        var newEntriesTable = {};\r\n        for (var i = 0; i < entriesA.length; i++) {\r\n            oldEntriesTable[entriesA[i]] = true;\r\n        }\r\n        \r\n        \r\n        //next, add the files from b that are not in a to c\r\n        for (i = 0; i < entriesB.length; i++) {\r\n            newEntriesTable[entriesB[i]] = true;\r\n        \r\n            if (oldEntriesTable[entriesB[i]]) {\r\n                //remove elements that appear in both and are different so that once we're done,\r\n                //we'll have a list of elements that appear in a and not b.\r\n                delete oldEntriesTable[entriesB[i]];\r\n                \r\n            } else {\r\n                c.addData(entriesB[i], b.getData(entriesB[i]));\r\n                \r\n            }\r\n            \r\n            //add modified files\r\n            if (!areBuffersEqual(a.getData(entriesB[i]), b.getData(entriesB[i]))) {\r\n                c.addData(entriesB[i], b.getData(entriesB[i]));\r\n            }\r\n                \r\n        }\r\n        \r\n        \r\n        //get the config file in both\r\n        var genconfa = JSON.parse(a.comment());\r\n        var genconfb = JSON.parse(b.comment());\r\n        \r\n        \r\n        //generate the new config\r\n        var genconfc = getAxLoaderInfo(genconfa.folder);\r\n        genconfc.patchVersion = genconfa.version;\r\n        genconfc.version = genconfb.version;\r\n        genconfc.removedFiles = Object.keys(oldEntriesTable);\r\n        \r\n        //add the new config file to the new file\r\n        c.comment(JSON.stringify(genconfc));\r\n        \r\n        \r\n        //TODO: this is ugly\r\n        return {genconf: genconfc, archive: c};\r\n        \r\n    }\r\n    \r\n    \r\n    \r\n    \r\n    \r\n    \r\n    /**\r\n     * Function: saveArchive\r\n     * \r\n     * Saves a archive file to disk.\r\n     * \r\n     * Parameters:\r\n     *      genconf - (Object) The config for this file.\r\n     *      buffer - (Buffer) The buffer to save.\r\n     */\r\n    function saveArchive(genconf, buffer) {\r\n        var folderEndPart = genconf.folder.split(/\\/|\\\\/).pop();\r\n        var filename = path.join(\r\n                config.output,\r\n                getFilename(folderEndPart, genconf.patchVersion, genconf.version));\r\n        \r\n        fs.writeFileSync(filename, buffer, \"binary\");\r\n\r\n    }\r\n    \r\n    \r\n    \r\n    \r\n    \r\n    /**\r\n     * Function: sendArchive\r\n     * \r\n     * Sends the archive file to a response object.\r\n     * \r\n     * Parameters:\r\n     *      buffer - (Buffer) - The buffer to send.\r\n     *      res - (Response) - The http response object.\r\n     */\r\n    function sendArchive(buffer, res) {\r\n        \r\n        res.setHeader(\"Content-Type\", \"application/octet-stream\");\r\n        res.setHeader(\"Content-Length\", buffer.length);\r\n        res.end(buffer, \"binary\");\r\n\r\n    }\r\n    \r\n    \r\n    \r\n    \r\n    \r\n    /**\r\n     * Function: archiveRequestHandler\r\n     * \r\n     * The request handler for generating and serving archives.\r\n     * \r\n     * Parameters:\r\n     *      genconf - (Object) The config.\r\n     *      req - (Request) The http request.\r\n     *      res - (Response) The http response.\r\n     */\r\n    function archiveRequestHandler(genconf, req, res) {\r\n        \r\n        var buffer = makeArchive(genconf).toBuffer();\r\n        \r\n        sendArchive(buffer, res);\r\n        saveArchive(genconf, buffer);\r\n\r\n    }\r\n    \r\n    \r\n    \r\n    \r\n    \r\n    /**\r\n     * Function: getAxLoaderInfo\r\n     * \r\n     * Returns the object that goes into the _axloaderInfo file.\r\n     * \r\n     * Parameters:\r\n     *      folder - (string) The name of the folder.\r\n     * \r\n     * Returns:\r\n     * (Object) The default config for the folder.\r\n     */\r\n    function getAxLoaderInfo(folder) {\r\n        return {\r\n            folder: folder,\r\n            version: \"debug\",\r\n            patchVersion: BASE,\r\n            removedFiles: [],\r\n        };\r\n    }\r\n    \r\n    \r\n    \r\n    \r\n\r\n    /**\r\n     * Function: getPatchableVersions\r\n     * \r\n     * Returns a list of the avalible base versions for a given folder.\r\n     * \r\n     * Parameters:\r\n     *      folder - (string) The name of the source folder.\r\n     *      index - The index file.\r\n     * \r\n     * Returns:\r\n     * (Object) A list of base versions.\r\n     */\r\n    function getPatchableVersions(folder, index) {\r\n        //the structure of the index is:\r\n        //{folder: {patchversion: {version: \"\"}}}\r\n        //we know what folder we want, and we only want base patchversions.\r\n        return (index[folder] ? index[folder][BASE] : {}) || {};\r\n    }\r\n    \r\n    \r\n    \r\n    \r\n    \r\n    /**\r\n     * Function: getBestVersion\r\n     * \r\n     * Takes a list of the avalible filenames and returns an integer version\r\n     * number that represents the highest version. Debug versions have a version\r\n     * number of -1.\r\n     * \r\n     * Parameters:\r\n     *      versions - (Object) An object containing the version propeties.\r\n     * \r\n     * Returns:\r\n     * (number) The best version number.\r\n     */\r\n    function getBestVersion(versions) {\r\n        \r\n        var best = Object.keys(versions).map(function (val) {\r\n                \r\n            if (!isNaN(val)) {\r\n                return parseInt(val, 10);\r\n            }\r\n            return val;\r\n        \r\n        }).reduce(function (prev, curr) {\r\n            \r\n            if (curr === \"debug\") {\r\n                return prev;\r\n            }\r\n            if (prev === \"debug\") {\r\n                return curr;\r\n            }\r\n            return Math.max(prev, curr);\r\n            \r\n        }, \"debug\");\r\n        \r\n        if (isNaN(best)) {\r\n            return -1;\r\n        }\r\n        return best;\r\n        \r\n    }\r\n    \r\n    \r\n    \r\n    /**\r\n     * Function: areBuffersEqual\r\n     * \r\n     * Retruns true of two buffers are equal.\r\n     */\r\n    function areBuffersEqual(a, b) {\r\n        \r\n        if (!a || !b) {\r\n            return false;\r\n        }\r\n        \r\n        if (a.length !== b.length) {\r\n            return false;\r\n        }\r\n        \r\n        for (var i = 0; i < a.length; i++) {\r\n            if (a[i] !== b[i]) {\r\n                return false;\r\n            }\r\n        }\r\n        \r\n        return true;\r\n        \r\n    }\r\n    \r\n    \r\n    \r\n    \r\n    /**\r\n     * Function: addToIndex\r\n     * \r\n     * Adds an item to the index object.\r\n     */\r\n    function addToIndex(index, folder, patchversion, version, filename) {\r\n        \r\n        if (!index[folder]) {\r\n            index[folder] = {};\r\n        }\r\n        if (!index[folder][patchversion]) {\r\n            index[folder][patchversion] = {};\r\n        }\r\n        \r\n        index[folder][patchversion][version] = getFilename(folder, patchversion, version);\r\n        \r\n        return index;\r\n    }\r\n    \r\n    \r\n    \r\n    \r\n    \r\n    /**\r\n     * Function: generate\r\n     * \r\n     * Generates the base versions and any patches needed. This function is slow\r\n     * and synchronous.\r\n     */\r\n    function generate(c) {\r\n        \r\n        if (c) {\r\n            config = c;\r\n        }\r\n        \r\n        for (var i = 0; i < config.assetFolders.length; i++) {\r\n            var folder = config.assetFolders[i],\r\n                folderEndPart = folder.split(/\\/|\\\\/).pop();\r\n            \r\n            \r\n            //read in the index\r\n            var indexFilename = path.join(config.output, INDEX_FILE_NAME),\r\n                index;\r\n            if (fs.existsSync(indexFilename)) {\r\n                index = JSON.parse(fs.readFileSync(indexFilename));\r\n            } else {\r\n                index = {};\r\n            }\r\n            \r\n            \r\n            //generate the config for the new version\r\n            var genconf = getAxLoaderInfo(folder);\r\n            var patchables = getPatchableVersions(folderEndPart, index);\r\n            genconf.version = getBestVersion(patchables) + 1;\r\n            \r\n            \r\n            //make the base version  \r\n            var newVersion = makeArchive(genconf);\r\n            \r\n            \r\n            //make all the patches\r\n            for (var prop in patchables) {\r\n                if (patchables.hasOwnProperty(prop)) {\r\n                    \r\n                    //make a patch\r\n                    var oldPathName = path.join(config.output, patchables[prop]);\r\n                    var oldVersion = new QuickArchive(fs.readFileSync(oldPathName));\r\n                    var patch = diffArchives(oldVersion, newVersion);\r\n                    saveArchive(patch.genconf, patch.archive.toBuffer());\r\n                    \r\n                    addToIndex(index,\r\n                               folderEndPart,\r\n                               prop,\r\n                               genconf.version,\r\n                               getFilename(folderEndPart, prop, genconf.version)\r\n                    );\r\n                    \r\n                }\r\n            }\r\n            \r\n            \r\n            //save new base version\r\n            addToIndex(index, folderEndPart, BASE, genconf.version, getFilename(folderEndPart, BASE, genconf.version));\r\n            saveArchive(genconf, newVersion.toBuffer());\r\n            \r\n            //save index\r\n            fs.writeFileSync(indexFilename, JSON.stringify(index));\r\n            \r\n        }\r\n        \r\n    }\r\n    \r\n    \r\n    \r\n    \r\n    \r\n    /**\r\n     * Function: devServer\r\n     * \r\n     * Starts a server for development.\r\n     */\r\n    function devserver(c) {\r\n        \r\n        if (c) {\r\n            config = c;\r\n        }\r\n\r\n        var app = express();\r\n        app.set(\"strict routing\", true);\r\n        \r\n        \r\n        app.use(express.compress());\r\n        app.use(\"/\", express.static(\"./static\"));\r\n        app.use(\"/\", express.static(\"./src\"));\r\n        app.use(express.json());\r\n        app.use(express.urlencoded());\r\n        \r\n        \r\n        //Add express things\r\n        app.get(\"/\", function (req, res) {\r\n            res.end(fs.readFileSync(config.index));\r\n        });\r\n        \r\n        app.get(\"/axloaderindex.json\", function (req, res) {\r\n            \r\n            var o = {},\r\n                files = config.assetFolders;\r\n            \r\n            files.forEach(function (file) {\r\n                \r\n                addToIndex(o, file, BASE, \"debug\", file + BASE + \"debug\" + EXT);\r\n                \r\n            });\r\n            \r\n            res.end(JSON.stringify(o));\r\n            \r\n        });\r\n        \r\n        for (var i = 0; i < config.assetFolders.length; i++) {\r\n            var genconf = getAxLoaderInfo(config.assetFolders[i]);\r\n            app.get(\"/\" + getFilename(genconf.folder, BASE, \"debug\"), archiveRequestHandler.bind(null, genconf));\r\n        }\r\n        \r\n        app.get(\"*\", function (req, res) {\r\n            res.status(404);\r\n            res.send(\"404\");\r\n        });\r\n        \r\n        app.listen(config.port);\r\n\r\n    }\r\n    \r\n    \r\n    \r\n    \r\n    \r\n    /**\r\n     * Function: testserver\r\n     * \r\n     * Starts a server for testing patching.\r\n     */\r\n    function testserver(c) {\r\n    \r\n        if (c) {\r\n            config = c;\r\n        }\r\n        \r\n        var app = express();\r\n        app.set(\"strict routing\", true);\r\n        \r\n        \r\n        app.use(express.compress());\r\n        app.use(\"/\", express.static(\"./static\"));\r\n        app.use(\"/\", express.static(\"./src\"));\r\n        app.use(\"/\", express.static(\"./spec\"));\r\n        app.use(\"/\", express.static(config.output));\r\n        app.use(express.json());\r\n        app.use(express.urlencoded());\r\n        \r\n        \r\n        //Add express things\r\n        app.get(\"/\", function (req, res) {\r\n            res.end(fs.readFileSync(config.index));\r\n        });\r\n        \r\n        \r\n        app.get(\"/changeFolder\", function (req, res) {\r\n            \r\n            var urlObj = url.parse(req.url, true);\r\n            config.assetFolders = [urlObj.query.folder];\r\n            res.end();\r\n            \r\n        });\r\n        \r\n        \r\n        app.get(\"/generate\", function (req, res) {\r\n            \r\n            generate();\r\n            res.end();\r\n            \r\n        });\r\n        \r\n        \r\n        app.get(\"/purge\", function (req, res) {\r\n            \r\n            var files = fs.readdirSync(config.output).filter(function (val) {\r\n                return (/\\.(qcv|json)$/).test(val);\r\n            });\r\n            \r\n            for (var i = 0; i < files.length; i++) {\r\n                fs.unlinkSync(path.join(config.output, files[i]));\r\n            }\r\n            \r\n            res.end();\r\n            \r\n            \r\n        });\r\n        \r\n        app.get(\"*\", function (req, res) {\r\n            res.status(404);\r\n            res.send(\"404\");\r\n        });\r\n        \r\n        app.listen(config.port);\r\n\r\n    }\r\n    \r\n    \r\n    \r\n    \r\n    if (process.argv[2] === \"generate\") {\r\n        \r\n        generate();\r\n        \r\n    } else if (process.argv[2] === \"test\") {\r\n        \r\n        console.warn(\"Test server running.\");\r\n        console.warn(\"The test server is for testing built patches OR for running \"+\r\n                     \"AxLoader's own\\ntests. Don't do both, you may lose data.\");\r\n        testserver();\r\n        \r\n    } else if (require.main === module) {\r\n         \r\n        console.warn(\"Dev server running.\");\r\n        devserver();\r\n        \r\n    }\r\n    \r\n    \r\n    function clone(obj) {\r\n        if (null === obj || \"object\" !== typeof obj) {\r\n            return obj;\r\n        }\r\n        var copy = obj.constructor();\r\n        for (var attr in obj) {\r\n            if (obj.hasOwnProperty(attr)) {\r\n                copy[attr] = obj[attr];\r\n            }\r\n        }\r\n        return copy;\r\n    }\r\n\r\n    \r\n    \r\n    module.exports = {\r\n        generate: generate,\r\n        devserver: devserver,\r\n        testserver: testserver,\r\n    };\r\n    \r\n\r\n}());\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n"]}