polen 0.11.0-next.18 → 0.11.0-next.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/build/api/errors.d.ts +278 -0
  2. package/build/api/errors.d.ts.map +1 -0
  3. package/build/api/errors.js +153 -0
  4. package/build/api/errors.js.map +1 -0
  5. package/build/api/schema/input-source/$$.d.ts +1 -0
  6. package/build/api/schema/input-source/$$.d.ts.map +1 -1
  7. package/build/api/schema/input-source/$$.js +1 -0
  8. package/build/api/schema/input-source/$$.js.map +1 -1
  9. package/build/api/schema/input-source/errors.d.ts +36 -0
  10. package/build/api/schema/input-source/errors.d.ts.map +1 -0
  11. package/build/api/schema/input-source/errors.js +17 -0
  12. package/build/api/schema/input-source/errors.js.map +1 -0
  13. package/build/api/schema/input-source/input-source.d.ts +1 -7
  14. package/build/api/schema/input-source/input-source.d.ts.map +1 -1
  15. package/build/api/schema/input-source/input-source.js +0 -6
  16. package/build/api/schema/input-source/input-source.js.map +1 -1
  17. package/build/api/schema/input-sources/directory.d.ts.map +1 -1
  18. package/build/api/schema/input-sources/directory.js +17 -4
  19. package/build/api/schema/input-sources/directory.js.map +1 -1
  20. package/build/api/schema/input-sources/file.d.ts.map +1 -1
  21. package/build/api/schema/input-sources/file.js +15 -4
  22. package/build/api/schema/input-sources/file.js.map +1 -1
  23. package/build/api/schema/input-sources/introspection-file.d.ts.map +1 -1
  24. package/build/api/schema/input-sources/introspection-file.js +28 -6
  25. package/build/api/schema/input-sources/introspection-file.js.map +1 -1
  26. package/build/api/schema/input-sources/introspection.d.ts.map +1 -1
  27. package/build/api/schema/input-sources/introspection.js +35 -7
  28. package/build/api/schema/input-sources/introspection.js.map +1 -1
  29. package/build/api/schema/input-sources/memory.d.ts.map +1 -1
  30. package/build/api/schema/input-sources/memory.js +15 -3
  31. package/build/api/schema/input-sources/memory.js.map +1 -1
  32. package/build/api/schema/input-sources/versioned-directory.js +20 -4
  33. package/build/api/schema/input-sources/versioned-directory.js.map +1 -1
  34. package/build/api/schema/load.d.ts +1 -1
  35. package/build/api/schema/load.d.ts.map +1 -1
  36. package/build/api/schema/load.js +1 -1
  37. package/build/api/schema/load.js.map +1 -1
  38. package/build/cli/commands/hero-image.d.ts +1 -2
  39. package/build/cli/commands/hero-image.d.ts.map +1 -1
  40. package/build/cli/index.d.ts +1 -1
  41. package/build/template/components/ReferenceVersionPicker.d.ts +9 -0
  42. package/build/template/components/ReferenceVersionPicker.d.ts.map +1 -0
  43. package/build/template/components/ReferenceVersionPicker.js +79 -0
  44. package/build/template/components/ReferenceVersionPicker.js.map +1 -0
  45. package/build/template/components/VersionPicker.d.ts +8 -3
  46. package/build/template/components/VersionPicker.d.ts.map +1 -1
  47. package/build/template/components/VersionPicker.js +12 -77
  48. package/build/template/components/VersionPicker.js.map +1 -1
  49. package/build/template/routes/changelog/ChangelogBody.d.ts +6 -0
  50. package/build/template/routes/changelog/ChangelogBody.d.ts.map +1 -0
  51. package/build/template/{components/Changelog/Changelog.js → routes/changelog/ChangelogBody.js} +8 -58
  52. package/build/template/routes/changelog/ChangelogBody.js.map +1 -0
  53. package/build/template/routes/changelog/ChangelogSidebar.d.ts +7 -0
  54. package/build/template/routes/changelog/ChangelogSidebar.d.ts.map +1 -0
  55. package/build/template/routes/changelog/ChangelogSidebar.js +46 -0
  56. package/build/template/routes/changelog/ChangelogSidebar.js.map +1 -0
  57. package/build/template/routes/changelog/ChangelogSidebarItem.d.ts +11 -0
  58. package/build/template/routes/changelog/ChangelogSidebarItem.d.ts.map +1 -0
  59. package/build/template/routes/changelog/ChangelogSidebarItem.js +35 -0
  60. package/build/template/routes/changelog/ChangelogSidebarItem.js.map +1 -0
  61. package/build/template/routes/changelog/_.d.ts +3264 -0
  62. package/build/template/routes/changelog/_.d.ts.map +1 -0
  63. package/build/template/routes/changelog/_.js +111 -0
  64. package/build/template/routes/changelog/_.js.map +1 -0
  65. package/build/template/routes/changelog/utils.d.ts +3 -0
  66. package/build/template/routes/changelog/utils.d.ts.map +1 -0
  67. package/build/template/routes/changelog/utils.js +11 -0
  68. package/build/template/routes/changelog/utils.js.map +1 -0
  69. package/build/template/routes/reference.js +2 -2
  70. package/build/template/routes/reference.js.map +1 -1
  71. package/build/template/routes/root.js +1 -1
  72. package/build/template/routes/root.js.map +1 -1
  73. package/build/template/theme/swiss-sharp.css +14 -14
  74. package/build/vite/plugins/schemas.d.ts +1 -2
  75. package/build/vite/plugins/schemas.d.ts.map +1 -1
  76. package/build/vite/plugins/schemas.js +0 -1
  77. package/build/vite/plugins/schemas.js.map +1 -1
  78. package/package.json +1 -1
  79. package/src/api/errors.ts +227 -0
  80. package/src/api/schema/input-source/$$.ts +1 -0
  81. package/src/api/schema/input-source/errors.ts +26 -0
  82. package/src/api/schema/input-source/input-source.ts +1 -22
  83. package/src/api/schema/input-sources/directory.ts +18 -13
  84. package/src/api/schema/input-sources/file.ts +17 -4
  85. package/src/api/schema/input-sources/introspection-file.ts +30 -15
  86. package/src/api/schema/input-sources/introspection.ts +38 -7
  87. package/src/api/schema/input-sources/memory.ts +19 -3
  88. package/src/api/schema/input-sources/versioned-directory.ts +20 -20
  89. package/src/api/schema/load.ts +3 -2
  90. package/src/template/components/ReferenceVersionPicker.tsx +107 -0
  91. package/src/template/components/VersionPicker.tsx +32 -98
  92. package/src/template/{components/Changelog/Changelog.tsx → routes/changelog/ChangelogBody.tsx} +7 -64
  93. package/src/template/routes/changelog/ChangelogSidebar.tsx +80 -0
  94. package/src/template/routes/changelog/ChangelogSidebarItem.tsx +68 -0
  95. package/src/template/routes/changelog/_.tsx +129 -0
  96. package/src/template/routes/changelog/utils.ts +13 -0
  97. package/src/template/routes/reference.tsx +2 -2
  98. package/src/template/routes/root.tsx +1 -1
  99. package/src/template/theme/swiss-sharp.css +14 -14
  100. package/src/vite/plugins/schemas.ts +0 -1
  101. package/build/sandbox.d.ts +0 -2
  102. package/build/sandbox.d.ts.map +0 -1
  103. package/build/sandbox.js +0 -17
  104. package/build/sandbox.js.map +0 -1
  105. package/build/template/components/Changelog/Changelog.d.ts +0 -8
  106. package/build/template/components/Changelog/Changelog.d.ts.map +0 -1
  107. package/build/template/components/Changelog/Changelog.js.map +0 -1
  108. package/build/template/components/Changelog/ChangelogVersionPicker.d.ts +0 -8
  109. package/build/template/components/Changelog/ChangelogVersionPicker.d.ts.map +0 -1
  110. package/build/template/components/Changelog/ChangelogVersionPicker.js +0 -16
  111. package/build/template/components/Changelog/ChangelogVersionPicker.js.map +0 -1
  112. package/build/template/components/SimpleVersionPicker.d.ts +0 -15
  113. package/build/template/components/SimpleVersionPicker.d.ts.map +0 -1
  114. package/build/template/components/SimpleVersionPicker.js +0 -15
  115. package/build/template/components/SimpleVersionPicker.js.map +0 -1
  116. package/build/template/routes/changelog.d.ts +0 -1635
  117. package/build/template/routes/changelog.d.ts.map +0 -1
  118. package/build/template/routes/changelog.js +0 -168
  119. package/build/template/routes/changelog.js.map +0 -1
  120. package/src/sandbox.ts +0 -15
  121. package/src/template/components/Changelog/ChangelogVersionPicker.tsx +0 -36
  122. package/src/template/components/SimpleVersionPicker.tsx +0 -48
  123. package/src/template/routes/changelog.tsx +0 -267
