home / github / issue_comments

Menu
  • Search all tables
  • GraphQL API

issue_comments: 752747169

This data as json

html_url issue_url id node_id user created_at updated_at author_association body reactions issue performed_via_github_app
https://github.com/simonw/datasette/issues/983#issuecomment-752747169 https://api.github.com/repos/simonw/datasette/issues/983 752747169 MDEyOklzc3VlQ29tbWVudDc1Mjc0NzE2OQ== 9599 2020-12-30T20:24:07Z 2020-12-30T20:24:07Z OWNER

This version adds datasette.plugins.define() plus extra validation of both .register() and .call(): ```javascript window.datasette = {}; window.datasette.plugins = (function() { var registry = {}; var definitions = {};

function extractParameters(fn) {
    var match = /\((.*)\)/.exec(fn.toString());
    if (match && match[1].trim()) {
        return match[1].split(',').map(s => s.trim());
    } else {
        return [];
    }
}

function define(hook, parameters) {
    definitions[hook] = parameters || [];
}

function isSubSet(a, b) {
    return a.every(parameter => b.includes(parameter))
}

function register(hook, fn, parameters) {
    parameters = parameters || extractParameters(fn);
    if (!definitions[hook]) {
        throw new Error('"' + hook + '" is not a defined plugin hook');
    }
    if (!definitions[hook]) {
        throw new Error('"' + hook + '" is not a defined plugin hook');
    }
    /* Check parameters is a subset of definitions[hook] */
    var validParameters = definitions[hook];
    if (!isSubSet(parameters, validParameters)) {
        throw new Error('"' + hook + '" valid parameters are ' + JSON.stringify(validParameters));
    }
    if (!registry[hook]) {
        registry[hook] = [];
    }
    registry[hook].push([fn, parameters]);
}

function call(hook, args) {
    args = args || {};
    if (!definitions[hook]) {
        throw new Error('"' + hook + '" hook has not been defined');
    }
    if (!isSubSet(Object.keys(args), definitions[hook])) {
        throw new Error('"' + hook + '" valid arguments are ' + JSON.stringify(definitions[hook]));
    }

    var implementations = registry[hook] || [];
    var results = [];
    implementations.forEach(([fn, parameters]) => {
        /* Call with the correct arguments */
        var callWith = parameters.map(parameter => args[parameter]);
        var result = fn.apply(fn, callWith);
        if (result) {
            results.push(result);
        }
    });
    return results;
}
return {
    define: define,
    register: register,
    _registry: registry,
    call: call
};

})(); Usage:javascript datasette.plugins.define('numbers', ['a', 'b']) datasette.plugins.register('numbers', (a, b) => a + b) datasette.plugins.register('numbers', (a, b) => a * b) datasette.plugins.call('numbers', {a: 4, b: 6}) ```

{
    "total_count": 0,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 0,
    "rocket": 0,
    "eyes": 0
}
712260429  
Powered by Datasette · Queries took 0.972ms · About: github-to-sqlite