Skip to content

Commit c25a5c2

Browse files
simonswissdcousens
authored andcommitted
Add new blog post for last year of releases (#9268)
1 parent 855bc25 commit c25a5c2

File tree

3 files changed

+159
-24
lines changed

3 files changed

+159
-24
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
---
2+
title: A year of releases in review
3+
description: >-
4+
Over the past year, Keystone has received numerous updates, new features, and
5+
essential bug fixes. Here’s a snapshot of the key improvements over the past
6+
12 months.
7+
publishDate: 2024-08-07
8+
authorName: The Keystone Team
9+
authorHandle: https://twitter.com/keystonejs
10+
---
11+
Over the past year, Keystone has received numerous updates, new features, and essential bug fixes. Here’s a snapshot of the key improvements over the past 12 months.
12+
13+
## Major Enhancements
14+
15+
### Enhanced Database Integration
16+
17+
One of the standout improvements this year is the update to Prisma `v5.13.0`. This update brings better performance and more robust features for database interactions. Alongside this, Keystone now supports extending the `PrismaClient`, providing more flexibility and control over database operations.
18+
19+
### Interactive Transactions
20+
21+
Keystone introduced `context.transaction`, allowing for interactive transactions within the `context`. This feature simplifies managing transactions, ensuring data integrity and consistency across operations.
22+
23+
### Improved Migration Commands
24+
25+
New migration commands like `keystone migrate create` and `keystone migrate apply` were added, making database migrations more straightforward and user-friendly.
26+
27+
### Validation and Hooks
28+
29+
A significant update was the overhaul of validation hooks for fields and lists.
30+
31+
Hooks like`{field|list}.hooks.validate.[create|update|delete]` provide developers with more granular control over data validation, enhancing data integrity and application reliability.
32+
33+
## Breaking Changes and Cleanups
34+
35+
### Identifier Overhaul
36+
37+
Keystone made a substantial change by switching file and image identifiers to random 128-bit `base64url` by default, replacing the older UUID system. This change improves security and performance.
38+
39+
### Type and Parameter Cleanup
40+
41+
Several deprecated types and parameters were removed, streamlining the codebase and improving overall efficiency. Notable removals include the old `AdminUIConfig`, `DatabaseConfig`, `GraphQLConfig`, and `ServerConfig` types, among others.
42+
43+
### Prisma and GraphQL Schema Handling
44+
45+
The handling of Prisma and GraphQL schemas saw improvements, with configurations now more centralised and consistent. This includes moving schema-related configurations to more intuitive locations within the setup.
46+
47+
## New Features
48+
49+
### Prisma Error Logging
50+
51+
Server-side Prisma errors are now logged with `console.error`, making debugging easier and ensuring that critical issues are more visible during development.
52+
53+
### Async HTTP Server Extension
54+
55+
Support for asynchronous operations during HTTP server startup was added, allowing for more complex and dynamic server initialization processes.
56+
57+
### GraphQL Error Messages
58+
59+
Improved error messaging for GraphQL errors in the Admin UI list view helps developers quickly identify and resolve issues.
60+
61+
### Admin UI Enhancements
62+
63+
The Admin UI saw multiple enhancements, including a responsive menu for smaller devices, better handling of field omissions, and consistent sub-field ordering for image fields.
64+
65+
## Bug Fixes
66+
67+
Keystone JS addressed numerous bugs throughout the year, improving stability and performance. Some key fixes include:
68+
69+
- Resolving issues with session strategies in the auth package.
70+
- Fixing default values and ordering for various field types.
71+
- Addressing Prisma migration errors in non-interactive environments.
72+
- Correcting access and overflow issues in the AdminUI.
73+
74+
## Keystatic-powered docs & blog
75+
76+
A growing portion of the Keystone documentation (as well as this blog!) is now content-editable via [Keystatic](https://keystatic.com), another [Thinkmill](https://thinkmill.com.au) product.
77+
78+
Keystatic shares common DNA with Keystone, but operates without a database. Instead, it stores content in Markdown/YAML/JSON/Markdoc/MDX on the local file system, and syncs it with the GitHub API.
79+
80+
The content can be edited via a world-class Admin UI (powered by [Keystar UI](https://github.com/Thinkmill/keystatic/tree/main/design-system) and coming to Keystone soon!), but also directly from the [codebase's content files](https://github.com/keystonejs/keystone/tree/main/docs/content).
81+
82+
## Community Contributions
83+
84+
Keystone JS has a vibrant community that continually contributes to its growth ❤️
85+
86+
This year, we saw first-time contributions from several developers, helping to enhance the platform with new features and fixes.
87+
88+
We’d like to extend our heartfelt thanks to all the contributors who have dedicated their time and effort to make Keystone JS better.
89+
90+
### Acknowledgements
91+
92+
A special acknowledgment goes to some of our key community contributors who have made significant impacts:
93+
94+
- [@renovate](https://github.com/renovate) for consistent contributions and improvements across various packages.
95+
- [@borisno2](https://github.com/borisno2) for significant enhancements and bug fixes.
96+
- [@iamandrewluca](https://github.com/iamandrewluca) for introducing new capabilities and extending functionality.
97+
98+
Additionally, we’d like to highlight a few first-time contributors who have joined the community and made valuable contributions:
99+
100+
{% hint kind="tip" %}
101+
[@ggpwnkthx](https://github.com/ggpwnkthx), [@dagrinchi](https://github.com/dagrinchi), [@Grumaks](https://github.com/Grumaks), [@PaulAroo](https://github.com/PaulAroo), [@leopoldkristjansson](https://github.com/leopoldkristjansson), [@ScottAgirs](https://github.com/ScottAgirs), [@lahirurane-rau](https://github.com/lahirurane-rau), [@MarcelMalik](https://github.com/MarcelMalik), [@TweededBadger](https://github.com/TweededBadger)
102+
{% /hint %}
103+
104+
## Looking Ahead
105+
106+
The Keystone JS team remains committed to delivering high-quality updates and features. We are excited about the future and look forward to continuing to enhance the platform, making it even more powerful and user-friendly.
107+
108+
Thank you to all the community members and contributors for your ongoing support and contributions! Here’s to another year of innovation and improvement with Keystone!

docs/keystatic.config.tsx

+16-24
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
import { config, fields, collection, singleton } from '@keystatic/core'
22
import { superscriptIcon } from '@keystar/ui/icon/icons/superscriptIcon'
3-
import { inline, mark, wrapper } from '@keystatic/core/content-components'
3+
import { mark, wrapper } from '@keystatic/core/content-components'
4+
import { cableIcon } from '@keystar/ui/icon/icons/cableIcon'
5+
import { creditCardIcon } from '@keystar/ui/icon/icons/creditCardIcon'
46

7+
import { emoji, hint } from './keystatic/content-components'
58
import { gradientSelector } from './keystatic/gradient-selector'
69

710
export default config({
@@ -46,6 +49,7 @@ export default config({
4649
heading: wrapper({ label: 'Heading', schema: { id: fields.text({ label: 'ID' }) } }),
4750
well: wrapper({
4851
label: 'Well',
52+
icon: creditCardIcon,
4953
schema: {
5054
heading: fields.text({ label: 'Heading' }),
5155
grad: fields.select({
@@ -77,29 +81,10 @@ export default config({
7781

7882
// ContentView: (data) => <WellPreview {...data} />,
7983
}),
80-
hint: wrapper({
81-
label: 'Hint',
82-
schema: {
83-
kind: fields.select({
84-
label: 'Kind',
85-
options: [
86-
{ label: 'Tip', value: 'tip' },
87-
{ label: 'Warning', value: 'warn' },
88-
{ label: 'Error', value: 'error' },
89-
],
90-
defaultValue: 'tip',
91-
}),
92-
},
93-
}),
94-
'related-content': wrapper({ label: 'Related Content', schema: {} }),
84+
hint: hint(),
85+
'related-content': wrapper({ label: 'Related Content', icon: cableIcon, schema: {} }),
9586
sup: mark({ label: 'Superscript', schema: {}, icon: superscriptIcon, tag: 'sup' }),
96-
emoji: inline({
97-
label: 'Emoji',
98-
schema: {
99-
symbol: fields.text({ label: 'Symbol' }),
100-
alt: fields.text({ label: 'Alt' }),
101-
},
102-
}),
87+
emoji: emoji(),
10388
},
10489
}),
10590
},
@@ -121,7 +106,14 @@ export default config({
121106
authorName: fields.text({ label: 'Author Name', validation: { isRequired: true } }),
122107
authorHandle: fields.url({ label: 'Author Handle' }),
123108
metaImageUrl: fields.url({ label: 'Meta Image URL' }),
124-
content: fields.markdoc({ label: 'Content', extension: 'md' }),
109+
content: fields.markdoc({
110+
label: 'Content',
111+
extension: 'md',
112+
components: {
113+
hint: hint('Callout'),
114+
emoji: emoji(),
115+
},
116+
}),
125117
},
126118
}),
127119

docs/keystatic/content-components.tsx

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import { fields } from '@keystatic/core'
2+
import { inline, wrapper } from '@keystatic/core/content-components'
3+
import { megaphoneIcon } from '@keystar/ui/icon/icons/megaphoneIcon'
4+
import { smileIcon } from '@keystar/ui/icon/icons/smileIcon'
5+
6+
type Label = string
7+
8+
export function hint (label: Label = 'Hint') {
9+
return wrapper({
10+
label: label,
11+
icon: megaphoneIcon,
12+
schema: {
13+
kind: fields.select({
14+
label: 'Kind',
15+
options: [
16+
{ label: 'Tip', value: 'tip' },
17+
{ label: 'Warning', value: 'warn' },
18+
{ label: 'Error', value: 'error' },
19+
],
20+
defaultValue: 'tip',
21+
}),
22+
},
23+
})
24+
}
25+
26+
export function emoji (label: Label = 'Emoji') {
27+
return inline({
28+
label: label,
29+
icon: smileIcon,
30+
schema: {
31+
symbol: fields.text({ label: 'Symbol' }),
32+
alt: fields.text({ label: 'Alt' }),
33+
},
34+
})
35+
}

0 commit comments

Comments
 (0)