/** Node CLI command that generates frontend model classes from backend project resource config. */
export default class DbGenerateFrontendModels extends BaseCommand {
    /**
     * Runs execute.
     * @returns {Promise<void>} - Resolves when files are generated.
     */
    execute(): Promise<void>;
    /**
     * Runs validate model config.
     * @param {object} args - Arguments.
     * @param {Set<string>} args.availableFrontendModelClassNames - Available frontend model class names in backend project.
     * @param {string} args.className - Model class name.
     * @param {Record<string, ?>} args.modelConfig - Model configuration.
     * @param {import("../../../../../configuration-types.js").FrontendModelResourceClassType | null} [args.resourceClass]
     * @returns {void} - No return value.
     */
    validateModelConfig({ availableFrontendModelClassNames, className, modelConfig, resourceClass }: {
        availableFrontendModelClassNames: Set<string>;
        className: string;
        modelConfig: Record<string, unknown>;
        resourceClass?: import("../../../../../configuration-types.js").FrontendModelResourceClassType | null | undefined;
    }): void;
    /**
     * Runs resources for backend project.
     * @param {import("../../../../../configuration-types.js").BackendProjectConfiguration} backendProject - Backend project config.
     * @returns {Record<string, import("../../../../../configuration-types.js").FrontendModelResourceDefinition>} - Resource definitions keyed by model class name.
     */
    resourcesForBackendProject(backendProject: import("../../../../../configuration-types.js").BackendProjectConfiguration): Record<string, import("../../../../../configuration-types.js").FrontendModelResourceDefinition>;
    /**
     * Runs available frontend model class names.
     * @param {Record<string, ?>} resources - Resource configuration keyed by model name.
     * @returns {Set<string>} - Available frontend model class names.
     */
    availableFrontendModelClassNames(resources: Record<string, unknown>): Set<string>;
    /**
     * Runs frontend models directory for backend project.
     * @param {{frontendModelsOutputPath?: string}} backendProject - Backend project config.
     * @returns {string} - Absolute frontend models output directory.
     */
    frontendModelsDirectoryForBackendProject(backendProject: {
        frontendModelsOutputPath?: string;
    }): string;
    /**
     * Runs import path for frontend models directory.
     * @param {string} frontendModelsDir - Frontend models output directory.
     * @returns {string} - Base class import path.
     */
    importPathForFrontendModelsDirectory(frontendModelsDir: string): string;
    /**
     * Runs build model file content.
     * @param {object} args - Method args.
     * @param {string} args.className - Model class name.
     * @param {string} args.importPath - Base class import path.
     * @param {typeof import("../../../../../database/record/index.js").default | undefined} args.modelClass - Backend model class.
     * @param {Record<string, ?>} args.modelConfig - Model configuration.
     * @param {import("../../../../../configuration-types.js").FrontendModelResourceClassType | null} [args.resourceClass]
     * @returns {string} - Generated file content.
     */
    buildModelFileContent({ className, importPath, modelClass, modelConfig, resourceClass }: {
        className: string;
        importPath: string;
        modelClass: typeof import("../../../../../database/record/index.js").default | undefined;
        modelConfig: Record<string, unknown>;
        resourceClass?: import("../../../../../configuration-types.js").FrontendModelResourceClassType | null | undefined;
    }): string;
    /**
     * Runs build index file content.
     * @param {Array<{className: string, fileName: string}>} generatedFiles - Generated model files.
     * @returns {string} - Index file content that imports and re-exports all models.
     */
    buildIndexFileContent(generatedFiles: Array<{
        className: string;
        fileName: string;
    }>): string;
    /**
     * Runs build setup file content.
     * @param {Array<{className: string, fileName: string}>} generatedFiles - Generated model files.
     * @returns {string} - Setup file content with side-effect imports for model registration.
     */
    buildSetupFileContent(generatedFiles: Array<{
        className: string;
        fileName: string;
    }>): string;
    /**
     * Invokes a backend resource's `permittedParams()` instance method at
     * generation time and extracts the relationship names that accept
     * nested writes (`{fooAttributes: [...]}` entries). The generator
     * emits those names into the frontend model's `resourceConfig()` so
     * the client `save()` walker knows which relationships to ship.
     *
     * Constructed with no controller/ability so resource overrides must
     * support being called without a request context.
     * @param {import("../../../../../configuration-types.js").FrontendModelResourceClassType | null} resourceClass - Resource class.
     * @returns {string[]} - Relationship names that accept nested writes (empty when none).
     */
    nestedRelationshipNamesForGenerator(resourceClass: import("../../../../../configuration-types.js").FrontendModelResourceClassType | null): string[];
    /**
     * Runs formatted array property.
     * @param {object} args - Formatting args.
     * @param {string} args.indent - Base indentation.
     * @param {string} args.propertyName - Object property name.
     * @param {string[]} args.values - String values.
     * @returns {string} - Formatted multiline array property.
     */
    formattedArrayProperty({ indent, propertyName, values }: {
        indent: string;
        propertyName: string;
        values: string[];
    }): string;
    /**
     * Runs formatted commands property.
     * @param {object} args - Formatting args.
     * @param {string} args.indent - Base indentation.
     * @param {string} args.propertyName - Object property name.
     * @param {Record<string, string>} args.values - Command key-values.
     * @returns {string} - Formatted multiline array property. Always emits
     *   the camelCase method-name array form (`memberCommands: ["updateAccess"]`)
     *   so the generated config matches the canonical
     *   `FrontendModelResourceConfig.{collection,member}Commands: string[]`
     *   shape. The runtime derives the command slug from the camelCase
     *   method name; consumers never need to write out
     *   `{updateAccess: "update-access"}` by hand.
     */
    formattedCommandsProperty({ indent, propertyName, values }: {
        indent: string;
        propertyName: string;
        values: Record<string, string>;
    }): string;
    /**
     * Runs formatted object property.
     * @param {object} args - Formatting args.
     * @param {string} args.indent - Base indentation.
     * @param {string} args.propertyName - Object property name.
     * @param {Record<string, string>} args.values - Object key-values.
     * @param {Record<string, string>} [args.filterDefaultValues] - Default values to omit from output.
     * @returns {string} - Formatted multiline object property.
     */
    formattedObjectProperty({ filterDefaultValues, indent, propertyName, values }: {
        indent: string;
        propertyName: string;
        values: Record<string, string>;
        filterDefaultValues?: Record<string, string> | undefined;
    }): string;
    /**
     * Runs attribute definitions for model.
     * @param {object} args - Arguments.
     * @param {typeof import("../../../../../database/record/index.js").default | undefined} args.modelClass - Backend model class.
     * @param {Record<string, ?>} args.modelConfig - Model configuration.
     * @returns {Array<{jsDocType: string, name: string}>} - Attribute definitions.
     */
    attributeDefinitionsForModel({ modelClass, modelConfig }: {
        modelClass: typeof import("../../../../../database/record/index.js").default | undefined;
        modelConfig: Record<string, unknown>;
    }): Array<{
        jsDocType: string;
        name: string;
    }>;
    /**
     * Runs js doc type for frontend attribute.
     * @param {object} args - Arguments.
     * @param {?} args.attributeConfig - Attribute configuration value.
     * @returns {string} - JSDoc type.
     */
    jsDocTypeForFrontendAttribute({ attributeConfig }: {
        attributeConfig: unknown;
    }): string;
    /**
     * Runs js doc type for frontend attribute base type.
     * @param {?} attributeConfig - Attribute configuration value.
     * @returns {string} - Non-nullable JSDoc type.
     */
    jsDocTypeForFrontendAttributeBaseType(attributeConfig: unknown): string;
    /**
     * Runs frontend attribute can be null.
     * @param {?} attributeConfig - Attribute configuration value.
     * @returns {boolean} - Whether the attribute allows null values.
     */
    frontendAttributeCanBeNull(attributeConfig: unknown): boolean;
    /**
     * Runs frontend attribute type value.
     * @param {?} attributeConfig - Attribute configuration value.
     * @returns {string | null} - Normalized column type.
     */
    frontendAttributeTypeValue(attributeConfig: unknown): string | null;
    /**
     * Runs frontend attribute config for model attribute.
     * @param {object} args - Arguments.
     * @param {string} args.attributeName - Frontend model attribute name.
     * @param {typeof import("../../../../../database/record/index.js").default | undefined} args.modelClass - Backend model class.
     * @returns {?} - Attribute config inferred from the backend model when available.
     */
    frontendAttributeConfigForModelAttribute({ attributeName, modelClass }: {
        attributeName: string;
        modelClass: typeof import("../../../../../database/record/index.js").default | undefined;
    }): unknown;
    /**
     * Runs relationships for model.
     * @param {object} args - Arguments.
     * @param {string} args.className - Model class name.
     * @param {Record<string, ?>} args.modelConfig - Model configuration.
     * @param {import("../../../../../configuration-types.js").FrontendModelResourceClassType | null} [args.resourceClass]
     * @returns {Array<{autoload: boolean, relationshipName: string, targetClassName: string, targetFileName: string, type: "belongsTo" | "hasOne" | "hasMany"}>} - Relationships.
     */
    relationshipsForModel({ className, modelConfig, resourceClass }: {
        className: string;
        modelConfig: Record<string, unknown>;
        resourceClass?: import("../../../../../configuration-types.js").FrontendModelResourceClassType | null | undefined;
    }): Array<{
        autoload: boolean;
        relationshipName: string;
        targetClassName: string;
        targetFileName: string;
        type: "belongsTo" | "hasOne" | "hasMany";
    }>;
    /**
     * Runs inferred relationship definition.
     * @param {object} args - Arguments.
     * @param {string} args.className - Model class name.
     * @param {string} args.relationshipName - Relationship name.
     * @param {import("../../../../../configuration-types.js").FrontendModelResourceClassType | null} [args.resourceClass]
     * @returns {{autoload: boolean, relationshipName: string, targetClassName: string, targetFileName: string, type: "belongsTo" | "hasOne" | "hasMany"}} Inferred relationship definition.
     */
    inferredRelationshipDefinition({ className, relationshipName, resourceClass }: {
        className: string;
        relationshipName: string;
        resourceClass?: import("../../../../../configuration-types.js").FrontendModelResourceClassType | null | undefined;
    }): {
        autoload: boolean;
        relationshipName: string;
        targetClassName: string;
        targetFileName: string;
        type: "belongsTo" | "hasOne" | "hasMany";
    };
}
import BaseCommand from "../../../../../cli/base-command.js";
//# sourceMappingURL=frontend-models.d.ts.map