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,41 +0,0 @@
1
- export function renderBuildDefaultValueFromSyncFunctionsGeneratedValueTemplate({
2
- currentValueName,
3
- targetName,
4
- canSyncExpression,
5
- previousValueExpression,
6
- nextValueExpression
7
- }: {
8
- currentValueName: string
9
- targetName: string
10
- canSyncExpression: string
11
- previousValueExpression: string
12
- nextValueExpression: string
13
- }): string {
14
- return ` const ${currentValueName} = form.getValues('${targetName}') as unknown
15
- if (${canSyncExpression}(
16
- ${currentValueName} === '' ||
17
- ${currentValueName} === undefined ||
18
- ${currentValueName} === null ||
19
- ${currentValueName} === ${previousValueExpression}
20
- )) {
21
- form.setValue('${targetName}', ${nextValueExpression} as never, {
22
- shouldDirty: false,
23
- shouldValidate: true
24
- })
25
- }`
26
- }
27
-
28
- export function renderBuildDefaultValueFromSyncFunctionsPreviousValueTemplate({
29
- defaultValueFromHandlerName,
30
- sourceName,
31
- targetSync
32
- }: {
33
- defaultValueFromHandlerName: string
34
- sourceName: string
35
- targetSync: string
36
- }): string {
37
- return ` function ${defaultValueFromHandlerName}(nextValue: unknown) {
38
- const previousValue = form.getValues('${sourceName}') as unknown
39
- ${targetSync}
40
- }`
41
- }
@@ -1,58 +0,0 @@
1
- export function renderBuildUiImportsImportsTemplate({ join }: { join: string }): string {
2
- return `import {
3
- ${join}
4
- } from '@admin/components/ui/form'`
5
- }
6
-
7
- export function renderBuildUiImportsImportsDetailsTemplate(): string {
8
- return `import {
9
- Select,
10
- SelectContent,
11
- SelectItem,
12
- SelectTrigger
13
- } from '@admin/components/ui/select'`
14
- }
15
-
16
- export function renderBuildUiImportsImportsDetailsBranchTemplate({
17
- join
18
- }: {
19
- join: string
20
- }): string {
21
- return `import {
22
- ${join}
23
- } from '@admin/components/ui/command'`
24
- }
25
-
26
- export function renderBuildUiImportsImportsDetailsBranchBodyTemplate(): string {
27
- return `import {
28
- Popover,
29
- PopoverContent,
30
- PopoverTrigger
31
- } from '@admin/components/ui/popover'`
32
- }
33
-
34
- export function renderBuildUiImportsImportsDetailsBranchBodyFragmentTemplate(): string {
35
- return `import {
36
- Tooltip,
37
- TooltipContent,
38
- TooltipTrigger
39
- } from '@admin/components/ui/tooltip'`
40
- }
41
-
42
- export function renderBuildUiImportsImportsDetailsBranchBodyFragmentSectionTemplate(): string {
43
- return `import {
44
- Tabs,
45
- TabsList,
46
- TabsTrigger,
47
- TabsContent
48
- } from '@admin/components/ui/tabs'`
49
- }
50
-
51
- export function renderBuildUiImportsImportsDetailsBranchBodyFragmentSectionVariantTemplate(): string {
52
- return `import {
53
- Accordion,
54
- AccordionContent,
55
- AccordionItem,
56
- AccordionTrigger
57
- } from '@admin/components/ui/accordion'`
58
- }
@@ -1,67 +0,0 @@
1
- export function renderDefaultValueContentTemplate({
2
- fName,
3
- targetValuesExpression,
4
- sourceValuesExpression,
5
- fallback
6
- }: {
7
- fName: string
8
- targetValuesExpression: string
9
- sourceValuesExpression: string
10
- fallback: string
11
- }): string {
12
- return ` ${fName}: ${targetValuesExpression}.length > 0
13
- ? ${targetValuesExpression}
14
- : ${sourceValuesExpression}.length > 0
15
- ? ${sourceValuesExpression}
16
- : ${fallback}`
17
- }
18
-
19
- export function renderDefaultValueContentDetailsTemplate({
20
- fName,
21
- hasInitialValueExpression,
22
- dataSource,
23
- hasInitialValueExpressionText,
24
- sourceName,
25
- defaultFallbackValue
26
- }: {
27
- fName: string
28
- hasInitialValueExpression: string
29
- dataSource: string
30
- hasInitialValueExpressionText: string
31
- sourceName: string
32
- defaultFallbackValue: string
33
- }): string {
34
- return ` ${fName}: ${hasInitialValueExpression}
35
- ? ${dataSource}.${fName}
36
- : ${hasInitialValueExpressionText}
37
- ? (${dataSource}.${sourceName} as never)
38
- : ${defaultFallbackValue}`
39
- }
40
-
41
- export function renderDefaultValueContentDetailsBranchTemplate({
42
- fName,
43
- dataSource
44
- }: {
45
- fName: string
46
- dataSource: string
47
- }): string {
48
- return ` ${fName}: ${dataSource}?.${fName}
49
- ? (typeof ${dataSource}?.${fName} === 'object' ? String(${dataSource}?.${fName}.id) : String(${dataSource}?.${fName}))
50
- : ''`
51
- }
52
-
53
- export function renderDefaultValueContentDetailsBranchBodyTemplate({
54
- fName,
55
- selectedValuesExpression,
56
- validValuesExpression,
57
- fallback
58
- }: {
59
- fName: string
60
- selectedValuesExpression: string
61
- validValuesExpression: string
62
- fallback: string
63
- }): string {
64
- return ` ${fName}: ${selectedValuesExpression}.length > 0
65
- ? ${selectedValuesExpression}.filter((value) => ${validValuesExpression}.includes(value))
66
- : ${fallback}`
67
- }
@@ -1,13 +0,0 @@
1
- export function renderNestedListDefaultValueContentTemplate({
2
- fName,
3
- dataSource,
4
- join
5
- }: {
6
- fName: string
7
- dataSource: string
8
- join: string
9
- }): string {
10
- return ` ${fName}: (${dataSource}?.${fName} ?? []).map((item) => ({
11
- ${join}
12
- }))`
13
- }
@@ -1,14 +0,0 @@
1
- export function renderLabelWithDescriptionLayoutTemplate({
2
- indent,
3
- labelJsx,
4
- descriptionJsx
5
- }: {
6
- indent: string
7
- labelJsx: string
8
- descriptionJsx: string
9
- }): string {
10
- return `<div className="flex flex-col gap-1">
11
- ${indent} ${labelJsx}
12
- ${indent} ${descriptionJsx}
13
- ${indent}</div>`
14
- }
@@ -1,18 +0,0 @@
1
- export function renderTabsTriggerTabsLayoutTemplate({
2
- indent,
3
- tabName,
4
- className,
5
- iconName,
6
- tabLabel
7
- }: {
8
- indent: string
9
- tabName: string
10
- className: string
11
- iconName: string
12
- tabLabel: string
13
- }): string {
14
- return `${indent}<TabsTrigger value="${tabName}"${className}>
15
- ${indent} <${iconName} className="size-4 shrink-0" />
16
- ${indent} <span>${tabLabel}</span>
17
- ${indent}</TabsTrigger>`
18
- }
@@ -1,21 +0,0 @@
1
- export function renderSelectReadValuesExpressionSelectValueTemplate({
2
- dataSource,
3
- fieldName
4
- }: {
5
- dataSource: string
6
- fieldName: string
7
- }): string {
8
- return `(() => {
9
- const selectValue = ${dataSource}?.${fieldName} as unknown
10
- const values = Array.isArray(selectValue) ? selectValue : [selectValue]
11
- return values
12
- .map((option) => {
13
- if (typeof option === 'string') return option
14
- if (option && typeof option === 'object' && 'value' in option) {
15
- return String(option.value)
16
- }
17
- return null
18
- })
19
- .filter((value): value is string => typeof value === 'string' && value.length > 0)
20
- })()`
21
- }
@@ -1,67 +0,0 @@
1
- export function renderBuildGroupCreatableSelectHandlersCurrentValueTemplate({
2
- fieldName,
3
- defaultValueFromHandlerContent
4
- }: {
5
- fieldName: string
6
- defaultValueFromHandlerContent: string
7
- }): string {
8
- return `const currentValue = form.getValues('${fieldName}')
9
- const selectedValues = Array.isArray(currentValue) ? currentValue : []
10
- const nextValues = [...new Set([...selectedValues, result.option.value])]
11
- ${defaultValueFromHandlerContent}form.setValue('${fieldName}', nextValues, {
12
- shouldDirty: true,
13
- shouldValidate: true
14
- })`
15
- }
16
-
17
- export function renderBuildGroupCreatableSelectHandlersContentTemplate({
18
- defaultValueFromHandlerContent,
19
- fieldName
20
- }: {
21
- defaultValueFromHandlerContent: string
22
- fieldName: string
23
- }): string {
24
- return `${defaultValueFromHandlerContent}form.setValue('${fieldName}', result.option.value, {
25
- shouldDirty: true,
26
- shouldValidate: true
27
- })`
28
- }
29
-
30
- export function renderBuildGroupCreatableSelectHandlersTrimmedLabelTemplate({
31
- fieldPascal,
32
- singular,
33
- fieldName,
34
- schemaName,
35
- setCreatedOptionValue
36
- }: {
37
- fieldPascal: string
38
- singular: string
39
- fieldName: string
40
- schemaName: string
41
- setCreatedOptionValue: string
42
- }): string {
43
- return ` function handleCreate${fieldPascal}Option(label: string) {
44
- const trimmedLabel = label.trim()
45
- if (!trimmedLabel) return
46
-
47
- startCreate${fieldPascal}OptionTransition(async () => {
48
- const result = await create${singular}SelectOption({
49
- fieldName: '${fieldName}',
50
- label: trimmedLabel
51
- })
52
-
53
- if (!result.success || !result.option) {
54
- toast.error(result.error || 'Failed to create option')
55
- return
56
- }
57
-
58
- await queryClient.invalidateQueries({
59
- queryKey: ['${schemaName}', 'select-options', '${fieldName}']
60
- })
61
- ${setCreatedOptionValue}
62
- set${fieldPascal}Search('')
63
- set${fieldPascal}Open(false)
64
- toast.success('Option created')
65
- })
66
- }`
67
- }
@@ -1,29 +0,0 @@
1
- export function renderBuildGroupCreatableSelectStateStaticOptionsTemplate({
2
- fieldName,
3
- fieldPascal,
4
- singular,
5
- schemaName,
6
- staticOptions
7
- }: {
8
- fieldName: string
9
- fieldPascal: string
10
- singular: string
11
- schemaName: string
12
- staticOptions: string
13
- }): string {
14
- return ` const [${fieldName}Open, set${fieldPascal}Open] = React.useState(false)
15
- const [${fieldName}Search, set${fieldPascal}Search] = React.useState('')
16
- const [create${fieldPascal}OptionPending, startCreate${fieldPascal}OptionTransition] = React.useTransition()
17
- const { data: ${fieldName}CreatedOptions = [] as ${singular}SelectOption[] } = useQuery<${singular}SelectOption[]>({
18
- queryKey: ['${schemaName}', 'select-options', '${fieldName}'],
19
- queryFn: () => get${singular}SelectOptions('${fieldName}')
20
- })
21
- const ${fieldName}StaticOptions: Array<{ label: string; value: string }> = [${staticOptions}]
22
- const ${fieldName}Options = [
23
- ...${fieldName}StaticOptions,
24
- ...${fieldName}CreatedOptions.filter(
25
- (createdOption: ${singular}SelectOption) =>
26
- !${fieldName}StaticOptions.some((option) => option.value === createdOption.value)
27
- )
28
- ]`
29
- }
@@ -1,13 +0,0 @@
1
- export function renderBuildGroupFieldArrayHooksFieldArrayTemplate({
2
- fieldName,
3
- pascalFieldName
4
- }: {
5
- fieldName: string
6
- pascalFieldName: string
7
- }): string {
8
- return ` const [${fieldName}Expanded, set${pascalFieldName}Expanded] = React.useState('')
9
- const ${fieldName}FieldArray = useFieldArray({
10
- control: form.control,
11
- name: '${fieldName}'
12
- })`
13
- }
@@ -1,30 +0,0 @@
1
- export function renderBuildGroupFieldsJsxTabContentTemplate({
2
- tName,
3
- tabFields
4
- }: {
5
- tName: string
6
- tabFields: string
7
- }): string {
8
- return ` <TabsContent value="${tName}" className="space-y-6">
9
- ${tabFields}
10
- </TabsContent>`
11
- }
12
-
13
- export function renderBuildGroupFieldsJsxTabsLayoutTemplate({
14
- indent,
15
- toPascalCase,
16
- tabsList,
17
- tabsContent
18
- }: {
19
- indent: string
20
- toPascalCase: string
21
- tabsList: string
22
- tabsContent: string
23
- }): string {
24
- return `${indent}<Tabs value={activeTab} onValueChange={(value) => void setActiveTab(value as ${toPascalCase}TabValue)} className="w-full">
25
- <TabsList>
26
- ${tabsList}
27
- </TabsList>
28
- ${tabsContent}
29
- ${indent}</Tabs>`
30
- }
@@ -1,129 +0,0 @@
1
- export function renderCardComponentTabValuesTemplate({
2
- groupVarPrefix,
3
- map,
4
- toPascalCase
5
- }: {
6
- groupVarPrefix: string
7
- map: string
8
- toPascalCase: string
9
- }): string {
10
- return `
11
- const ${groupVarPrefix}TabValues = [${map}] as const
12
- const ${groupVarPrefix}TabParser = parseAsStringLiteral(${groupVarPrefix}TabValues).withDefault(${groupVarPrefix}TabValues[0])
13
-
14
- type ${toPascalCase}TabValue = (typeof ${groupVarPrefix}TabValues)[number]
15
- `
16
- }
17
-
18
- export function renderCardComponentCardHeaderTemplate({
19
- groupVarPrefix,
20
- zodFields,
21
- tabParserConst,
22
- groupComponentName,
23
- singular,
24
- analysisHasTabsFieldTab,
25
- relStateContent,
26
- creatableSelectStateContent,
27
- selectStateContent,
28
- defaultValues,
29
- savedValueName,
30
- toCamelCase,
31
- resetValues,
32
- groupTitle,
33
- schemaName,
34
- defaultValueFromSyncFunctionsContent,
35
- fieldArrayHooksContent,
36
- creatableSelectHandlersContent,
37
- descriptionLine,
38
- fieldsJsx,
39
- groupHintText
40
- }: {
41
- groupVarPrefix: string
42
- zodFields: string
43
- tabParserConst: string
44
- groupComponentName: string
45
- singular: string
46
- analysisHasTabsFieldTab: string
47
- relStateContent: string
48
- creatableSelectStateContent: string
49
- selectStateContent: string
50
- defaultValues: string
51
- savedValueName: string
52
- toCamelCase: string
53
- resetValues: string
54
- groupTitle: string
55
- schemaName: string
56
- defaultValueFromSyncFunctionsContent: string
57
- fieldArrayHooksContent: string
58
- creatableSelectHandlersContent: string
59
- descriptionLine: string
60
- fieldsJsx: string
61
- groupHintText: string
62
- }): string {
63
- return `const ${groupVarPrefix}Schema = z.object({
64
- ${zodFields}
65
- })
66
- ${tabParserConst}
67
-
68
- function ${groupComponentName}({ initialData }: { initialData?: ${singular} | null }) {
69
- const queryClient = useQueryClient()${analysisHasTabsFieldTab}${relStateContent}${creatableSelectStateContent}${selectStateContent}
70
-
71
- const form = useForm<z.infer<typeof ${groupVarPrefix}Schema>>({
72
- resolver: standardSchemaResolver(${groupVarPrefix}Schema),
73
- mode: 'onBlur',
74
- reValidateMode: 'onChange',
75
- defaultValues: {
76
- ${defaultValues}
77
- }
78
- })
79
-
80
- const mutation = useMutation({
81
- mutationFn: (data: ${singular}UpsertInput) => upsert${singular}(data),
82
- onSuccess: async (result) => {
83
- const ${savedValueName} = result.${toCamelCase}
84
- if (${savedValueName}) {
85
- form.reset({
86
- ${resetValues}
87
- })
88
- }
89
- toast.success('${groupTitle} saved')
90
- void queryClient.invalidateQueries({ queryKey: ['${schemaName}'] })
91
- },
92
- onError: (error: Error) => {
93
- toast.error(error.message || 'Failed to save')
94
- }
95
- })
96
-
97
- const isPending = mutation.isPending
98
- ${defaultValueFromSyncFunctionsContent}
99
- ${fieldArrayHooksContent}
100
- ${creatableSelectHandlersContent}
101
- return (
102
- <Form {...form}>
103
- <form onSubmit={form.handleSubmit((values) => {
104
- mutation.mutate(values as ${singular}UpsertInput)
105
- })}>
106
- <Card >
107
- <CardHeader>
108
- <CardTitle>${groupTitle}</CardTitle>${descriptionLine}
109
- </CardHeader>
110
- <CardContent className="space-y-5">
111
- ${fieldsJsx}
112
- </CardContent>
113
- <CardFooter>${groupHintText}
114
- <Button
115
- type="submit"
116
- disabled={isPending || !form.formState.isDirty}
117
- aria-busy={isPending}
118
- className="ml-auto min-w-25"
119
- >
120
- {isPending && <Spinner />}
121
- {isPending ? 'Saving…' : 'Save'}
122
- </Button>
123
- </CardFooter>
124
- </Card>
125
- </form>
126
- </Form>
127
- )
128
- }`
129
- }
@@ -1,66 +0,0 @@
1
- export function renderSingleFormImportsTemplate({ map }: { map: string }): string {
2
- return `import {
3
- ${map}
4
- } from '@admin/components/ui/card'`
5
- }
6
-
7
- export function renderSingleFormClientModuleTemplate({
8
- needsReactImport,
9
- hasCreatableSelectUseQuery,
10
- lucideIconsLucide,
11
- hasNestedListUseFieldArray,
12
- hasTabsFieldImport,
13
- hasRelationshipImport,
14
- relHookImportsContent,
15
- join,
16
- singular,
17
- hasCreatableSelectContent,
18
- actionImportPath,
19
- hasCreatableSelectContentText,
20
- joinText,
21
- cardRenders
22
- }: {
23
- needsReactImport: string
24
- hasCreatableSelectUseQuery: string
25
- lucideIconsLucide: string
26
- hasNestedListUseFieldArray: string
27
- hasTabsFieldImport: string
28
- hasRelationshipImport: string
29
- relHookImportsContent: string
30
- join: string
31
- singular: string
32
- hasCreatableSelectContent: string
33
- actionImportPath: string
34
- hasCreatableSelectContentText: string
35
- joinText: string
36
- cardRenders: string
37
- }): string {
38
- return `'use client'
39
- ${needsReactImport}
40
- import { standardSchemaResolver } from '@hookform/resolvers/standard-schema'
41
- import { useMutation, ${hasCreatableSelectUseQuery}useQueryClient } from '@tanstack/react-query'${lucideIconsLucide}
42
- import {${hasNestedListUseFieldArray} useForm } from 'react-hook-form'
43
- import { toast } from 'sonner'
44
- import { z } from 'zod/v3'${hasTabsFieldImport}${hasRelationshipImport}
45
- ${relHookImportsContent}${join}
46
- import type {
47
- ${singular},
48
- ${hasCreatableSelectContent}${singular}UpsertInput
49
- } from '@admin/actions/${actionImportPath}'
50
- import { ${hasCreatableSelectContentText}upsert${singular} } from '@admin/actions/${actionImportPath}'
51
-
52
- ${joinText}
53
-
54
- interface ${singular}FormProps {
55
- initialData?: ${singular} | null
56
- }
57
-
58
- export function ${singular}Form({ initialData }: ${singular}FormProps) {
59
- return (
60
- <div className="space-y-6">
61
- ${cardRenders}
62
- </div>
63
- )
64
- }
65
- `
66
- }
@@ -1,72 +0,0 @@
1
- export function renderColumnDefLayoutTemplate({
2
- colAccessorKey
3
- }: {
4
- colAccessorKey: string
5
- }): string {
6
- return `cell: ({ row }) => {
7
- const email = row.getValue('${colAccessorKey}') as string
8
- return <div className="text-sm font-medium">{email || '-'}</div>
9
- }`
10
- }
11
-
12
- export function renderColumnDefDateTemplate({
13
- colAccessorKey
14
- }: {
15
- colAccessorKey: string
16
- }): string {
17
- return `cell: ({ row }) => {
18
- const date = row.getValue('${colAccessorKey}') as string
19
- return date ? new Date(date).toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' }) : '-'
20
- }`
21
- }
22
-
23
- export function renderColumnDefValueTemplate({
24
- colAccessorKey
25
- }: {
26
- colAccessorKey: string
27
- }): string {
28
- return `cell: ({ row }) => {
29
- const value = row.getValue('${colAccessorKey}') as string
30
- return <Badge variant="outline">{value || 'N/A'}</Badge>
31
- }`
32
- }
33
-
34
- export function renderColumnDefLayoutDetailsTemplate({
35
- colAccessorKey
36
- }: {
37
- colAccessorKey: string
38
- }): string {
39
- return `cell: ({ row }) => {
40
- const value = row.getValue('${colAccessorKey}') as number
41
- return <div className="text-right">{value !== null && value !== undefined ? value : '-'}</div>
42
- }`
43
- }
44
-
45
- export function renderColumnDefValueDetailsTemplate({
46
- colAccessorKey
47
- }: {
48
- colAccessorKey: string
49
- }): string {
50
- return `cell: ({ row }) => {
51
- const value = row.getValue('${colAccessorKey}') as string
52
- return <div>{value || '-'}</div>
53
- }`
54
- }
55
-
56
- export function renderColumnDefContentTemplate({
57
- colAccessorKey,
58
- columnSize,
59
- sortableHeader,
60
- cellDef
61
- }: {
62
- colAccessorKey: string
63
- columnSize: string
64
- sortableHeader: string
65
- cellDef: string
66
- }): string {
67
- return ` {
68
- accessorKey: '${colAccessorKey}',
69
- ${columnSize}${sortableHeader},
70
- ${cellDef}
71
- }`
72
- }