home / github

Menu
  • Search all tables
  • GraphQL API

issue_comments

Table actions
  • GraphQL API for issue_comments

23 rows where author_association = "OWNER" and "updated_at" is on date 2020-12-31 sorted by updated_at descending

✖
✖
✖

✎ View and edit SQL

This data as json, CSV (advanced)

Suggested facets: reactions, updated_at (date)

issue 5

  • Adopt Prettier for JavaScript code formatting 9
  • JavaScript plugin hooks mechanism similar to pluggy 7
  • Mechanism for minifying JavaScript that ships with Datasette 3
  • Mechanism for executing JavaScript unit tests 3
  • Documented HTML hooks for JavaScript plugin authors 1

user 1

  • simonw 23

author_association 1

  • OWNER · 23 ✖
id html_url issue_url node_id user created_at updated_at ▲ author_association body reactions issue performed_via_github_app
753224351 https://github.com/simonw/datasette/issues/1166#issuecomment-753224351 https://api.github.com/repos/simonw/datasette/issues/1166 MDEyOklzc3VlQ29tbWVudDc1MzIyNDM1MQ== simonw 9599 2020-12-31T23:23:29Z 2020-12-31T23:23:29Z OWNER

I should configure the action to only run if changes have been made within the datasette/static directory.

{
    "total_count": 0,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 0,
    "rocket": 0,
    "eyes": 0
}
Adopt Prettier for JavaScript code formatting 777140799  
753221646 https://github.com/simonw/datasette/issues/983#issuecomment-753221646 https://api.github.com/repos/simonw/datasette/issues/983 MDEyOklzc3VlQ29tbWVudDc1MzIyMTY0Ng== simonw 9599 2020-12-31T22:58:47Z 2020-12-31T22:58:47Z OWNER

https://github.com/mishoo/UglifyJS/issues/1905#issuecomment-300485490 says:

sourceMappingURL aren't added by default in 3.x due to one of the feature requests not to - some users are putting them within HTTP response headers instead.

So the command line for that would be:

js $ uglifyjs main.js -cmo main.min.js --source-map url=main.min.js.map

{
    "total_count": 0,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 0,
    "rocket": 0,
    "eyes": 0
}
JavaScript plugin hooks mechanism similar to pluggy 712260429  
753221362 https://github.com/simonw/datasette/issues/1164#issuecomment-753221362 https://api.github.com/repos/simonw/datasette/issues/1164 MDEyOklzc3VlQ29tbWVudDc1MzIyMTM2Mg== simonw 9599 2020-12-31T22:55:57Z 2020-12-31T22:55:57Z OWNER

I had to add this as the first line in table.min.js for the source mapping to work: //# sourceMappingURL=/-/static/table.min.js.map

{
    "total_count": 0,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 0,
    "rocket": 0,
    "eyes": 0
}
Mechanism for minifying JavaScript that ships with Datasette 776634318  
753220665 https://github.com/simonw/datasette/issues/1164#issuecomment-753220665 https://api.github.com/repos/simonw/datasette/issues/1164 MDEyOklzc3VlQ29tbWVudDc1MzIyMDY2NQ== simonw 9599 2020-12-31T22:49:36Z 2020-12-31T22:49:36Z OWNER

I started with a 7K table.js file.

npx uglifyjs table.js --source-map -o table.min.js gave me a 5.6K table.min.js file.

npx uglifyjs table.js --source-map -o table.min.js --compress --mangle gave me 4.5K.

{
    "total_count": 0,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 0,
    "rocket": 0,
    "eyes": 0
}
Mechanism for minifying JavaScript that ships with Datasette 776634318  
753220412 https://github.com/simonw/datasette/issues/1164#issuecomment-753220412 https://api.github.com/repos/simonw/datasette/issues/1164 MDEyOklzc3VlQ29tbWVudDc1MzIyMDQxMg== simonw 9599 2020-12-31T22:47:36Z 2020-12-31T22:47:36Z OWNER

