betterstart-cli 0.0.102 → 0.0.104

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 (147) hide show
  1. package/dist/assets/adapters/next/templates/init/lib/actions/webhooks/index.ts +0 -5
  2. package/dist/assets/adapters/next/templates/init/lib/actions/webhooks/send-test-webhook.ts +1 -1
  3. package/dist/assets/adapters/next/templates/renderers/commands/init/banner-art.ts +7 -0
  4. package/dist/assets/adapters/next/templates/renderers/commands/init/verify-database-reachable.ts +30 -0
  5. package/dist/assets/adapters/next/templates/renderers/commands/seed/build-seed-script.ts +171 -0
  6. package/dist/assets/adapters/next/templates/renderers/generators/actions/action-helpers/build-authorship-alias-block.ts +4 -0
  7. package/dist/assets/adapters/next/templates/renderers/generators/actions/action-helpers/build-authorship-data-fields.ts +4 -0
  8. package/dist/assets/adapters/next/templates/renderers/generators/actions/action-helpers/build-format-action-date-source.ts +18 -0
  9. package/dist/assets/adapters/next/templates/renderers/generators/actions/action-helpers/build-read-select-option-type.ts +6 -0
  10. package/dist/assets/adapters/next/templates/renderers/generators/actions/action-helpers/build-relationship-data-types.ts +25 -0
  11. package/dist/assets/adapters/next/templates/renderers/generators/actions/action-helpers/build-result-mapping.ts +62 -0
  12. package/dist/assets/adapters/next/templates/renderers/generators/actions/action-helpers/generate-populate-list-rels-function.ts +50 -0
  13. package/dist/assets/adapters/next/templates/renderers/generators/actions/entity-file-contents/build-restore-many-to-many-statements.ts +27 -0
  14. package/dist/assets/adapters/next/templates/renderers/generators/actions/entity-file-contents/build-select-option-types.ts +37 -0
  15. package/dist/assets/adapters/next/templates/renderers/generators/actions/entity-file-contents/gen-bulk-sort-order-content.ts +93 -0
  16. package/dist/assets/adapters/next/templates/renderers/generators/actions/entity-file-contents/gen-create-content.ts +157 -0
  17. package/dist/assets/adapters/next/templates/renderers/generators/actions/entity-file-contents/gen-create-select-option-content.ts +134 -0
  18. package/dist/assets/adapters/next/templates/renderers/generators/actions/entity-file-contents/gen-delete-bulk-content.ts +85 -0
  19. package/dist/assets/adapters/next/templates/renderers/generators/actions/entity-file-contents/gen-delete-content.ts +66 -0
  20. package/dist/assets/adapters/next/templates/renderers/generators/actions/entity-file-contents/gen-distinct-files.ts +45 -0
  21. package/dist/assets/adapters/next/templates/renderers/generators/actions/entity-file-contents/gen-get-by-id-content.ts +55 -0
  22. package/dist/assets/adapters/next/templates/renderers/generators/actions/entity-file-contents/gen-get-by-slug-content.ts +55 -0
  23. package/dist/assets/adapters/next/templates/renderers/generators/actions/entity-file-contents/gen-get-plural-content.ts +106 -0
  24. package/dist/assets/adapters/next/templates/renderers/generators/actions/entity-file-contents/gen-get-select-options-content.ts +55 -0
  25. package/dist/assets/adapters/next/templates/renderers/generators/actions/entity-file-contents/gen-get-versions-content.ts +19 -0
  26. package/dist/assets/adapters/next/templates/renderers/generators/actions/entity-file-contents/gen-m2m-files.ts +151 -0
  27. package/dist/assets/adapters/next/templates/renderers/generators/actions/entity-file-contents/gen-restore-content.ts +123 -0
  28. package/dist/assets/adapters/next/templates/renderers/generators/actions/entity-file-contents/gen-update-content.ts +187 -0
  29. package/dist/assets/adapters/next/templates/renderers/generators/actions/entity-file-contents/generate-resolve-media-function.ts +40 -0
  30. package/dist/assets/adapters/next/templates/renderers/generators/actions/entity-file-contents/generate-slug-helpers.ts +73 -0
  31. package/dist/assets/adapters/next/templates/renderers/generators/actions/entity-file-contents/generate-version-snapshot-helpers.ts +104 -0
  32. package/dist/assets/adapters/next/templates/renderers/generators/actions/lifecycle-hook-emissions/lifecycle-context.ts +22 -0
  33. package/dist/assets/adapters/next/templates/renderers/generators/actions/lifecycle-hook-emissions/lifecycle-hook-import.ts +4 -0
  34. package/dist/assets/adapters/next/templates/renderers/generators/actions/markdown-renderer.ts +411 -0
  35. package/dist/assets/adapters/next/templates/renderers/generators/actions/select-fields-resolver.ts +99 -0
  36. package/dist/assets/adapters/next/templates/renderers/generators/actions/single-actions/generate-single-actions.ts +292 -0
  37. package/dist/assets/adapters/next/templates/renderers/generators/columns/column-defs/generate-authorship-value.ts +8 -0
  38. package/dist/assets/adapters/next/templates/renderers/generators/columns/column-defs/generate-column-def.ts +297 -0
  39. package/dist/assets/adapters/next/templates/renderers/generators/columns/column-defs/generate-first-column-def.ts +483 -0
  40. package/dist/assets/adapters/next/templates/renderers/generators/columns/column-defs/generate-image-cell-media.ts +38 -0
  41. package/dist/assets/adapters/next/templates/renderers/generators/columns/column-defs/generate-image-element.ts +22 -0
  42. package/dist/assets/adapters/next/templates/renderers/generators/columns/column-defs/generate-relationship-label.ts +26 -0
  43. package/dist/assets/adapters/next/templates/renderers/generators/columns/column-defs/generate-select-label.ts +17 -0
  44. package/dist/assets/adapters/next/templates/renderers/generators/columns/custom-cell.ts +24 -0
  45. package/dist/assets/adapters/next/templates/renderers/generators/columns/generate-columns.ts +55 -0
  46. package/dist/assets/adapters/next/templates/renderers/generators/create-page.ts +16 -0
  47. package/dist/assets/adapters/next/templates/renderers/generators/database/generate-database.ts +5 -0
  48. package/dist/assets/adapters/next/templates/renderers/generators/database/generate-junction-table.ts +27 -0
  49. package/dist/assets/adapters/next/templates/renderers/generators/database/generate-select-options-table.ts +35 -0
  50. package/dist/assets/adapters/next/templates/renderers/generators/database/generate-table-definition.ts +25 -0
  51. package/dist/assets/adapters/next/templates/renderers/generators/dev-mode-integration/build-entity-dev-mode-snippets.ts +180 -0
  52. package/dist/assets/adapters/next/templates/renderers/generators/dev-mode-integration/build-form-dev-mode-snippets.ts +97 -0
  53. package/dist/assets/adapters/next/templates/renderers/generators/dev-mode-integration/build-single-dev-mode-snippets.ts +60 -0
  54. package/dist/assets/adapters/next/templates/renderers/generators/dev-mode-integration/create-dev-mode-integration-artifact.ts +89 -0
  55. package/dist/assets/adapters/next/templates/renderers/generators/dev-mode-integration/lifecycle-hook-code.ts +55 -0
  56. package/dist/assets/adapters/next/templates/renderers/generators/edit-page.ts +33 -0
  57. package/dist/assets/adapters/next/templates/renderers/generators/email-template/generate-email-template.ts +248 -0
  58. package/dist/assets/adapters/next/templates/renderers/generators/email-template/generate-field-value.ts +31 -0
  59. package/dist/assets/adapters/next/templates/renderers/generators/emitted-helpers.ts +16 -0
  60. package/dist/assets/adapters/next/templates/renderers/generators/form/field-jsx/generate-icon-postfix.ts +27 -0
  61. package/dist/assets/adapters/next/templates/renderers/generators/form/field-jsx/render-boolean-field.ts +47 -0
  62. package/dist/assets/adapters/next/templates/renderers/generators/form/field-jsx/render-creatable-select-field.ts +122 -0
  63. package/dist/assets/adapters/next/templates/renderers/generators/form/field-jsx/render-date-field.ts +47 -0
  64. package/dist/assets/adapters/next/templates/renderers/generators/form/field-jsx/render-default-field.ts +53 -0
  65. package/dist/assets/adapters/next/templates/renderers/generators/form/field-jsx/render-gallery-field.ts +46 -0
  66. package/dist/assets/adapters/next/templates/renderers/generators/form/field-jsx/render-group-field.ts +16 -0
  67. package/dist/assets/adapters/next/templates/renderers/generators/form/field-jsx/render-icon-field.ts +31 -0
  68. package/dist/assets/adapters/next/templates/renderers/generators/form/field-jsx/render-markdown-field.ts +50 -0
  69. package/dist/assets/adapters/next/templates/renderers/generators/form/field-jsx/render-media-field.ts +47 -0
  70. package/dist/assets/adapters/next/templates/renderers/generators/form/field-jsx/render-multi-relationship-field.ts +91 -0
  71. package/dist/assets/adapters/next/templates/renderers/generators/form/field-jsx/render-multi-select-field.ts +219 -0
  72. package/dist/assets/adapters/next/templates/renderers/generators/form/field-jsx/render-number-field.ts +48 -0
  73. package/dist/assets/adapters/next/templates/renderers/generators/form/field-jsx/render-richtext-field.ts +50 -0
  74. package/dist/assets/adapters/next/templates/renderers/generators/form/field-jsx/render-select-field.ts +61 -0
  75. package/dist/assets/adapters/next/templates/renderers/generators/form/field-jsx/render-separator-field.ts +16 -0
  76. package/dist/assets/adapters/next/templates/renderers/generators/form/field-jsx/render-single-relationship-field.ts +93 -0
  77. package/dist/assets/adapters/next/templates/renderers/generators/form/field-jsx/render-textarea-field.ts +53 -0
  78. package/dist/assets/adapters/next/templates/renderers/generators/form/field-jsx-nested/render-list-field.ts +163 -0
  79. package/dist/assets/adapters/next/templates/renderers/generators/form/field-jsx-nested/render-nested-field.ts +164 -0
  80. package/dist/assets/adapters/next/templates/renderers/generators/form/field-jsx-nested/render-nested-object-list-field.ts +59 -0
  81. package/dist/assets/adapters/next/templates/renderers/generators/form/field-jsx-nested/render-text-input-field.ts +27 -0
  82. package/dist/assets/adapters/next/templates/renderers/generators/form/form-entity/generate-form.ts +822 -0
  83. package/dist/assets/adapters/next/templates/renderers/generators/form/form-shared/build-default-value-from-sync-functions.ts +41 -0
  84. package/dist/assets/adapters/next/templates/renderers/generators/form/form-shared/build-ui-imports.ts +58 -0
  85. package/dist/assets/adapters/next/templates/renderers/generators/form/form-shared/generate-default-value.ts +67 -0
  86. package/dist/assets/adapters/next/templates/renderers/generators/form/form-shared/generate-nested-list-default-value.ts +13 -0
  87. package/dist/assets/adapters/next/templates/renderers/generators/form/form-shared/label-with-description.ts +14 -0
  88. package/dist/assets/adapters/next/templates/renderers/generators/form/form-shared/render-tabs-trigger.ts +18 -0
  89. package/dist/assets/adapters/next/templates/renderers/generators/form/form-shared/select-read-values-expression.ts +21 -0
  90. package/dist/assets/adapters/next/templates/renderers/generators/form/form-single/build-group-creatable-select-handlers.ts +67 -0
  91. package/dist/assets/adapters/next/templates/renderers/generators/form/form-single/build-group-creatable-select-state.ts +29 -0
  92. package/dist/assets/adapters/next/templates/renderers/generators/form/form-single/build-group-field-array-hooks.ts +13 -0
  93. package/dist/assets/adapters/next/templates/renderers/generators/form/form-single/build-group-fields-jsx.ts +30 -0
  94. package/dist/assets/adapters/next/templates/renderers/generators/form/form-single/generate-card-component.ts +129 -0
  95. package/dist/assets/adapters/next/templates/renderers/generators/form/form-single/generate-single-form.ts +66 -0
  96. package/dist/assets/adapters/next/templates/renderers/generators/form-admin/admin-columns/generate-column-def.ts +72 -0
  97. package/dist/assets/adapters/next/templates/renderers/generators/form-admin/admin-columns/generate-columns.ts +89 -0
  98. package/dist/assets/adapters/next/templates/renderers/generators/form-admin/admin-page/generate-page.ts +23 -0
  99. package/dist/assets/adapters/next/templates/renderers/generators/form-admin/admin-page-content.ts +246 -0
  100. package/dist/assets/adapters/next/templates/renderers/generators/form-admin/admin-submission-drawer.ts +216 -0
  101. package/dist/assets/adapters/next/templates/renderers/generators/form-admin/admin-table.ts +273 -0
  102. package/dist/assets/adapters/next/templates/renderers/generators/form-pipeline/form-actions/exclusive-date-upper-bound-helper.ts +11 -0
  103. package/dist/assets/adapters/next/templates/renderers/generators/form-pipeline/form-actions/generate-form-actions.ts +505 -0
  104. package/dist/assets/adapters/next/templates/renderers/generators/form-pipeline/form-component-multistep/build-component-source.ts +197 -0
  105. package/dist/assets/adapters/next/templates/renderers/generators/form-pipeline/form-component-shared/build-field-error-helper.ts +16 -0
  106. package/dist/assets/adapters/next/templates/renderers/generators/form-pipeline/form-component-shared/error-message-line.ts +13 -0
  107. package/dist/assets/adapters/next/templates/renderers/generators/form-pipeline/form-component-shared/generate-field-jsx.ts +226 -0
  108. package/dist/assets/adapters/next/templates/renderers/generators/form-pipeline/form-component-shared/generate-file-upload-field-jsx.ts +41 -0
  109. package/dist/assets/adapters/next/templates/renderers/generators/form-pipeline/form-component-shared/generate-list-field-jsx.ts +160 -0
  110. package/dist/assets/adapters/next/templates/renderers/generators/form-pipeline/form-component-shared/generate-multiselect-field-jsx.ts +40 -0
  111. package/dist/assets/adapters/next/templates/renderers/generators/form-pipeline/form-component-shared/generate-number-field-jsx.ts +41 -0
  112. package/dist/assets/adapters/next/templates/renderers/generators/form-pipeline/form-component-shared/generate-text-field-jsx.ts +39 -0
  113. package/dist/assets/adapters/next/templates/renderers/generators/form-pipeline/form-component-shared/label-with-description-line.ts +14 -0
  114. package/dist/assets/adapters/next/templates/renderers/generators/form-pipeline/form-component-single/build-single-step-form-component-source.ts +100 -0
  115. package/dist/assets/adapters/next/templates/renderers/generators/form-pipeline/form-database.ts +29 -0
  116. package/dist/assets/adapters/next/templates/renderers/generators/form-pipeline/form-hook.ts +142 -0
  117. package/dist/assets/adapters/next/templates/renderers/generators/hook/generate-hook.ts +169 -0
  118. package/dist/assets/adapters/next/templates/renderers/generators/hook/generate-single-hook.ts +30 -0
  119. package/dist/assets/adapters/next/templates/renderers/generators/navigation-extract.ts +19 -0
  120. package/dist/assets/adapters/next/templates/renderers/generators/page-content/generate-page-content.ts +419 -0
  121. package/dist/assets/adapters/next/templates/renderers/generators/page.ts +24 -0
  122. package/dist/assets/adapters/next/templates/renderers/generators/row-actions-emitters/build-delete-dialog-source.ts +108 -0
  123. package/dist/assets/adapters/next/templates/renderers/generators/row-actions-emitters/build-row-actions-source.ts +61 -0
  124. package/dist/assets/adapters/next/templates/renderers/generators/single-page.ts +59 -0
  125. package/dist/assets/adapters/next/templates/renderers/generators/sortable-header/build-sort-label-expr.ts +9 -0
  126. package/dist/assets/adapters/next/templates/renderers/generators/sortable-header/build-sortable-header-button-jsx.ts +20 -0
  127. package/dist/assets/adapters/next/templates/renderers/generators/sortable-header/build-sortable-header-def.ts +14 -0
  128. package/dist/assets/adapters/next/templates/renderers/generators/table.ts +284 -0
  129. package/dist/assets/adapters/next/templates/renderers/generators/thankyou-email-template.ts +110 -0
  130. package/dist/assets/adapters/next/templates/renderers/generators/webhook-events/render-extract.ts +14 -0
  131. package/dist/assets/adapters/next/templates/renderers/init/scaffolders/next-config/create-next-config-template.ts +48 -0
  132. package/dist/assets/adapters/next/templates/renderers/init/scaffolders/tailwind/admin-shadow-input-utility.ts +9 -0
  133. package/dist/assets/adapters/next/templates/renderers/init/scaffolders/tailwind/admin-theme-block.ts +42 -0
  134. package/dist/assets/adapters/next/templates/renderers/init/templates/app/admin.ts +12 -0
  135. package/dist/assets/adapters/next/templates/renderers/integration-runtime/render-core-email-provider.ts +27 -0
  136. package/dist/assets/adapters/next/templates/renderers/integration-runtime/render-core-storage-provider.ts +27 -0
  137. package/dist/assets/adapters/next/templates/renderers/snapshots/barrels/render-db-barrel.ts +8 -0
  138. package/dist/assets/adapters/next/templates/renderers/snapshots/barrels/render-navigation-barrel.ts +63 -0
  139. package/dist/assets/adapters/next/templates/renderers/snapshots/barrels/render-webhook-events-barrel.ts +16 -0
  140. package/dist/{chunk-TIJEHWRF.js → chunk-OYU73Q2W.js} +1 -50
  141. package/dist/chunk-OYU73Q2W.js.map +1 -0
  142. package/dist/cli.js +8903 -4025
  143. package/dist/cli.js.map +1 -1
  144. package/dist/{read-namespaced-template-UXU7OCY3.js → read-namespaced-template-EIH2NPDJ.js} +2 -2
  145. package/package.json +1 -1
  146. package/dist/chunk-TIJEHWRF.js.map +0 -1
  147. /package/dist/{read-namespaced-template-UXU7OCY3.js.map → read-namespaced-template-EIH2NPDJ.js.map} +0 -0
