Skip to content

Add content hash to JS includes (closes #2714)#2745

Open
mvanhorn wants to merge 1 commit into
simonw:mainfrom
mvanhorn:osc/2714-js-content-hash
Open

Add content hash to JS includes (closes #2714)#2745
mvanhorn wants to merge 1 commit into
simonw:mainfrom
mvanhorn:osc/2714-js-content-hash

Conversation

@mvanhorn
Copy link
Copy Markdown

Summary

Adds ?{{ static_hash('foo.js') }} to the five first-party JS includes shipped with datasette so browsers refetch when the bundled file changes, matching the existing pattern used for app.css.

Vendored libraries (cm-editor-6.0.1.bundle.js, sql-formatter-2.3.3.min.js, json-format-highlight-1.0.1.js) already carry a version in the filename and were left alone.

Closes #2714

Approach

Datasette.static_hash(filename) already exists (it's what app_css_hash calls under the hood). The change exposes it as a callable in the template context so templates can reuse the same SHA-1-prefix scheme as app.css without hardcoding per-file context entries.

handle_exception.py also gets static_hash added to the error-page template context, the same way it currently passes app_css_hash.

Files changed

  • datasette/app.py — expose static_hash callable.
  • datasette/handle_exception.py — include it in the error template context.
  • datasette/templates/base.html — hash datasette-manager.js and navigation-search.js.
  • datasette/templates/table.html — hash column-chooser.js, table.js, mobile-column-actions.js.

Tests

  • New test_js_content_hash parametrized across all 5 files, asserts the rendered <script src> includes the expected ?hash suffix.
  • Existing test_navigation_menu_links updated to expect the new query string on navigation-search.js.
  • Full tests/test_html.py + tests/test_table_html.py pass locally (212 passed, 1 xpassed).

The CSS link in base.html already carries `?{{ app_css_hash }}` so that
browsers refetch when the bundled file changes. The five first-party JS
files shipped with datasette did not. Cache-busting JS the same way
matches the existing CSS pattern and uses the static_hash() helper that
already powers app_css_hash().

Files updated:
- datasette/app.py: expose static_hash as a callable in template context.
- datasette/handle_exception.py: include static_hash in the error-page
  template context (mirrors the existing app_css_hash entry there).
- datasette/templates/base.html: hash datasette-manager.js and
  navigation-search.js.
- datasette/templates/table.html: hash column-chooser.js, table.js, and
  mobile-column-actions.js.
- tests/test_html.py: new test_js_content_hash parametrized across all
  five files; existing test_navigation_menu_links updated to expect the
  new query string.

Vendored libraries (cm-editor-6.0.1.bundle.js, sql-formatter-2.3.3.min.js,
json-format-highlight-1.0.1.js) already carry a version in the filename
and were left unchanged.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Datasette JS should include content hash in the URL

1 participant