I'm trying to minify table.js and I ran into a problem:

Uglification failed. Unexpected character '`'

It turns out uglify-js doesn't support ES6 syntax!

But uglify-es does:

npm install uglify-es

Annoyingly it looks like uglify-es uses the same CLI command, uglifyjs. So after installing it this seemed to work:

npx uglifyjs table.js --source-map -o table.min.js

I really don't like how npx uglifyjs could mean different things depending on which package was installed.

{
    "total_count": 0,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 0,
    "rocket": 0,
    "eyes": 0
}
Mechanism for minifying JavaScript that ships with Datasette 776634318  
753219521 https://github.com/simonw/datasette/issues/983#issuecomment-753219521 https://api.github.com/repos/simonw/datasette/issues/983 MDEyOklzc3VlQ29tbWVudDc1MzIxOTUyMQ== simonw 9599 2020-12-31T22:39:52Z 2020-12-31T22:39:52Z OWNER

For inlining the plugins.min.js file into the Jinja templates I could use the trick described here: https://stackoverflow.com/a/41404611 - which adds a {{ include_file('file.txt') }} function to Jinja.

{
    "total_count": 0,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 0,
    "rocket": 0,
    "eyes": 0
}
JavaScript plugin hooks mechanism similar to pluggy 712260429  
753219407 https://github.com/simonw/datasette/issues/983#issuecomment-753219407 https://api.github.com/repos/simonw/datasette/issues/983 MDEyOklzc3VlQ29tbWVudDc1MzIxOTQwNw== simonw 9599 2020-12-31T22:38:45Z 2020-12-31T22:39:10Z OWNER

