@postxl/generator 0.74.2 → 1.0.1

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 (189) hide show
  1. package/LICENSE +50 -0
  2. package/README.md +79 -1
  3. package/dist/generator-manager.class.d.ts +59 -0
  4. package/dist/generator-manager.class.js +221 -0
  5. package/dist/generator.class.d.ts +90 -0
  6. package/dist/generator.class.js +32 -0
  7. package/dist/generator.context.d.ts +174 -0
  8. package/dist/generator.context.js +125 -0
  9. package/dist/helpers/branded.types.d.ts +149 -0
  10. package/dist/helpers/branded.types.js +111 -0
  11. package/dist/helpers/config-builder.class.d.ts +27 -0
  12. package/dist/helpers/config-builder.class.js +54 -0
  13. package/dist/helpers/import-generator.class.d.ts +70 -0
  14. package/dist/helpers/import-generator.class.js +166 -0
  15. package/dist/helpers/importable.types.d.ts +52 -0
  16. package/dist/helpers/importable.types.js +15 -0
  17. package/dist/helpers/index-generator.class.d.ts +10 -0
  18. package/dist/helpers/index-generator.class.js +46 -0
  19. package/dist/helpers/index.d.ts +8 -0
  20. package/dist/helpers/index.js +24 -0
  21. package/dist/helpers/package-json.generator.d.ts +56 -0
  22. package/dist/helpers/package-json.generator.js +36 -0
  23. package/dist/helpers/tsconfig.generator.d.ts +1 -0
  24. package/dist/helpers/tsconfig.generator.js +14 -0
  25. package/dist/helpers/verify-context.d.ts +4 -0
  26. package/dist/helpers/verify-context.js +23 -0
  27. package/dist/index.d.ts +5 -0
  28. package/dist/index.js +21 -0
  29. package/dist/utils/checksum.d.ts +10 -0
  30. package/dist/utils/checksum.js +132 -0
  31. package/dist/utils/fs-utils.d.ts +34 -0
  32. package/dist/utils/fs-utils.js +126 -0
  33. package/dist/utils/index.d.ts +10 -0
  34. package/dist/utils/index.js +26 -0
  35. package/dist/utils/jsdoc.d.ts +12 -0
  36. package/dist/utils/jsdoc.js +37 -0
  37. package/dist/utils/lint.d.ts +46 -0
  38. package/dist/utils/lint.js +154 -0
  39. package/dist/utils/lockfile.d.ts +7 -0
  40. package/dist/utils/lockfile.js +80 -0
  41. package/dist/utils/logger.class.d.ts +25 -0
  42. package/dist/utils/logger.class.js +55 -0
  43. package/dist/utils/merge-conflict.d.ts +55 -0
  44. package/dist/utils/merge-conflict.js +264 -0
  45. package/dist/utils/path.d.ts +52 -0
  46. package/dist/utils/path.js +183 -0
  47. package/dist/utils/prettier-config.d.ts +2 -0
  48. package/dist/utils/prettier-config.js +13 -0
  49. package/dist/utils/prettier.d.ts +5 -0
  50. package/dist/utils/prettier.js +67 -0
  51. package/dist/utils/prettier.skiptest.d.ts +1 -0
  52. package/dist/utils/prettier.skiptest.js +22 -0
  53. package/dist/utils/promise.d.ts +2 -0
  54. package/dist/utils/promise.js +10 -0
  55. package/dist/utils/string-functions.d.ts +9 -0
  56. package/dist/utils/string-functions.js +23 -0
  57. package/dist/utils/sync-log-result.d.ts +9 -0
  58. package/dist/utils/sync-log-result.js +90 -0
  59. package/dist/utils/sync.d.ts +143 -0
  60. package/dist/utils/sync.js +325 -0
  61. package/dist/utils/template.d.ts +66 -0
  62. package/dist/utils/template.js +159 -0
  63. package/dist/utils/vfs.class.d.ts +115 -0
  64. package/dist/utils/vfs.class.js +239 -0
  65. package/dist/utils/zip.d.ts +13 -0
  66. package/dist/utils/zip.js +40 -0
  67. package/package.json +57 -34
  68. package/dist/generator.d.ts +0 -13
  69. package/dist/generator.js +0 -455
  70. package/dist/generators/enums/react.generator.d.ts +0 -10
  71. package/dist/generators/enums/react.generator.js +0 -110
  72. package/dist/generators/enums/types.generator.d.ts +0 -10
  73. package/dist/generators/enums/types.generator.js +0 -39
  74. package/dist/generators/indices/data/module.generator.d.ts +0 -9
  75. package/dist/generators/indices/data/module.generator.js +0 -60
  76. package/dist/generators/indices/data/service.generator.d.ts +0 -9
  77. package/dist/generators/indices/data/service.generator.js +0 -249
  78. package/dist/generators/indices/data/types.generator.d.ts +0 -9
  79. package/dist/generators/indices/data/types.generator.js +0 -49
  80. package/dist/generators/indices/dispatcher-service.generator.d.ts +0 -9
  81. package/dist/generators/indices/dispatcher-service.generator.js +0 -107
  82. package/dist/generators/indices/export/class.generator.d.ts +0 -9
  83. package/dist/generators/indices/export/class.generator.js +0 -140
  84. package/dist/generators/indices/export/encoder.generator.d.ts +0 -9
  85. package/dist/generators/indices/export/encoder.generator.js +0 -50
  86. package/dist/generators/indices/import/convert-functions.generator.d.ts +0 -9
  87. package/dist/generators/indices/import/convert-functions.generator.js +0 -509
  88. package/dist/generators/indices/import/decoder.generator.d.ts +0 -9
  89. package/dist/generators/indices/import/decoder.generator.js +0 -40
  90. package/dist/generators/indices/import/service.generator.d.ts +0 -9
  91. package/dist/generators/indices/import/service.generator.js +0 -573
  92. package/dist/generators/indices/import/types.generator.d.ts +0 -9
  93. package/dist/generators/indices/import/types.generator.js +0 -242
  94. package/dist/generators/indices/repositories.generator.d.ts +0 -9
  95. package/dist/generators/indices/repositories.generator.js +0 -25
  96. package/dist/generators/indices/routes.generator.d.ts +0 -9
  97. package/dist/generators/indices/routes.generator.js +0 -29
  98. package/dist/generators/indices/seed-migration.generator.d.ts +0 -9
  99. package/dist/generators/indices/seed-migration.generator.js +0 -36
  100. package/dist/generators/indices/seed-template.generator.d.ts +0 -9
  101. package/dist/generators/indices/seed-template.generator.js +0 -80
  102. package/dist/generators/indices/testids.generator.d.ts +0 -7
  103. package/dist/generators/indices/testids.generator.js +0 -71
  104. package/dist/generators/indices/types.generator.d.ts +0 -10
  105. package/dist/generators/indices/types.generator.js +0 -35
  106. package/dist/generators/indices/update/actiontypes.generator.d.ts +0 -9
  107. package/dist/generators/indices/update/actiontypes.generator.js +0 -49
  108. package/dist/generators/indices/update/module.generator.d.ts +0 -9
  109. package/dist/generators/indices/update/module.generator.js +0 -41
  110. package/dist/generators/indices/update/service.generator.d.ts +0 -9
  111. package/dist/generators/indices/update/service.generator.js +0 -34
  112. package/dist/generators/indices/view/module.generator.d.ts +0 -9
  113. package/dist/generators/indices/view/module.generator.js +0 -39
  114. package/dist/generators/indices/view/service.generator.d.ts +0 -9
  115. package/dist/generators/indices/view/service.generator.js +0 -34
  116. package/dist/generators/models/admin.page.generator.d.ts +0 -7
  117. package/dist/generators/models/admin.page.generator.js +0 -74
  118. package/dist/generators/models/export/encoder.generator.d.ts +0 -9
  119. package/dist/generators/models/export/encoder.generator.js +0 -51
  120. package/dist/generators/models/import/decoder.generator.d.ts +0 -9
  121. package/dist/generators/models/import/decoder.generator.js +0 -148
  122. package/dist/generators/models/react/context.generator.d.ts +0 -9
  123. package/dist/generators/models/react/context.generator.js +0 -71
  124. package/dist/generators/models/react/index.d.ts +0 -10
  125. package/dist/generators/models/react/index.js +0 -31
  126. package/dist/generators/models/react/library.generator.d.ts +0 -10
  127. package/dist/generators/models/react/library.generator.js +0 -94
  128. package/dist/generators/models/react/lookup.generator.d.ts +0 -9
  129. package/dist/generators/models/react/lookup.generator.js +0 -175
  130. package/dist/generators/models/react/modals.generator.d.ts +0 -23
  131. package/dist/generators/models/react/modals.generator.js +0 -710
  132. package/dist/generators/models/repository.generator.d.ts +0 -9
  133. package/dist/generators/models/repository.generator.js +0 -955
  134. package/dist/generators/models/route.generator.d.ts +0 -9
  135. package/dist/generators/models/route.generator.js +0 -92
  136. package/dist/generators/models/seed.generator.d.ts +0 -21
  137. package/dist/generators/models/seed.generator.js +0 -285
  138. package/dist/generators/models/stub.generator.d.ts +0 -9
  139. package/dist/generators/models/stub.generator.js +0 -92
  140. package/dist/generators/models/types.generator.d.ts +0 -9
  141. package/dist/generators/models/types.generator.js +0 -125
  142. package/dist/generators/models/update/service.generator.d.ts +0 -10
  143. package/dist/generators/models/update/service.generator.js +0 -302
  144. package/dist/generators/models/view/service.generator.d.ts +0 -10
  145. package/dist/generators/models/view/service.generator.js +0 -239
  146. package/dist/lib/attributes.d.ts +0 -114
  147. package/dist/lib/attributes.js +0 -2
  148. package/dist/lib/exports.d.ts +0 -45
  149. package/dist/lib/exports.js +0 -90
  150. package/dist/lib/imports.d.ts +0 -65
  151. package/dist/lib/imports.js +0 -114
  152. package/dist/lib/meta.d.ts +0 -1191
  153. package/dist/lib/meta.js +0 -434
  154. package/dist/lib/schema/fields.d.ts +0 -46
  155. package/dist/lib/schema/fields.js +0 -62
  156. package/dist/lib/schema/schema.d.ts +0 -466
  157. package/dist/lib/schema/schema.js +0 -18
  158. package/dist/lib/schema/types.d.ts +0 -201
  159. package/dist/lib/schema/types.js +0 -112
  160. package/dist/lib/serializer.d.ts +0 -15
  161. package/dist/lib/serializer.js +0 -24
  162. package/dist/lib/test-id-collector.d.ts +0 -42
  163. package/dist/lib/test-id-collector.js +0 -53
  164. package/dist/lib/types.d.ts +0 -7
  165. package/dist/lib/types.js +0 -13
  166. package/dist/lib/typescript.d.ts +0 -5
  167. package/dist/lib/typescript.js +0 -22
  168. package/dist/lib/utils/ast.d.ts +0 -29
  169. package/dist/lib/utils/ast.js +0 -23
  170. package/dist/lib/utils/error.d.ts +0 -17
  171. package/dist/lib/utils/error.js +0 -52
  172. package/dist/lib/utils/file.d.ts +0 -10
  173. package/dist/lib/utils/file.js +0 -56
  174. package/dist/lib/utils/jsdoc.d.ts +0 -9
  175. package/dist/lib/utils/jsdoc.js +0 -37
  176. package/dist/lib/utils/logger.d.ts +0 -17
  177. package/dist/lib/utils/logger.js +0 -12
  178. package/dist/lib/utils/string.d.ts +0 -40
  179. package/dist/lib/utils/string.js +0 -187
  180. package/dist/lib/utils/types.d.ts +0 -12
  181. package/dist/lib/utils/types.js +0 -2
  182. package/dist/lib/zod.d.ts +0 -8
  183. package/dist/lib/zod.js +0 -60
  184. package/dist/prisma/attributes.d.ts +0 -21
  185. package/dist/prisma/attributes.js +0 -175
  186. package/dist/prisma/client-path.d.ts +0 -7
  187. package/dist/prisma/client-path.js +0 -29
  188. package/dist/prisma/parse.d.ts +0 -12
  189. package/dist/prisma/parse.js +0 -452
