@postxl/generator 0.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 (95) hide show
  1. package/README.md +3 -0
  2. package/dist/jest.config.d.ts +3 -0
  3. package/dist/src/generator.d.ts +12 -0
  4. package/dist/src/generator.js +164 -0
  5. package/dist/src/generators/enums/react.generator.d.ts +10 -0
  6. package/dist/src/generators/enums/react.generator.js +81 -0
  7. package/dist/src/generators/enums/types.generator.d.ts +10 -0
  8. package/dist/src/generators/enums/types.generator.js +18 -0
  9. package/dist/src/generators/indices/datamockmodule.generator.d.ts +9 -0
  10. package/dist/src/generators/indices/datamockmodule.generator.js +104 -0
  11. package/dist/src/generators/indices/datamodule.generator.d.ts +9 -0
  12. package/dist/src/generators/indices/datamodule.generator.js +128 -0
  13. package/dist/src/generators/indices/dataservice.generator.d.ts +9 -0
  14. package/dist/src/generators/indices/dataservice.generator.js +47 -0
  15. package/dist/src/generators/indices/repositories.generator.d.ts +9 -0
  16. package/dist/src/generators/indices/repositories.generator.js +17 -0
  17. package/dist/src/generators/indices/seed.generator.d.ts +9 -0
  18. package/dist/src/generators/indices/seed.generator.js +17 -0
  19. package/dist/src/generators/indices/stubs.generator.d.ts +9 -0
  20. package/dist/src/generators/indices/stubs.generator.js +17 -0
  21. package/dist/src/generators/indices/testdataservice.generator.d.ts +7 -0
  22. package/dist/src/generators/indices/testdataservice.generator.js +61 -0
  23. package/dist/src/generators/indices/types.generator.d.ts +10 -0
  24. package/dist/src/generators/indices/types.generator.js +21 -0
  25. package/dist/src/generators/models/react.generator/context.generator.d.ts +9 -0
  26. package/dist/src/generators/models/react.generator/context.generator.js +66 -0
  27. package/dist/src/generators/models/react.generator/index.d.ts +10 -0
  28. package/dist/src/generators/models/react.generator/index.js +32 -0
  29. package/dist/src/generators/models/react.generator/library.generator.d.ts +9 -0
  30. package/dist/src/generators/models/react.generator/library.generator.js +113 -0
  31. package/dist/src/generators/models/react.generator/lookup.generator.d.ts +9 -0
  32. package/dist/src/generators/models/react.generator/lookup.generator.js +97 -0
  33. package/dist/src/generators/models/react.generator/modals.generator.d.ts +23 -0
  34. package/dist/src/generators/models/react.generator/modals.generator.js +521 -0
  35. package/dist/src/generators/models/repository.generator.d.ts +9 -0
  36. package/dist/src/generators/models/repository.generator.js +282 -0
  37. package/dist/src/generators/models/route.generator.d.ts +16 -0
  38. package/dist/src/generators/models/route.generator.js +112 -0
  39. package/dist/src/generators/models/seed.generator.d.ts +20 -0
  40. package/dist/src/generators/models/seed.generator.js +185 -0
  41. package/dist/src/generators/models/stub.generator.d.ts +9 -0
  42. package/dist/src/generators/models/stub.generator.js +74 -0
  43. package/dist/src/generators/models/types.generator.d.ts +9 -0
  44. package/dist/src/generators/models/types.generator.js +116 -0
  45. package/dist/src/lib/attributes.d.ts +43 -0
  46. package/dist/src/lib/attributes.js +2 -0
  47. package/dist/src/lib/exports.d.ts +26 -0
  48. package/dist/src/lib/exports.js +38 -0
  49. package/dist/src/lib/imports.d.ts +35 -0
  50. package/dist/src/lib/imports.js +55 -0
  51. package/dist/src/lib/meta.d.ts +359 -0
  52. package/dist/src/lib/meta.js +195 -0
  53. package/dist/src/lib/schema/fields.d.ts +35 -0
  54. package/dist/src/lib/schema/fields.js +49 -0
  55. package/dist/src/lib/schema/schema.d.ts +275 -0
  56. package/dist/src/lib/schema/schema.js +2 -0
  57. package/dist/src/lib/schema/types.d.ts +72 -0
  58. package/dist/src/lib/schema/types.js +41 -0
  59. package/dist/src/lib/schema/zod.d.ts +8 -0
  60. package/dist/src/lib/schema/zod.js +44 -0
  61. package/dist/src/lib/serializer.d.ts +15 -0
  62. package/dist/src/lib/serializer.js +24 -0
  63. package/dist/src/lib/utils/error.d.ts +5 -0
  64. package/dist/src/lib/utils/error.js +13 -0
  65. package/dist/src/lib/utils/file.d.ts +10 -0
  66. package/dist/src/lib/utils/file.js +54 -0
  67. package/dist/src/lib/utils/logger.d.ts +11 -0
  68. package/dist/src/lib/utils/logger.js +2 -0
  69. package/dist/src/lib/utils/string.d.ts +29 -0
  70. package/dist/src/lib/utils/string.js +75 -0
  71. package/dist/src/lib/utils/types.d.ts +12 -0
  72. package/dist/src/lib/utils/types.js +2 -0
  73. package/dist/src/lib/vfs.d.ts +137 -0
  74. package/dist/src/lib/vfs.js +419 -0
  75. package/dist/src/prisma/attributes.d.ts +17 -0
  76. package/dist/src/prisma/attributes.js +80 -0
  77. package/dist/src/prisma/client-path.d.ts +7 -0
  78. package/dist/src/prisma/client-path.js +29 -0
  79. package/dist/src/prisma/parse.d.ts +12 -0
  80. package/dist/src/prisma/parse.js +276 -0
  81. package/dist/tests/attributes.test.d.ts +1 -0
  82. package/dist/tests/attributes.test.js +76 -0
  83. package/dist/tests/file.test.d.ts +1 -0
  84. package/dist/tests/file.test.js +26 -0
  85. package/dist/tests/utils/random.d.ts +3 -0
  86. package/dist/tests/utils/random.js +15 -0
  87. package/dist/tests/vfs.test.d.ts +1 -0
  88. package/dist/tests/vfs.test.js +74 -0
  89. package/dist/tsconfig.tsbuildinfo +1 -0
  90. package/jest.config.ts +18 -0
  91. package/package.json +42 -0
  92. package/tests/attributes.test.ts +91 -0
  93. package/tests/file.test.ts +32 -0
  94. package/tests/utils/random.ts +11 -0
  95. package/tests/vfs.test.ts +92 -0
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateSeedIndex = void 0;
4
+ const exports_1 = require("../../lib/exports");
5
+ const meta_1 = require("../../lib/meta");
6
+ /**
7
+ * Generates index file for all seed files.
8
+ */
9
+ function generateSeedIndex({ models, meta }) {
10
+ const exports = exports_1.ExportsGenerator.from(meta.seed.indexFilePath);
11
+ for (const model of models) {
12
+ const meta = (0, meta_1.getModelMetadata)({ model });
13
+ exports.exportEverythingFrom(meta.seed.filePath);
14
+ }
15
+ return exports.generate();
16
+ }
17
+ exports.generateSeedIndex = generateSeedIndex;
@@ -0,0 +1,9 @@
1
+ import { SchemaMetaData } from '../../lib/meta';
2
+ import { Model } from '../../lib/schema/schema';
3
+ /**
4
+ * Generates an index file that exports all stubs.
5
+ */
6
+ export declare function generateStubsIndex({ models, meta }: {
7
+ models: Model[];
8
+ meta: SchemaMetaData;
9
+ }): string;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateStubsIndex = void 0;
4
+ const exports_1 = require("../../lib/exports");
5
+ const meta_1 = require("../../lib/meta");
6
+ /**
7
+ * Generates an index file that exports all stubs.
8
+ */
9
+ function generateStubsIndex({ models, meta }) {
10
+ const exports = exports_1.ExportsGenerator.from(meta.data.stubIndexFilePath);
11
+ for (const model of models) {
12
+ const meta = (0, meta_1.getModelMetadata)({ model });
13
+ exports.exportEverythingFrom(meta.data.stubFilePath);
14
+ }
15
+ return exports.generate();
16
+ }
17
+ exports.generateStubsIndex = generateStubsIndex;
@@ -0,0 +1,7 @@
1
+ import { SchemaMetaData } from '../../lib/meta';
2
+ /**
3
+ * Generates a generic data service object that may be used on the server to access database.
4
+ */
5
+ export declare function generateTestDataService({ meta }: {
6
+ meta: SchemaMetaData;
7
+ }): string;
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.generateTestDataService = void 0;
27
+ const Types = __importStar(require("../../lib/schema/types"));
28
+ const imports_1 = require("../../lib/imports");
29
+ /**
30
+ * Generates a generic data service object that may be used on the server to access database.
31
+ */
32
+ function generateTestDataService({ meta }) {
33
+ const imports = imports_1.ImportsGenerator.from(meta.data.testDataServiceFilePath).addImport({
34
+ items: [Types.toVariableName('MockData')],
35
+ from: meta.data.dataMockModuleFilePath,
36
+ });
37
+ return `
38
+ import { ResetService } from '@d2i/common'
39
+ import { Injectable, Logger } from '@nestjs/common'
40
+ import { DbService } from '@la/db'
41
+
42
+ ${imports.generate()}
43
+
44
+ @Injectable()
45
+ export class TestDataService {
46
+ private logger = new Logger(TestDataService.name)
47
+ constructor(
48
+ private db: DbService,
49
+
50
+ private resetService: ResetService,
51
+ ) {}
52
+
53
+ public async resetTestData(data: MockData) {
54
+ this.logger.log(\`✅ Reset test data\`)
55
+ await this.db.emptyDatabase()
56
+ return this.resetService.reset()
57
+ }
58
+ }
59
+ `;
60
+ }
61
+ exports.generateTestDataService = generateTestDataService;
@@ -0,0 +1,10 @@
1
+ import { SchemaMetaData } from '../../lib/meta';
2
+ import { Enum, Model } from '../../lib/schema/schema';
3
+ /**
4
+ * Generates an index file that exports all types.
5
+ */
6
+ export declare function generateTypesIndex({ models, enums, meta, }: {
7
+ models: Model[];
8
+ enums: Enum[];
9
+ meta: SchemaMetaData;
10
+ }): string;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateTypesIndex = void 0;
4
+ const exports_1 = require("../../lib/exports");
5
+ const meta_1 = require("../../lib/meta");
6
+ /**
7
+ * Generates an index file that exports all types.
8
+ */
9
+ function generateTypesIndex({ models, enums, meta, }) {
10
+ const exports = exports_1.ExportsGenerator.from(meta.types.indexFilePath);
11
+ for (const model of models) {
12
+ const meta = (0, meta_1.getModelMetadata)({ model });
13
+ exports.exportEverythingFrom(meta.types.filePath);
14
+ }
15
+ for (const enumerator of enums) {
16
+ const meta = (0, meta_1.getEnumMetadata)({ enumerator });
17
+ exports.exportEverythingFrom(meta.types.filePath);
18
+ }
19
+ return exports.generate();
20
+ }
21
+ exports.generateTypesIndex = generateTypesIndex;
@@ -0,0 +1,9 @@
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;
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateModelContext = void 0;
4
+ const imports_1 = require("../../../lib/imports");
5
+ const string_1 = require("../../../lib/utils/string");
6
+ /**
7
+ * Utility component that generates the definition of the React context for a given model.
8
+ */
9
+ function generateModelContext({ model, meta }) {
10
+ const queryName = (0, string_1.toCamelCase)(model.name);
11
+ // NOTE: Reference name is not used outside of this file, that's why it's local.
12
+ const contextReferenceName = `${(0, string_1.toPascalCase)(model.name)}Context`;
13
+ const imports = imports_1.ImportsGenerator.from(meta.react.folderPath).addImport({
14
+ items: [model.typeName, model.brandedIdType],
15
+ from: meta.types.importPath,
16
+ });
17
+ return `
18
+ import React, { useMemo } from 'react'
19
+
20
+ import { createUseContext } from '@lib/context'
21
+ import { trpc } from '@lib/trpc'
22
+ import { filterMap, mapMap } from '@lib/utils'
23
+
24
+ ${imports.generate()}
25
+
26
+ type Context = {
27
+ ready: boolean
28
+ map: Map<${model.brandedIdType}, ${model.typeName}>
29
+ list: ${model.typeName}[]
30
+ }
31
+
32
+ const ReactContext = React.createContext<Context | null>(null)
33
+
34
+ /**
35
+ * Context provider to fetch the ${meta.userFriendlyName} data and use it in componenets.
36
+ */
37
+ export const ${meta.react.context.contextProviderName} = ({ children }: React.PropsWithChildren<{}>) => {
38
+ const ${queryName} = trpc.${meta.trpc.getMap.reactQueryMethod}.useQuery()
39
+
40
+ const context = useMemo<Context>(() => {
41
+ const data = ${queryName}.data ?? new Map()
42
+
43
+ return {
44
+ ready: ${queryName}.isLoading === false,
45
+ map: data,
46
+ list: [...data.values()]
47
+ }
48
+ }, [${queryName}.isLoading, ${queryName}.data])
49
+
50
+ return <ReactContext.Provider value={context}>{children}</ReactContext.Provider>
51
+ }
52
+
53
+ export const ${meta.react.context.testContextProviderName} = ({
54
+ value,
55
+ children
56
+ }: React.PropsWithChildren<{ value: Context }>) => {
57
+ return <ReactContext.Provider value={value}>{children}</ReactContext.Provider>
58
+ }
59
+
60
+ /**
61
+ * A React hook to access the model data.
62
+ */
63
+ export const ${meta.react.context.hookFnName} = createUseContext(ReactContext, "${contextReferenceName}")
64
+ `;
65
+ }
66
+ exports.generateModelContext = generateModelContext;
@@ -0,0 +1,10 @@
1
+ import { ModelMetaData } from '../../../lib/meta';
2
+ import { Model } from '../../../lib/schema/schema';
3
+ import { VirtualFS } from '../../../lib/vfs';
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;
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateReactComponentsForModel = void 0;
4
+ const vfs_1 = require("../../../lib/vfs");
5
+ const context_generator_1 = require("./context.generator");
6
+ const library_generator_1 = require("./library.generator");
7
+ const lookup_generator_1 = require("./lookup.generator");
8
+ const modals_generator_1 = require("./modals.generator");
9
+ /**
10
+ * Generates generic React components for a given model.
11
+ */
12
+ function generateReactComponentsForModel({ model, meta }) {
13
+ const vfs = new vfs_1.VirtualFS({
14
+ '/index.ts': `
15
+ export * from './CreateModal'
16
+ export * from './EditModal'
17
+ export * from './DeleteModal'
18
+
19
+ export * from './Form'
20
+ export * from './context'
21
+ export * from './Library'
22
+ `,
23
+ });
24
+ vfs.write(`/context.tsx`, (0, context_generator_1.generateModelContext)({ model, meta }));
25
+ vfs.write(`/CreateModal.tsx`, (0, modals_generator_1.generateModelCreateModalComponent)({ model, meta }));
26
+ vfs.write(`/EditModal.tsx`, (0, modals_generator_1.generateEditModalModelComponent)({ model, meta }));
27
+ vfs.write(`/DeleteModal.tsx`, (0, modals_generator_1.generateDeleteModalModelComponent)({ model, meta }));
28
+ vfs.write(`/Form.tsx`, (0, lookup_generator_1.generateModelLookupComponents)({ model, meta }));
29
+ vfs.write(`/Library.tsx`, (0, library_generator_1.generateModelLibraryComponents)({ model, meta }));
30
+ return vfs;
31
+ }
32
+ exports.generateReactComponentsForModel = generateReactComponentsForModel;
@@ -0,0 +1,9 @@
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
+ export declare function generateModelLibraryComponents({ model, meta }: {
7
+ model: Model;
8
+ meta: ModelMetaData;
9
+ }): string;
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateModelLibraryComponents = void 0;
4
+ const meta_1 = require("../../../lib/meta");
5
+ const fields_1 = require("../../../lib/schema/fields");
6
+ const imports_1 = require("../../../lib/imports");
7
+ /**
8
+ * Generates components that may be used to list all entries of a given data type.
9
+ */
10
+ function generateModelLibraryComponents({ model, meta }) {
11
+ const { react: { context, components }, } = meta;
12
+ const imports = imports_1.ImportsGenerator.from(meta.react.folderPath)
13
+ .addImport({
14
+ items: [model.typeName],
15
+ from: meta.types.importPath,
16
+ })
17
+ .addImport({
18
+ items: [context.hookFnName, components.modals.editComponentName, components.modals.deleteComponentName],
19
+ from: meta.react.folderPath,
20
+ });
21
+ for (const relation of (0, fields_1.getRelationFields)(model)) {
22
+ const refMeta = (0, meta_1.getModelMetadata)({ model: relation.relationToModel });
23
+ imports.addImport({
24
+ items: [refMeta.react.context.contextProviderName],
25
+ from: refMeta.react.folderPath,
26
+ });
27
+ }
28
+ const depContexts = (0, fields_1.getRelationFields)(model).map((field) => {
29
+ const depMeta = (0, meta_1.getModelMetadata)({ model: field.relationToModel });
30
+ return depMeta.react.context.contextProviderName;
31
+ });
32
+ return `
33
+ import React, { useState } from 'react'
34
+
35
+ import { CardList } from '@components/shared/CardList'
36
+ import { CardWithActions } from '@components/shared/CardWithActions'
37
+
38
+ ${imports.generate()}
39
+
40
+ /**
41
+ * Show all ${model.name} entries.
42
+ */
43
+ export const ${components.libraryComponentName} = () => {
44
+ const { ready, list } = ${context.hookFnName}()
45
+
46
+ return (
47
+ <CardList>
48
+ {list.map(item => <${components.cardComponentName} key={item.id} item={item} />)}
49
+ </CardList>
50
+ )
51
+ }
52
+
53
+ /**
54
+ * Show a single ${model.name} entry.
55
+ */
56
+ export const ${components.cardComponentName} = ({ item }: { item: ${model.typeName} }) => {
57
+ const [isEditModalOpen, setIsEditModalOpen] = useState(false)
58
+ const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false)
59
+
60
+ return (
61
+ <>
62
+ <CardWithActions
63
+ title={item.name}
64
+ actions={[
65
+ {
66
+ label: 'Edit',
67
+ icon: 'pencil-on-paper',
68
+ onClick: () => setIsEditModalOpen(true),
69
+ },
70
+ {
71
+ label: 'Delete',
72
+ icon: 'trash',
73
+ onClick: () => setIsDeleteModalOpen(true),
74
+ },
75
+ ]}
76
+ />
77
+
78
+ ${nestInParentComponents({
79
+ child: `
80
+ <${components.modals.editComponentName}
81
+ data={item}
82
+ show={isEditModalOpen}
83
+ onHide={() => setIsEditModalOpen(false)}
84
+ />
85
+ `,
86
+ components: depContexts,
87
+ })}
88
+
89
+ <${components.modals.deleteComponentName}
90
+ id={item.id}
91
+ show={isDeleteModalOpen}
92
+ onHide={() => setIsDeleteModalOpen(false)}
93
+ />
94
+ </>
95
+ )
96
+ }
97
+ `;
98
+ }
99
+ exports.generateModelLibraryComponents = generateModelLibraryComponents;
100
+ /**
101
+ * Nests a given React component in an array of parent wrappers.
102
+ */
103
+ function nestInParentComponents({ child, components }) {
104
+ if (components.length === 0) {
105
+ return child;
106
+ }
107
+ const [parent, ...rest] = components;
108
+ return `
109
+ <${parent}>
110
+ ${nestInParentComponents({ child, components: rest })}
111
+ </${parent}>
112
+ `;
113
+ }
@@ -0,0 +1,9 @@
1
+ import { ModelMetaData } from '../../../lib/meta';
2
+ import { Model } from '../../../lib/schema/schema';
3
+ /**
4
+ * Utility generator that generates lookup components for a given model.
5
+ */
6
+ export declare function generateModelLookupComponents({ model, meta }: {
7
+ model: Model;
8
+ meta: ModelMetaData;
9
+ }): string;
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateModelLookupComponents = void 0;
4
+ const imports_1 = require("../../../lib/imports");
5
+ /**
6
+ * Utility generator that generates lookup components for a given model.
7
+ */
8
+ function generateModelLookupComponents({ model, meta }) {
9
+ const { react: { context, components }, } = meta;
10
+ const imports = imports_1.ImportsGenerator.from(meta.react.folderPath)
11
+ .addImport({
12
+ items: [context.hookFnName],
13
+ from: meta.react.folderPath,
14
+ })
15
+ .addImport({
16
+ items: [model.typeName],
17
+ from: meta.types.importPath,
18
+ });
19
+ const typeName = model.typeName;
20
+ return `
21
+ import React, { useMemo } from 'react'
22
+
23
+ import { MenuSelectInput, MenuSelectField } from '@components/atoms/MenuSelect'
24
+ import { SelectInput, SelectField } from '@components/atoms/SelectInput'
25
+ import { SearchInput, SearchField } from '@components/atoms/SearchInput'
26
+ import { TableSelectInput, TableSelectField } from '@components/atoms/TableSelectInput'
27
+
28
+
29
+ import { UnionOmit } from '@lib/types'
30
+
31
+ ${imports.generate()}
32
+
33
+ // Select
34
+
35
+ export const ${components.forms.selectInputName} = ({
36
+ ...delegated
37
+ }: UnionOmit<React.ComponentPropsWithoutRef<typeof SelectInput<${typeName}>>, 'label' | 'options' | 'loading'>) => {
38
+ const { list, ready } = ${context.hookFnName}()
39
+ return <SelectInput<${typeName}> options={list} label={(l) => l.name} loading={!ready} {...delegated} />
40
+ }
41
+
42
+ export const ${components.forms.selectFieldName} = ({
43
+ ...delegated
44
+ }: Omit<React.ComponentPropsWithoutRef<typeof SelectField<${typeName}>>, 'label' | 'options' | 'loading'>) => {
45
+ const { list, ready } = ${context.hookFnName}()
46
+ return <SelectField<${typeName}> options={list} label={(l) => l.name} loading={!ready} {...delegated} />
47
+ }
48
+
49
+ // Menu Select
50
+
51
+ export const ${components.forms.menuSelectInputName} = ({
52
+ ...delegated
53
+ }: UnionOmit<React.ComponentPropsWithoutRef<typeof MenuSelectInput<${typeName}>>, 'label' | 'options' | 'loading'>) => {
54
+ const { list, ready } = ${context.hookFnName}()
55
+ return <MenuSelectInput<${typeName}> options={list} label={(l) => l.name} loading={!ready} {...delegated} />
56
+ }
57
+
58
+ export const ${components.forms.menuSelectFieldName} = ({
59
+ ...delegated
60
+ }: UnionOmit<React.ComponentPropsWithoutRef<typeof MenuSelectField<${typeName}>>, 'label' | 'options' | 'loading'>) => {
61
+ const { list, ready } = ${context.hookFnName}()
62
+ return <MenuSelectField<${typeName}> options={list} label={(l) => l.name} loading={!ready} {...delegated} />
63
+ }
64
+
65
+ // Search
66
+
67
+ export const ${components.forms.searchInputName} = ({
68
+ ...delegated
69
+ }: UnionOmit<React.ComponentPropsWithoutRef<typeof SearchInput<${typeName}>>, 'label' | 'options' | 'loading'>) => {
70
+ const { list, ready } = ${context.hookFnName}()
71
+ return <SearchInput<${typeName}> options={list} label={(l) => l.name} loading={!ready} {...delegated} />
72
+ }
73
+ export const ${components.forms.searchFieldName} = ({
74
+ ...delegated
75
+ }: Omit<React.ComponentPropsWithoutRef<typeof SearchField<${typeName}>>, 'label' | 'options' | 'loading'>) => {
76
+ const { list, ready } = ${context.hookFnName}()
77
+ return <SearchField<${typeName}> options={list} label={(l) => l.name} loading={!ready} {...delegated} />
78
+ }
79
+
80
+ // Table
81
+
82
+ export const ${components.forms.tableSelectInputName} = ({
83
+ ...delegated
84
+ }: UnionOmit<React.ComponentPropsWithoutRef<typeof TableSelectInput<${typeName}>>, 'label' | 'options' | 'loading'>) => {
85
+ const { list, ready } = ${context.hookFnName}()
86
+ return <TableSelectInput<${typeName}> options={list} label={(l) => l.name} loading={!ready} {...delegated} />
87
+ }
88
+
89
+ export const ${components.forms.tableSelectFieldName} = ({
90
+ ...delegated
91
+ }: UnionOmit<React.ComponentPropsWithoutRef<typeof TableSelectField<${typeName}>>, 'label' | 'options' | 'loading'>) => {
92
+ const { list, ready } = ${context.hookFnName}()
93
+ return <TableSelectField<${typeName}> options={list} label={(l) => l.name} loading={!ready} {...delegated} />
94
+ }
95
+ `;
96
+ }
97
+ exports.generateModelLookupComponents = generateModelLookupComponents;
@@ -0,0 +1,23 @@
1
+ import { Model } from '../../../lib/schema/schema';
2
+ import { ModelMetaData } from '../../../lib/meta';
3
+ /**
4
+ * Utility generator that creates a create modal component for a given model.
5
+ */
6
+ export declare function generateModelCreateModalComponent({ model, meta }: {
7
+ model: Model;
8
+ meta: ModelMetaData;
9
+ }): string;
10
+ /**
11
+ * Returns a React component that lets you edit a model instance.
12
+ */
13
+ export declare function generateEditModalModelComponent({ model, meta }: {
14
+ model: Model;
15
+ meta: ModelMetaData;
16
+ }): string;
17
+ /**
18
+ * Generates a modal component that lets you delete a model instance.
19
+ */
20
+ export declare function generateDeleteModalModelComponent({ model, meta }: {
21
+ model: Model;
22
+ meta: ModelMetaData;
23
+ }): string;