@@ -0,0 +1,29 @@
1
+ export function renderFormDatabaseImportsTemplate({
2
+ imports,
3
+ tableName,
4
+ toPascalCase,
5
+ fieldDefs,
6
+ customFieldsCol
7
+ }: {
8
+ imports: string
9
+ tableName: string
10
+ toPascalCase: string
11
+ fieldDefs: string
12
+ customFieldsCol: string
13
+ }): string {
14
+ return `import { sql } from 'drizzle-orm'
15
+ import {
16
+ ${imports}
17
+ } from 'drizzle-orm/pg-core'
18
+
19
+ export const ${tableName} = pgTable('${toPascalCase}Submissions', {
20
+ id: uuid().defaultRandom().primaryKey().notNull(),
21
+ ${fieldDefs}${customFieldsCol}
22
+ ipAddress: text(),
23
+ userAgent: text(),
24
+ submittedAt: timestamp({ precision: 3, mode: 'string' }).default(sql\`CURRENT_TIMESTAMP\`).notNull(),
25
+ createdAt: timestamp({ precision: 3, mode: 'string' }).default(sql\`CURRENT_TIMESTAMP\`).notNull(),
26
+ updatedAt: timestamp({ precision: 3, mode: 'string' }).default(sql\`CURRENT_TIMESTAMP\`).notNull()
27
+ })
28
+ `
29
+ }
@@ -0,0 +1,142 @@
1
+ export function renderFormHookGeneratedFunctionTemplate({
2
+ submissionActionImports,
3
+ actionImportPath,
4
+ pascal,
5
+ camel,
6
+ successMsg,
7
+ hasExportCreateObjectUrl
8
+ }: {
9
+ submissionActionImports: string
10
+ actionImportPath: string
11
+ pascal: string
12
+ camel: string
13
+ successMsg: string
14
+ hasExportCreateObjectUrl: string
15
+ }): string {
16
+ return `import {
17
+ ${submissionActionImports}
18
+ } from '@admin/actions/${actionImportPath}'
19
+ import type {
20
+ Create${pascal}SubmissionInput,
21
+ Get${pascal}SubmissionsFilters
22
+ } from '@admin/actions/${actionImportPath}'
23
+ import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'
24
+ import { toast } from 'sonner'
25
+
26
+ export function use${pascal}Submissions(
27
+ search?: string,
28
+ submittedAtFrom?: string,
29
+ submittedAtTo?: string,
30
+ page?: number,
31
+ pageSize?: number,
32
+ orderBy?: string,
33
+ orderDirection?: 'asc' | 'desc'
34
+ ) {
35
+ return useQuery({
36
+ queryKey: [
37
+ '${camel}-submissions',
38
+ search ?? '',
39
+ submittedAtFrom ?? '',
40
+ submittedAtTo ?? '',
41
+ page ?? 0,
42
+ pageSize ?? 20,
43
+ orderBy ?? '',
44
+ orderDirection ?? ''
45
+ ],
46
+ queryFn: () => {
47
+ const filters: Get${pascal}SubmissionsFilters = {}
48
+
49
+ if (search) filters.search = search
50
+ if (submittedAtFrom) filters.submittedAtFrom = submittedAtFrom
51
+ if (submittedAtTo) filters.submittedAtTo = submittedAtTo
52
+ if (pageSize != null && pageSize !== -1) {
53
+ filters.limit = pageSize
54
+ filters.offset = (page ?? 0) * pageSize
55
+ }
56
+ if (orderBy) filters.orderBy = orderBy
57
+ if (orderDirection) filters.orderDirection = orderDirection
58
+
59
+ return get${pascal}Submissions(Object.keys(filters).length > 0 ? filters : undefined)
60
+ }
61
+ })
62
+ }
63
+
64
+ export function use${pascal}Submission(id: string | null) {
65
+ return useQuery({
66
+ queryKey: ['${camel}-submission', id],
67
+ queryFn: () => {
68
+ if (!id) {
69
+ throw new Error('Submission ID is required')
70
+ }
71
+ return get${pascal}Submission(id)
72
+ },
73
+ enabled: !!id
74
+ })
75
+ }
76
+
77
+ export function useCreate${pascal}Submission() {
78
+ const queryClient = useQueryClient()
79
+
80
+ return useMutation({
81
+ mutationFn: (data: Create${pascal}SubmissionInput) => create${pascal}Submission(data),
82
+ onSuccess: async (result) => {
83
+ if (result.success) {
84
+ toast.success('${successMsg}')
85
+ await queryClient.refetchQueries({ queryKey: ['${camel}-submissions'] })
86
+ } else {
87
+ toast.error(result.error || 'Failed to submit form')
88
+ }
89
+ },
90
+ onError: (error: Error) => {
91
+ toast.error(error.message || 'Failed to submit form')
92
+ }
93
+ })
94
+ }
95
+
96
+ export function useDelete${pascal}Submission() {
97
+ const queryClient = useQueryClient()
98
+
99
+ return useMutation({
100
+ mutationFn: (id: string) => delete${pascal}Submission(id),
101
+ onSuccess: async () => {
102
+ toast.success('Submission deleted successfully')
103
+ await queryClient.refetchQueries({ queryKey: ['${camel}-submissions'] })
104
+ },
105
+ onError: (error: Error) => {
106
+ toast.error(error.message || 'Failed to delete submission')
107
+ }
108
+ })
109
+ }
110
+ ${hasExportCreateObjectUrl}`
111
+ }
112
+
113
+ export function renderFormHookGeneratedFunctionDetailsTemplate({
114
+ pascal,
115
+ formName
116
+ }: {
117
+ pascal: string
118
+ formName: string
119
+ }): string {
120
+ return `
121
+ export function useExport${pascal}SubmissionsCSV() {
122
+ return useMutation({
123
+ mutationFn: export${pascal}SubmissionsCSV,
124
+ onSuccess: (csvContent) => {
125
+ const blob = new Blob([csvContent], { type: 'text/csv' })
126
+ const url = window.URL.createObjectURL(blob)
127
+ const link = document.createElement('a')
128
+ link.href = url
129
+ link.download = \`${formName}-submissions-\${new Date().toISOString().split('T')[0]}.csv\`
130
+ document.body.appendChild(link)
131
+ link.click()
132
+ document.body.removeChild(link)
133
+ window.URL.revokeObjectURL(url)
134
+ toast.success('CSV exported successfully')
135
+ },
136
+ onError: (error: Error) => {
137
+ toast.error(error.message || 'Failed to export CSV')
138
+ }
139
+ })
140
+ }
141
+ `
142
+ }
@@ -0,0 +1,169 @@
1
+ export function renderHookContentTemplate(): string {
2
+ return ` if (safePageSize !== -1) {
3
+ filters.limit = safePageSize
4
+ filters.offset = safePage * safePageSize
5
+ }
6
+ if (orderBy) filters.orderBy = orderBy
7
+ if (orderDirection) filters.orderDirection = orderDirection`
8
+ }
9
+
10
+ export function renderHookFiltersTemplate({
11
+ plural,
12
+ map,
13
+ paginationBlock
14
+ }: {
15
+ plural: string
16
+ map: string
17
+ paginationBlock: string
18
+ }): string {
19
+ return `const filters: ${plural}Query = {}
20
+ if (search) filters.search = search
21
+ ${map}
22
+ ${paginationBlock}
23
+ return get${plural}(Object.keys(filters).length > 0 ? filters : undefined)`
24
+ }
25
+
26
+ export function renderHookContentDetailsTemplate(): string {
27
+ return ` if (status === 'published') filters.published = true
28
+ if (status === 'draft') filters.published = false`
29
+ }
30
+
31
+ export function renderHookContentDetailsBranchTemplate({
32
+ filterFromVariableName,
33
+ filterField,
34
+ filterToVariableName
35
+ }: {
36
+ filterFromVariableName: string
37
+ filterField: string
38
+ filterToVariableName: string
39
+ }): string {
40
+ return ` if (${filterFromVariableName}) filters.${filterField}From = ${filterFromVariableName}
41
+ if (${filterToVariableName}) filters.${filterField}To = ${filterToVariableName}`
42
+ }
43
+
44
+ export function renderHookContentDetailsBranchBodyTemplate({
45
+ filterVariableName,
46
+ filterField
47
+ }: {
48
+ filterVariableName: string
49
+ filterField: string
50
+ }): string {
51
+ return ` if (${filterVariableName} === 'true') filters.${filterField} = true
52
+ if (${filterVariableName} === 'false') filters.${filterField} = false`
53
+ }
54
+
55
+ export function renderHookFiltersDetailsTemplate({
56
+ plural,
57
+ paginationBlock
58
+ }: {
59
+ plural: string
60
+ paginationBlock: string
61
+ }): string {
62
+ return `const filters: ${plural}Query = {}
63
+ if (search) filters.search = search
64
+ ${paginationBlock}
65
+ return get${plural}(Object.keys(filters).length > 0 ? filters : undefined)`
66
+ }
67
+
68
+ export function renderHookGeneratedFunctionTemplate({
69
+ singular,
70
+ singularText
71
+ }: {
72
+ singular: string
73
+ singularText: string
74
+ }): string {
75
+ return `
76
+ export function use${singular}(id: string | null | undefined): UseQueryResult<${singular} | null, Error> {
77
+ return useQuery({
78
+ queryKey: ['${singularText}', id],
79
+ queryFn: () => (id ? get${singular}ById(id) : Promise.resolve(null)),
80
+ enabled: !!id,
81
+ })
82
+ }`
83
+ }
84
+
85
+ export function renderHookGeneratedFunctionDetailsTemplate({
86
+ singular,
87
+ singularText
88
+ }: {
89
+ singular: string
90
+ singularText: string
91
+ }): string {
92
+ return `
93
+
94
+ export function use${singular}BySlug(slug: string | null | undefined): UseQueryResult<${singular} | null, Error> {
95
+ return useQuery({
96
+ queryKey: ['${singularText}', 'slug', slug],
97
+ queryFn: () => (slug ? get${singular}BySlug(slug) : Promise.resolve(null)),
98
+ enabled: !!slug,
99
+ })
100
+ }`
101
+ }
102
+
103
+ export function renderHookGeneratedFunctionDetailsBranchTemplate({
104
+ plural,
105
+ filterPascalName,
106
+ pluralText,
107
+ filterKey
108
+ }: {
109
+ plural: string
110
+ filterPascalName: string
111
+ pluralText: string
112
+ filterKey: string
113
+ }): string {
114
+ return `
115
+
116
+ export function use${plural}Distinct${filterPascalName}(): UseQueryResult<string[], Error> {
117
+ return useQuery({
118
+ queryKey: ['${pluralText}', 'distinct', '${filterKey}'],
119
+ queryFn: () => getDistinct${plural}${filterPascalName}()
120
+ })
121
+ }`
122
+ }
123
+
124
+ export function renderHookGeneratedFunctionDetailsBranchBodyTemplate({
125
+ join,
126
+ actionImportPath,
127
+ plural,
128
+ allParamsContent,
129
+ pluralText,
130
+ queryKeyParts,
131
+ filtersBody,
132
+ singularHook,
133
+ slugHook,
134
+ distinctHooks
135
+ }: {
136
+ join: string
137
+ actionImportPath: string
138
+ plural: string
139
+ allParamsContent: string
140
+ pluralText: string
141
+ queryKeyParts: string
142
+ filtersBody: string
143
+ singularHook: string
144
+ slugHook: string
145
+ distinctHooks: string
146
+ }): string {
147
+ return `import {
148
+ ${join}
149
+ } from '@admin/actions/${actionImportPath}'
150
+ import { type UseQueryResult, useQuery } from '@tanstack/react-query'
151
+
152
+ export function use${plural}(
153
+ ${allParamsContent}
154
+ options?: { enabled?: boolean }
155
+ ): UseQueryResult<${plural}Page, Error> {
156
+ const safePage = Number.isFinite(page ?? 0) && (page ?? 0) > 0 ? (page ?? 0) : 0
157
+ const safePageSize = pageSize === -1 || (Number.isFinite(pageSize ?? 20) && (pageSize ?? 20) > 0) ? (pageSize ?? 20) : 20
158
+
159
+ return useQuery({
160
+ queryKey: ['${pluralText}', ${queryKeyParts}],
161
+ queryFn: () => {
162
+ ${filtersBody}
163
+ },
164
+ enabled: options?.enabled ?? true,
165
+ })
166
+ }
167
+ ${singularHook}${slugHook}${distinctHooks}
168
+ `
169
+ }
@@ -0,0 +1,30 @@
1
+ export function renderSingleHookComponentTemplate({
2
+ singular,
3
+ actionImportPath,
4
+ schemaName
5
+ }: {
6
+ singular: string
7
+ actionImportPath: string
8
+ schemaName: string
9
+ }): string {
10
+ return `import {
11
+ get${singular},
12
+ type ${singular}
13
+ } from '@admin/actions/${actionImportPath}'
14
+ import { type UseQueryResult, useQuery } from '@tanstack/react-query'
15
+
16
+ interface Use${singular}Options {
17
+ initialData?: ${singular} | null
18
+ }
19
+
20
+ export function use${singular}(options: Use${singular}Options = {}): UseQueryResult<${singular} | null, Error> {
21
+ return useQuery({
22
+ queryKey: ['${schemaName}'],
23
+ queryFn: () => get${singular}(),
24
+ staleTime: Number.POSITIVE_INFINITY,
25
+ gcTime: Number.POSITIVE_INFINITY,
26
+ ...(options.initialData !== undefined ? { initialData: options.initialData } : {}),
27
+ })
28
+ }
29
+ `
30
+ }
@@ -0,0 +1,19 @@
1
+ export function renderBuildNavigationExtractSourceImportsTemplate({
2
+ join,
3
+ toCamelCase,
4
+ joinText
5
+ }: {
6
+ join: string
7
+ toCamelCase: string
8
+ joinText: string
9
+ }): string {
10
+ return `import type { AdminNavigationItem } from '@admin/types/navigation'
11
+ import { ${join} } from 'lucide-react'
12
+
13
+ export const ${toCamelCase}Nav: AdminNavigationItem[] = [
14
+ {
15
+ ${joinText}
16
+ }
17
+ ]
18
+ `
19
+ }