@@ -1 +0,0 @@
1
- {"version":3,"file":"changelog.d.ts","sourceRoot":"","sources":["../../../src/template/routes/changelog.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AA+OtC,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YAqBlB,CAAA"}
@@ -1,168 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { Catalog } from '#lib/catalog';
3
- import { Change } from '#lib/change';
4
- import { route } from '#lib/react-router-effect/route';
5
- import { useLoaderData } from '#lib/react-router-effect/use-loader-data';
6
- import { Revision } from '#lib/revision';
7
- import { Swiss } from '#lib/swiss';
8
- import { Version } from '#lib/version';
9
- import { Box, Flex, Text } from '@radix-ui/themes';
10
- import { Effect, HashMap, Option } from 'effect';
11
- import React, { useEffect, useMemo, useState } from 'react';
12
- import { useParams } from 'react-router';
13
- import { schemasCatalog } from 'virtual:polen/project/schemas';
14
- import { Changelog } from '../components/Changelog/Changelog.js';
15
- import { renderDate } from '../components/Changelog/Changelog.js';
16
- import { ChangelogVersionPicker } from '../components/Changelog/ChangelogVersionPicker.js';
17
- const calculateCounts = (revision) => {
18
- return {
19
- breaking: revision.changes.filter(Change.isBreaking).length,
20
- dangerous: revision.changes.filter(Change.isDangerous).length,
21
- safe: revision.changes.filter(Change.isSafe).length,
22
- };
23
- };
24
- const SidebarEntry = ({ revision, counts, isActive }) => {
25
- const dateId = revision.date;
26
- return (_jsx(Box, { mb: '2', children: _jsxs("a", { href: `#${dateId}`, style: {
27
- textDecoration: 'none',
28
- display: 'flex',
29
- alignItems: 'center',
30
- justifyContent: 'space-between',
31
- padding: '0.5rem 0.75rem',
32
- borderRadius: '4px',
33
- backgroundColor: isActive ? 'var(--gray-a3)' : 'transparent',
34
- color: 'inherit',
35
- transition: 'background-color 0.2s',
36
- }, onClick: (e) => {
37
- e.preventDefault();
38
- // Update URL hash
39
- window.history.pushState(null, '', `#${dateId}`);
40
- // Dispatch custom event for pushState
41
- window.dispatchEvent(new Event('pushstate'));
42
- // Smooth scroll to element
43
- document.getElementById(dateId)?.scrollIntoView({ behavior: 'smooth' });
44
- }, children: [_jsx(Text, { size: '2', weight: isActive ? 'medium' : 'regular', children: renderDate(revision.date) }), _jsxs(Flex, { gap: '2', align: 'center', children: [counts.breaking > 0 && (_jsx(Text, { size: '1', weight: 'medium', style: { color: '#ef4444' }, children: counts.breaking })), counts.dangerous > 0 && (_jsx(Text, { size: '1', weight: 'medium', style: { color: '#f59e0b' }, children: counts.dangerous })), counts.safe > 0 && (_jsx(Text, { size: '1', weight: 'medium', style: { color: '#10b981' }, children: counts.safe }))] })] }) }));
45
- };
46
- //
47
- //
48
- //
49
- //
50
- // ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ • Schema
51
- //
52
- //
53
- const schema = Catalog.Catalog;
54
- //
55
- //
56
- //
57
- //
58
- // ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ • Loader
59
- //
60
- //
61
- const changelogLoader = () => {
62
- // This should never be called when schemasCatalog is null
63
- // because the route won't be added to the router
64
- // But we return an Effect.fail for safety
65
- if (!schemasCatalog) {
66
- return Effect.fail(new Error('No schema catalog available. This page requires a GraphQL schema to be configured. '
67
- + 'Please ensure your Polen configuration includes a valid schema source.'));
68
- }
69
- return Effect.succeed(schemasCatalog);
70
- };
71
- //
72
- //
73
- //
74
- //
75
- // ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ • Component
76
- //
77
- //
78
- const Component = () => {
79
- const catalog = useLoaderData(schema);
80
- const [activeRevision, setActiveRevision] = useState(null);
81
- const params = useParams();
82
- const urlVersion = params['version'];
83
- // Get available versions if catalog is versioned
84
- const availableVersions = useMemo(() => {
85
- if (Catalog.Versioned.is(catalog)) {
86
- return Catalog.Versioned.getVersions(catalog).map(Version.encodeSync);
87
- }
88
- return [];
89
- }, [catalog]);
90
- // Get revisions for the current version (for sidebar)
91
- const revisions = useMemo(() => {
92
- if (Catalog.Unversioned.is(catalog)) {
93
- return catalog.schema.revisions;
94
- }
95
- else {
96
- // For versioned catalogs, show only current version's revisions
97
- if (urlVersion) {
98
- const entryOption = Option.map(HashMap.findFirst(catalog.entries, (_, key) => Version.encodeSync(key) === urlVersion), ([, value]) => value);
99
- return Option.match(entryOption, {
100
- onNone: () => [],
101
- onSome: (entry) => entry.revisions,
102
- });
103
- }
104
- // No revisions if no version selected (will redirect)
105
- return [];
106
- }
107
- }, [catalog, urlVersion]);
108
- // Calculate counts for all revisions (SSR-safe)
109
- const revisionsWithCounts = revisions.map(revision => ({
110
- revision,
111
- counts: calculateCounts(revision),
112
- }));
113
- // Track active revision based on URL hash
114
- useEffect(() => {
115
- const handleHashChange = () => {
116
- const hash = window.location.hash.slice(1);
117
- setActiveRevision(hash || null);
118
- };
119
- // Set initial active revision
120
- handleHashChange();
121
- // Listen for hash changes
122
- window.addEventListener('hashchange', handleHashChange);
123
- // Listen for pushState/replaceState (custom event we'll dispatch)
124
- window.addEventListener('pushstate', handleHashChange);
125
- return () => {
126
- window.removeEventListener('hashchange', handleHashChange);
127
- window.removeEventListener('pushstate', handleHashChange);
128
- };
129
- }, []);
130
- return (_jsxs(Swiss.Body, { subgrid: true, children: [_jsxs(Swiss.Item, { cols: 4, style: {
131
- position: 'sticky',
132
- top: '2rem',
133
- height: 'fit-content',
134
- minWidth: '250px',
135
- maxHeight: 'calc(100vh - 4rem)',
136
- overflowY: 'auto',
137
- }, children: [Catalog.Versioned.is(catalog) && availableVersions.length > 1 && urlVersion && (_jsx(Box, { mb: '3', children: _jsx(ChangelogVersionPicker, { versions: availableVersions, currentVersion: urlVersion }) })), _jsx(Text, { size: '2', weight: 'medium', mb: '3', style: { display: 'block' }, children: "Revisions" }), revisionsWithCounts.map(({ revision, counts }) => (_jsx(SidebarEntry, { revision: revision, counts: counts, isActive: activeRevision === revision.date }, revision.date)))] }), _jsx(Swiss.Item, { start: 6, cols: 7, children: _jsx(Changelog, { catalog: catalog }) })] }));
138
- };
139
- //
140
- //
141
- //
142
- //
143
- // ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ • Routes
144
- //
145
- //
146
- export const changelog = !schemasCatalog
147
- ? null
148
- : route({
149
- schema,
150
- path: `changelog`,
151
- loader: changelogLoader,
152
- Component,
153
- children: [
154
- // Support deep linking to specific version
155
- route({
156
- path: `version/:version`,
157
- loader: changelogLoader,
158
- Component,
159
- }),
160
- // Support deep linking to specific version/revision
161
- route({
162
- path: `version/:version/revision/:revision`,
163
- loader: changelogLoader,
164
- Component,
165
- }),
166
- ],
167
- });
168
- //# sourceMappingURL=changelog.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"changelog.js","sourceRoot":"","sources":["../../../src/template/routes/changelog.tsx"],"names":[],"mappings":"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"}
package/src/sandbox.ts DELETED
@@ -1,15 +0,0 @@
1
- //
2
- //
3
- //
4
- //
5
- //
6
- // Temporary Work File
7
- //
8
- // ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
9
- //
10
- // – Use freely
11
- // – Try to remember to not commit changes
12
- // – Included by development TypeScript configuration
13
- // – Excluded by build TypeScript configuration
14
- //
15
- //
@@ -1,36 +0,0 @@
1
- import { Select } from '@radix-ui/themes'
2
- import React from 'react'
3
- import { useNavigate } from 'react-router'
4
-
5
- interface Props {
6
- versions: string[]
7
- currentVersion: string
8
- }
9
-
10
- export const ChangelogVersionPicker: React.FC<Props> = ({ versions, currentVersion }) => {
11
- const navigate = useNavigate()
12
-
13
- // Don't show selector if only one version
14
- if (versions.length <= 1) {
15
- return null
16
- }
17
-
18
- const handleVersionChange = (newVersion: string) => {
19
- navigate(`/changelog/version/${newVersion}`)
20
- }
21
-
22
- return (
23
- <Select.Root value={currentVersion} onValueChange={handleVersionChange}>
24
- <Select.Trigger>
25
- Version {currentVersion}
26
- </Select.Trigger>
27
- <Select.Content>
28
- {versions.map(version => (
29
- <Select.Item key={version} value={version}>
30
- Version {version}
31
- </Select.Item>
32
- ))}
33
- </Select.Content>
34
- </Select.Root>
35
- )
36
- }
@@ -1,48 +0,0 @@
1
- import { Version } from '#lib/version/$'
2
- import { Select } from '@radix-ui/themes'
3
- import type * as React from 'react'
4
-
5
- interface Props {
6
- versions: readonly Version.Version[]
7
- currentVersion: Version.Version
8
- onVersionChange: (version: Version.Version) => void
9
- label?: string
10
- }
11
-
12
- /**
13
- * A generic version picker component that can be used for any versioned content.
14
- * This is a controlled component - parent manages the state.
15
- */
16
- export const SimpleVersionPicker: React.FC<Props> = ({
17
- versions,
18
- currentVersion,
19
- onVersionChange,
20
- label = '',
21
- }) => {
22
- // Don't show selector if only one version
23
- if (versions.length <= 1) {
24
- return null
25
- }
26
-
27
- return (
28
- <Select.Root
29
- value={Version.encodeSync(currentVersion)}
30
- onValueChange={(versionEncoded) => onVersionChange(Version.fromString(versionEncoded))}
31
- >
32
- <Select.Trigger style={{ minWidth: '120px' }}>
33
- {label}
34
- {label ? ' ' : ''}
35
- {Version.encodeSync(currentVersion)}
36
- </Select.Trigger>
37
- <Select.Content position='popper' sideOffset={5}>
38
- {versions.map(version => (
39
- <Select.Item key={Version.encodeSync(version)} value={Version.encodeSync(version)}>
40
- {label}
41
- {label ? ' ' : ''}
42
- {Version.encodeSync(version)}
43
- </Select.Item>
44
- ))}
45
- </Select.Content>
46
- </Select.Root>
47
- )
48
- }
@@ -1,267 +0,0 @@
1
- import { Catalog } from '#lib/catalog'
2
- import { Change } from '#lib/change'
3
- import { route } from '#lib/react-router-effect/route'
4
- import { useLoaderData } from '#lib/react-router-effect/use-loader-data'
5
- import { Revision } from '#lib/revision'
6
- import { Swiss } from '#lib/swiss'
7
- import { Version } from '#lib/version'
8
- import { Box, Flex, Text } from '@radix-ui/themes'
9
- import { Effect, HashMap, Option } from 'effect'
10
- import React, { useEffect, useMemo, useState } from 'react'
11
- import { useParams } from 'react-router'
12
- import { schemasCatalog } from 'virtual:polen/project/schemas'
13
- import { Changelog } from '../components/Changelog/Changelog.js'
14
- import { renderDate } from '../components/Changelog/Changelog.js'
15
- import { ChangelogVersionPicker } from '../components/Changelog/ChangelogVersionPicker.js'
16
-
17
- interface VersionCounts {
18
- breaking: number
19
- dangerous: number
20
- safe: number
21
- }
22
-
23
- const calculateCounts = (revision: Revision.Revision): VersionCounts => {
24
- return {
25
- breaking: revision.changes.filter(Change.isBreaking).length,
26
- dangerous: revision.changes.filter(Change.isDangerous).length,
27
- safe: revision.changes.filter(Change.isSafe).length,
28
- }
29
- }
30
-
31
- const SidebarEntry: React.FC<{
32
- revision: Revision.Revision
33
- counts: VersionCounts
34
- isActive: boolean
35
- }> = ({ revision, counts, isActive }) => {
36
- const dateId = revision.date
37
-
38
- return (
39
- <Box mb='2'>
40
- <a
41
- href={`#${dateId}`}
42
- style={{
43
- textDecoration: 'none',
44
- display: 'flex',
45
- alignItems: 'center',
46
- justifyContent: 'space-between',
47
- padding: '0.5rem 0.75rem',
48
- borderRadius: '4px',
49
- backgroundColor: isActive ? 'var(--gray-a3)' : 'transparent',
50
- color: 'inherit',
51
- transition: 'background-color 0.2s',
52
- }}
53
- onClick={(e) => {
54
- e.preventDefault()
55
- // Update URL hash
56
- window.history.pushState(null, '', `#${dateId}`)
57
- // Dispatch custom event for pushState
58
- window.dispatchEvent(new Event('pushstate'))
59
- // Smooth scroll to element
60
- document.getElementById(dateId)?.scrollIntoView({ behavior: 'smooth' })
61
- }}
62
- >
63
- <Text size='2' weight={isActive ? 'medium' : 'regular'}>
64
- {renderDate(revision.date)}
65
- </Text>
66
- <Flex gap='2' align='center'>
67
- {counts.breaking > 0 && (
68
- <Text size='1' weight='medium' style={{ color: '#ef4444' }}>
69
- {counts.breaking}
70
- </Text>
71
- )}
72
- {counts.dangerous > 0 && (
73
- <Text size='1' weight='medium' style={{ color: '#f59e0b' }}>
74
- {counts.dangerous}
75
- </Text>
76
- )}
77
- {counts.safe > 0 && (
78
- <Text size='1' weight='medium' style={{ color: '#10b981' }}>
79
- {counts.safe}
80
- </Text>
81
- )}
82
- </Flex>
83
- </a>
84
- </Box>
85
- )
86
- }
87
-
88
- //
89
- //
90
- //
91
- //
92
- // ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ • Schema
93
- //
94
- //
95
-
96
- const schema = Catalog.Catalog
97
-
98
- //
99
- //
100
- //
101
- //
102
- // ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ • Loader
103
- //
104
- //
105
-
106
- const changelogLoader = () => {
107
- // This should never be called when schemasCatalog is null
108
- // because the route won't be added to the router
109
- // But we return an Effect.fail for safety
110
- if (!schemasCatalog) {
111
- return Effect.fail(
112
- new Error(
113
- 'No schema catalog available. This page requires a GraphQL schema to be configured. '
114
- + 'Please ensure your Polen configuration includes a valid schema source.',
115
- ),
116
- )
117
- }
118
- return Effect.succeed(schemasCatalog)
119
- }
120
-
121
- //
122
- //
123
- //
124
- //
125
- // ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ • Component
126
- //
127
- //
128
-
129
- const Component = () => {
130
- const catalog = useLoaderData(schema)
131
-
132
- const [activeRevision, setActiveRevision] = useState<string | null>(null)
133
- const params = useParams()
134
- const urlVersion = params['version']
135
-
136
- // Get available versions if catalog is versioned
137
- const availableVersions = useMemo(() => {
138
- if (Catalog.Versioned.is(catalog)) {
139
- return Catalog.Versioned.getVersions(catalog).map(Version.encodeSync)
140
- }
141
- return []
142
- }, [catalog])
143
-
144
- // Get revisions for the current version (for sidebar)
145
- const revisions = useMemo(() => {
146
- if (Catalog.Unversioned.is(catalog)) {
147
- return catalog.schema.revisions
148
- } else {
149
- // For versioned catalogs, show only current version's revisions
150
- if (urlVersion) {
151
- const entryOption = Option.map(
152
- HashMap.findFirst(catalog.entries, (_, key) => Version.encodeSync(key) === urlVersion),
153
- ([, value]) => value,
154
- )
155
- return Option.match(entryOption, {
156
- onNone: () => [],
157
- onSome: (entry) => entry.revisions,
158
- })
159
- }
160
- // No revisions if no version selected (will redirect)
161
- return []
162
- }
163
- }, [catalog, urlVersion])
164
-
165
- // Calculate counts for all revisions (SSR-safe)
166
- const revisionsWithCounts = revisions.map(revision => ({
167
- revision,
168
- counts: calculateCounts(revision),
169
- }))
170
-
171
- // Track active revision based on URL hash
172
- useEffect(() => {
173
- const handleHashChange = () => {
174
- const hash = window.location.hash.slice(1)
175
- setActiveRevision(hash || null)
176
- }
177
-
178
- // Set initial active revision
179
- handleHashChange()
180
-
181
- // Listen for hash changes
182
- window.addEventListener('hashchange', handleHashChange)
183
-
184
- // Listen for pushState/replaceState (custom event we'll dispatch)
185
- window.addEventListener('pushstate', handleHashChange)
186
-
187
- return () => {
188
- window.removeEventListener('hashchange', handleHashChange)
189
- window.removeEventListener('pushstate', handleHashChange)
190
- }
191
- }, [])
192
-
193
- return (
194
- <Swiss.Body subgrid>
195
- {/* Sidebar */}
196
- <Swiss.Item
197
- cols={4}
198
- style={{
199
- position: 'sticky',
200
- top: '2rem',
201
- height: 'fit-content',
202
- minWidth: '250px',
203
- maxHeight: 'calc(100vh - 4rem)',
204
- overflowY: 'auto',
205
- }}
206
- >
207
- {/* Version picker for versioned catalogs */}
208
- {Catalog.Versioned.is(catalog) && availableVersions.length > 1 && urlVersion && (
209
- <Box mb='3'>
210
- <ChangelogVersionPicker
211
- versions={availableVersions}
212
- currentVersion={urlVersion}
213
- />
214
- </Box>
215
- )}
216
-
217
- <Text size='2' weight='medium' mb='3' style={{ display: 'block' }}>
218
- Revisions
219
- </Text>
220
- {revisionsWithCounts.map(({ revision, counts }) => (
221
- <SidebarEntry
222
- key={revision.date}
223
- revision={revision}
224
- counts={counts}
225
- isActive={activeRevision === revision.date}
226
- />
227
- ))}
228
- </Swiss.Item>
229
-
230
- {/* Main content */}
231
- <Swiss.Item start={6} cols={7}>
232
- <Changelog catalog={catalog} />
233
- </Swiss.Item>
234
- </Swiss.Body>
235
- )
236
- }
237
-
238
- //
239
- //
240
- //
241
- //
242
- // ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ • Routes
243
- //
244
- //
245
-
246
- export const changelog = !schemasCatalog
247
- ? null
248
- : route({
249
- schema,
250
- path: `changelog`,
251
- loader: changelogLoader,
252
- Component,
253
- children: [
254
- // Support deep linking to specific version
255
- route({
256
- path: `version/:version`,
257
- loader: changelogLoader,
258
- Component,
259
- }),
260
- // Support deep linking to specific version/revision
261
- route({
262
- path: `version/:version/revision/:revision`,
263
- loader: changelogLoader,
264
- Component,
265
- }),
266
- ],
267
- })