@@ -1,41 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.generateBusinessLogicUpdateModule = void 0;
4
- const imports_1 = require("../../../lib/imports");
5
- const meta_1 = require("../../../lib/meta");
6
- /**
7
- * Generates a BusinessLogic update module class.
8
- */
9
- function generateBusinessLogicUpdateModule({ models, meta }) {
10
- const mm = models
11
- .map((model) => ({ model, meta: (0, meta_1.getModelMetadata)({ model }) }))
12
- .sort((a, b) => a.meta.update.serviceClassName.localeCompare(b.meta.update.serviceClassName));
13
- const imports = imports_1.ImportsGenerator.from(meta.update.moduleLocation.path).addImports({
14
- [meta.update.serviceLocation.path]: meta.update.serviceClassName,
15
- [meta.view.moduleLocation.import]: meta.view.moduleName,
16
- });
17
- const providers = [meta.update.serviceClassName];
18
- for (const { meta } of mm) {
19
- imports.addImport({
20
- items: [meta.update.serviceClassName],
21
- from: meta.update.serviceClassLocation.path,
22
- });
23
- providers.push(meta.update.serviceClassName);
24
- }
25
- const moduleName = meta.update.moduleName;
26
- return /* ts */ `
27
- import { Module } from '@nestjs/common'
28
-
29
- ${imports.generate()}
30
-
31
- const providers = [${providers.join(', ')}]
32
-
33
- @Module({
34
- imports: [ViewModule],
35
- providers,
36
- exports: providers,
37
- })
38
- export class ${moduleName} {}
39
- `;
40
- }
41
- exports.generateBusinessLogicUpdateModule = generateBusinessLogicUpdateModule;
@@ -1,9 +0,0 @@
1
- import { SchemaMetaData } from '../../../lib/meta';
2
- import { Model } from '../../../lib/schema/schema';
3
- /**
4
- * Generates the business logic service class.
5
- */
6
- export declare function generateBusinessLogicUpdateService({ models, meta, }: {
7
- models: Model[];
8
- meta: SchemaMetaData;
9
- }): string;
@@ -1,34 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.generateBusinessLogicUpdateService = void 0;
4
- const imports_1 = require("../../../lib/imports");
5
- const meta_1 = require("../../../lib/meta");
6
- /**
7
- * Generates the business logic service class.
8
- */
9
- function generateBusinessLogicUpdateService({ models, meta, }) {
10
- const mm = models
11
- .map((model) => ({ model, meta: (0, meta_1.getModelMetadata)({ model }) }))
12
- .sort((a, b) => a.meta.update.serviceClassName.localeCompare(b.meta.update.serviceClassName));
13
- const imports = imports_1.ImportsGenerator.from(meta.update.serviceLocation.path);
14
- for (const { meta } of mm) {
15
- imports.addImport({
16
- items: [meta.update.serviceClassName],
17
- from: meta.update.serviceClassLocation.path,
18
- });
19
- }
20
- const constructor = mm
21
- .map(({ meta }) => `@Inject(forwardRef(() => ${meta.update.serviceClassName})) public readonly ${meta.update.serviceVariableName} :${meta.update.serviceClassName}`)
22
- .join(',\n');
23
- return /* ts */ `
24
- import { Inject, Injectable, forwardRef } from '@nestjs/common'
25
-
26
- ${imports.generate()}
27
-
28
- @Injectable()
29
- export class ${meta.update.serviceClassName} {
30
- constructor(${constructor}) {}
31
- }
32
- `;
33
- }
34
- exports.generateBusinessLogicUpdateService = generateBusinessLogicUpdateService;
@@ -1,9 +0,0 @@
1
- import { SchemaMetaData } from '../../../lib/meta';
2
- import { Model } from '../../../lib/schema/schema';
3
- /**
4
- * Generates a BusinessLogic view module class.
5
- */
6
- export declare function generateBusinessLogicViewModule({ models, meta }: {
7
- models: Model[];
8
- meta: SchemaMetaData;
9
- }): string;
@@ -1,39 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.generateBusinessLogicViewModule = void 0;
4
- const imports_1 = require("../../../lib/imports");
5
- const meta_1 = require("../../../lib/meta");
6
- /**
7
- * Generates a BusinessLogic view module class.
8
- */
9
- function generateBusinessLogicViewModule({ models, meta }) {
10
- const mm = models
11
- .map((model) => ({ model, meta: (0, meta_1.getModelMetadata)({ model }) }))
12
- .sort((a, b) => a.meta.view.serviceClassName.localeCompare(b.meta.view.serviceClassName));
13
- const imports = imports_1.ImportsGenerator.from(meta.view.moduleLocation.path).addImports({
14
- [meta.view.serviceLocation.path]: meta.view.serviceClassName,
15
- });
16
- const providers = [meta.view.serviceClassName];
17
- for (const { meta } of mm) {
18
- imports.addImport({
19
- items: [meta.view.serviceClassName],
20
- from: meta.view.serviceLocation.path,
21
- });
22
- providers.push(meta.view.serviceClassName);
23
- }
24
- const moduleName = meta.view.moduleName;
25
- return /* ts */ `
26
- import { Module } from '@nestjs/common'
27
-
28
- ${imports.generate()}
29
-
30
- const providers = [${providers.join(', ')}]
31
-
32
- @Module({
33
- providers,
34
- exports: providers,
35
- })
36
- export class ${moduleName} {}
37
- `;
38
- }
39
- exports.generateBusinessLogicViewModule = generateBusinessLogicViewModule;
@@ -1,9 +0,0 @@
1
- import { SchemaMetaData } from '../../../lib/meta';
2
- import { Model } from '../../../lib/schema/schema';
3
- /**
4
- * Generates the business logic service class.
5
- */
6
- export declare function generateBusinessLogicViewService({ models, meta }: {
7
- models: Model[];
8
- meta: SchemaMetaData;
9
- }): string;
@@ -1,34 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.generateBusinessLogicViewService = void 0;
4
- const imports_1 = require("../../../lib/imports");
5
- const meta_1 = require("../../../lib/meta");
6
- /**
7
- * Generates the business logic service class.
8
- */
9
- function generateBusinessLogicViewService({ models, meta }) {
10
- const mm = models
11
- .map((model) => ({ model, meta: (0, meta_1.getModelMetadata)({ model }) }))
12
- .sort((a, b) => a.meta.view.serviceClassName.localeCompare(b.meta.view.serviceClassName));
13
- const imports = imports_1.ImportsGenerator.from(meta.view.serviceLocation.path);
14
- for (const { meta } of mm) {
15
- imports.addImport({
16
- items: [meta.view.serviceClassName],
17
- from: meta.view.serviceLocation.path,
18
- });
19
- }
20
- const constructor = mm
21
- .map(({ meta }) => `@Inject(forwardRef(() => ${meta.view.serviceClassName})) public readonly ${meta.view.serviceVariableName} :${meta.view.serviceClassName}`)
22
- .join(',\n');
23
- return /* ts */ `
24
- import { Inject, Injectable, forwardRef } from '@nestjs/common'
25
-
26
- ${imports.generate()}
27
-
28
- @Injectable()
29
- export class ${meta.view.serviceClassName} {
30
- constructor(${constructor}) {}
31
- }
32
- `;
33
- }
34
- exports.generateBusinessLogicViewService = generateBusinessLogicViewService;
@@ -1,7 +0,0 @@
1
- import { ModelMetaData } from '../../lib/meta';
2
- /**
3
- * returns an admin page for a given model.
4
- */
5
- export declare function generateAdminPage({ meta }: {
6
- meta: ModelMetaData;
7
- }): string;
@@ -1,74 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.generateAdminPage = void 0;
4
- const imports_1 = require("../../lib/imports");
5
- /**
6
- * returns an admin page for a given model.
7
- */
8
- function generateAdminPage({ meta }) {
9
- const { react } = meta;
10
- const imports = imports_1.ImportsGenerator.from(meta.admin.filePath).addImport({
11
- items: [react.components.libraryComponentName, react.components.modals.createComponentName],
12
- from: meta.react.importPath,
13
- });
14
- return `
15
- import styled from 'styled-components'
16
-
17
- import { ActionWrapper, ActionsBarWrapper, Search, Spacer } from '@components/atoms/ActionsBar'
18
- import { Button } from '@components/atoms/Button'
19
- import { Headline } from '@components/atoms/Headline'
20
-
21
- ${imports.generate()}
22
-
23
- import { Content, Layout } from '@components/shared/Layout'
24
- import { t } from '@i18n/translation'
25
- import { useState } from 'react'
26
-
27
-
28
- export default function Admin${meta.internalSingularNameCapitalized}Page() {
29
- const [query, setQuery] = useState('')
30
- const [isCreateModalOpen, setIsCreateModalOpen] = useState(false)
31
-
32
- return (
33
- <Layout>
34
- <Header>
35
- <Headline label="${meta.userFriendlyName}" />
36
- <ActionsBarWrapper>
37
- <Search
38
- key="Search"
39
- placeholder="Search ${meta.userFriendlyNamePlural}"
40
- icon="magnifying-glass"
41
- value={query}
42
- onChange={(e) => setQuery(e.target.value)}
43
- />
44
-
45
- <Spacer key="Spacer" />
46
-
47
- <ActionWrapper key="GlobalFilter">
48
- <Button label={t['Create']} icon="plus" fill="fill" onClick={() => setIsCreateModalOpen(true)}/>
49
- </ActionWrapper>
50
- </ActionsBarWrapper>
51
- </Header>
52
-
53
- <Content>
54
- <${meta.react.components.libraryComponentName} />
55
- </Content>
56
-
57
- <${meta.react.components.modals.createComponentName}
58
- show={isCreateModalOpen}
59
- onHide={() => setIsCreateModalOpen(false)}
60
- />
61
- </Layout>
62
- )
63
- }
64
-
65
- const Header = styled.header\`
66
- display: flex;
67
- flex-direction: column;
68
- align-items: stretch;
69
-
70
- gap: var(--headline-spacing);
71
- \`
72
- `;
73
- }
74
- exports.generateAdminPage = generateAdminPage;
@@ -1,9 +0,0 @@
1
- import { ModelMetaData } from '../../../lib/meta';
2
- import { Model } from '../../../lib/schema/schema';
3
- /**
4
- * Creates an encoder for the Seed Excel template.
5
- */
6
- export declare function generateModelExportEncoder({ model, meta }: {
7
- model: Model;
8
- meta: ModelMetaData;
9
- }): string;
@@ -1,51 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.generateModelExportEncoder = void 0;
4
- const imports_1 = require("../../../lib/imports");
5
- const meta_1 = require("../../../lib/meta");
6
- const types_1 = require("../../../lib/schema/types");
7
- /**
8
- * Creates an encoder for the Seed Excel template.
9
- */
10
- function generateModelExportEncoder({ model, meta }) {
11
- const { location, itemEncoderFunctionName, encodedExcelType, arrayEncoderFunctionName } = meta.export.encoder;
12
- const imports = imports_1.ImportsGenerator.from(location.path).addImports({
13
- [meta.types.importPath]: [(0, types_1.toAnnotatedTypeName)(meta.types.typeName)],
14
- [meta.import.decoder.location.import]: [meta.import.decoder.rowDecoderName],
15
- });
16
- const { userFriendlyName: userFriendly, userFriendlyNamePlural: userFriendlyPlural } = meta;
17
- const fieldEncoders = generateFieldEncoders({ model });
18
- /* prettier-ignore */
19
- return `
20
- import * as z from 'zod'
21
-
22
- ${imports.generate()}
23
-
24
- /**
25
- * The type for rows in the ${userFriendly} table
26
- */
27
- export type ${encodedExcelType} = z.infer<typeof ${meta.import.decoder.rowDecoderName}>
28
-
29
-
30
- /**
31
- * Converts a ${userFriendly} to an Excel row
32
- */
33
- export const ${itemEncoderFunctionName} = (item: ${model.typeName}): ${encodedExcelType} => ({
34
- ${fieldEncoders.join(',\n')}
35
- })
36
-
37
- /**
38
- * Converts a list of ${userFriendlyPlural} to an Excel table
39
- */
40
- export const ${arrayEncoderFunctionName} = (items: ${model.typeName}[]): ${encodedExcelType}[] => items.map(${itemEncoderFunctionName})
41
- `;
42
- }
43
- exports.generateModelExportEncoder = generateModelExportEncoder;
44
- function generateFieldEncoders({ model }) {
45
- const fieldEncoders = [];
46
- for (const field of model.fields) {
47
- const fieldMeta = (0, meta_1.getFieldMetadata)({ field });
48
- fieldEncoders.push(`"${fieldMeta.excelColumnName}": item.${field.name}`);
49
- }
50
- return fieldEncoders;
51
- }
@@ -1,9 +0,0 @@
1
- import { ModelMetaData } from '../../../lib/meta';
2
- import { Model } from '../../../lib/schema/schema';
3
- /**
4
- * Creates a decoder for the Seed Excel template.
5
- */
6
- export declare function generateModelImportDecoder({ model, meta }: {
7
- model: Model;
8
- meta: ModelMetaData;
9
- }): string;
@@ -1,148 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.generateModelImportDecoder = void 0;
4
- const imports_1 = require("../../../lib/imports");
5
- const meta_1 = require("../../../lib/meta");
6
- const types_1 = require("../../../lib/schema/types");
7
- const types_2 = require("../../../lib/types");
8
- const zodPackageName = (0, types_1.toPackageName)('@postxl/zod');
9
- /**
10
- * Creates a decoder for the Seed Excel template.
11
- */
12
- function generateModelImportDecoder({ model, meta }) {
13
- const { tableDecoder: tableImportDecoder } = meta.import.decoder;
14
- const imports = imports_1.ImportsGenerator.from(meta.import.decoder.location.path).addImports({
15
- [zodPackageName]: [(0, types_1.toFunctionName)('excelNullOrBlankDecoder')],
16
- [meta.types.importPath]: [(0, types_1.toAnnotatedTypeName)(meta.types.typeName)],
17
- });
18
- const { userFriendlyName: userFriendly, internalSingularNameCapitalized: singularCapitalized } = meta;
19
- const { fieldDecoders, blankFieldDecoders } = generateFieldDecoders({ model, meta, imports });
20
- const fieldTransformers = generateFieldTransformers({ model });
21
- return `
22
- import * as z from 'zod'
23
-
24
- ${imports.generate()}
25
-
26
- /**
27
- * The decoder for an Excel row containing a ${userFriendly} entry
28
- */
29
- export const ${meta.import.decoder.rowDecoderName} = z.object({
30
- ${fieldDecoders.join(',\n')}
31
- })
32
-
33
- /**
34
- * The decoder to identify blank rows in the ${userFriendly} table
35
- *
36
- * Excel tables often contain blank rows - esp. when the table has 0 entries, the table in Excel contains a single row with empty values.
37
- * This decoder identifies these rows and converts them to undefined.
38
- * In the table decoder, we use a union of the blank row decoder and the actual row decoder to not throw on blank rows - but instead filter them out.
39
- */
40
- const blank${singularCapitalized}RowDecoder = z
41
- .object({
42
- ${blankFieldDecoders.join(',\n')}
43
- })
44
- .transform(() => undefined)
45
-
46
- /**
47
- * The decoder for an Excel table that contains ${userFriendly} entries
48
- *
49
- * We use a union of the blank row decoder and the actual row decoder to not throw on blank rows - but instead filter them out.
50
- */
51
- export const ${tableImportDecoder} = z
52
- .array(
53
- blank${singularCapitalized}RowDecoder
54
- .or(${meta.import.decoder.rowDecoderName}
55
- .transform(item => ({
56
- ${fieldTransformers.join(',\n')}
57
- })))
58
- )
59
- .transform((items) => items.filter(Boolean) as ${model.typeName}[])`;
60
- }
61
- exports.generateModelImportDecoder = generateModelImportDecoder;
62
- function generateFieldDecoders({ model, meta, imports, }) {
63
- const fieldDecoders = [];
64
- const blankFieldDecoders = [];
65
- for (const field of model.fields) {
66
- const fieldMeta = (0, meta_1.getFieldMetadata)({ field });
67
- const optionalModifier = field.attributes.isUpdatedAt || field.attributes.isCreatedAt ? '.optional()' : '';
68
- blankFieldDecoders.push(`'${fieldMeta.excelColumnName}': excelNullOrBlankDecoder${optionalModifier}`);
69
- switch (field.kind) {
70
- case 'id': {
71
- imports.addImport({ items: [meta.types.toBrandedIdTypeFnName], from: meta.types.importPath });
72
- fieldDecoders.push(`'${fieldMeta.excelColumnName}': ${toExcelDecoder({
73
- tsTypeName: field.unbrandedTypeName,
74
- nullable: false,
75
- imports,
76
- })}.transform((id: ${field.unbrandedTypeName}) => ${meta.types.toBrandedIdTypeFnName}(id))`);
77
- break;
78
- }
79
- case 'scalar': {
80
- fieldDecoders.push(`'${fieldMeta.excelColumnName}': ${toExcelDecoder({
81
- tsTypeName: field.tsTypeName,
82
- nullable: !field.isRequired,
83
- imports,
84
- })}${optionalModifier}`);
85
- break;
86
- }
87
- case 'relation': {
88
- const refModel = field.relationToModel;
89
- const refMeta = (0, meta_1.getModelMetadata)({ model: refModel });
90
- imports.addImport({ items: [refMeta.types.toBrandedIdTypeFnName], from: refMeta.types.importPath });
91
- fieldDecoders.push(`'${fieldMeta.excelColumnName}': ${toExcelDecoder({
92
- tsTypeName: field.unbrandedTypeName,
93
- nullable: !field.isRequired,
94
- imports,
95
- })}
96
- .transform(
97
- (id: ${field.unbrandedTypeName}${field.isRequired ? '' : '| null'}) =>
98
- ${field.isRequired ? '' : ' id === null ? null : '}${refMeta.types.toBrandedIdTypeFnName}(id)
99
- )`);
100
- break;
101
- }
102
- case 'enum': {
103
- fieldDecoders.push(`'${fieldMeta.excelColumnName}': z.enum([
104
- ${field.enumerator.values.map((v) => `'${v}'`).join(', ')}
105
- ])${field.isRequired ? '' : '.nullable()'}${optionalModifier}`);
106
- break;
107
- }
108
- default: {
109
- throw new types_2.ExhaustiveSwitchCheck(field);
110
- }
111
- }
112
- }
113
- return { fieldDecoders, blankFieldDecoders };
114
- }
115
- function toExcelDecoder({ tsTypeName, nullable, imports, }) {
116
- switch (tsTypeName) {
117
- case 'string': {
118
- const decoder = nullable ? (0, types_1.toFunctionName)('excelStringNullableDecoder') : (0, types_1.toFunctionName)('excelStringDecoder');
119
- imports.addImport({ items: [decoder], from: zodPackageName });
120
- return decoder;
121
- }
122
- case 'boolean': {
123
- const decoder = (0, types_1.toFunctionName)('excelBooleanDecoder');
124
- imports.addImport({ items: [decoder], from: zodPackageName });
125
- return decoder;
126
- }
127
- case 'number': {
128
- const decoder = nullable ? (0, types_1.toFunctionName)('excelNumberNullableDecoder') : (0, types_1.toFunctionName)('excelNumberDecoder');
129
- imports.addImport({ items: [decoder], from: zodPackageName });
130
- return decoder;
131
- }
132
- case 'Date': {
133
- const decoder = nullable ? (0, types_1.toFunctionName)('excelDateNullableDecoder') : (0, types_1.toFunctionName)('excelDateDecoder');
134
- imports.addImport({ items: [decoder], from: zodPackageName });
135
- return decoder;
136
- }
137
- default:
138
- throw new Error('Unknown type');
139
- }
140
- }
141
- function generateFieldTransformers({ model }) {
142
- const fieldTransformers = [];
143
- for (const field of model.fields) {
144
- const fieldMeta = (0, meta_1.getFieldMetadata)({ field });
145
- fieldTransformers.push(`${field.name}: item['${fieldMeta.excelColumnName}']`);
146
- }
147
- return fieldTransformers;
148
- }
@@ -1,9 +0,0 @@
1
- import { ModelMetaData } from '../../../lib/meta';
2
- import { Model } from '../../../lib/schema/schema';
3
- /**
4
- * Utility component that generates the definition of the React context for a given model.
5
- */
6
- export declare function generateModelContext({ model, meta }: {
7
- model: Model;
8
- meta: ModelMetaData;
9
- }): string;
@@ -1,71 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.generateModelContext = void 0;
4
- const imports_1 = require("../../../lib/imports");
5
- /**
6
- * Utility component that generates the definition of the React context for a given model.
7
- */
8
- function generateModelContext({ model, meta }) {
9
- const imports = imports_1.ImportsGenerator.from(meta.react.folderPath).addTypeImport({
10
- from: meta.types.importPath,
11
- items: [model.typeName, model.brandedIdType],
12
- });
13
- const resultMapTypeDefinition = `Map<${model.brandedIdType}, ${model.typeName}>`;
14
- return `
15
- import { useMemo } from 'react'
16
-
17
- import { trpc } from '@lib/trpc'
18
-
19
- ${imports.generate()}
20
-
21
- type ProviderHookType = {
22
- ready: boolean
23
- map: ${resultMapTypeDefinition}
24
- list: ${model.typeName}[]
25
- }
26
-
27
- /**
28
- * A React utility hook to access the model data in the generated forms.
29
- */
30
- export const ${meta.react.context.hookFnName} = (): ProviderHookType => {
31
- const dataQuery = trpc.${meta.trpc.getMap.reactQueryMethod}.useQuery()
32
-
33
- const value = useMemo<ProviderHookType>(() => {
34
- const data: ${resultMapTypeDefinition} = dataQuery.data ?? new ${resultMapTypeDefinition}()
35
-
36
- return {
37
- ready: dataQuery.isLoading === false,
38
- map: data,
39
- list: Array.from(data.values())
40
- }
41
- }, [dataQuery.isLoading, dataQuery.data])
42
-
43
- return value
44
- }
45
-
46
- /**
47
- * Returns a single instance of the model if the data is ready.
48
- */
49
- export const ${meta.react.context.instanceGetterHookFnName} = (
50
- { id }: { id?: ${model.brandedIdType} | null }
51
- ): ${model.typeName} | null => {
52
- const { map, ready } = ${meta.react.context.hookFnName}()
53
-
54
- const value = useMemo(() => {
55
- if (!ready || !id) {
56
- return null
57
- }
58
-
59
- const val = map.get(id)
60
- if (!val) {
61
- return null
62
- }
63
-
64
- return val
65
- }, [map, ready, id])
66
-
67
- return value
68
- }
69
- `;
70
- }
71
- exports.generateModelContext = generateModelContext;
@@ -1,10 +0,0 @@
1
- import { VirtualFS } from '@postxl/lock';
2
- import { ModelMetaData } from '../../../lib/meta';
3
- import { Model } from '../../../lib/schema/schema';
4
- /**
5
- * Generates generic React components for a given model.
6
- */
7
- export declare function generateReactComponentsForModel({ model, meta }: {
8
- model: Model;
9
- meta: ModelMetaData;
10
- }): VirtualFS;
@@ -1,31 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.generateReactComponentsForModel = void 0;
4
- const lock_1 = require("@postxl/lock");
5
- const exports_1 = require("../../../lib/exports");
6
- const context_generator_1 = require("./context.generator");
7
- const library_generator_1 = require("./library.generator");
8
- const lookup_generator_1 = require("./lookup.generator");
9
- const modals_generator_1 = require("./modals.generator");
10
- /**
11
- * Generates generic React components for a given model.
12
- */
13
- function generateReactComponentsForModel({ model, meta }) {
14
- const vfs = new lock_1.VirtualFS();
15
- const exports = exports_1.ExportsGenerator.fromRoot()
16
- .exportEverythingFromFile('./CreateModal')
17
- .exportEverythingFromFile('./EditModal')
18
- .exportEverythingFromFile('./DeleteModal')
19
- .exportEverythingFromFile('./Form')
20
- .exportEverythingFromFile('./context');
21
- vfs.write(`/context.tsx`, (0, context_generator_1.generateModelContext)({ model, meta }));
22
- vfs.write(`/CreateModal.tsx`, (0, modals_generator_1.generateModelCreateModalComponent)({ model, meta }));
23
- vfs.write(`/EditModal.tsx`, (0, modals_generator_1.generateEditModalModelComponent)({ model, meta }));
24
- vfs.write(`/DeleteModal.tsx`, (0, modals_generator_1.generateDeleteModalModelComponent)({ model, meta }));
25
- vfs.write(`/Form.tsx`, (0, lookup_generator_1.generateModelLookupComponents)({ model, meta }));
26
- vfs.write(`/Library.tsx`, (0, library_generator_1.generateModelLibraryComponents)({ model, meta }));
27
- exports.exportEverythingFromFile('./Library');
28
- vfs.write(`/index.ts`, exports.generate());
29
- return vfs;
30
- }
31
- exports.generateReactComponentsForModel = generateReactComponentsForModel;
@@ -1,10 +0,0 @@
1
- import { ModelMetaData } from '../../../lib/meta';
2
- import { Model } from '../../../lib/schema/schema';
3
- /**
4
- * Generates components that may be used to list all entries of a given data type.
5
- *
6
- */
7
- export declare function generateModelLibraryComponents({ model, meta }: {
8
- model: Model;
9
- meta: ModelMetaData;
10
- }): string;