Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .changeset/7151-legacy-retired-provenance.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
---
---

Test-only change to `plugin-dashboard`'s legacy-retired suite; no published behaviour changes.

The two annotated `it.each` rows in `DashboardGridLayout.legacyRetired.test.tsx` introduced their literals with provenance comments naming a schema-catalog fixture. Both were true when written and were invalidated 66 minutes later by the catalog migration off the retired shape (objectui#4600). The annotations now state the measured history and say plainly that the rows no longer carry the independent-corpus property, and the relationship they assert is derived at test time from the fixture instead of restated in prose.
Original file line numberDiff line numberDiff line change
Expand Up@@ -31,6 +31,9 @@
*/

import { describe, it, expect, afterEach } from 'vitest';
import fs from 'node:fs';
import path from 'node:path';
import { fileURLToPath } from 'node:url';
import React from 'react';
import { render, screen, cleanup } from '@testing-library/react';
import type { DashboardComponentSchema } from '@object-ui/types';
Expand All@@ -46,16 +49,46 @@ afterEach(cleanup);
const dash = (widget: Record<string, unknown>): DashboardComponentSchema =>
({ type: 'dashboard', widgets: [widget] }) as unknown as DashboardComponentSchema;

/**
* The catalog entry the two annotated rows below were transcribed from, named
* once so the prose and the derived block at the bottom cannot drift apart.
*/
const REPO_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..', '..', '..');
const CATALOG_FIXTURE = path.join(
REPO_ROOT,
'examples/schema-catalog/src/schemas/plugin-dashboard/filtered-dashboard.json',
);
const catalogWidgets = (
JSON.parse(fs.readFileSync(CATALOG_FIXTURE, 'utf8')) as { widgets: Record<string, unknown>[] }
).widgets;

describe('DashboardGridLayout retired legacy widgets (#4612)', () => {
it.each([
['chart', { id: 'w1', type: 'bar', object: 'invoices', categoryField: 'month', valueField: 'amount', aggregate: 'sum' }],
// Byte-for-byte `examples/schema-catalog/src/schemas/plugin-dashboard/
// filtered-dashboard.json` → `widgets[0]`: the real stored shape, not a
// fixture invented to match the detector.
// Transcribed from `filtered-dashboard.json` → `widgets[0]` as that fixture
// stood at `8640cec19`, the commit that added this file. It was byte-for-byte
// then — same keys, same order, same values — and it is NOT byte-for-byte
// now: `e028dfcd8` (objectui#4600, PR #4615) migrated the `filtered-*`
// entries off the retired shape 66 minutes later, so `widgets[0]` on disk is
// `{ id, title, type, options: { xField, yField, data } }` today.
//
// ⚠️ This row therefore does NOT carry the independent-corpus property the
// original annotation claimed for it. It is a HISTORICAL specimen of stored
// metadata, not a live transcription — which is the right thing to pin (a
// renderer cannot refuse to receive stored metadata) but is worth strictly
// less as evidence, so it is stated rather than left to be re-derived. No
// live specimen can replace it; the derived block at the bottom measures
// that, instead of asserting it here in prose the way this comment once did.
['catalog bar', { id: 'invoices_by_status', title: 'Invoices by Status', type: 'bar', object: 'invoices', categoryField: 'status', aggregate: 'count' }],
// The pivot family, whose legacy spelling names `rowField`/`columnField`.
['pivot', { id: 'w1', type: 'pivot', object: 'invoices', rowField: 'region', valueField: 'amount' }],
// `widgets[2]` of the same catalog entry.
// The same fixture's `widgets[2]` at that same commit, and a LOOSER claim
// than the row above ever made: its retired binding verbatim (`type`,
// `object`, `aggregate`), with `id` genericised to `w1` and `title` /
// `filterBindings` dropped. So this row was never byte-for-byte and never
// said it was. `e028dfcd8` retired that widget's shape too — `widgets[2]` is
// `{ id, title, type, options: { value }, filterBindings }` today — so the
// same ⚠️ above applies to it.
['metric', { id: 'w1', type: 'metric', object: 'invoices', aggregate: 'count' }],
])('renders the visible placeholder for a legacy %s widget', (_kind, widget) => {
render(<DashboardGridLayout schema={dash(widget)} />);
Expand DownExpand Up@@ -116,4 +149,64 @@ describe('DashboardGridLayout retired legacy widgets (#4612)', () => {
renderOne({ id: 'w1', type: 'pivot', options: { data: [{ region: 'EMEA', amount: 1 }] } });
expect(screen.queryByText(/retired data format/i)).not.toBeInTheDocument();
});

/**
* The corpus half — DERIVED from the fixture, not transcribed from it
* (objectui#7151).
*
* Two of the rows above are hand-written literals introduced by comments
* naming a fixture. Those comments were TRUE when written and stopped being
* true 66 minutes later, and nothing noticed for months: a comment cannot
* detect the file it names changing, which is exactly what a test can do. So
* the relationship stops being prose here and becomes a read.
*
* It reads the file off disk rather than importing it because this package's
* `tsconfig.test.json` declares `"types": ["node"]` — the precondition
* `packages/types/src/__tests__/timeline-catalog-fixture-migrated.test.ts`
* could not meet in `packages/plugin-timeline` and had to relocate for. The
* root Vitest config aliases `@object-ui/*` to sibling `src/`, so this file
* needs no built dependency closure to resolve either half.
*
* What this block deliberately does NOT do is restore the independent-corpus
* property the annotations above lost, because that property is no longer
* obtainable. Measured across every JSON document in the repo: 28 dashboard
* widgets, ZERO carrying the retired top-level binding, against live controls
* of 15 `options`-shaped and 2 `dataset`-shaped widgets. That zero is by
* DESIGN, not by accident — the retirement's whole content is that no
* authoring surface emits the shape (`WidgetConfigPanel` scrubs it on save via
* `LEGACY_ANALYTICS_KEYS`), and the catalog is an authoring corpus. A specimen
* reappearing there is therefore a catalog regression, which is the second
* thing this block catches.
*/
describe('the catalog entry those two rows name (objectui#7151)', () => {
it('is on disk, and holds the widgets the derived rows below iterate', () => {
// Asserted before anything consumes `catalogWidgets`: an emptied or
// renamed `widgets` array turns the `it.each` below into ZERO tests and a
// green run — the vacuous pass this whole block exists to end.
expect(fs.existsSync(CATALOG_FIXTURE), `fixture not found at ${CATALOG_FIXTURE}`).toBe(true);
expect(catalogWidgets.length).toBeGreaterThan(0);
});

it('carries NO widget in the retired shape — which is why those rows are hand-written', () => {
expect(catalogWidgets.length).toBeGreaterThan(0);
const retired = catalogWidgets.filter(
(w) => 'object' in w || 'categoryField' in w || 'valueField' in w || 'aggregate' in w,
);
expect(
retired,
'a shipped catalog widget authors the retired pre-ADR-0021 binding again — either the catalog regressed, or there is finally a live corpus specimen to transcribe into the annotated rows above',
).toEqual([]);
});

// The independent-corpus property, restored on the side where the corpus
// still HAS specimens: these are the real shipped documents, and the
// detector must fire on none of them.
it.each(catalogWidgets.map((w, i) => [`widgets[${i}]`, w] as [string, Record<string, unknown>]))(
'does NOT show the placeholder for shipped catalog %s',
(_where, widget) => {
renderOne(widget);
expect(screen.queryByText(/retired data format/i)).not.toBeInTheDocument();
},
);
});
});
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .changeset/7151-legacy-retired-provenance.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
---
---

Test-only change to `plugin-dashboard`'s legacy-retired suite; no published behaviour changes.

The two annotated `it.each` rows in `DashboardGridLayout.legacyRetired.test.tsx` introduced their literals with provenance comments naming a schema-catalog fixture. Both were true when written and were invalidated 66 minutes later by the catalog migration off the retired shape (objectui#4600). The annotations now state the measured history and say plainly that the rows no longer carry the independent-corpus property, and the relationship they assert is derived at test time from the fixture instead of restated in prose.
Original file line numberDiff line numberDiff line change
Expand Up@@ -31,6 +31,9 @@
*/

import { describe, it, expect, afterEach } from 'vitest';
import fs from 'node:fs';
import path from 'node:path';
import { fileURLToPath } from 'node:url';
import React from 'react';
import { render, screen, cleanup } from '@testing-library/react';
import type { DashboardComponentSchema } from '@object-ui/types';
Expand All@@ -46,16 +49,46 @@ afterEach(cleanup);
const dash = (widget: Record<string, unknown>): DashboardComponentSchema =>
({ type: 'dashboard', widgets: [widget] }) as unknown as DashboardComponentSchema;

/**
* The catalog entry the two annotated rows below were transcribed from, named
* once so the prose and the derived block at the bottom cannot drift apart.
*/
const REPO_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..', '..', '..');
const CATALOG_FIXTURE = path.join(
REPO_ROOT,
'examples/schema-catalog/src/schemas/plugin-dashboard/filtered-dashboard.json',
);
const catalogWidgets = (
JSON.parse(fs.readFileSync(CATALOG_FIXTURE, 'utf8')) as { widgets: Record<string, unknown>[] }
).widgets;

describe('DashboardGridLayout retired legacy widgets (#4612)', () => {
it.each([
['chart', { id: 'w1', type: 'bar', object: 'invoices', categoryField: 'month', valueField: 'amount', aggregate: 'sum' }],
// Byte-for-byte `examples/schema-catalog/src/schemas/plugin-dashboard/
// filtered-dashboard.json` → `widgets[0]`: the real stored shape, not a
// fixture invented to match the detector.
// Transcribed from `filtered-dashboard.json` → `widgets[0]` as that fixture
// stood at `8640cec19`, the commit that added this file. It was byte-for-byte
// then — same keys, same order, same values — and it is NOT byte-for-byte
// now: `e028dfcd8` (objectui#4600, PR #4615) migrated the `filtered-*`
// entries off the retired shape 66 minutes later, so `widgets[0]` on disk is
// `{ id, title, type, options: { xField, yField, data } }` today.
//
// ⚠️ This row therefore does NOT carry the independent-corpus property the
// original annotation claimed for it. It is a HISTORICAL specimen of stored
// metadata, not a live transcription — which is the right thing to pin (a
// renderer cannot refuse to receive stored metadata) but is worth strictly
// less as evidence, so it is stated rather than left to be re-derived. No
// live specimen can replace it; the derived block at the bottom measures
// that, instead of asserting it here in prose the way this comment once did.
['catalog bar', { id: 'invoices_by_status', title: 'Invoices by Status', type: 'bar', object: 'invoices', categoryField: 'status', aggregate: 'count' }],
// The pivot family, whose legacy spelling names `rowField`/`columnField`.
['pivot', { id: 'w1', type: 'pivot', object: 'invoices', rowField: 'region', valueField: 'amount' }],
// `widgets[2]` of the same catalog entry.
// The same fixture's `widgets[2]` at that same commit, and a LOOSER claim
// than the row above ever made: its retired binding verbatim (`type`,
// `object`, `aggregate`), with `id` genericised to `w1` and `title` /
// `filterBindings` dropped. So this row was never byte-for-byte and never
// said it was. `e028dfcd8` retired that widget's shape too — `widgets[2]` is
// `{ id, title, type, options: { value }, filterBindings }` today — so the
// same ⚠️ above applies to it.
['metric', { id: 'w1', type: 'metric', object: 'invoices', aggregate: 'count' }],
])('renders the visible placeholder for a legacy %s widget', (_kind, widget) => {
render(<DashboardGridLayout schema={dash(widget)} />);
Expand DownExpand Up@@ -116,4 +149,64 @@ describe('DashboardGridLayout retired legacy widgets (#4612)', () => {
renderOne({ id: 'w1', type: 'pivot', options: { data: [{ region: 'EMEA', amount: 1 }] } });
expect(screen.queryByText(/retired data format/i)).not.toBeInTheDocument();
});

/**
* The corpus half — DERIVED from the fixture, not transcribed from it
* (objectui#7151).
*
* Two of the rows above are hand-written literals introduced by comments
* naming a fixture. Those comments were TRUE when written and stopped being
* true 66 minutes later, and nothing noticed for months: a comment cannot
* detect the file it names changing, which is exactly what a test can do. So
* the relationship stops being prose here and becomes a read.
*
* It reads the file off disk rather than importing it because this package's
* `tsconfig.test.json` declares `"types": ["node"]` — the precondition
* `packages/types/src/__tests__/timeline-catalog-fixture-migrated.test.ts`
* could not meet in `packages/plugin-timeline` and had to relocate for. The
* root Vitest config aliases `@object-ui/*` to sibling `src/`, so this file
* needs no built dependency closure to resolve either half.
*
* What this block deliberately does NOT do is restore the independent-corpus
* property the annotations above lost, because that property is no longer
* obtainable. Measured across every JSON document in the repo: 28 dashboard
* widgets, ZERO carrying the retired top-level binding, against live controls
* of 15 `options`-shaped and 2 `dataset`-shaped widgets. That zero is by
* DESIGN, not by accident — the retirement's whole content is that no
* authoring surface emits the shape (`WidgetConfigPanel` scrubs it on save via
* `LEGACY_ANALYTICS_KEYS`), and the catalog is an authoring corpus. A specimen
* reappearing there is therefore a catalog regression, which is the second
* thing this block catches.
*/
describe('the catalog entry those two rows name (objectui#7151)', () => {
it('is on disk, and holds the widgets the derived rows below iterate', () => {
// Asserted before anything consumes `catalogWidgets`: an emptied or
// renamed `widgets` array turns the `it.each` below into ZERO tests and a
// green run — the vacuous pass this whole block exists to end.
expect(fs.existsSync(CATALOG_FIXTURE), `fixture not found at ${CATALOG_FIXTURE}`).toBe(true);
expect(catalogWidgets.length).toBeGreaterThan(0);
});

it('carries NO widget in the retired shape — which is why those rows are hand-written', () => {
expect(catalogWidgets.length).toBeGreaterThan(0);
const retired = catalogWidgets.filter(
(w) => 'object' in w || 'categoryField' in w || 'valueField' in w || 'aggregate' in w,
);
expect(
retired,
'a shipped catalog widget authors the retired pre-ADR-0021 binding again — either the catalog regressed, or there is finally a live corpus specimen to transcribe into the annotated rows above',
).toEqual([]);
});

// The independent-corpus property, restored on the side where the corpus
// still HAS specimens: these are the real shipped documents, and the
// detector must fire on none of them.
it.each(catalogWidgets.map((w, i) => [`widgets[${i}]`, w] as [string, Record<string, unknown>]))(
'does NOT show the placeholder for shipped catalog %s',
(_where, widget) => {
renderOne(widget);
expect(screen.queryByText(/retired data format/i)).not.toBeInTheDocument();
},
);
});
});
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .changeset/7151-legacy-retired-provenance.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
---
---

Test-only change to `plugin-dashboard`'s legacy-retired suite; no published behaviour changes.

The two annotated `it.each` rows in `DashboardGridLayout.legacyRetired.test.tsx` introduced their literals with provenance comments naming a schema-catalog fixture. Both were true when written and were invalidated 66 minutes later by the catalog migration off the retired shape (objectui#4600). The annotations now state the measured history and say plainly that the rows no longer carry the independent-corpus property, and the relationship they assert is derived at test time from the fixture instead of restated in prose.
Original file line numberDiff line numberDiff line change
Expand Up@@ -31,6 +31,9 @@
*/

import { describe, it, expect, afterEach } from 'vitest';
import fs from 'node:fs';
import path from 'node:path';
import { fileURLToPath } from 'node:url';
import React from 'react';
import { render, screen, cleanup } from '@testing-library/react';
import type { DashboardComponentSchema } from '@object-ui/types';
Expand All@@ -46,16 +49,46 @@ afterEach(cleanup);
const dash = (widget: Record<string, unknown>): DashboardComponentSchema =>
({ type: 'dashboard', widgets: [widget] }) as unknown as DashboardComponentSchema;

/**
* The catalog entry the two annotated rows below were transcribed from, named
* once so the prose and the derived block at the bottom cannot drift apart.
*/
const REPO_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..', '..', '..');
const CATALOG_FIXTURE = path.join(
REPO_ROOT,
'examples/schema-catalog/src/schemas/plugin-dashboard/filtered-dashboard.json',
);
const catalogWidgets = (
JSON.parse(fs.readFileSync(CATALOG_FIXTURE, 'utf8')) as { widgets: Record<string, unknown>[] }
).widgets;

describe('DashboardGridLayout retired legacy widgets (#4612)', () => {
it.each([
['chart', { id: 'w1', type: 'bar', object: 'invoices', categoryField: 'month', valueField: 'amount', aggregate: 'sum' }],
// Byte-for-byte `examples/schema-catalog/src/schemas/plugin-dashboard/
// filtered-dashboard.json` → `widgets[0]`: the real stored shape, not a
// fixture invented to match the detector.
// Transcribed from `filtered-dashboard.json` → `widgets[0]` as that fixture
// stood at `8640cec19`, the commit that added this file. It was byte-for-byte
// then — same keys, same order, same values — and it is NOT byte-for-byte
// now: `e028dfcd8` (objectui#4600, PR #4615) migrated the `filtered-*`
// entries off the retired shape 66 minutes later, so `widgets[0]` on disk is
// `{ id, title, type, options: { xField, yField, data } }` today.
//
// ⚠️ This row therefore does NOT carry the independent-corpus property the
// original annotation claimed for it. It is a HISTORICAL specimen of stored
// metadata, not a live transcription — which is the right thing to pin (a
// renderer cannot refuse to receive stored metadata) but is worth strictly
// less as evidence, so it is stated rather than left to be re-derived. No
// live specimen can replace it; the derived block at the bottom measures
// that, instead of asserting it here in prose the way this comment once did.
['catalog bar', { id: 'invoices_by_status', title: 'Invoices by Status', type: 'bar', object: 'invoices', categoryField: 'status', aggregate: 'count' }],
// The pivot family, whose legacy spelling names `rowField`/`columnField`.
['pivot', { id: 'w1', type: 'pivot', object: 'invoices', rowField: 'region', valueField: 'amount' }],
// `widgets[2]` of the same catalog entry.
// The same fixture's `widgets[2]` at that same commit, and a LOOSER claim
// than the row above ever made: its retired binding verbatim (`type`,
// `object`, `aggregate`), with `id` genericised to `w1` and `title` /
// `filterBindings` dropped. So this row was never byte-for-byte and never
// said it was. `e028dfcd8` retired that widget's shape too — `widgets[2]` is
// `{ id, title, type, options: { value }, filterBindings }` today — so the
// same ⚠️ above applies to it.
['metric', { id: 'w1', type: 'metric', object: 'invoices', aggregate: 'count' }],
])('renders the visible placeholder for a legacy %s widget', (_kind, widget) => {
render(<DashboardGridLayout schema={dash(widget)} />);
Expand DownExpand Up@@ -116,4 +149,64 @@ describe('DashboardGridLayout retired legacy widgets (#4612)', () => {
renderOne({ id: 'w1', type: 'pivot', options: { data: [{ region: 'EMEA', amount: 1 }] } });
expect(screen.queryByText(/retired data format/i)).not.toBeInTheDocument();
});

/**
* The corpus half — DERIVED from the fixture, not transcribed from it
* (objectui#7151).
*
* Two of the rows above are hand-written literals introduced by comments
* naming a fixture. Those comments were TRUE when written and stopped being
* true 66 minutes later, and nothing noticed for months: a comment cannot
* detect the file it names changing, which is exactly what a test can do. So
* the relationship stops being prose here and becomes a read.
*
* It reads the file off disk rather than importing it because this package's
* `tsconfig.test.json` declares `"types": ["node"]` — the precondition
* `packages/types/src/__tests__/timeline-catalog-fixture-migrated.test.ts`
* could not meet in `packages/plugin-timeline` and had to relocate for. The
* root Vitest config aliases `@object-ui/*` to sibling `src/`, so this file
* needs no built dependency closure to resolve either half.
*
* What this block deliberately does NOT do is restore the independent-corpus
* property the annotations above lost, because that property is no longer
* obtainable. Measured across every JSON document in the repo: 28 dashboard
* widgets, ZERO carrying the retired top-level binding, against live controls
* of 15 `options`-shaped and 2 `dataset`-shaped widgets. That zero is by
* DESIGN, not by accident — the retirement's whole content is that no
* authoring surface emits the shape (`WidgetConfigPanel` scrubs it on save via
* `LEGACY_ANALYTICS_KEYS`), and the catalog is an authoring corpus. A specimen
* reappearing there is therefore a catalog regression, which is the second
* thing this block catches.
*/
describe('the catalog entry those two rows name (objectui#7151)', () => {
it('is on disk, and holds the widgets the derived rows below iterate', () => {
// Asserted before anything consumes `catalogWidgets`: an emptied or
// renamed `widgets` array turns the `it.each` below into ZERO tests and a
// green run — the vacuous pass this whole block exists to end.
expect(fs.existsSync(CATALOG_FIXTURE), `fixture not found at ${CATALOG_FIXTURE}`).toBe(true);
expect(catalogWidgets.length).toBeGreaterThan(0);
});

it('carries NO widget in the retired shape — which is why those rows are hand-written', () => {
expect(catalogWidgets.length).toBeGreaterThan(0);
const retired = catalogWidgets.filter(
(w) => 'object' in w || 'categoryField' in w || 'valueField' in w || 'aggregate' in w,
);
expect(
retired,
'a shipped catalog widget authors the retired pre-ADR-0021 binding again — either the catalog regressed, or there is finally a live corpus specimen to transcribe into the annotated rows above',
).toEqual([]);
});

// The independent-corpus property, restored on the side where the corpus
// still HAS specimens: these are the real shipped documents, and the
// detector must fire on none of them.
it.each(catalogWidgets.map((w, i) => [`widgets[${i}]`, w] as [string, Record<string, unknown>]))(
'does NOT show the placeholder for shipped catalog %s',
(_where, widget) => {
renderOne(widget);
expect(screen.queryByText(/retired data format/i)).not.toBeInTheDocument();
},
);
});
});
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .changeset/7151-legacy-retired-provenance.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
---
---

Test-only change to `plugin-dashboard`'s legacy-retired suite; no published behaviour changes.

The two annotated `it.each` rows in `DashboardGridLayout.legacyRetired.test.tsx` introduced their literals with provenance comments naming a schema-catalog fixture. Both were true when written and were invalidated 66 minutes later by the catalog migration off the retired shape (objectui#4600). The annotations now state the measured history and say plainly that the rows no longer carry the independent-corpus property, and the relationship they assert is derived at test time from the fixture instead of restated in prose.
Original file line numberDiff line numberDiff line change
Expand Up@@ -31,6 +31,9 @@
*/

import { describe, it, expect, afterEach } from 'vitest';
import fs from 'node:fs';
import path from 'node:path';
import { fileURLToPath } from 'node:url';
import React from 'react';
import { render, screen, cleanup } from '@testing-library/react';
import type { DashboardComponentSchema } from '@object-ui/types';
Expand All@@ -46,16 +49,46 @@ afterEach(cleanup);
const dash = (widget: Record<string, unknown>): DashboardComponentSchema =>
({ type: 'dashboard', widgets: [widget] }) as unknown as DashboardComponentSchema;

/**
* The catalog entry the two annotated rows below were transcribed from, named
* once so the prose and the derived block at the bottom cannot drift apart.
*/
const REPO_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..', '..', '..');
const CATALOG_FIXTURE = path.join(
REPO_ROOT,
'examples/schema-catalog/src/schemas/plugin-dashboard/filtered-dashboard.json',
);
const catalogWidgets = (
JSON.parse(fs.readFileSync(CATALOG_FIXTURE, 'utf8')) as { widgets: Record<string, unknown>[] }
).widgets;

describe('DashboardGridLayout retired legacy widgets (#4612)', () => {
it.each([
['chart', { id: 'w1', type: 'bar', object: 'invoices', categoryField: 'month', valueField: 'amount', aggregate: 'sum' }],
// Byte-for-byte `examples/schema-catalog/src/schemas/plugin-dashboard/
// filtered-dashboard.json` → `widgets[0]`: the real stored shape, not a
// fixture invented to match the detector.
// Transcribed from `filtered-dashboard.json` → `widgets[0]` as that fixture
// stood at `8640cec19`, the commit that added this file. It was byte-for-byte
// then — same keys, same order, same values — and it is NOT byte-for-byte
// now: `e028dfcd8` (objectui#4600, PR #4615) migrated the `filtered-*`
// entries off the retired shape 66 minutes later, so `widgets[0]` on disk is
// `{ id, title, type, options: { xField, yField, data } }` today.
//
// ⚠️ This row therefore does NOT carry the independent-corpus property the
// original annotation claimed for it. It is a HISTORICAL specimen of stored
// metadata, not a live transcription — which is the right thing to pin (a
// renderer cannot refuse to receive stored metadata) but is worth strictly
// less as evidence, so it is stated rather than left to be re-derived. No
// live specimen can replace it; the derived block at the bottom measures
// that, instead of asserting it here in prose the way this comment once did.
['catalog bar', { id: 'invoices_by_status', title: 'Invoices by Status', type: 'bar', object: 'invoices', categoryField: 'status', aggregate: 'count' }],
// The pivot family, whose legacy spelling names `rowField`/`columnField`.
['pivot', { id: 'w1', type: 'pivot', object: 'invoices', rowField: 'region', valueField: 'amount' }],
// `widgets[2]` of the same catalog entry.
// The same fixture's `widgets[2]` at that same commit, and a LOOSER claim
// than the row above ever made: its retired binding verbatim (`type`,
// `object`, `aggregate`), with `id` genericised to `w1` and `title` /
// `filterBindings` dropped. So this row was never byte-for-byte and never
// said it was. `e028dfcd8` retired that widget's shape too — `widgets[2]` is
// `{ id, title, type, options: { value }, filterBindings }` today — so the
// same ⚠️ above applies to it.
['metric', { id: 'w1', type: 'metric', object: 'invoices', aggregate: 'count' }],
])('renders the visible placeholder for a legacy %s widget', (_kind, widget) => {
render(<DashboardGridLayout schema={dash(widget)} />);
Expand DownExpand Up@@ -116,4 +149,64 @@ describe('DashboardGridLayout retired legacy widgets (#4612)', () => {
renderOne({ id: 'w1', type: 'pivot', options: { data: [{ region: 'EMEA', amount: 1 }] } });
expect(screen.queryByText(/retired data format/i)).not.toBeInTheDocument();
});

/**
* The corpus half — DERIVED from the fixture, not transcribed from it
* (objectui#7151).
*
* Two of the rows above are hand-written literals introduced by comments
* naming a fixture. Those comments were TRUE when written and stopped being
* true 66 minutes later, and nothing noticed for months: a comment cannot
* detect the file it names changing, which is exactly what a test can do. So
* the relationship stops being prose here and becomes a read.
*
* It reads the file off disk rather than importing it because this package's
* `tsconfig.test.json` declares `"types": ["node"]` — the precondition
* `packages/types/src/__tests__/timeline-catalog-fixture-migrated.test.ts`
* could not meet in `packages/plugin-timeline` and had to relocate for. The
* root Vitest config aliases `@object-ui/*` to sibling `src/`, so this file
* needs no built dependency closure to resolve either half.
*
* What this block deliberately does NOT do is restore the independent-corpus
* property the annotations above lost, because that property is no longer
* obtainable. Measured across every JSON document in the repo: 28 dashboard
* widgets, ZERO carrying the retired top-level binding, against live controls
* of 15 `options`-shaped and 2 `dataset`-shaped widgets. That zero is by
* DESIGN, not by accident — the retirement's whole content is that no
* authoring surface emits the shape (`WidgetConfigPanel` scrubs it on save via
* `LEGACY_ANALYTICS_KEYS`), and the catalog is an authoring corpus. A specimen
* reappearing there is therefore a catalog regression, which is the second
* thing this block catches.
*/
describe('the catalog entry those two rows name (objectui#7151)', () => {
it('is on disk, and holds the widgets the derived rows below iterate', () => {
// Asserted before anything consumes `catalogWidgets`: an emptied or
// renamed `widgets` array turns the `it.each` below into ZERO tests and a
// green run — the vacuous pass this whole block exists to end.
expect(fs.existsSync(CATALOG_FIXTURE), `fixture not found at ${CATALOG_FIXTURE}`).toBe(true);
expect(catalogWidgets.length).toBeGreaterThan(0);
});

it('carries NO widget in the retired shape — which is why those rows are hand-written', () => {
expect(catalogWidgets.length).toBeGreaterThan(0);
const retired = catalogWidgets.filter(
(w) => 'object' in w || 'categoryField' in w || 'valueField' in w || 'aggregate' in w,
);
expect(
retired,
'a shipped catalog widget authors the retired pre-ADR-0021 binding again — either the catalog regressed, or there is finally a live corpus specimen to transcribe into the annotated rows above',
).toEqual([]);
});

// The independent-corpus property, restored on the side where the corpus
// still HAS specimens: these are the real shipped documents, and the
// detector must fire on none of them.
it.each(catalogWidgets.map((w, i) => [`widgets[${i}]`, w] as [string, Record<string, unknown>]))(
'does NOT show the placeholder for shipped catalog %s',
(_where, widget) => {
renderOne(widget);
expect(screen.queryByText(/retired data format/i)).not.toBeInTheDocument();
},
);
});
});
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .changeset/7151-legacy-retired-provenance.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
---
---

Test-only change to `plugin-dashboard`'s legacy-retired suite; no published behaviour changes.

The two annotated `it.each` rows in `DashboardGridLayout.legacyRetired.test.tsx` introduced their literals with provenance comments naming a schema-catalog fixture. Both were true when written and were invalidated 66 minutes later by the catalog migration off the retired shape (objectui#4600). The annotations now state the measured history and say plainly that the rows no longer carry the independent-corpus property, and the relationship they assert is derived at test time from the fixture instead of restated in prose.
Original file line numberDiff line numberDiff line change
Expand Up@@ -31,6 +31,9 @@
*/

import { describe, it, expect, afterEach } from 'vitest';
import fs from 'node:fs';
import path from 'node:path';
import { fileURLToPath } from 'node:url';
import React from 'react';
import { render, screen, cleanup } from '@testing-library/react';
import type { DashboardComponentSchema } from '@object-ui/types';
Expand All@@ -46,16 +49,46 @@ afterEach(cleanup);
const dash = (widget: Record<string, unknown>): DashboardComponentSchema =>
({ type: 'dashboard', widgets: [widget] }) as unknown as DashboardComponentSchema;

/**
* The catalog entry the two annotated rows below were transcribed from, named
* once so the prose and the derived block at the bottom cannot drift apart.
*/
const REPO_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..', '..', '..');
const CATALOG_FIXTURE = path.join(
REPO_ROOT,
'examples/schema-catalog/src/schemas/plugin-dashboard/filtered-dashboard.json',
);
const catalogWidgets = (
JSON.parse(fs.readFileSync(CATALOG_FIXTURE, 'utf8')) as { widgets: Record<string, unknown>[] }
).widgets;

describe('DashboardGridLayout retired legacy widgets (#4612)', () => {
it.each([
['chart', { id: 'w1', type: 'bar', object: 'invoices', categoryField: 'month', valueField: 'amount', aggregate: 'sum' }],
// Byte-for-byte `examples/schema-catalog/src/schemas/plugin-dashboard/
// filtered-dashboard.json` → `widgets[0]`: the real stored shape, not a
// fixture invented to match the detector.
// Transcribed from `filtered-dashboard.json` → `widgets[0]` as that fixture
// stood at `8640cec19`, the commit that added this file. It was byte-for-byte
// then — same keys, same order, same values — and it is NOT byte-for-byte
// now: `e028dfcd8` (objectui#4600, PR #4615) migrated the `filtered-*`
// entries off the retired shape 66 minutes later, so `widgets[0]` on disk is
// `{ id, title, type, options: { xField, yField, data } }` today.
//
// ⚠️ This row therefore does NOT carry the independent-corpus property the
// original annotation claimed for it. It is a HISTORICAL specimen of stored
// metadata, not a live transcription — which is the right thing to pin (a
// renderer cannot refuse to receive stored metadata) but is worth strictly
// less as evidence, so it is stated rather than left to be re-derived. No
// live specimen can replace it; the derived block at the bottom measures
// that, instead of asserting it here in prose the way this comment once did.
['catalog bar', { id: 'invoices_by_status', title: 'Invoices by Status', type: 'bar', object: 'invoices', categoryField: 'status', aggregate: 'count' }],
// The pivot family, whose legacy spelling names `rowField`/`columnField`.
['pivot', { id: 'w1', type: 'pivot', object: 'invoices', rowField: 'region', valueField: 'amount' }],
// `widgets[2]` of the same catalog entry.
// The same fixture's `widgets[2]` at that same commit, and a LOOSER claim
// than the row above ever made: its retired binding verbatim (`type`,
// `object`, `aggregate`), with `id` genericised to `w1` and `title` /
// `filterBindings` dropped. So this row was never byte-for-byte and never
// said it was. `e028dfcd8` retired that widget's shape too — `widgets[2]` is
// `{ id, title, type, options: { value }, filterBindings }` today — so the
// same ⚠️ above applies to it.
['metric', { id: 'w1', type: 'metric', object: 'invoices', aggregate: 'count' }],
])('renders the visible placeholder for a legacy %s widget', (_kind, widget) => {
render(<DashboardGridLayout schema={dash(widget)} />);
Expand DownExpand Up@@ -116,4 +149,64 @@ describe('DashboardGridLayout retired legacy widgets (#4612)', () => {
renderOne({ id: 'w1', type: 'pivot', options: { data: [{ region: 'EMEA', amount: 1 }] } });
expect(screen.queryByText(/retired data format/i)).not.toBeInTheDocument();
});

/**
* The corpus half — DERIVED from the fixture, not transcribed from it
* (objectui#7151).
*
* Two of the rows above are hand-written literals introduced by comments
* naming a fixture. Those comments were TRUE when written and stopped being
* true 66 minutes later, and nothing noticed for months: a comment cannot
* detect the file it names changing, which is exactly what a test can do. So
* the relationship stops being prose here and becomes a read.
*
* It reads the file off disk rather than importing it because this package's
* `tsconfig.test.json` declares `"types": ["node"]` — the precondition
* `packages/types/src/__tests__/timeline-catalog-fixture-migrated.test.ts`
* could not meet in `packages/plugin-timeline` and had to relocate for. The
* root Vitest config aliases `@object-ui/*` to sibling `src/`, so this file
* needs no built dependency closure to resolve either half.
*
* What this block deliberately does NOT do is restore the independent-corpus
* property the annotations above lost, because that property is no longer
* obtainable. Measured across every JSON document in the repo: 28 dashboard
* widgets, ZERO carrying the retired top-level binding, against live controls
* of 15 `options`-shaped and 2 `dataset`-shaped widgets. That zero is by
* DESIGN, not by accident — the retirement's whole content is that no
* authoring surface emits the shape (`WidgetConfigPanel` scrubs it on save via
* `LEGACY_ANALYTICS_KEYS`), and the catalog is an authoring corpus. A specimen
* reappearing there is therefore a catalog regression, which is the second
* thing this block catches.
*/
describe('the catalog entry those two rows name (objectui#7151)', () => {
it('is on disk, and holds the widgets the derived rows below iterate', () => {
// Asserted before anything consumes `catalogWidgets`: an emptied or
// renamed `widgets` array turns the `it.each` below into ZERO tests and a
// green run — the vacuous pass this whole block exists to end.
expect(fs.existsSync(CATALOG_FIXTURE), `fixture not found at ${CATALOG_FIXTURE}`).toBe(true);
expect(catalogWidgets.length).toBeGreaterThan(0);
});

it('carries NO widget in the retired shape — which is why those rows are hand-written', () => {
expect(catalogWidgets.length).toBeGreaterThan(0);
const retired = catalogWidgets.filter(
(w) => 'object' in w || 'categoryField' in w || 'valueField' in w || 'aggregate' in w,
);
expect(
retired,
'a shipped catalog widget authors the retired pre-ADR-0021 binding again — either the catalog regressed, or there is finally a live corpus specimen to transcribe into the annotated rows above',
).toEqual([]);
});

// The independent-corpus property, restored on the side where the corpus
// still HAS specimens: these are the real shipped documents, and the
// detector must fire on none of them.
it.each(catalogWidgets.map((w, i) => [`widgets[${i}]`, w] as [string, Record<string, unknown>]))(
'does NOT show the placeholder for shipped catalog %s',
(_where, widget) => {
renderOne(widget);
expect(screen.queryByText(/retired data format/i)).not.toBeInTheDocument();
},
);
});
});
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .changeset/7151-legacy-retired-provenance.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
---
---

Test-only change to `plugin-dashboard`'s legacy-retired suite; no published behaviour changes.

The two annotated `it.each` rows in `DashboardGridLayout.legacyRetired.test.tsx` introduced their literals with provenance comments naming a schema-catalog fixture. Both were true when written and were invalidated 66 minutes later by the catalog migration off the retired shape (objectui#4600). The annotations now state the measured history and say plainly that the rows no longer carry the independent-corpus property, and the relationship they assert is derived at test time from the fixture instead of restated in prose.
Original file line numberDiff line numberDiff line change
Expand Up@@ -31,6 +31,9 @@
*/

import { describe, it, expect, afterEach } from 'vitest';
import fs from 'node:fs';
import path from 'node:path';
import { fileURLToPath } from 'node:url';
import React from 'react';
import { render, screen, cleanup } from '@testing-library/react';
import type { DashboardComponentSchema } from '@object-ui/types';
Expand All@@ -46,16 +49,46 @@ afterEach(cleanup);
const dash = (widget: Record<string, unknown>): DashboardComponentSchema =>
({ type: 'dashboard', widgets: [widget] }) as unknown as DashboardComponentSchema;

/**
* The catalog entry the two annotated rows below were transcribed from, named
* once so the prose and the derived block at the bottom cannot drift apart.
*/
const REPO_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..', '..', '..');
const CATALOG_FIXTURE = path.join(
REPO_ROOT,
'examples/schema-catalog/src/schemas/plugin-dashboard/filtered-dashboard.json',
);
const catalogWidgets = (
JSON.parse(fs.readFileSync(CATALOG_FIXTURE, 'utf8')) as { widgets: Record<string, unknown>[] }
).widgets;

describe('DashboardGridLayout retired legacy widgets (#4612)', () => {
it.each([
['chart', { id: 'w1', type: 'bar', object: 'invoices', categoryField: 'month', valueField: 'amount', aggregate: 'sum' }],
// Byte-for-byte `examples/schema-catalog/src/schemas/plugin-dashboard/
// filtered-dashboard.json` → `widgets[0]`: the real stored shape, not a
// fixture invented to match the detector.
// Transcribed from `filtered-dashboard.json` → `widgets[0]` as that fixture
// stood at `8640cec19`, the commit that added this file. It was byte-for-byte
// then — same keys, same order, same values — and it is NOT byte-for-byte
// now: `e028dfcd8` (objectui#4600, PR #4615) migrated the `filtered-*`
// entries off the retired shape 66 minutes later, so `widgets[0]` on disk is
// `{ id, title, type, options: { xField, yField, data } }` today.
//
// ⚠️ This row therefore does NOT carry the independent-corpus property the
// original annotation claimed for it. It is a HISTORICAL specimen of stored
// metadata, not a live transcription — which is the right thing to pin (a
// renderer cannot refuse to receive stored metadata) but is worth strictly
// less as evidence, so it is stated rather than left to be re-derived. No
// live specimen can replace it; the derived block at the bottom measures
// that, instead of asserting it here in prose the way this comment once did.
['catalog bar', { id: 'invoices_by_status', title: 'Invoices by Status', type: 'bar', object: 'invoices', categoryField: 'status', aggregate: 'count' }],
// The pivot family, whose legacy spelling names `rowField`/`columnField`.
['pivot', { id: 'w1', type: 'pivot', object: 'invoices', rowField: 'region', valueField: 'amount' }],
// `widgets[2]` of the same catalog entry.
// The same fixture's `widgets[2]` at that same commit, and a LOOSER claim
// than the row above ever made: its retired binding verbatim (`type`,
// `object`, `aggregate`), with `id` genericised to `w1` and `title` /
// `filterBindings` dropped. So this row was never byte-for-byte and never
// said it was. `e028dfcd8` retired that widget's shape too — `widgets[2]` is
// `{ id, title, type, options: { value }, filterBindings }` today — so the
// same ⚠️ above applies to it.
['metric', { id: 'w1', type: 'metric', object: 'invoices', aggregate: 'count' }],
])('renders the visible placeholder for a legacy %s widget', (_kind, widget) => {
render(<DashboardGridLayout schema={dash(widget)} />);
Expand DownExpand Up@@ -116,4 +149,64 @@ describe('DashboardGridLayout retired legacy widgets (#4612)', () => {
renderOne({ id: 'w1', type: 'pivot', options: { data: [{ region: 'EMEA', amount: 1 }] } });
expect(screen.queryByText(/retired data format/i)).not.toBeInTheDocument();
});

/**
* The corpus half — DERIVED from the fixture, not transcribed from it
* (objectui#7151).
*
* Two of the rows above are hand-written literals introduced by comments
* naming a fixture. Those comments were TRUE when written and stopped being
* true 66 minutes later, and nothing noticed for months: a comment cannot
* detect the file it names changing, which is exactly what a test can do. So
* the relationship stops being prose here and becomes a read.
*
* It reads the file off disk rather than importing it because this package's
* `tsconfig.test.json` declares `"types": ["node"]` — the precondition
* `packages/types/src/__tests__/timeline-catalog-fixture-migrated.test.ts`
* could not meet in `packages/plugin-timeline` and had to relocate for. The
* root Vitest config aliases `@object-ui/*` to sibling `src/`, so this file
* needs no built dependency closure to resolve either half.
*
* What this block deliberately does NOT do is restore the independent-corpus
* property the annotations above lost, because that property is no longer
* obtainable. Measured across every JSON document in the repo: 28 dashboard
* widgets, ZERO carrying the retired top-level binding, against live controls
* of 15 `options`-shaped and 2 `dataset`-shaped widgets. That zero is by
* DESIGN, not by accident — the retirement's whole content is that no
* authoring surface emits the shape (`WidgetConfigPanel` scrubs it on save via
* `LEGACY_ANALYTICS_KEYS`), and the catalog is an authoring corpus. A specimen
* reappearing there is therefore a catalog regression, which is the second
* thing this block catches.
*/
describe('the catalog entry those two rows name (objectui#7151)', () => {
it('is on disk, and holds the widgets the derived rows below iterate', () => {
// Asserted before anything consumes `catalogWidgets`: an emptied or
// renamed `widgets` array turns the `it.each` below into ZERO tests and a
// green run — the vacuous pass this whole block exists to end.
expect(fs.existsSync(CATALOG_FIXTURE), `fixture not found at ${CATALOG_FIXTURE}`).toBe(true);
expect(catalogWidgets.length).toBeGreaterThan(0);
});

it('carries NO widget in the retired shape — which is why those rows are hand-written', () => {
expect(catalogWidgets.length).toBeGreaterThan(0);
const retired = catalogWidgets.filter(
(w) => 'object' in w || 'categoryField' in w || 'valueField' in w || 'aggregate' in w,
);
expect(
retired,
'a shipped catalog widget authors the retired pre-ADR-0021 binding again — either the catalog regressed, or there is finally a live corpus specimen to transcribe into the annotated rows above',
).toEqual([]);
});

// The independent-corpus property, restored on the side where the corpus
// still HAS specimens: these are the real shipped documents, and the
// detector must fire on none of them.
it.each(catalogWidgets.map((w, i) => [`widgets[${i}]`, w] as [string, Record<string, unknown>]))(
'does NOT show the placeholder for shipped catalog %s',
(_where, widget) => {
renderOne(widget);
expect(screen.queryByText(/retired data format/i)).not.toBeInTheDocument();
},
);
});
});
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .changeset/7151-legacy-retired-provenance.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
---
---

Test-only change to `plugin-dashboard`'s legacy-retired suite; no published behaviour changes.

The two annotated `it.each` rows in `DashboardGridLayout.legacyRetired.test.tsx` introduced their literals with provenance comments naming a schema-catalog fixture. Both were true when written and were invalidated 66 minutes later by the catalog migration off the retired shape (objectui#4600). The annotations now state the measured history and say plainly that the rows no longer carry the independent-corpus property, and the relationship they assert is derived at test time from the fixture instead of restated in prose.
Original file line numberDiff line numberDiff line change
Expand Up@@ -31,6 +31,9 @@
*/

import { describe, it, expect, afterEach } from 'vitest';
import fs from 'node:fs';
import path from 'node:path';
import { fileURLToPath } from 'node:url';
import React from 'react';
import { render, screen, cleanup } from '@testing-library/react';
import type { DashboardComponentSchema } from '@object-ui/types';
Expand All@@ -46,16 +49,46 @@ afterEach(cleanup);
const dash = (widget: Record<string, unknown>): DashboardComponentSchema =>
({ type: 'dashboard', widgets: [widget] }) as unknown as DashboardComponentSchema;

/**
* The catalog entry the two annotated rows below were transcribed from, named
* once so the prose and the derived block at the bottom cannot drift apart.
*/
const REPO_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..', '..', '..');
const CATALOG_FIXTURE = path.join(
REPO_ROOT,
'examples/schema-catalog/src/schemas/plugin-dashboard/filtered-dashboard.json',
);
const catalogWidgets = (
JSON.parse(fs.readFileSync(CATALOG_FIXTURE, 'utf8')) as { widgets: Record<string, unknown>[] }
).widgets;

describe('DashboardGridLayout retired legacy widgets (#4612)', () => {
it.each([
['chart', { id: 'w1', type: 'bar', object: 'invoices', categoryField: 'month', valueField: 'amount', aggregate: 'sum' }],
// Byte-for-byte `examples/schema-catalog/src/schemas/plugin-dashboard/
// filtered-dashboard.json` → `widgets[0]`: the real stored shape, not a
// fixture invented to match the detector.
// Transcribed from `filtered-dashboard.json` → `widgets[0]` as that fixture
// stood at `8640cec19`, the commit that added this file. It was byte-for-byte
// then — same keys, same order, same values — and it is NOT byte-for-byte
// now: `e028dfcd8` (objectui#4600, PR #4615) migrated the `filtered-*`
// entries off the retired shape 66 minutes later, so `widgets[0]` on disk is
// `{ id, title, type, options: { xField, yField, data } }` today.
//
// ⚠️ This row therefore does NOT carry the independent-corpus property the
// original annotation claimed for it. It is a HISTORICAL specimen of stored
// metadata, not a live transcription — which is the right thing to pin (a
// renderer cannot refuse to receive stored metadata) but is worth strictly
// less as evidence, so it is stated rather than left to be re-derived. No
// live specimen can replace it; the derived block at the bottom measures
// that, instead of asserting it here in prose the way this comment once did.
['catalog bar', { id: 'invoices_by_status', title: 'Invoices by Status', type: 'bar', object: 'invoices', categoryField: 'status', aggregate: 'count' }],
// The pivot family, whose legacy spelling names `rowField`/`columnField`.
['pivot', { id: 'w1', type: 'pivot', object: 'invoices', rowField: 'region', valueField: 'amount' }],
// `widgets[2]` of the same catalog entry.
// The same fixture's `widgets[2]` at that same commit, and a LOOSER claim
// than the row above ever made: its retired binding verbatim (`type`,
// `object`, `aggregate`), with `id` genericised to `w1` and `title` /
// `filterBindings` dropped. So this row was never byte-for-byte and never
// said it was. `e028dfcd8` retired that widget's shape too — `widgets[2]` is
// `{ id, title, type, options: { value }, filterBindings }` today — so the
// same ⚠️ above applies to it.
['metric', { id: 'w1', type: 'metric', object: 'invoices', aggregate: 'count' }],
])('renders the visible placeholder for a legacy %s widget', (_kind, widget) => {
render(<DashboardGridLayout schema={dash(widget)} />);
Expand DownExpand Up@@ -116,4 +149,64 @@ describe('DashboardGridLayout retired legacy widgets (#4612)', () => {
renderOne({ id: 'w1', type: 'pivot', options: { data: [{ region: 'EMEA', amount: 1 }] } });
expect(screen.queryByText(/retired data format/i)).not.toBeInTheDocument();
});

/**
* The corpus half — DERIVED from the fixture, not transcribed from it
* (objectui#7151).
*
* Two of the rows above are hand-written literals introduced by comments
* naming a fixture. Those comments were TRUE when written and stopped being
* true 66 minutes later, and nothing noticed for months: a comment cannot
* detect the file it names changing, which is exactly what a test can do. So
* the relationship stops being prose here and becomes a read.
*
* It reads the file off disk rather than importing it because this package's
* `tsconfig.test.json` declares `"types": ["node"]` — the precondition
* `packages/types/src/__tests__/timeline-catalog-fixture-migrated.test.ts`
* could not meet in `packages/plugin-timeline` and had to relocate for. The
* root Vitest config aliases `@object-ui/*` to sibling `src/`, so this file
* needs no built dependency closure to resolve either half.
*
* What this block deliberately does NOT do is restore the independent-corpus
* property the annotations above lost, because that property is no longer
* obtainable. Measured across every JSON document in the repo: 28 dashboard
* widgets, ZERO carrying the retired top-level binding, against live controls
* of 15 `options`-shaped and 2 `dataset`-shaped widgets. That zero is by
* DESIGN, not by accident — the retirement's whole content is that no
* authoring surface emits the shape (`WidgetConfigPanel` scrubs it on save via
* `LEGACY_ANALYTICS_KEYS`), and the catalog is an authoring corpus. A specimen
* reappearing there is therefore a catalog regression, which is the second
* thing this block catches.
*/
describe('the catalog entry those two rows name (objectui#7151)', () => {
it('is on disk, and holds the widgets the derived rows below iterate', () => {
// Asserted before anything consumes `catalogWidgets`: an emptied or
// renamed `widgets` array turns the `it.each` below into ZERO tests and a
// green run — the vacuous pass this whole block exists to end.
expect(fs.existsSync(CATALOG_FIXTURE), `fixture not found at ${CATALOG_FIXTURE}`).toBe(true);
expect(catalogWidgets.length).toBeGreaterThan(0);
});

it('carries NO widget in the retired shape — which is why those rows are hand-written', () => {
expect(catalogWidgets.length).toBeGreaterThan(0);
const retired = catalogWidgets.filter(
(w) => 'object' in w || 'categoryField' in w || 'valueField' in w || 'aggregate' in w,
);
expect(
retired,
'a shipped catalog widget authors the retired pre-ADR-0021 binding again — either the catalog regressed, or there is finally a live corpus specimen to transcribe into the annotated rows above',
).toEqual([]);
});

// The independent-corpus property, restored on the side where the corpus
// still HAS specimens: these are the real shipped documents, and the
// detector must fire on none of them.
it.each(catalogWidgets.map((w, i) => [`widgets[${i}]`, w] as [string, Record<string, unknown>]))(
'does NOT show the placeholder for shipped catalog %s',
(_where, widget) => {
renderOne(widget);
expect(screen.queryByText(/retired data format/i)).not.toBeInTheDocument();
},
);
});
});
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .changeset/7151-legacy-retired-provenance.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
---
---

Test-only change to `plugin-dashboard`'s legacy-retired suite; no published behaviour changes.

The two annotated `it.each` rows in `DashboardGridLayout.legacyRetired.test.tsx` introduced their literals with provenance comments naming a schema-catalog fixture. Both were true when written and were invalidated 66 minutes later by the catalog migration off the retired shape (objectui#4600). The annotations now state the measured history and say plainly that the rows no longer carry the independent-corpus property, and the relationship they assert is derived at test time from the fixture instead of restated in prose.
Original file line numberDiff line numberDiff line change
Expand Up@@ -31,6 +31,9 @@
*/

import { describe, it, expect, afterEach } from 'vitest';
import fs from 'node:fs';
import path from 'node:path';
import { fileURLToPath } from 'node:url';
import React from 'react';
import { render, screen, cleanup } from '@testing-library/react';
import type { DashboardComponentSchema } from '@object-ui/types';
Expand All@@ -46,16 +49,46 @@ afterEach(cleanup);
const dash = (widget: Record<string, unknown>): DashboardComponentSchema =>
({ type: 'dashboard', widgets: [widget] }) as unknown as DashboardComponentSchema;

/**
* The catalog entry the two annotated rows below were transcribed from, named
* once so the prose and the derived block at the bottom cannot drift apart.
*/
const REPO_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..', '..', '..');
const CATALOG_FIXTURE = path.join(
REPO_ROOT,
'examples/schema-catalog/src/schemas/plugin-dashboard/filtered-dashboard.json',
);
const catalogWidgets = (
JSON.parse(fs.readFileSync(CATALOG_FIXTURE, 'utf8')) as { widgets: Record<string, unknown>[] }
).widgets;

describe('DashboardGridLayout retired legacy widgets (#4612)', () => {
it.each([
['chart', { id: 'w1', type: 'bar', object: 'invoices', categoryField: 'month', valueField: 'amount', aggregate: 'sum' }],
// Byte-for-byte `examples/schema-catalog/src/schemas/plugin-dashboard/
// filtered-dashboard.json` → `widgets[0]`: the real stored shape, not a
// fixture invented to match the detector.
// Transcribed from `filtered-dashboard.json` → `widgets[0]` as that fixture
// stood at `8640cec19`, the commit that added this file. It was byte-for-byte
// then — same keys, same order, same values — and it is NOT byte-for-byte
// now: `e028dfcd8` (objectui#4600, PR #4615) migrated the `filtered-*`
// entries off the retired shape 66 minutes later, so `widgets[0]` on disk is
// `{ id, title, type, options: { xField, yField, data } }` today.
//
// ⚠️ This row therefore does NOT carry the independent-corpus property the
// original annotation claimed for it. It is a HISTORICAL specimen of stored
// metadata, not a live transcription — which is the right thing to pin (a
// renderer cannot refuse to receive stored metadata) but is worth strictly
// less as evidence, so it is stated rather than left to be re-derived. No
// live specimen can replace it; the derived block at the bottom measures
// that, instead of asserting it here in prose the way this comment once did.
['catalog bar', { id: 'invoices_by_status', title: 'Invoices by Status', type: 'bar', object: 'invoices', categoryField: 'status', aggregate: 'count' }],
// The pivot family, whose legacy spelling names `rowField`/`columnField`.
['pivot', { id: 'w1', type: 'pivot', object: 'invoices', rowField: 'region', valueField: 'amount' }],
// `widgets[2]` of the same catalog entry.
// The same fixture's `widgets[2]` at that same commit, and a LOOSER claim
// than the row above ever made: its retired binding verbatim (`type`,
// `object`, `aggregate`), with `id` genericised to `w1` and `title` /
// `filterBindings` dropped. So this row was never byte-for-byte and never
// said it was. `e028dfcd8` retired that widget's shape too — `widgets[2]` is
// `{ id, title, type, options: { value }, filterBindings }` today — so the
// same ⚠️ above applies to it.
['metric', { id: 'w1', type: 'metric', object: 'invoices', aggregate: 'count' }],
])('renders the visible placeholder for a legacy %s widget', (_kind, widget) => {
render(<DashboardGridLayout schema={dash(widget)} />);
Expand DownExpand Up@@ -116,4 +149,64 @@ describe('DashboardGridLayout retired legacy widgets (#4612)', () => {
renderOne({ id: 'w1', type: 'pivot', options: { data: [{ region: 'EMEA', amount: 1 }] } });
expect(screen.queryByText(/retired data format/i)).not.toBeInTheDocument();
});

/**
* The corpus half — DERIVED from the fixture, not transcribed from it
* (objectui#7151).
*
* Two of the rows above are hand-written literals introduced by comments
* naming a fixture. Those comments were TRUE when written and stopped being
* true 66 minutes later, and nothing noticed for months: a comment cannot
* detect the file it names changing, which is exactly what a test can do. So
* the relationship stops being prose here and becomes a read.
*
* It reads the file off disk rather than importing it because this package's
* `tsconfig.test.json` declares `"types": ["node"]` — the precondition
* `packages/types/src/__tests__/timeline-catalog-fixture-migrated.test.ts`
* could not meet in `packages/plugin-timeline` and had to relocate for. The
* root Vitest config aliases `@object-ui/*` to sibling `src/`, so this file
* needs no built dependency closure to resolve either half.
*
* What this block deliberately does NOT do is restore the independent-corpus
* property the annotations above lost, because that property is no longer
* obtainable. Measured across every JSON document in the repo: 28 dashboard
* widgets, ZERO carrying the retired top-level binding, against live controls
* of 15 `options`-shaped and 2 `dataset`-shaped widgets. That zero is by
* DESIGN, not by accident — the retirement's whole content is that no
* authoring surface emits the shape (`WidgetConfigPanel` scrubs it on save via
* `LEGACY_ANALYTICS_KEYS`), and the catalog is an authoring corpus. A specimen
* reappearing there is therefore a catalog regression, which is the second
* thing this block catches.
*/
describe('the catalog entry those two rows name (objectui#7151)', () => {
it('is on disk, and holds the widgets the derived rows below iterate', () => {
// Asserted before anything consumes `catalogWidgets`: an emptied or
// renamed `widgets` array turns the `it.each` below into ZERO tests and a
// green run — the vacuous pass this whole block exists to end.
expect(fs.existsSync(CATALOG_FIXTURE), `fixture not found at ${CATALOG_FIXTURE}`).toBe(true);
expect(catalogWidgets.length).toBeGreaterThan(0);
});

it('carries NO widget in the retired shape — which is why those rows are hand-written', () => {
expect(catalogWidgets.length).toBeGreaterThan(0);
const retired = catalogWidgets.filter(
(w) => 'object' in w || 'categoryField' in w || 'valueField' in w || 'aggregate' in w,
);
expect(
retired,
'a shipped catalog widget authors the retired pre-ADR-0021 binding again — either the catalog regressed, or there is finally a live corpus specimen to transcribe into the annotated rows above',
).toEqual([]);
});

// The independent-corpus property, restored on the side where the corpus
// still HAS specimens: these are the real shipped documents, and the
// detector must fire on none of them.
it.each(catalogWidgets.map((w, i) => [`widgets[${i}]`, w] as [string, Record<string, unknown>]))(
'does NOT show the placeholder for shipped catalog %s',
(_where, widget) => {
renderOne(widget);
expect(screen.queryByText(/retired data format/i)).not.toBeInTheDocument();
},
);
});
});
Loading