Add factory creation ports and owner initialization contracts
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
import { validateInitialization } from "./initialization.js";
|
||||
import { validateExecutionContracts } from "./execution.js";
|
||||
import { resolveForwardedBinding, type ConcreteBinding } from "./forwarding.js";
|
||||
import type {
|
||||
@@ -42,6 +43,7 @@ import { specializePackageExport } from "./generic-packages.js";
|
||||
import { isDeepStrictEqual } from "node:util";
|
||||
|
||||
export type CapabilityValidationIssueCode =
|
||||
| "invalid-initialization"
|
||||
| "invalid-execution-contract"
|
||||
| "invalid-query-contract"
|
||||
| "query-provider-reason-required"
|
||||
@@ -1043,6 +1045,7 @@ const validatePackages = (
|
||||
);
|
||||
}
|
||||
break;
|
||||
case "creation":
|
||||
case "constructor":
|
||||
if (port.requirement.inputType)
|
||||
validateValueType(issues, port.requirement.inputType, `${portPath}.requirement.inputType`, indexes);
|
||||
@@ -1794,14 +1797,14 @@ const validateConformances = (
|
||||
});
|
||||
if (
|
||||
operation.scope === "class" &&
|
||||
(binding.dependencies.some((entry) => entry.binding.kind !== "constructor") ||
|
||||
packageExport.dependencyPorts.some((entry) => entry.requirement.kind !== "constructor"))
|
||||
(binding.dependencies.some((entry) => !["constructor", "creation"].includes(entry.binding.kind)) ||
|
||||
packageExport.dependencyPorts.some((entry) => !["constructor", "creation"].includes(entry.requirement.kind)))
|
||||
) {
|
||||
issue(
|
||||
issues,
|
||||
"invalid-package-binding",
|
||||
bindingPath,
|
||||
"Class functions may inject constructors, not instance-dependent ports",
|
||||
"Class functions require receiverless dependencies such as creation ports",
|
||||
);
|
||||
}
|
||||
validateBoundDependencies(issues, {
|
||||
@@ -2084,7 +2087,7 @@ export const validateWorkspaceRevision = (workspace: WorkspaceRevision): Capabil
|
||||
validatePackages(workspace, issues, indexes);
|
||||
validateConformances(workspace, issues, indexes);
|
||||
validateConstructors(workspace, issues, indexes);
|
||||
issues.push(...validateExecutionContracts(workspace));
|
||||
issues.push(...validateExecutionContracts(workspace), ...validateInitialization(workspace));
|
||||
return issues;
|
||||
};
|
||||
|
||||
@@ -2327,6 +2330,11 @@ export const computeCapabilityClosure = (
|
||||
}
|
||||
break;
|
||||
}
|
||||
case "creation": {
|
||||
for (const owner of dependency.binding.owners)
|
||||
queued.push({ atomId: dependency.binding.atomId, interfaceRevisionId: owner.interfaceRevisionId });
|
||||
break;
|
||||
}
|
||||
case "constructor": {
|
||||
constructors.add(dependency.binding.atomId);
|
||||
const constructor = plan.constructors.get(dependency.binding.atomId);
|
||||
|
||||
Reference in New Issue
Block a user