betterstart-cli 0.0.104 → 0.0.105

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 (140) hide show
  1. package/dist/cli.js +6416 -5203
  2. package/dist/cli.js.map +1 -1
  3. package/package.json +1 -1
  4. package/dist/assets/adapters/next/templates/renderers/commands/init/banner-art.ts +0 -7
  5. package/dist/assets/adapters/next/templates/renderers/commands/init/verify-database-reachable.ts +0 -30
  6. package/dist/assets/adapters/next/templates/renderers/commands/seed/build-seed-script.ts +0 -171
  7. package/dist/assets/adapters/next/templates/renderers/generators/actions/action-helpers/build-authorship-alias-block.ts +0 -4
  8. package/dist/assets/adapters/next/templates/renderers/generators/actions/action-helpers/build-authorship-data-fields.ts +0 -4
  9. package/dist/assets/adapters/next/templates/renderers/generators/actions/action-helpers/build-format-action-date-source.ts +0 -18
  10. package/dist/assets/adapters/next/templates/renderers/generators/actions/action-helpers/build-read-select-option-type.ts +0 -6
  11. package/dist/assets/adapters/next/templates/renderers/generators/actions/action-helpers/build-relationship-data-types.ts +0 -25
  12. package/dist/assets/adapters/next/templates/renderers/generators/actions/action-helpers/build-result-mapping.ts +0 -62
  13. package/dist/assets/adapters/next/templates/renderers/generators/actions/action-helpers/generate-populate-list-rels-function.ts +0 -50
  14. package/dist/assets/adapters/next/templates/renderers/generators/actions/entity-file-contents/build-restore-many-to-many-statements.ts +0 -27
  15. package/dist/assets/adapters/next/templates/renderers/generators/actions/entity-file-contents/build-select-option-types.ts +0 -37
  16. package/dist/assets/adapters/next/templates/renderers/generators/actions/entity-file-contents/gen-bulk-sort-order-content.ts +0 -93
  17. package/dist/assets/adapters/next/templates/renderers/generators/actions/entity-file-contents/gen-create-content.ts +0 -157
  18. package/dist/assets/adapters/next/templates/renderers/generators/actions/entity-file-contents/gen-create-select-option-content.ts +0 -134
  19. package/dist/assets/adapters/next/templates/renderers/generators/actions/entity-file-contents/gen-delete-bulk-content.ts +0 -85
  20. package/dist/assets/adapters/next/templates/renderers/generators/actions/entity-file-contents/gen-delete-content.ts +0 -66
  21. package/dist/assets/adapters/next/templates/renderers/generators/actions/entity-file-contents/gen-distinct-files.ts +0 -45
  22. package/dist/assets/adapters/next/templates/renderers/generators/actions/entity-file-contents/gen-get-by-id-content.ts +0 -55
  23. package/dist/assets/adapters/next/templates/renderers/generators/actions/entity-file-contents/gen-get-by-slug-content.ts +0 -55
  24. package/dist/assets/adapters/next/templates/renderers/generators/actions/entity-file-contents/gen-get-plural-content.ts +0 -106
  25. package/dist/assets/adapters/next/templates/renderers/generators/actions/entity-file-contents/gen-get-select-options-content.ts +0 -55
  26. package/dist/assets/adapters/next/templates/renderers/generators/actions/entity-file-contents/gen-get-versions-content.ts +0 -19
  27. package/dist/assets/adapters/next/templates/renderers/generators/actions/entity-file-contents/gen-m2m-files.ts +0 -151
  28. package/dist/assets/adapters/next/templates/renderers/generators/actions/entity-file-contents/gen-restore-content.ts +0 -123
  29. package/dist/assets/adapters/next/templates/renderers/generators/actions/entity-file-contents/gen-update-content.ts +0 -187
  30. package/dist/assets/adapters/next/templates/renderers/generators/actions/entity-file-contents/generate-resolve-media-function.ts +0 -40
  31. package/dist/assets/adapters/next/templates/renderers/generators/actions/entity-file-contents/generate-slug-helpers.ts +0 -73
  32. package/dist/assets/adapters/next/templates/renderers/generators/actions/entity-file-contents/generate-version-snapshot-helpers.ts +0 -104
  33. package/dist/assets/adapters/next/templates/renderers/generators/actions/lifecycle-hook-emissions/lifecycle-context.ts +0 -22
  34. package/dist/assets/adapters/next/templates/renderers/generators/actions/lifecycle-hook-emissions/lifecycle-hook-import.ts +0 -4
  35. package/dist/assets/adapters/next/templates/renderers/generators/actions/markdown-renderer.ts +0 -411
  36. package/dist/assets/adapters/next/templates/renderers/generators/actions/select-fields-resolver.ts +0 -99
  37. package/dist/assets/adapters/next/templates/renderers/generators/actions/single-actions/generate-single-actions.ts +0 -292
  38. package/dist/assets/adapters/next/templates/renderers/generators/columns/column-defs/generate-authorship-value.ts +0 -8
  39. package/dist/assets/adapters/next/templates/renderers/generators/columns/column-defs/generate-column-def.ts +0 -297
  40. package/dist/assets/adapters/next/templates/renderers/generators/columns/column-defs/generate-first-column-def.ts +0 -483
  41. package/dist/assets/adapters/next/templates/renderers/generators/columns/column-defs/generate-image-cell-media.ts +0 -38
  42. package/dist/assets/adapters/next/templates/renderers/generators/columns/column-defs/generate-image-element.ts +0 -22
  43. package/dist/assets/adapters/next/templates/renderers/generators/columns/column-defs/generate-relationship-label.ts +0 -26
  44. package/dist/assets/adapters/next/templates/renderers/generators/columns/column-defs/generate-select-label.ts +0 -17
  45. package/dist/assets/adapters/next/templates/renderers/generators/columns/custom-cell.ts +0 -24
  46. package/dist/assets/adapters/next/templates/renderers/generators/columns/generate-columns.ts +0 -55
  47. package/dist/assets/adapters/next/templates/renderers/generators/create-page.ts +0 -16
  48. package/dist/assets/adapters/next/templates/renderers/generators/database/generate-database.ts +0 -5
  49. package/dist/assets/adapters/next/templates/renderers/generators/database/generate-junction-table.ts +0 -27
  50. package/dist/assets/adapters/next/templates/renderers/generators/database/generate-select-options-table.ts +0 -35
  51. package/dist/assets/adapters/next/templates/renderers/generators/database/generate-table-definition.ts +0 -25
  52. package/dist/assets/adapters/next/templates/renderers/generators/dev-mode-integration/build-entity-dev-mode-snippets.ts +0 -180
  53. package/dist/assets/adapters/next/templates/renderers/generators/dev-mode-integration/build-form-dev-mode-snippets.ts +0 -97
  54. package/dist/assets/adapters/next/templates/renderers/generators/dev-mode-integration/build-single-dev-mode-snippets.ts +0 -60
  55. package/dist/assets/adapters/next/templates/renderers/generators/dev-mode-integration/create-dev-mode-integration-artifact.ts +0 -89
  56. package/dist/assets/adapters/next/templates/renderers/generators/dev-mode-integration/lifecycle-hook-code.ts +0 -55
  57. package/dist/assets/adapters/next/templates/renderers/generators/edit-page.ts +0 -33
  58. package/dist/assets/adapters/next/templates/renderers/generators/email-template/generate-email-template.ts +0 -248
  59. package/dist/assets/adapters/next/templates/renderers/generators/email-template/generate-field-value.ts +0 -31
  60. package/dist/assets/adapters/next/templates/renderers/generators/emitted-helpers.ts +0 -16
  61. package/dist/assets/adapters/next/templates/renderers/generators/form/field-jsx/generate-icon-postfix.ts +0 -27
  62. package/dist/assets/adapters/next/templates/renderers/generators/form/field-jsx/render-boolean-field.ts +0 -47
  63. package/dist/assets/adapters/next/templates/renderers/generators/form/field-jsx/render-creatable-select-field.ts +0 -122
  64. package/dist/assets/adapters/next/templates/renderers/generators/form/field-jsx/render-date-field.ts +0 -47
  65. package/dist/assets/adapters/next/templates/renderers/generators/form/field-jsx/render-default-field.ts +0 -53
  66. package/dist/assets/adapters/next/templates/renderers/generators/form/field-jsx/render-gallery-field.ts +0 -46
  67. package/dist/assets/adapters/next/templates/renderers/generators/form/field-jsx/render-group-field.ts +0 -16
  68. package/dist/assets/adapters/next/templates/renderers/generators/form/field-jsx/render-icon-field.ts +0 -31
  69. package/dist/assets/adapters/next/templates/renderers/generators/form/field-jsx/render-markdown-field.ts +0 -50
  70. package/dist/assets/adapters/next/templates/renderers/generators/form/field-jsx/render-media-field.ts +0 -47
  71. package/dist/assets/adapters/next/templates/renderers/generators/form/field-jsx/render-multi-relationship-field.ts +0 -91
  72. package/dist/assets/adapters/next/templates/renderers/generators/form/field-jsx/render-multi-select-field.ts +0 -219
  73. package/dist/assets/adapters/next/templates/renderers/generators/form/field-jsx/render-number-field.ts +0 -48
  74. package/dist/assets/adapters/next/templates/renderers/generators/form/field-jsx/render-richtext-field.ts +0 -50
  75. package/dist/assets/adapters/next/templates/renderers/generators/form/field-jsx/render-select-field.ts +0 -61
  76. package/dist/assets/adapters/next/templates/renderers/generators/form/field-jsx/render-separator-field.ts +0 -16
  77. package/dist/assets/adapters/next/templates/renderers/generators/form/field-jsx/render-single-relationship-field.ts +0 -93
  78. package/dist/assets/adapters/next/templates/renderers/generators/form/field-jsx/render-textarea-field.ts +0 -53
  79. package/dist/assets/adapters/next/templates/renderers/generators/form/field-jsx-nested/render-list-field.ts +0 -163
  80. package/dist/assets/adapters/next/templates/renderers/generators/form/field-jsx-nested/render-nested-field.ts +0 -164
  81. package/dist/assets/adapters/next/templates/renderers/generators/form/field-jsx-nested/render-nested-object-list-field.ts +0 -59
  82. package/dist/assets/adapters/next/templates/renderers/generators/form/field-jsx-nested/render-text-input-field.ts +0 -27
  83. package/dist/assets/adapters/next/templates/renderers/generators/form/form-entity/generate-form.ts +0 -822
  84. package/dist/assets/adapters/next/templates/renderers/generators/form/form-shared/build-default-value-from-sync-functions.ts +0 -41
  85. package/dist/assets/adapters/next/templates/renderers/generators/form/form-shared/build-ui-imports.ts +0 -58
  86. package/dist/assets/adapters/next/templates/renderers/generators/form/form-shared/generate-default-value.ts +0 -67
  87. package/dist/assets/adapters/next/templates/renderers/generators/form/form-shared/generate-nested-list-default-value.ts +0 -13
  88. package/dist/assets/adapters/next/templates/renderers/generators/form/form-shared/label-with-description.ts +0 -14
  89. package/dist/assets/adapters/next/templates/renderers/generators/form/form-shared/render-tabs-trigger.ts +0 -18
  90. package/dist/assets/adapters/next/templates/renderers/generators/form/form-shared/select-read-values-expression.ts +0 -21
  91. package/dist/assets/adapters/next/templates/renderers/generators/form/form-single/build-group-creatable-select-handlers.ts +0 -67
  92. package/dist/assets/adapters/next/templates/renderers/generators/form/form-single/build-group-creatable-select-state.ts +0 -29
  93. package/dist/assets/adapters/next/templates/renderers/generators/form/form-single/build-group-field-array-hooks.ts +0 -13
  94. package/dist/assets/adapters/next/templates/renderers/generators/form/form-single/build-group-fields-jsx.ts +0 -30
  95. package/dist/assets/adapters/next/templates/renderers/generators/form/form-single/generate-card-component.ts +0 -129
  96. package/dist/assets/adapters/next/templates/renderers/generators/form/form-single/generate-single-form.ts +0 -66
  97. package/dist/assets/adapters/next/templates/renderers/generators/form-admin/admin-columns/generate-column-def.ts +0 -72
  98. package/dist/assets/adapters/next/templates/renderers/generators/form-admin/admin-columns/generate-columns.ts +0 -89
  99. package/dist/assets/adapters/next/templates/renderers/generators/form-admin/admin-page/generate-page.ts +0 -23
  100. package/dist/assets/adapters/next/templates/renderers/generators/form-admin/admin-page-content.ts +0 -246
  101. package/dist/assets/adapters/next/templates/renderers/generators/form-admin/admin-submission-drawer.ts +0 -216
  102. package/dist/assets/adapters/next/templates/renderers/generators/form-admin/admin-table.ts +0 -273
  103. package/dist/assets/adapters/next/templates/renderers/generators/form-pipeline/form-actions/exclusive-date-upper-bound-helper.ts +0 -11
  104. package/dist/assets/adapters/next/templates/renderers/generators/form-pipeline/form-actions/generate-form-actions.ts +0 -505
  105. package/dist/assets/adapters/next/templates/renderers/generators/form-pipeline/form-component-multistep/build-component-source.ts +0 -197
  106. package/dist/assets/adapters/next/templates/renderers/generators/form-pipeline/form-component-shared/build-field-error-helper.ts +0 -16
  107. package/dist/assets/adapters/next/templates/renderers/generators/form-pipeline/form-component-shared/error-message-line.ts +0 -13
  108. package/dist/assets/adapters/next/templates/renderers/generators/form-pipeline/form-component-shared/generate-field-jsx.ts +0 -226
  109. package/dist/assets/adapters/next/templates/renderers/generators/form-pipeline/form-component-shared/generate-file-upload-field-jsx.ts +0 -41
  110. package/dist/assets/adapters/next/templates/renderers/generators/form-pipeline/form-component-shared/generate-list-field-jsx.ts +0 -160
  111. package/dist/assets/adapters/next/templates/renderers/generators/form-pipeline/form-component-shared/generate-multiselect-field-jsx.ts +0 -40
  112. package/dist/assets/adapters/next/templates/renderers/generators/form-pipeline/form-component-shared/generate-number-field-jsx.ts +0 -41
  113. package/dist/assets/adapters/next/templates/renderers/generators/form-pipeline/form-component-shared/generate-text-field-jsx.ts +0 -39
  114. package/dist/assets/adapters/next/templates/renderers/generators/form-pipeline/form-component-shared/label-with-description-line.ts +0 -14
  115. package/dist/assets/adapters/next/templates/renderers/generators/form-pipeline/form-component-single/build-single-step-form-component-source.ts +0 -100
  116. package/dist/assets/adapters/next/templates/renderers/generators/form-pipeline/form-database.ts +0 -29
  117. package/dist/assets/adapters/next/templates/renderers/generators/form-pipeline/form-hook.ts +0 -142
  118. package/dist/assets/adapters/next/templates/renderers/generators/hook/generate-hook.ts +0 -169
  119. package/dist/assets/adapters/next/templates/renderers/generators/hook/generate-single-hook.ts +0 -30
  120. package/dist/assets/adapters/next/templates/renderers/generators/navigation-extract.ts +0 -19
  121. package/dist/assets/adapters/next/templates/renderers/generators/page-content/generate-page-content.ts +0 -419
  122. package/dist/assets/adapters/next/templates/renderers/generators/page.ts +0 -24
  123. package/dist/assets/adapters/next/templates/renderers/generators/row-actions-emitters/build-delete-dialog-source.ts +0 -108
  124. package/dist/assets/adapters/next/templates/renderers/generators/row-actions-emitters/build-row-actions-source.ts +0 -61
  125. package/dist/assets/adapters/next/templates/renderers/generators/single-page.ts +0 -59
  126. package/dist/assets/adapters/next/templates/renderers/generators/sortable-header/build-sort-label-expr.ts +0 -9
  127. package/dist/assets/adapters/next/templates/renderers/generators/sortable-header/build-sortable-header-button-jsx.ts +0 -20
  128. package/dist/assets/adapters/next/templates/renderers/generators/sortable-header/build-sortable-header-def.ts +0 -14
  129. package/dist/assets/adapters/next/templates/renderers/generators/table.ts +0 -284
  130. package/dist/assets/adapters/next/templates/renderers/generators/thankyou-email-template.ts +0 -110
  131. package/dist/assets/adapters/next/templates/renderers/generators/webhook-events/render-extract.ts +0 -14
  132. package/dist/assets/adapters/next/templates/renderers/init/scaffolders/next-config/create-next-config-template.ts +0 -48
  133. package/dist/assets/adapters/next/templates/renderers/init/scaffolders/tailwind/admin-shadow-input-utility.ts +0 -9
  134. package/dist/assets/adapters/next/templates/renderers/init/scaffolders/tailwind/admin-theme-block.ts +0 -42
  135. package/dist/assets/adapters/next/templates/renderers/init/templates/app/admin.ts +0 -12
  136. package/dist/assets/adapters/next/templates/renderers/integration-runtime/render-core-email-provider.ts +0 -27
  137. package/dist/assets/adapters/next/templates/renderers/integration-runtime/render-core-storage-provider.ts +0 -27
  138. package/dist/assets/adapters/next/templates/renderers/snapshots/barrels/render-db-barrel.ts +0 -8
  139. package/dist/assets/adapters/next/templates/renderers/snapshots/barrels/render-navigation-barrel.ts +0 -63
  140. package/dist/assets/adapters/next/templates/renderers/snapshots/barrels/render-webhook-events-barrel.ts +0 -16