You'll be able to add JavaScript plugins using a bunch of different mechanisms:

  • In a custom template, dropping the code in to a <script> block
  • A bookmarklet that injects an extra script (I'm really excited to try this out)
  • A separate script.js file that's loaded into Datasette using the "extra_js_urls" metadata option, documented here: https://docs.datasette.io/en/stable/custom_templates.html#custom-css-and-javascript
  • A plugin you can install, like datasette-vega or datasette-cluster-map - since plugins can bundle their own script files that then get loaded on pages via this hook: https://docs.datasette.io/en/stable/plugin_hooks.html#extra-js-urls-template-database-table-columns-view-name-request-datasette
{
    "total_count": 1,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 1,
    "confused": 0,
    "heart": 0,
    "rocket": 0,
    "eyes": 0
}
JavaScript plugin hooks mechanism similar to pluggy 712260429  
753217917 https://github.com/simonw/datasette/issues/983#issuecomment-753217917 https://api.github.com/repos/simonw/datasette/issues/983 MDEyOklzc3VlQ29tbWVudDc1MzIxNzkxNw== simonw 9599 2020-12-31T22:23:29Z 2020-12-31T22:23:36Z OWNER

If I'm going to do that, it would be good if subsequent plugins that register against the load event are executed straight away. That's a bit of a weird edge-case in plugin world - it would involve the bulkier code that gets loaded redefining how datasette.plugins.register works to special-case the 'load' hook.

Maybe the tiny bootstrap code could define a datasette.plugins.onload(callbackFunction) method which gets upgraded later into something that fires straight away? Would add more bytes though.

{
    "total_count": 0,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 0,
    "rocket": 0,
    "eyes": 0
}
JavaScript plugin hooks mechanism similar to pluggy 712260429  
753217714 https://github.com/simonw/datasette/issues/983#issuecomment-753217714 https://api.github.com/repos/simonw/datasette/issues/983 MDEyOklzc3VlQ29tbWVudDc1MzIxNzcxNA== simonw 9599 2020-12-31T22:21:33Z 2020-12-31T22:21:33Z OWNER

Eventually I'd like to provide a whole bunch of other datasette.X utility functions that plugins can use - things like datasette.addTabbedContentPane() or similar.

But I don't want to inline those into the page.

So... I think the basic plugin system remains inline - maybe from an inlined file called plugins-bootstrap.js. Then a separate plugins.js contains the rest of the API functionality.

If a plugin wants to take advantage of those APIs, maybe it registers itself using datasette.plugins.register('load', () => ...) - that load hook can then be fired once the bulkier plugin code has been loaded.

{
    "total_count": 0,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 0,
    "rocket": 0,
    "eyes": 0
}
JavaScript plugin hooks mechanism similar to pluggy 712260429  
753217127 https://github.com/simonw/datasette/issues/987#issuecomment-753217127 https://api.github.com/repos/simonw/datasette/issues/987 MDEyOklzc3VlQ29tbWVudDc1MzIxNzEyNw== simonw 9599 2020-12-31T22:16:46Z 2020-12-31T22:16:46Z OWNER

I'm going to use class="plugin-content-pre-table" rather than id= - just because I still want to be able to display all of this stuff on the single https://latest.datasette.io/-/patterns page so duplicate IDs are best avoided.

{
    "total_count": 0,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 0,
    "rocket": 0,
    "eyes": 0
}
Documented HTML hooks for JavaScript plugin authors 712984738  
753215761 https://github.com/simonw/datasette/issues/983#issuecomment-753215761 https://api.github.com/repos/simonw/datasette/issues/983 MDEyOklzc3VlQ29tbWVudDc1MzIxNTc2MQ== simonw 9599 2020-12-31T22:07:31Z 2020-12-31T22:07:31Z OWNER

I think I need to keep the mechanism whereby a plugin can return undefined in order to indicate that it has nothing to say for that specific item - that's borrowed from Pluggy and I've used it a bunch in my Python plugins. That makes the code a bit longer.

I'll write some example plugins to help me decide if the filtering-out-of-undefined mechanism is needed or not.

{
    "total_count": 0,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 0,
    "rocket": 0,
    "eyes": 0
}
JavaScript plugin hooks mechanism similar to pluggy 712260429  
753215545 https://github.com/simonw/datasette/issues/983#issuecomment-753215545 https://api.github.com/repos/simonw/datasette/issues/983 MDEyOklzc3VlQ29tbWVudDc1MzIxNTU0NQ== simonw 9599 2020-12-31T22:05:41Z 2020-12-31T22:05:41Z OWNER

Using object destructuring like that is a great idea. I'm going to play with your version - it's delightfully succinct.

{
    "total_count": 0,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 0,
    "rocket": 0,
    "eyes": 0
}
JavaScript plugin hooks mechanism similar to pluggy 712260429  
753214664 https://github.com/simonw/datasette/issues/1166#issuecomment-753214664 https://api.github.com/repos/simonw/datasette/issues/1166 MDEyOklzc3VlQ29tbWVudDc1MzIxNDY2NA== simonw 9599 2020-12-31T21:58:04Z 2020-12-31T21:58:04Z OWNER

Wrote a TIL about this: https://til.simonwillison.net/github-actions/prettier-github-actions

{
    "total_count": 0,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 0,
    "rocket": 0,
    "eyes": 0
}
Adopt Prettier for JavaScript code formatting 777140799  
753211535 https://github.com/simonw/datasette/issues/1166#issuecomment-753211535 https://api.github.com/repos/simonw/datasette/issues/1166 MDEyOklzc3VlQ29tbWVudDc1MzIxMTUzNQ== simonw 9599 2020-12-31T21:46:04Z 2020-12-31T21:46:04Z OWNER

https://github.com/simonw/datasette/runs/1631682372?check_suite_focus=true failed!

{
    "total_count": 0,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 0,
    "rocket": 0,
    "eyes": 0
}
Adopt Prettier for JavaScript code formatting 777140799  
753210536 https://github.com/simonw/datasette/issues/1166#issuecomment-753210536 https://api.github.com/repos/simonw/datasette/issues/1166 MDEyOklzc3VlQ29tbWVudDc1MzIxMDUzNg== simonw 9599 2020-12-31T21:45:19Z 2020-12-31T21:45:19Z OWNER

Oops, committed that bad formatting test to main instead of a branch!

{
    "total_count": 0,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 0,
    "rocket": 0,
    "eyes": 0
}
Adopt Prettier for JavaScript code formatting 777140799  
753209192 https://github.com/simonw/datasette/issues/1166#issuecomment-753209192 https://api.github.com/repos/simonw/datasette/issues/1166 MDEyOklzc3VlQ29tbWVudDc1MzIwOTE5Mg== simonw 9599 2020-12-31T21:44:22Z 2020-12-31T21:44:22Z OWNER

Tests passed in https://github.com/simonw/datasette/runs/1631677726?check_suite_focus=true

I'm going to try submitting a pull request with badly formatted JavaScript to see if it gets caught.

{
    "total_count": 0,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 0,
    "rocket": 0,
    "eyes": 0
}
Adopt Prettier for JavaScript code formatting 777140799  
753200580 https://github.com/simonw/datasette/issues/1166#issuecomment-753200580 https://api.github.com/repos/simonw/datasette/issues/1166 MDEyOklzc3VlQ29tbWVudDc1MzIwMDU4MA== simonw 9599 2020-12-31T21:38:06Z 2020-12-31T21:38:06Z OWNER

I think this should work: - uses: actions/cache@v2 with: path: ~/.npm key: ${{ runner.os }}-node-${{ hashFiles('**/prettier.yml' }} I'll use the prettier.yml workflow that I'm about to create as the cache key for the NPM cache.

{
    "total_count": 0,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 0,
    "rocket": 0,
    "eyes": 0
}
Adopt Prettier for JavaScript code formatting 777140799  
753197957 https://github.com/simonw/datasette/issues/1166#issuecomment-753197957 https://api.github.com/repos/simonw/datasette/issues/1166 MDEyOklzc3VlQ29tbWVudDc1MzE5Nzk1Nw== simonw 9599 2020-12-31T21:36:14Z 2020-12-31T21:36:14Z OWNER

Maybe not that action actually - I wanted to use a pre-built action to avoid installing Prettier every time, but that's what it seems to do: https://github.com/creyD/prettier_action/blob/bb361e2979cff283ca7684908deac8f95400e779/entrypoint.sh#L28-L37

{
    "total_count": 0,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 0,
    "rocket": 0,
    "eyes": 0
}
Adopt Prettier for JavaScript code formatting 777140799  
753195905 https://github.com/simonw/datasette/issues/1166#issuecomment-753195905 https://api.github.com/repos/simonw/datasette/issues/1166 MDEyOklzc3VlQ29tbWVudDc1MzE5NTkwNQ== simonw 9599 2020-12-31T21:34:46Z 2020-12-31T21:34:46Z OWNER

This action looks good - tag 3.2 is equivalent to this commit hash: https://github.com/creyD/prettier_action/tree/bb361e2979cff283ca7684908deac8f95400e779

{
    "total_count": 0,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 0,
    "rocket": 0,
    "eyes": 0
}
Adopt Prettier for JavaScript code formatting 777140799  
753193475 https://github.com/simonw/datasette/issues/1166#issuecomment-753193475 https://api.github.com/repos/simonw/datasette/issues/1166 MDEyOklzc3VlQ29tbWVudDc1MzE5MzQ3NQ== simonw 9599 2020-12-31T21:33:00Z 2020-12-31T21:33:00Z OWNER

I want a CI check that confirms that files conform to prettier - but only datasette/static/*.js files that are not already minified.

This seems to do the job:

npx prettier --check 'datasette/static/*[!.min].js'
{
    "total_count": 0,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 0,
    "rocket": 0,
    "eyes": 0
}
Adopt Prettier for JavaScript code formatting 777140799  
752846267 https://github.com/simonw/datasette/issues/1165#issuecomment-752846267 https://api.github.com/repos/simonw/datasette/issues/1165 MDEyOklzc3VlQ29tbWVudDc1Mjg0NjI2Nw== simonw 9599 2020-12-31T05:10:41Z 2020-12-31T05:13:14Z OWNER

https://github.com/PostHog/posthog/tree/master/cypress/integration has some useful examples, linked from this article: https://posthog.com/blog/cypress-end-to-end-tests

Also useful: their workflow https://github.com/PostHog/posthog/blob/master/.github/workflows/e2e.yml

{
    "total_count": 0,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 0,
    "rocket": 0,
    "eyes": 0
}
Mechanism for executing JavaScript unit tests 776635426  
752839433 https://github.com/simonw/datasette/issues/1165#issuecomment-752839433 https://api.github.com/repos/simonw/datasette/issues/1165 MDEyOklzc3VlQ29tbWVudDc1MjgzOTQzMw== simonw 9599 2020-12-31T04:29:40Z 2020-12-31T04:29:40Z OWNER

Important to absorb the slightly bizarre assertion syntax from Chai - docs here https://www.chaijs.com/api/bdd/

{
    "total_count": 0,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 0,
    "rocket": 0,
    "eyes": 0
}
Mechanism for executing JavaScript unit tests 776635426  
752828851 https://github.com/simonw/datasette/issues/1165#issuecomment-752828851 https://api.github.com/repos/simonw/datasette/issues/1165 MDEyOklzc3VlQ29tbWVudDc1MjgyODg1MQ== simonw 9599 2020-12-31T03:19:38Z 2020-12-31T03:19:38Z OWNER

I got Cypress working! I added the datasette.plugins code to the table template and ran a test called plugins.spec.js using the following: javascript context('datasette.plugins API', () => { beforeEach(() => { cy.visit('/fixtures/compound_three_primary_keys') }); it('should exist', () => { let datasette; cy.window().then(win => { datasette = win.datasette; }).then(() => { expect(datasette).to.exist; expect(datasette.plugins).to.exist; }); }); it('should register and execute plugins', () => { let datasette; cy.window().then(win => { datasette = win.datasette; }).then(() => { expect(datasette.plugins.call('numbers')).to.deep.equal([]); // Register a plugin datasette.plugins.register("numbers", (a, b) => a + b, ['a', 'b']); var result = datasette.plugins.call("numbers", {a: 1, b: 2}); expect(result).to.deep.equal([3]); // Second plugin datasette.plugins.register("numbers", (a, b) => a * b, ['a', 'b']); var result2 = datasette.plugins.call("numbers", {a: 1, b: 2}); expect(result2).to.deep.equal([3, 2]); }); }); });

{
    "total_count": 0,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 0,
    "rocket": 0,
    "eyes": 0
}
Mechanism for executing JavaScript unit tests 776635426  

Advanced export

JSON shape: default, array, newline-delimited, object

CSV options:

CREATE TABLE [issue_comments] (
   [html_url] TEXT,
   [issue_url] TEXT,
   [id] INTEGER PRIMARY KEY,
   [node_id] TEXT,
   [user] INTEGER REFERENCES [users]([id]),
   [created_at] TEXT,
   [updated_at] TEXT,
   [author_association] TEXT,
   [body] TEXT,
   [reactions] TEXT,
   [issue] INTEGER REFERENCES [issues]([id])
, [performed_via_github_app] TEXT);
CREATE INDEX [idx_issue_comments_issue]
                ON [issue_comments] ([issue]);
CREATE INDEX [idx_issue_comments_user]
                ON [issue_comments] ([user]);
Powered by Datasette · Queries took 1553.423ms · About: github-to-sqlite
  • Sort ascending
  • Sort descending
  • Facet by this
  • Hide this column
  • Show all columns
  • Show not-blank rows