github
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/1165#issuecomment-752828851 | https://api.github.com/repos/simonw/datasette/issues/1165 | 752828851 | MDEyOklzc3VlQ29tbWVudDc1MjgyODg1MQ== | 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 } |
776635426 | |
https://github.com/simonw/datasette/issues/1165#issuecomment-752839433 | https://api.github.com/repos/simonw/datasette/issues/1165 | 752839433 | MDEyOklzc3VlQ29tbWVudDc1MjgzOTQzMw== | 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 } |
776635426 | |
https://github.com/simonw/datasette/issues/1165#issuecomment-752846267 | https://api.github.com/repos/simonw/datasette/issues/1165 | 752846267 | MDEyOklzc3VlQ29tbWVudDc1Mjg0NjI2Nw== | 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 } |
776635426 | |
https://github.com/simonw/datasette/issues/1166#issuecomment-753193475 | https://api.github.com/repos/simonw/datasette/issues/1166 | 753193475 | MDEyOklzc3VlQ29tbWVudDc1MzE5MzQ3NQ== | 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 } |
777140799 | |
https://github.com/simonw/datasette/issues/1166#issuecomment-753195905 | https://api.github.com/repos/simonw/datasette/issues/1166 | 753195905 | MDEyOklzc3VlQ29tbWVudDc1MzE5NTkwNQ== | 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 } |
777140799 | |
https://github.com/simonw/datasette/issues/1166#issuecomment-753197957 | https://api.github.com/repos/simonw/datasette/issues/1166 | 753197957 | MDEyOklzc3VlQ29tbWVudDc1MzE5Nzk1Nw== | 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 } |
777140799 | |
https://github.com/simonw/datasette/issues/1166#issuecomment-753200580 | https://api.github.com/repos/simonw/datasette/issues/1166 | 753200580 | MDEyOklzc3VlQ29tbWVudDc1MzIwMDU4MA== | 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 } |
777140799 | |
https://github.com/simonw/datasette/issues/1166#issuecomment-753209192 | https://api.github.com/repos/simonw/datasette/issues/1166 | 753209192 | MDEyOklzc3VlQ29tbWVudDc1MzIwOTE5Mg== | 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 } |
777140799 | |
https://github.com/simonw/datasette/issues/1166#issuecomment-753210536 | https://api.github.com/repos/simonw/datasette/issues/1166 | 753210536 | MDEyOklzc3VlQ29tbWVudDc1MzIxMDUzNg== | 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 } |
777140799 | |
https://github.com/simonw/datasette/issues/1166#issuecomment-753211535 | https://api.github.com/repos/simonw/datasette/issues/1166 | 753211535 | MDEyOklzc3VlQ29tbWVudDc1MzIxMTUzNQ== | 9599 | 2020-12-31T21:46:04Z | 2020-12-31T21:46:04Z | OWNER | https://github.com/simonw/datasette/runs/1631682372?check_suite_focus=true failed! <img width="693" alt="Trying_out_bad_formatting__refs__1166_ยท_simonw_datasette_8087091" src="https://user-images.githubusercontent.com/9599/103426449-841e5c00-4b6e-11eb-95e6-26432a7b27dd.png"> | { "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
777140799 | |
https://github.com/simonw/datasette/issues/1166#issuecomment-753214664 | https://api.github.com/repos/simonw/datasette/issues/1166 | 753214664 | MDEyOklzc3VlQ29tbWVudDc1MzIxNDY2NA== | 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 } |
777140799 | |
https://github.com/simonw/datasette/issues/983#issuecomment-753215545 | https://api.github.com/repos/simonw/datasette/issues/983 | 753215545 | MDEyOklzc3VlQ29tbWVudDc1MzIxNTU0NQ== | 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 } |
712260429 | |
https://github.com/simonw/datasette/issues/983#issuecomment-753215761 | https://api.github.com/repos/simonw/datasette/issues/983 | 753215761 | MDEyOklzc3VlQ29tbWVudDc1MzIxNTc2MQ== | 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 } |
712260429 | |
https://github.com/simonw/datasette/issues/987#issuecomment-753217127 | https://api.github.com/repos/simonw/datasette/issues/987 | 753217127 | MDEyOklzc3VlQ29tbWVudDc1MzIxNzEyNw== | 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 } |
712984738 | |
https://github.com/simonw/datasette/issues/983#issuecomment-753217714 | https://api.github.com/repos/simonw/datasette/issues/983 | 753217714 | MDEyOklzc3VlQ29tbWVudDc1MzIxNzcxNA== | 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 } |
712260429 | |
https://github.com/simonw/datasette/issues/983#issuecomment-753217917 | https://api.github.com/repos/simonw/datasette/issues/983 | 753217917 | MDEyOklzc3VlQ29tbWVudDc1MzIxNzkxNw== | 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 } |
712260429 | |
https://github.com/simonw/datasette/issues/983#issuecomment-753219521 | https://api.github.com/repos/simonw/datasette/issues/983 | 753219521 | MDEyOklzc3VlQ29tbWVudDc1MzIxOTUyMQ== | 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 } |
712260429 | |
https://github.com/simonw/datasette/issues/1164#issuecomment-753220412 | https://api.github.com/repos/simonw/datasette/issues/1164 | 753220412 | MDEyOklzc3VlQ29tbWVudDc1MzIyMDQxMg== | 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 } |
776634318 | |
https://github.com/simonw/datasette/issues/1164#issuecomment-753220665 | https://api.github.com/repos/simonw/datasette/issues/1164 | 753220665 | MDEyOklzc3VlQ29tbWVudDc1MzIyMDY2NQ== | 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 } |
776634318 | |
https://github.com/simonw/datasette/issues/1164#issuecomment-753221362 | https://api.github.com/repos/simonw/datasette/issues/1164 | 753221362 | MDEyOklzc3VlQ29tbWVudDc1MzIyMTM2Mg== | 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 } |
776634318 | |
https://github.com/simonw/datasette/issues/983#issuecomment-753221646 | https://api.github.com/repos/simonw/datasette/issues/983 | 753221646 | MDEyOklzc3VlQ29tbWVudDc1MzIyMTY0Ng== | 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 } |
712260429 | |
https://github.com/simonw/datasette/issues/1166#issuecomment-753224351 | https://api.github.com/repos/simonw/datasette/issues/1166 | 753224351 | MDEyOklzc3VlQ29tbWVudDc1MzIyNDM1MQ== | 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 } |
777140799 | |
https://github.com/simonw/datasette/issues/983#issuecomment-753219407 | https://api.github.com/repos/simonw/datasette/issues/983 | 753219407 | MDEyOklzc3VlQ29tbWVudDc1MzIxOTQwNw== | 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 } |
712260429 |