@@ -1,419 +0,0 @@
1
- export function renderPageContentClientModuleTemplate({
2
- join,
3
- hasCreateLink,
4
- hasFiltersUseQueryStates,
5
- hasDeleteParseAsArrayOf,
6
- hasFiltersEntityFiltersBar,
7
- devModeIntegrationButtonExportName,
8
- devModeIntegrationButtonImportPath
9
- }: {
10
- join: string
11
- hasCreateLink: string
12
- hasFiltersUseQueryStates: string
13
- hasDeleteParseAsArrayOf: string
14
- hasFiltersEntityFiltersBar: string
15
- devModeIntegrationButtonExportName: string
16
- devModeIntegrationButtonImportPath: string
17
- }): string {
18
- return `'use client'
19
-
20
- import type { Setting } from '@admin/actions/settings'
21
- import { useIsFetching, useQuery, useQueryClient } from '@tanstack/react-query'
22
- import type { ColumnDef } from '@tanstack/react-table'
23
- import { ${join} } from 'lucide-react'
24
- ${hasCreateLink}import { parseAsInteger, parseAsString${hasFiltersUseQueryStates}${hasDeleteParseAsArrayOf}, useQueryState } from 'nuqs'
25
- import * as React from 'react'
26
- import { toast } from 'sonner'
27
- ${hasFiltersEntityFiltersBar}import { SortOrderDialog } from '@admin/components/shared/sort-order-dialog'
28
- import { PageHeader } from '@admin/components/shared/page-header'
29
- import { Button } from '@admin/components/ui/button'
30
- import { ${devModeIntegrationButtonExportName} } from '${devModeIntegrationButtonImportPath}'
31
- `
32
- }
33
-
34
- export function renderPageContentImportsTemplate(): string {
35
- return `import { DeleteDialog } from '@admin/components/shared/delete-dialog'
36
- `
37
- }
38
-
39
- export function renderPageContentImportsSchemaNameTemplate({
40
- join,
41
- schemaName
42
- }: {
43
- join: string
44
- schemaName: string
45
- }): string {
46
- return `import {
47
- ${join}
48
- } from '@admin/hooks/use-${schemaName}'
49
- `
50
- }
51
-
52
- export function renderPageContentImportsAdminTemplate({
53
- singular,
54
- actionImportPath,
55
- plural,
56
- hasDeleteAdmin,
57
- toKebabCase
58
- }: {
59
- singular: string
60
- actionImportPath: string
61
- plural: string
62
- hasDeleteAdmin: string
63
- toKebabCase: string
64
- }): string {
65
- return `import type { ${singular} } from '@admin/actions/${actionImportPath}'
66
- import { get${plural}, bulkUpdate${plural}SortOrder } from '@admin/actions/${actionImportPath}'
67
- ${hasDeleteAdmin}import { ${plural}Table } from './${toKebabCase}-table'
68
- `
69
- }
70
-
71
- export function renderPageContentFilterParsersTemplate({
72
- resolvedFiltersDate,
73
- resolvedFiltersDateDate,
74
- resolvedFiltersDistinct
75
- }: {
76
- resolvedFiltersDate: string
77
- resolvedFiltersDateDate: string
78
- resolvedFiltersDistinct: string
79
- }): string {
80
- return ` const filterParsers = {
81
- ${resolvedFiltersDate}
82
- } as const
83
- const [filterValues, setFilters] = useQueryStates(filterParsers)
84
- ${resolvedFiltersDateDate}
85
- ${resolvedFiltersDistinct}
86
- `
87
- }
88
-
89
- export function renderPageContentSelectOptionsTemplate({
90
- filterVariableName
91
- }: {
92
- filterVariableName: string
93
- }): string {
94
- return ` const ${filterVariableName}SelectOptions = (${filterVariableName}Options ?? []).map((option) => ({
95
- label: option,
96
- value: option
97
- }))`
98
- }
99
-
100
- export function renderPageContentHandleBulkDeleteTemplate({
101
- plural,
102
- escapeTemplateText,
103
- escapeTemplateTextEscapedTemplateText,
104
- pluralText,
105
- quoteLiteral,
106
- quoteLiteralQuotedValue
107
- }: {
108
- plural: string
109
- escapeTemplateText: string
110
- escapeTemplateTextEscapedTemplateText: string
111
- pluralText: string
112
- quoteLiteral: string
113
- quoteLiteralQuotedValue: string
114
- }): string {
115
- return `
116
- const [selectedIds, setSelectedIds] = useQueryState(
117
- 'selected',
118
- parseAsArrayOf(parseAsString).withDefault([])
119
- )
120
- const [isPending, startTransition] = React.useTransition()
121
-
122
- const handleBulkDelete = () => {
123
- startTransition(async () => {
124
- try {
125
- const result = await deleteBulk${plural}(selectedIds)
126
-
127
- if (result.success) {
128
- toast.success(
129
- selectedIds.length === 1
130
- ? \`\${selectedIds.length} ${escapeTemplateText} deleted\`
131
- : \`\${selectedIds.length} ${escapeTemplateTextEscapedTemplateText} deleted\`
132
- )
133
- queryClient.refetchQueries({ queryKey: ['${pluralText}'] })
134
- void setSelectedIds([])
135
- } else {
136
- toast.error(result.error || ${quoteLiteral})
137
- }
138
- } catch (error) {
139
- toast.error(${quoteLiteralQuotedValue})
140
- console.error(error)
141
- }
142
- })
143
- }
144
- `
145
- }
146
-
147
- export function renderPageContentResultTemplate({
148
- plural,
149
- pluralText,
150
- camelPlural,
151
- labelExpr
152
- }: {
153
- plural: string
154
- pluralText: string
155
- camelPlural: string
156
- labelExpr: string
157
- }): string {
158
- return `
159
- const [sortDialogOpen, setSortDialogOpen] = React.useState(false)
160
- const { data: sortOrderSummary } = useQuery({
161
- queryKey: ['${plural}', 'sort-order-summary'],
162
- queryFn: () => get${pluralText}({ limit: 1, offset: 0 })
163
- })
164
- const sortOrderTotalRows = sortOrderSummary?.total ?? 0
165
-
166
- const fetchSortPage = React.useCallback(
167
- async (offset: number, limit: number) => {
168
- const result = await get${pluralText}({ limit, offset })
169
- return {
170
- items: (result.${camelPlural} ?? []).map((item) => ({
171
- id: item.id,
172
- label: ${labelExpr}
173
- })),
174
- total: result.total
175
- }
176
- },
177
- []
178
- )
179
-
180
- const handleSaveSortOrder = React.useCallback(
181
- async (updates: { id: string; sortOrder: number }[]) => {
182
- const result = await bulkUpdate${pluralText}SortOrder(updates)
183
- if (result.success) {
184
- queryClient.refetchQueries({ queryKey: ['${plural}'] })
185
- }
186
- return result
187
- },
188
- [queryClient]
189
- )
190
- `
191
- }
192
-
193
- export function renderPageContentTemplate({ singular }: { singular: string }): string {
194
- return `
195
- {selectedIds.length > 0 && (
196
- <DeleteDialog
197
- count={selectedIds.length}
198
- entityName="${singular}"
199
- onConfirm={handleBulkDelete}
200
- isPending={isPending}
201
- />
202
- )}`
203
- }
204
-
205
- export function renderPageContentActionButtonsTemplate({
206
- adminRoutePath,
207
- schemaName,
208
- singularizeLabel
209
- }: {
210
- adminRoutePath: string
211
- schemaName: string
212
- singularizeLabel: string
213
- }): string {
214
- return `<Button asChild>
215
- <Link href="${adminRoutePath}/${schemaName}/new">
216
- Create ${singularizeLabel}
217
- </Link>
218
- </Button>`
219
- }
220
-
221
- export function renderPageContentActionButtonsDetailsTemplate(): string {
222
- return `
223
- <Button variant="outline" onClick={() => setSortDialogOpen(true)} disabled={sortOrderTotalRows === 0}>
224
- <GripVertical className="size-4" />
225
- Rearrange
226
- </Button>`
227
- }
228
-
229
- export function renderPageContentLayoutTemplate({
230
- deleteButton,
231
- rearrangeButton
232
- }: {
233
- deleteButton: string
234
- rearrangeButton: string
235
- }): string {
236
- return ` <div className="flex items-center gap-1">${deleteButton}${rearrangeButton}
237
- </div>`
238
- }
239
-
240
- export function renderPageContentLayoutDetailsTemplate({
241
- rearrangeButton
242
- }: {
243
- rearrangeButton: string
244
- }): string {
245
- return ` <div className="flex items-center gap-1">${rearrangeButton}
246
- </div>`
247
- }
248
-
249
- export function renderPageContentLabelTemplate({
250
- plural,
251
- schemaLabel
252
- }: {
253
- plural: string
254
- schemaLabel: string
255
- }): string {
256
- return `
257
- <SortOrderDialog
258
- open={sortDialogOpen}
259
- onOpenChange={setSortDialogOpen}
260
- queryKey={['${plural}']}
261
- fetchPage={fetchSortPage}
262
- onSave={handleSaveSortOrder}
263
- title="Rearrange ${schemaLabel}"
264
- description="Drag items to reorder them."
265
- />`
266
- }
267
-
268
- export function renderPageContentComponentTemplate({
269
- imports,
270
- plural,
271
- singular,
272
- pluralText,
273
- filterStateLogicContent,
274
- deleteLogic,
275
- sortOrderLogic,
276
- filterOptionsLogicContent,
277
- activeFilterCountExpr,
278
- hasFiltersContent,
279
- hasFiltersSetFilters,
280
- filterConfigEntriesContent,
281
- schemaLabel,
282
- devModeIntegrationButtonExportName,
283
- createButtonContent,
284
- hasFiltersLabel,
285
- tableProps,
286
- sortOrderDialog
287
- }: {
288
- imports: string
289
- plural: string
290
- singular: string
291
- pluralText: string
292
- filterStateLogicContent: string
293
- deleteLogic: string
294
- sortOrderLogic: string
295
- filterOptionsLogicContent: string
296
- activeFilterCountExpr: string
297
- hasFiltersContent: string
298
- hasFiltersSetFilters: string
299
- filterConfigEntriesContent: string
300
- schemaLabel: string
301
- devModeIntegrationButtonExportName: string
302
- createButtonContent: string
303
- hasFiltersLabel: string
304
- tableProps: string
305
- sortOrderDialog: string
306
- }): string {
307
- return `${imports}
308
- interface ${plural}PageContentProps<TValue> {
309
- columns: ColumnDef<${singular}, TValue>[]
310
- initialSettings?: Setting | null
311
- }
312
-
313
- export function ${plural}PageContent<TValue>({
314
- columns,
315
- initialSettings
316
- }: ${plural}PageContentProps<TValue>) {
317
- const queryClient = useQueryClient()
318
- const isSearchFetching = useIsFetching({ queryKey: ['${pluralText}'] }) > 0
319
- const [search, setSearch] = useQueryState('q', parseAsString.withDefault(''))
320
- const [, setPageIndex] = useQueryState('page', parseAsInteger.withDefault(0))
321
- ${filterStateLogicContent}${deleteLogic}${sortOrderLogic}
322
- ${filterOptionsLogicContent} const activeFilterCount = ${activeFilterCountExpr}
323
-
324
- const handleSearch = React.useCallback((value: string | null) => {
325
- React.startTransition(() => {
326
- void setPageIndex(0)
327
- void setSearch(value)
328
- })
329
- }, [setSearch, setPageIndex])
330
-
331
- const handleClearAll = React.useCallback(() => {
332
- React.startTransition(() => {
333
- void setPageIndex(0)
334
- void setSearch(null)
335
- ${hasFiltersContent}
336
- })
337
- }, [setSearch, setPageIndex${hasFiltersSetFilters}])
338
- ${filterConfigEntriesContent}
339
- return (
340
- <React.Fragment>
341
- <PageHeader
342
- title="${schemaLabel}"
343
- actions={
344
- <div className="flex items-center gap-1">
345
- <${devModeIntegrationButtonExportName} initialSettings={initialSettings} />
346
- ${createButtonContent}
347
- </div>
348
- }
349
- />
350
- ${hasFiltersLabel}
351
- <main className="space-y-4 px-4 pb-4 flex-1">
352
- <${plural}Table ${tableProps} />${sortOrderDialog}
353
- </main>
354
- </React.Fragment>
355
- )
356
- }
357
- `
358
- }
359
-
360
- export function renderPageContentDetailsTemplate({
361
- clearFilterObject
362
- }: {
363
- clearFilterObject: string
364
- }): string {
365
- return ` void setFilters({
366
- ${clearFilterObject}
367
- })`
368
- }
369
-
370
- export function renderPageContentFiltersTemplate({
371
- filterConfigEntries
372
- }: {
373
- filterConfigEntries: string
374
- }): string {
375
- return `
376
- const filters = [
377
- ${filterConfigEntries}
378
- ]
379
- `
380
- }
381
-
382
- export function renderPageContentLabelBranchTemplate({
383
- toLowerCase,
384
- filtersActionsContent
385
- }: {
386
- toLowerCase: string
387
- filtersActionsContent: string
388
- }): string {
389
- return `
390
- <EntityFiltersBar
391
- filters={filters}
392
- activeFilterCount={activeFilterCount}
393
- onFilterChange={(updates) => {
394
- React.startTransition(() => {
395
- void setPageIndex(0)
396
- void setFilters(updates)
397
- })
398
- }}
399
- onClearAll={handleClearAll}
400
- search={search}
401
- searchPlaceholder="Search ${toLowerCase}..."
402
- isPending={isSearchFetching}
403
- onSearch={handleSearch}
404
- actions={
405
- ${filtersActionsContent}
406
- }
407
- />`
408
- }
409
-
410
- export function renderPageContentLayoutDetailsBranchTemplate({
411
- filtersActionsContent
412
- }: {
413
- filtersActionsContent: string
414
- }): string {
415
- return `
416
- <div className="flex items-center justify-end">
417
- ${filtersActionsContent}
418
- </div>`
419
- }
@@ -1,24 +0,0 @@
1
- export function renderPageImportsTemplate({
2
- plural,
3
- kebabPlural
4
- }: {
5
- plural: string
6
- kebabPlural: string
7
- }): string {
8
- return `import { getSetting } from '@admin/actions/settings'
9
- import * as React from 'react'
10
- import { columns } from './columns'
11
- import { ${plural}PageContent } from './${kebabPlural}-page-content'
12
- import { ${plural}PageSkeleton } from './${kebabPlural}-page-skeleton'
13
-
14
- export default async function ${plural}Page() {
15
- const initialSettings = await getSetting()
16
-
17
- return (
18
- <React.Suspense fallback={<${plural}PageSkeleton />}>
19
- <${plural}PageContent columns={columns} initialSettings={initialSettings} />
20
- </React.Suspense>
21
- )
22
- }
23
- `
24
- }
@@ -1,108 +0,0 @@
1
- export function renderBuildDeleteDialogSourceClientModuleTemplate({
2
- deleteActionName,
3
- actionImportPath,
4
- componentName,
5
- quoteLiteral,
6
- queryKey,
7
- quoteLiteralQuotedValue,
8
- quoteLiteralText,
9
- escapeJsx,
10
- quoteLiteralContent
11
- }: {
12
- deleteActionName: string
13
- actionImportPath: string
14
- componentName: string
15
- quoteLiteral: string
16
- queryKey: string
17
- quoteLiteralQuotedValue: string
18
- quoteLiteralText: string
19
- escapeJsx: string
20
- quoteLiteralContent: string
21
- }): string {
22
- return `'use client'
23
-
24
- import { ${deleteActionName} } from '@admin/actions/${actionImportPath}'
25
- import {
26
- AlertDialog,
27
- AlertDialogAction,
28
- AlertDialogCancel,
29
- AlertDialogContent,
30
- AlertDialogDescription,
31
- AlertDialogFooter,
32
- AlertDialogHeader,
33
- AlertDialogTitle,
34
- AlertDialogTrigger
35
- } from '@admin/components/ui/alert-dialog'
36
- import { DropdownMenuItem } from '@admin/components/ui/dropdown-menu'
37
- import { useQueryClient } from '@tanstack/react-query'
38
- import { Trash } from 'lucide-react'
39
- import * as React from 'react'
40
- import { toast } from 'sonner'
41
-
42
- interface ${componentName}Props {
43
- id: string
44
- open: boolean
45
- onOpenChange: (open: boolean) => void
46
- }
47
-
48
- export function ${componentName}({
49
- id,
50
- open,
51
- onOpenChange
52
- }: ${componentName}Props) {
53
- const [isPending, startTransition] = React.useTransition()
54
- const queryClient = useQueryClient()
55
-
56
- const handleDelete = () => {
57
- startTransition(async () => {
58
- try {
59
- const result = await ${deleteActionName}(id)
60
-
61
- if (result.success) {
62
- toast.success(${quoteLiteral})
63
- queryClient.refetchQueries({ queryKey: ['${queryKey}'] })
64
- onOpenChange(false)
65
- } else {
66
- toast.error(result.error || ${quoteLiteralQuotedValue})
67
- }
68
- } catch (error) {
69
- toast.error(${quoteLiteralText})
70
- console.error(error)
71
- }
72
- })
73
- }
74
-
75
- return (
76
- <AlertDialog open={open} onOpenChange={onOpenChange}>
77
- <AlertDialogTrigger asChild>
78
- <DropdownMenuItem variant="destructive" onSelect={(event) => event.preventDefault()}>
79
- <Trash className="size-4" />
80
- Delete ${escapeJsx}
81
- </DropdownMenuItem>
82
- </AlertDialogTrigger>
83
- <AlertDialogContent>
84
- <AlertDialogHeader>
85
- <AlertDialogTitle>Delete ${escapeJsx}?</AlertDialogTitle>
86
- <AlertDialogDescription>
87
- This permanently deletes it and cannot be undone.
88
- </AlertDialogDescription>
89
- </AlertDialogHeader>
90
- <AlertDialogFooter>
91
- <AlertDialogCancel disabled={isPending}>Cancel</AlertDialogCancel>
92
- <AlertDialogAction
93
- onClick={(e) => {
94
- e.preventDefault()
95
- handleDelete()
96
- }}
97
- disabled={isPending}
98
- aria-busy={isPending}
99
- >
100
- {isPending ? 'Deleting…' : ${quoteLiteralContent}}
101
- </AlertDialogAction>
102
- </AlertDialogFooter>
103
- </AlertDialogContent>
104
- </AlertDialog>
105
- )
106
- }
107
- `
108
- }
@@ -1,61 +0,0 @@
1
- export function renderBuildRowActionsSourceClientModuleTemplate({
2
- dialogComponentName,
3
- dialogModuleName,
4
- componentName,
5
- escapeTemplateText,
6
- escapeJsx
7
- }: {
8
- dialogComponentName: string
9
- dialogModuleName: string
10
- componentName: string
11
- escapeTemplateText: string
12
- escapeJsx: string
13
- }): string {
14
- return `'use client'
15
-
16
- import { Button } from '@admin/components/ui/button'
17
- import {
18
- DropdownMenu,
19
- DropdownMenuContent,
20
- DropdownMenuTrigger
21
- } from '@admin/components/ui/dropdown-menu'
22
- import { MoreHorizontal } from 'lucide-react'
23
- import * as React from 'react'
24
- import { ${dialogComponentName} } from './${dialogModuleName}'
25
-
26
- export function ${componentName}({ id }: { id: string }) {
27
- const [menuOpen, setMenuOpen] = React.useState(false)
28
- const [deleteOpen, setDeleteOpen] = React.useState(false)
29
-
30
- function handleDeleteOpenChange(open: boolean) {
31
- setDeleteOpen(open)
32
-
33
- if (!open) {
34
- setMenuOpen(false)
35
- }
36
- }
37
-
38
- return (
39
- <DropdownMenu open={menuOpen} onOpenChange={setMenuOpen}>
40
- <DropdownMenuTrigger asChild>
41
- <Button
42
- variant="ghost"
43
- className="size-8 p-0"
44
- aria-label={\`Open ${escapeTemplateText} actions for \${id}\`}
45
- >
46
- <span className="sr-only">Open ${escapeJsx} actions</span>
47
- <MoreHorizontal className="size-4" />
48
- </Button>
49
- </DropdownMenuTrigger>
50
- <DropdownMenuContent align="end">
51
- <${dialogComponentName}
52
- id={id}
53
- open={deleteOpen}
54
- onOpenChange={handleDeleteOpenChange}
55
- />
56
- </DropdownMenuContent>
57
- </DropdownMenu>
58
- )
59
- }
60
- `
61
- }
@@ -1,59 +0,0 @@
1
- export function renderSinglePageDataTemplate({ singular }: { singular: string }): string {
2
- return ` const data = await get${singular}()
3
- `
4
- }
5
-
6
- export function renderSinglePageGeneratedValueTemplate({ singular }: { singular: string }): string {
7
- return ` const [data, initialSettings] = await Promise.all([
8
- get${singular}(),
9
- getSetting()
10
- ])
11
- `
12
- }
13
-
14
- export function renderSinglePageImportsTemplate({
15
- settingsImport,
16
- singular,
17
- actionImportPath,
18
- devModeIntegrationButtonExportName,
19
- devModeIntegrationButtonImportPath,
20
- schemaName,
21
- pageName,
22
- dataLoad,
23
- schemaLabel,
24
- initialSettingsProp
25
- }: {
26
- settingsImport: string
27
- singular: string
28
- actionImportPath: string
29
- devModeIntegrationButtonExportName: string
30
- devModeIntegrationButtonImportPath: string
31
- schemaName: string
32
- pageName: string
33
- dataLoad: string
34
- schemaLabel: string
35
- initialSettingsProp: string
36
- }): string {
37
- return `${settingsImport}import { get${singular} } from '@admin/actions/${actionImportPath}'
38
- import { PageHeader } from '@admin/components/shared/page-header'
39
- import { ${devModeIntegrationButtonExportName} } from '${devModeIntegrationButtonImportPath}'
40
- import { ${singular}Form } from './${schemaName}-form'
41
- import React from 'react'
42
-
43
- export default async function ${pageName}Page() {
44
- ${dataLoad}
45
-
46
- return (
47
- <React.Fragment>
48
- <PageHeader
49
- title="${schemaLabel}"
50
- actions={<${devModeIntegrationButtonExportName} ${initialSettingsProp} />}
51
- />
52
- <main className="mx-auto max-w-5xl w-full p-4">
53
- <${singular}Form initialData={data} />
54
- </main>
55
- </React.Fragment>
56
- )
57
- }
58
- `
59
- }
@@ -1,9 +0,0 @@
1
- export function renderBuildSortLabelExprSortDirectionTemplate(): string {
2
- return `const sortDirection = column.getIsSorted()
3
- const sortLabel = sortDirection === 'asc'
4
- ? 'sorted ascending'
5
- : sortDirection === 'desc'
6
- ? 'sorted descending'
7
- : 'not sorted'
8
- `
9
- }
@@ -1,20 +0,0 @@
1
- export function renderBuildSortableHeaderButtonJsxActionButtonsTemplate({
2
- className,
3
- escapeTemplateText,
4
- escapeJsx
5
- }: {
6
- className: string
7
- escapeTemplateText: string
8
- escapeJsx: string
9
- }): string {
10
- return `<Button
11
- variant="ghost"
12
- onClick={() => column.toggleSorting(column.getIsSorted() === 'asc')}
13
- className="${className} min-w-0 justify-start overflow-hidden px-0! border-none rounded-none bg-transparent! scale-100! group"
14
- aria-label={\`Sort by ${escapeTemplateText}, \${sortLabel}\`}
15
- aria-sort={sortDirection === 'asc' ? 'ascending' : sortDirection === 'desc' ? 'descending' : 'none'}
16
- >
17
- <span className="truncate">${escapeJsx}</span>
18
- <SortIndicator direction={sortDirection} />
19
- </Button>`
20
- }