diff --git a/packages/devtools/src/formats/runtime.ts b/packages/devtools/src/formats/runtime.ts index ffa2b3f8..9237616a 100644 --- a/packages/devtools/src/formats/runtime.ts +++ b/packages/devtools/src/formats/runtime.ts @@ -53,6 +53,7 @@ type ExtractSchemaParams = { ownName?: string required?: boolean localRef?: boolean + immutable?: boolean } type RuntimeModelDefinition = { @@ -80,12 +81,13 @@ export class RuntimeModelBuilder { this.#commonEmbeds = params.commonEmbeds ?? [] this.#modelName = params.name this.#modelRelations = params.definition.relations ?? {} - if (params.definition.version !== "1.0") { - this.#immutableFields = params.definition.immutableFields?? [] - } this.#modelSchema = params.definition.schema this.#modelViews = params.views this.#modelIndices = params.indices + this.#immutableFields = + // TODO: remove @ts-ignore once model definition is updated + // @ts-ignore added in new version of the model definition + params.definition.version === '1.0' ? [] : params.definition.immutableFields ?? [] } build(): RuntimeModelDefinition { @@ -129,6 +131,7 @@ export class RuntimeModelBuilder { ownName: propKey, parentName: ownName, required: requiredProps.includes(propKey), + immutable: this.#immutableFields.includes(propKey), }) } return fields @@ -154,11 +157,16 @@ export class RuntimeModelBuilder { } const required = params.required ?? false - const immutable = params.ownName? this.#immutableFields.includes(params.ownName): false + const immutable = params.immutable ?? false const items = schema.items as AnySchema if (items.$ref != null) { - return { type: 'list', required, immutable, item: this._buildListReference(items.$ref, params) } + return { + type: 'list', + required, + immutable, + item: this._buildListReference(items.$ref, params), + } } if (items.type == null) { throw new Error('Missing schema $ref or type for array items') @@ -210,7 +218,7 @@ export class RuntimeModelBuilder { refType: 'object', refName: ownName, required: params.required ?? false, - immutable: params.ownName? this.#immutableFields.includes(params.ownName): false + immutable: params.immutable ?? false, } } @@ -227,7 +235,7 @@ export class RuntimeModelBuilder { refType: 'enum', refName: ownName, required: params.required ?? false, - immutable: params.ownName? this.#immutableFields.includes(params.ownName): false + immutable: params.immutable ?? false, } } @@ -253,7 +261,7 @@ export class RuntimeModelBuilder { } const required = params.required ?? false - const immutable = params.ownName? this.#immutableFields.includes(params.ownName): false + const immutable = params.immutable ?? false switch (schema.type) { case 'boolean': @@ -322,16 +330,14 @@ export function createRuntimeDefinition( for (const [modelID, modelDefinition] of Object.entries(definition.models)) { const modelName = definition.aliases?.[modelID] ?? modelDefinition.name const isV1 = modelDefinition.version === '1.0' - const interfaceDefinition = - isV1 - ? { interface: false, implements: [] } - : { interface: modelDefinition.interface, implements: modelDefinition.implements } + const interfaceDefinition = isV1 + ? { interface: false, implements: [] } + : { interface: modelDefinition.interface, implements: modelDefinition.implements } // Add name to model metadata mapping runtime.models[modelName] = { ...interfaceDefinition, id: modelID, accountRelation: modelDefinition.accountRelation, - immutableFields: !isV1? modelDefinition.immutableFields: [], } // Extract objects, enums, relations and views from model schema diff --git a/packages/devtools/src/schema/resolution.ts b/packages/devtools/src/schema/resolution.ts index 6c5932b8..db859091 100644 --- a/packages/devtools/src/schema/resolution.ts +++ b/packages/devtools/src/schema/resolution.ts @@ -131,10 +131,12 @@ function executeCreateFactory( name: sourceDefinition.name, description: sourceDefinition.description, accountRelation: sourceDefinition.accountRelation, - immutableFields: !isV1 ? (sourceDefinition as ModelDefinitionV2).immutableFields: [], interface: isV1 ? false : sourceDefinition.interface, implements: implementIDs, schema: sourceDefinition.schema, + // TODO: remove @ts-ignore once model definition is updated + // @ts-ignore added in new version of the model definition + immutableFields: isV1 ? [] : sourceDefinition.immutableFields, relations, views, } diff --git a/packages/runtime/src/schema.ts b/packages/runtime/src/schema.ts index 2d08751b..877b529d 100644 --- a/packages/runtime/src/schema.ts +++ b/packages/runtime/src/schema.ts @@ -528,10 +528,9 @@ class SchemaBuilder { }, } for (const [key, field] of Object.entries(fields)) { - // Don't show meta or immutable fields in schema - if (field.type == 'meta' || (field as any).immutable) continue - switch (field.type) { + case 'meta': + break case 'reference': config[key] = this._buildDocumentObjectReferenceField(key, field) break @@ -945,7 +944,12 @@ class SchemaBuilder { const inputPrefix = isDocument || required ? '' : 'Partial' for (const [key, field] of Object.entries(fields)) { - let type//TODO should it also go here? + if (!required && (field as RuntimeScalarCommon).immutable) { + // Skip immutable fields from partial inputs + continue + } + + let type switch (field.type) { case 'meta': case 'view': @@ -1077,7 +1081,6 @@ class SchemaBuilder { name: string, model: RuntimeModel, ) { - console.trace("i came here") switch (model.accountRelation.type) { case 'list': this.#mutations[`create${name}`] = mutationWithClientMutationId({ diff --git a/packages/types/src/index.ts b/packages/types/src/index.ts index b7cf4938..e06fdddb 100644 --- a/packages/types/src/index.ts +++ b/packages/types/src/index.ts @@ -217,7 +217,6 @@ export type RuntimeModel = { interface: boolean implements: Array accountRelation: ModelAccountRelationV2 - immutableFields?: Array } /**