From 04b25eabd224f06cd02e81d45cb8dbecc0eb9e01 Mon Sep 17 00:00:00 2001 From: Niko Sams Date: Sat, 15 Feb 2025 18:47:34 +0100 Subject: [PATCH] Remove support for explicit {name, import} config, support new imports correctly everywhere using convertConfigImport helper --- demo/admin/src/news/NewsForm.cometGen.ts | 8 +-- demo/admin/src/news/NewsGrid.cometGen.ts | 8 +-- .../products/ProductsGridPreviewAction.tsx | 11 ++-- .../future/CreateCapProductForm.cometGen.ts | 8 +-- ...m.cometGen.ts => ProductForm.cometGen.tsx} | 11 ++-- .../products/future/ProductsGrid.cometGen.tsx | 6 ++- .../products/future/generated/ProductForm.tsx | 9 +++- .../src/generator/future/generateForm.ts | 7 ++- .../generateComponentFormField.ts | 5 +- .../future/generateForm/generateFormField.ts | 18 ++----- .../src/generator/future/generateGrid.ts | 52 +++++++------------ .../future/generateGrid/combinationColumn.ts | 3 +- .../src/generator/future/generator.ts | 22 ++++---- .../future/utils/convertConfigImport.ts | 12 +++++ .../generator/future/utils/tsMorphHelper.ts | 7 ++- 15 files changed, 98 insertions(+), 89 deletions(-) rename demo/admin/src/products/future/{ProductForm.cometGen.ts => ProductForm.cometGen.tsx} (90%) create mode 100644 packages/admin/cms-admin/src/generator/future/utils/convertConfigImport.ts diff --git a/demo/admin/src/news/NewsForm.cometGen.ts b/demo/admin/src/news/NewsForm.cometGen.ts index 4f87d8d2f0..f560689ed4 100644 --- a/demo/admin/src/news/NewsForm.cometGen.ts +++ b/demo/admin/src/news/NewsForm.cometGen.ts @@ -1,6 +1,8 @@ -import { type future_FormConfig as FormConfig } from "@comet/cms-admin"; +import { type DamImageBlock, type future_FormConfig as FormConfig } from "@comet/cms-admin"; import { type GQLNews } from "@src/graphql.generated"; +import { NewsContentBlock } from "./blocks/NewsContentBlock"; + export const NewsForm: FormConfig = { type: "form", gqlType: "News", @@ -36,13 +38,13 @@ export const NewsForm: FormConfig = { type: "block", name: "image", label: "Image", - block: { name: "DamImageBlock", import: "@comet/cms-admin" }, + block: DamImageBlock, }, { type: "block", name: "content", label: "Content", - block: { name: "NewsContentBlock", import: "../blocks/NewsContentBlock" }, + block: NewsContentBlock, }, ], }; diff --git a/demo/admin/src/news/NewsGrid.cometGen.ts b/demo/admin/src/news/NewsGrid.cometGen.ts index be9907d459..65f038fdab 100644 --- a/demo/admin/src/news/NewsGrid.cometGen.ts +++ b/demo/admin/src/news/NewsGrid.cometGen.ts @@ -1,6 +1,8 @@ -import { type future_GridConfig as GridConfig } from "@comet/cms-admin"; +import { type DamImageBlock, type future_GridConfig as GridConfig } from "@comet/cms-admin"; import { type GQLNews } from "@src/graphql.generated"; +import { NewsContentBlock } from "./blocks/NewsContentBlock"; + export const NewsGrid: GridConfig = { type: "grid", gqlType: "News", @@ -26,13 +28,13 @@ export const NewsGrid: GridConfig = { type: "block", name: "image", headerName: "Image", - block: { name: "DamImageBlock", import: "@comet/cms-admin" }, + block: DamImageBlock, }, { type: "block", name: "content", headerName: "Content", - block: { name: "NewsContentBlock", import: "../blocks/NewsContentBlock" }, + block: NewsContentBlock, }, ], }; diff --git a/demo/admin/src/products/ProductsGridPreviewAction.tsx b/demo/admin/src/products/ProductsGridPreviewAction.tsx index 66ac112040..364fb0ad3d 100644 --- a/demo/admin/src/products/ProductsGridPreviewAction.tsx +++ b/demo/admin/src/products/ProductsGridPreviewAction.tsx @@ -9,12 +9,17 @@ import { Typography, } from "@mui/material"; import { type GridCellParams, type GridValidRowModel } from "@mui/x-data-grid-pro"; -import { type GQLProductsGridFutureFragment } from "@src/products/future/generated/ProductsGrid.generated"; -import { type GQLProductsListManualFragment } from "@src/products/ProductsGrid.generated"; +import { FormattedMessage } from "react-intl"; + +import { Dialog, DialogContent, DialogTitle, IconButton, Typography } from "@mui/material"; +import { GridCellParams } from "@mui/x-data-grid-pro"; import { useState } from "react"; import { FormattedMessage } from "react-intl"; -type Props = GridCellParams; +import { GQLProductsGridFutureFragment } from "./future/generated/ProductsGrid.generated"; +import { GQLProductsListManualFragment } from "./ProductsGrid.generated"; + +type Props = GridCellParams; export const ProductsGridPreviewAction = ({ row }: Props) => { const [showDetails, setShowDetails] = useState(false); diff --git a/demo/admin/src/products/future/CreateCapProductForm.cometGen.ts b/demo/admin/src/products/future/CreateCapProductForm.cometGen.ts index e01c0c3cd2..7d93b5fa60 100644 --- a/demo/admin/src/products/future/CreateCapProductForm.cometGen.ts +++ b/demo/admin/src/products/future/CreateCapProductForm.cometGen.ts @@ -1,6 +1,8 @@ -import { type future_FormConfig as FormConfig } from "@comet/cms-admin"; +import { type DamImageBlock, type future_FormConfig as FormConfig } from "@comet/cms-admin"; import { type GQLProduct } from "@src/graphql.generated"; +import { validateTitle } from "./validateTitle"; + export const CreateCapProductForm: FormConfig = { type: "form", gqlType: "Product", @@ -12,13 +14,13 @@ export const CreateCapProductForm: FormConfig = { name: "title", label: "Titel", // default is generated from name (camelCaseToHumanReadable) required: true, // default is inferred from gql schema - validate: { name: "validateTitle", import: "./validateTitle" }, + validate: validateTitle, }, { type: "text", name: "slug" }, { type: "text", name: "description", label: "Description", multiline: true }, { type: "asyncSelect", name: "category", rootQuery: "productCategories" }, { type: "boolean", name: "inStock" }, { type: "date", name: "availableSince", startAdornment: { icon: "CalendarToday" } }, - { type: "block", name: "image", label: "Image", block: { name: "DamImageBlock", import: "@comet/cms-admin" } }, + { type: "block", name: "image", label: "Image", block: DamImageBlock }, ], }; diff --git a/demo/admin/src/products/future/ProductForm.cometGen.ts b/demo/admin/src/products/future/ProductForm.cometGen.tsx similarity index 90% rename from demo/admin/src/products/future/ProductForm.cometGen.ts rename to demo/admin/src/products/future/ProductForm.cometGen.tsx index 1f188249e0..f5c3385804 100644 --- a/demo/admin/src/products/future/ProductForm.cometGen.ts +++ b/demo/admin/src/products/future/ProductForm.cometGen.tsx @@ -1,5 +1,8 @@ import { DamImageBlock, type future_FormConfig as FormConfig } from "@comet/cms-admin"; import { type GQLProduct } from "@src/graphql.generated"; +import { FormattedMessage } from "react-intl"; + +import { FutureProductNotice } from "../helpers/FutureProductNotice"; export const ProductForm: FormConfig = { type: "form", @@ -18,8 +21,10 @@ export const ProductForm: FormConfig = { name: "title", label: "Titel", // default is generated from name (camelCaseToHumanReadable) required: true, // default is inferred from gql schema - //validate: { name: "validateTitle", import: "./validateTitle" }, - validate: (value: string) => (value.length < 3 ? "Title must be at least 3 characters long" : undefined), + validate: (value: string) => + value.length < 3 ? ( + + ) : undefined, }, { type: "text", name: "slug" }, { type: "date", name: "createdAt", label: "Created", readOnly: true }, @@ -69,7 +74,7 @@ export const ProductForm: FormConfig = { }, { type: "boolean", name: "inStock" }, { type: "date", name: "availableSince", startAdornment: { icon: "CalendarToday" } }, - { type: "component", component: { name: "FutureProductNotice", import: "../../helpers/FutureProductNotice" } }, + { type: "component", component: FutureProductNotice }, { type: "block", name: "image", label: "Image", block: DamImageBlock }, { type: "fileUpload", name: "priceList", label: "Price List", maxFileSize: 1024 * 1024 * 4, download: true }, { type: "fileUpload", name: "datasheets", label: "Datasheets", multiple: true, maxFileSize: 1024 * 1024 * 4, download: false }, diff --git a/demo/admin/src/products/future/ProductsGrid.cometGen.tsx b/demo/admin/src/products/future/ProductsGrid.cometGen.tsx index e80424b05e..c9cd774b9b 100644 --- a/demo/admin/src/products/future/ProductsGrid.cometGen.tsx +++ b/demo/admin/src/products/future/ProductsGrid.cometGen.tsx @@ -1,6 +1,8 @@ import { type future_GridConfig as GridConfig } from "@comet/cms-admin"; import { type GQLProduct } from "@src/graphql.generated"; +import { ProductsGridPreviewAction } from "../ProductsGridPreviewAction"; +import { ManufacturerFilterOperators } from "./ManufacturerFilter"; import { ProductTitle } from "./ProductTitle"; const typeValues = [{ value: "Cap", label: "great Cap" }, "Shirt", "Tie"]; @@ -112,11 +114,11 @@ export const ProductsGrid: GridConfig = { name: "manufacturer.name", headerName: "Manufacturer", fieldName: "manufacturer", - filterOperators: { name: "ManufacturerFilterOperators", import: "./ManufacturerFilter" }, + filterOperators: ManufacturerFilterOperators, }, { type: "actions", - component: { name: "ProductsGridPreviewAction", import: "../../ProductsGridPreviewAction" }, + component: ProductsGridPreviewAction, }, ], }; diff --git a/demo/admin/src/products/future/generated/ProductForm.tsx b/demo/admin/src/products/future/generated/ProductForm.tsx index 529c760efe..f35edd4aa8 100644 --- a/demo/admin/src/products/future/generated/ProductForm.tsx +++ b/demo/admin/src/products/future/generated/ProductForm.tsx @@ -212,7 +212,14 @@ export function ProductForm({ id }: FormProps) { fullWidth name="title" label={} - validate={(value: string) => (value.length < 3 ? "Title must be at least 3 characters long" : undefined)} + validate={(value: string) => + value.length < 3 ? ( + + ) : undefined + } /> { if ("import" in field.block) { - imports.push({ - name: field.block.name, - importPath: field.block.import, - }); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + imports.push(convertConfigImport(field.block as any)); // TODO: improve typing, generator runtime vs. config mismatch } }); diff --git a/packages/admin/cms-admin/src/generator/future/generateForm/generateComponentFormField.ts b/packages/admin/cms-admin/src/generator/future/generateForm/generateComponentFormField.ts index e119d239db..5123ca0d9b 100644 --- a/packages/admin/cms-admin/src/generator/future/generateForm/generateComponentFormField.ts +++ b/packages/admin/cms-admin/src/generator/future/generateForm/generateComponentFormField.ts @@ -1,9 +1,10 @@ import { type ComponentFormFieldConfig } from "../generator"; -import { type Imports } from "../utils/generateImportsCode"; +import { convertConfigImport } from "../utils/convertConfigImport"; import { type GenerateFieldsReturn } from "./generateFields"; export function generateComponentFormField({ config }: { config: ComponentFormFieldConfig }): GenerateFieldsReturn { - const imports: Imports = [{ name: config.component.name, importPath: config.component.import }]; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const imports = [convertConfigImport(config.component as any)]; // TODO: improve typing, generator runtime vs. config mismatch const code = `<${config.component.name} />`; return { diff --git a/packages/admin/cms-admin/src/generator/future/generateForm/generateFormField.ts b/packages/admin/cms-admin/src/generator/future/generateForm/generateFormField.ts index a759519243..0d7649e6b4 100644 --- a/packages/admin/cms-admin/src/generator/future/generateForm/generateFormField.ts +++ b/packages/admin/cms-admin/src/generator/future/generateForm/generateFormField.ts @@ -8,6 +8,7 @@ import { import { type Adornment, type FormConfig, type FormFieldConfig, type GQLDocumentConfigMap, isFormFieldConfig } from "../generator"; import { camelCaseToHumanReadable } from "../utils/camelCaseToHumanReadable"; +import { convertConfigImport } from "../utils/convertConfigImport"; import { findQueryTypeOrThrow } from "../utils/findQueryType"; import { type Imports } from "../utils/generateImportsCode"; import { isFieldOptional } from "../utils/isFieldOptional"; @@ -35,10 +36,8 @@ const getAdornmentData = ({ adornmentData }: { adornmentData: Adornment }): Ador } else if (typeof adornmentData.icon === "object") { if ("import" in adornmentData.icon) { adornmentString = `<${adornmentData.icon.name} />`; - adornmentImport = { - name: `${adornmentData.icon.name}`, - importPath: `${adornmentData.icon.import}`, - }; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + adornmentImport = convertConfigImport(adornmentData.icon as any); // TODO: improve typing, generator runtime vs. config mismatch } else { const { name, ...iconProps } = adornmentData.icon; adornmentString = `<${name}Icon @@ -138,15 +137,8 @@ export function generateFormField({ let validateCode = ""; if (config.validate) { if ("import" in config.validate) { - let importPath = config.validate.import; - if (importPath.startsWith("./")) { - //go one level up as generated files are in generated subfolder - importPath = `.${importPath}`; - } - imports.push({ - name: config.validate.name, - importPath, - }); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + imports.push(convertConfigImport(config.validate as any)); // TODO: improve typing, generator runtime vs. config mismatch validateCode = `validate={${config.validate.name}}`; } else if ("code" in config.validate) { validateCode = `validate={${config.validate.code}}`; diff --git a/packages/admin/cms-admin/src/generator/future/generateGrid.ts b/packages/admin/cms-admin/src/generator/future/generateGrid.ts index 0684f9b326..0d7d172ef8 100644 --- a/packages/admin/cms-admin/src/generator/future/generateGrid.ts +++ b/packages/admin/cms-admin/src/generator/future/generateGrid.ts @@ -26,6 +26,7 @@ import { type StaticSelectLabelCellContent, } from "./generator"; import { camelCaseToHumanReadable } from "./utils/camelCaseToHumanReadable"; +import { convertConfigImport } from "./utils/convertConfigImport"; import { findMutationType } from "./utils/findMutationType"; import { findQueryTypeOrThrow } from "./utils/findQueryType"; import { findRootBlocks } from "./utils/findRootBlocks"; @@ -191,15 +192,13 @@ export function generateGrid( rootBlockColumns.forEach((field) => { if (rootBlocks[String(field.name)]) { // update rootBlocks if they are also used in columns - rootBlocks[String(field.name)].import = field.block.import; - rootBlocks[String(field.name)].name = field.block.name; + const block = field.block as any; // TODO: improve typing, generator runtime vs. config mismatch + rootBlocks[String(field.name)].import = block.import; + rootBlocks[String(field.name)].name = block.name; } }); Object.values(rootBlocks).forEach((block) => { - imports.push({ - name: block.name, - importPath: block.import, - }); + imports.push(convertConfigImport(block as any)); // TODO: improve typing, generator runtime vs. config mismatch }); const gridQueryType = findQueryTypeOrThrow(gridQuery, gqlIntrospection); @@ -318,6 +317,9 @@ export function generateGrid( visible: actionsColumnVisible = undefined, ...restActionsColumnConfig } = actionsColumnConfig ?? {}; + if (actionsColumnComponent) { + imports.push(convertConfigImport(actionsColumnComponent as any)); // TODO: improve typing, generator runtime vs. config mismatch + } const gridNeedsTheme = config.columns.some((column) => typeof column.visible === "string"); @@ -334,18 +336,14 @@ export function generateGrid( let gridType: "number" | "boolean" | "dateTime" | "date" | undefined; let filterOperators: string | undefined; - if (column.filterOperators) { - let importPath = column.filterOperators.import; - if (importPath.startsWith("./")) { - //go one level up as generated files are in generated subfolder - importPath = `.${importPath}`; + if (column.type != "combination" && column.filterOperators) { + const configFilterOperators = column.filterOperators as any; // TODO: improve typing, generator runtime vs. config mismatch + if (configFilterOperators.import) { + imports.push(convertConfigImport(configFilterOperators)); + } else { + throw new Error("Unsupported filterOperators, only imports are supported for now"); } - imports.push({ - name: column.filterOperators.name, - importPath, - }); - - filterOperators = column.filterOperators.name; + filterOperators = configFilterOperators.name; } if (type == "dateTime") { @@ -377,10 +375,7 @@ export function generateGrid( iconsToImport.push(value.label.icon); } else if (typeof value.label.icon?.name === "string") { if ("import" in value.label.icon) { - imports.push({ - name: value.label.icon.name, - importPath: value.label.icon.import, - }); + imports.push(convertConfigImport(value.label.icon as any)); // TODO: improve typing, generator runtime vs. config mismatch } else { iconsToImport.push(value.label.icon.name); } @@ -451,13 +446,9 @@ export function generateGrid( if ("code" in column.renderCell) { renderCell = column.renderCell.code as string; if ("imports" in column.renderCell) { - //TODO improve typing - imports.push( - ...(column.renderCell.imports as Imports).map((imprt) => ({ - name: imprt.name, - importPath: imprt.importPath.startsWith("./") ? `.${imprt.importPath}` : imprt.importPath, - })), - ); + // TODO: improve typing, generator runtime vs. config mismatch + const renderCellImports = (column.renderCell as any).imports; + imports.push(...renderCellImports.map((imprt: any) => convertConfigImport(imprt))); } } else { throw new Error(`Unsupported renderCell for column '${name}', only arrow functions are supported`); @@ -600,11 +591,6 @@ export function generateGrid( import { FormattedMessage, FormattedNumber, useIntl } from "react-intl"; ${generateImportsCode(imports)} - ${Object.entries(rootBlocks) - .map(([rootBlockKey, rootBlock]) => `import { ${rootBlock.name} } from "${rootBlock.import}";`) - .join("\n")} - ${actionsColumnComponent ? `import { ${actionsColumnComponent.name} } from "${actionsColumnComponent.import}";` : ""} - const ${instanceGqlTypePlural}Fragment = gql\` fragment ${fragmentName} on ${gqlType} { id diff --git a/packages/admin/cms-admin/src/generator/future/generateGrid/combinationColumn.ts b/packages/admin/cms-admin/src/generator/future/generateGrid/combinationColumn.ts index fda0ad52b2..ee079b0282 100644 --- a/packages/admin/cms-admin/src/generator/future/generateGrid/combinationColumn.ts +++ b/packages/admin/cms-admin/src/generator/future/generateGrid/combinationColumn.ts @@ -1,7 +1,7 @@ import { type GridColDef } from "@comet/admin"; import { type FormattedNumber } from "react-intl"; -import { type BaseColumnConfig, type ImportReference } from "../generator"; +import { type BaseColumnConfig } from "../generator"; import { getFormattedMessageNode } from "../utils/intl"; type AbstractField = { @@ -56,7 +56,6 @@ export type GridCombinationColumnConfig = { name: string; primaryText?: Field; secondaryText?: Field; - filterOperators?: ImportReference; } & BaseColumnConfig & Pick; diff --git a/packages/admin/cms-admin/src/generator/future/generator.ts b/packages/admin/cms-admin/src/generator/future/generator.ts index 8c70e2d5d5..f07383b906 100644 --- a/packages/admin/cms-admin/src/generator/future/generator.ts +++ b/packages/admin/cms-admin/src/generator/future/generator.ts @@ -5,11 +5,12 @@ import { type BlockInterface } from "@comet/blocks-admin"; import { GraphQLFileLoader } from "@graphql-tools/graphql-file-loader"; import { loadSchema } from "@graphql-tools/load"; import { type IconProps } from "@mui/material"; -import { type GridFilterItem, type GridRenderCellParams, type GridSortDirection, type GridValidRowModel } from "@mui/x-data-grid"; +import { type GridCellParams, type GridFilterItem, type GridFilterOperator, type GridRenderCellParams, type GridSortDirection, type GridValidRowModel } from "@mui/x-data-grid"; import { promises as fs } from "fs"; import { glob } from "glob"; import { introspectionFromSchema } from "graphql"; import { basename, dirname } from "path"; +import { ComponentType, ReactNode } from "react"; import { type FinalFormFileUploadProps } from "../../form/file/FinalFormFileUpload"; import { generateForm } from "./generateForm"; @@ -20,16 +21,11 @@ import { type ColumnVisibleOption } from "./utils/columnVisibility"; import { configsFromSourceFile, morphTsSource } from "./utils/tsMorphHelper"; import { writeGenerated } from "./utils/writeGenerated"; -export type ImportReference = { - name: string; - import: string; -}; - type IconObject = Pick & { name: IconName; }; -type Icon = IconName | IconObject | ImportReference; +type Icon = IconName | IconObject | ComponentType; export type Adornment = string | { icon: Icon }; type SingleFileFormFieldConfig = { type: "fileUpload"; multiple?: false; maxFiles?: 1; download?: boolean } & Pick< @@ -47,7 +43,7 @@ type InputBaseFieldConfig = { endAdornment?: Adornment; }; -export type ComponentFormFieldConfig = { type: "component"; component: ImportReference }; +export type ComponentFormFieldConfig = { type: "component"; component: ComponentType }; export type FormFieldConfig = ( | ({ type: "text"; multiline?: boolean } & InputBaseFieldConfig) @@ -72,7 +68,7 @@ export type FormFieldConfig = ( labelField?: string; filterField?: { name: string; gqlName?: string }; } & Omit) - | { type: "block"; block: ImportReference | BlockInterface } + | { type: "block"; block: BlockInterface } | SingleFileFormFieldConfig | MultiFileFormFieldConfig ) & { @@ -80,7 +76,7 @@ export type FormFieldConfig = ( label?: string; required?: boolean; virtual?: boolean; - validate?: ImportReference | ((value: unknown) => string | undefined); + validate?: (value: unknown) => ReactNode | undefined; helperText?: string; readOnly?: boolean; }; @@ -142,10 +138,10 @@ export type GridColumnConfig = ( | { type: "date"; renderCell?: (params: GridRenderCellParams) => JSX.Element } | { type: "dateTime"; renderCell?: (params: GridRenderCellParams) => JSX.Element } | { type: "staticSelect"; values?: Array<{ value: string; label: string | StaticSelectLabelCellContent } | string> } - | { type: "block"; block: ImportReference } -) & { name: UsableFields; filterOperators?: ImportReference } & BaseColumnConfig; + | { type: "block"; block: BlockInterface } +) & { name: UsableFields; filterOperators?: GridFilterOperator[] } & BaseColumnConfig; -export type ActionsGridColumnConfig = { type: "actions"; component?: ImportReference } & BaseColumnConfig; +export type ActionsGridColumnConfig = { type: "actions"; component?: ComponentType } & BaseColumnConfig; type InitialFilterConfig = { items: GridFilterItem[]; diff --git a/packages/admin/cms-admin/src/generator/future/utils/convertConfigImport.ts b/packages/admin/cms-admin/src/generator/future/utils/convertConfigImport.ts new file mode 100644 index 0000000000..f04892d220 --- /dev/null +++ b/packages/admin/cms-admin/src/generator/future/utils/convertConfigImport.ts @@ -0,0 +1,12 @@ +import { Imports } from "./generateImportsCode"; + +// generated code is one level below config, this function converts relative imports to go one level up +export function convertConfigImport(imprt: { name: string; import: string }): Imports[0] { + let importPath = imprt.import as string; + if (importPath.startsWith("../")) { + importPath = `../${importPath}`; + } else if (importPath.startsWith("./")) { + importPath = `.${importPath}`; + } + return { name: imprt.name, importPath }; +} diff --git a/packages/admin/cms-admin/src/generator/future/utils/tsMorphHelper.ts b/packages/admin/cms-admin/src/generator/future/utils/tsMorphHelper.ts index b1707bd385..da9d0de11a 100644 --- a/packages/admin/cms-admin/src/generator/future/utils/tsMorphHelper.ts +++ b/packages/admin/cms-admin/src/generator/future/utils/tsMorphHelper.ts @@ -16,7 +16,6 @@ import { } from "ts-morph"; import { GeneratorConfig } from "../generator"; -import { Imports } from "./generateImportsCode"; const project = new Project({ tsConfigFilePath: "tsconfig.json", @@ -29,7 +28,7 @@ export function morphTsSource(path: string) { } export function configsFromSourceFile(sourceFile: SourceFile) { - const configs: Record = {}; //TODO GeneratorConfig is not fully correct + const configs: Record = {}; //TODO GeneratorConfig is not fully correct (runtime vs config mismatch) for (const [name, declarations] of Array.from(sourceFile.getExportedDeclarations().entries())) { //console.log(name); if (declarations.length != 1) { @@ -43,7 +42,7 @@ export function configsFromSourceFile(sourceFile: SourceFile) { } function findUsedImports(node: Node) { - const imports = [] as Imports; + const imports = [] as Array<{ name: string; import: string }>; node.getDescendantsOfKind(SyntaxKind.Identifier).forEach((identifier) => { for (const referencedSymbol of identifier.findReferences()) { for (const reference of referencedSymbol.getReferences()) { @@ -54,7 +53,7 @@ function findUsedImports(node: Node) { if ((namedImport.getAliasNode() || namedImport.getNameNode())?.getText() == referenceNode.getText()) { imports.push({ name: namedImport.getNameNode().getText(), - importPath: importDeclaration.getModuleSpecifierValue(), + import: importDeclaration.getModuleSpecifierValue(), }); } }