@sayoriqwq/effect-harness 0.0.2 → 0.0.4
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.
- package/dist/bin/effect-harness.js +0 -0
- package/dist/src/harness/ProviderDiscovery.d.ts +5 -2
- package/dist/src/harness/ProviderDiscovery.js +11 -7
- package/dist/src/harness/ProviderDiscovery.js.map +1 -1
- package/dist/src/harness/verify/ProviderProfile.js +29 -9
- package/dist/src/harness/verify/ProviderProfile.js.map +1 -1
- package/dist/src/harness/verify/TsgoPolicy.d.ts +3 -0
- package/dist/src/harness/verify/TsgoPolicy.js +3 -0
- package/dist/src/harness/verify/TsgoPolicy.js.map +1 -1
- package/harness/diagnostic-layers.md +1 -1
- package/package.json +18 -21
- package/provider/docs/package-config.md +16 -0
- package/provider/docs/quality-policy.md +14 -4
- package/provider/effect-harness.provider.json +43 -7
- package/provider/index.md +4 -0
- package/repos/effect/packages/platform-node-shared/test/fixtures/bash/parent-exits-early.sh +0 -0
- package/repos/effect/packages/platform-node-shared/test/fixtures/bash/spawn-children.sh +0 -0
- package/repos/effect/packages/tools/ai-docgen/src/main.ts +0 -0
- package/repos/effect/packages/tools/bundle/src/bin.ts +0 -0
- package/repos/effect/packages/tools/jsdocs/src/bin.ts +0 -0
- package/repos/effect/packages/tools/openapi-generator/src/bin.ts +0 -0
- package/repos/effect/packages/tools/utils/src/bin.ts +0 -0
- package/repos/effect/scripts/bundle-analyze.sh +0 -0
- package/repos/effect/scripts/bundle-compare-selected.sh +0 -0
- package/repos/effect/scripts/bundle-compare.sh +0 -0
- package/repos/effect/scripts/worktree-setup.sh +0 -0
- package/repos/tsgo/_tools/perf-check-tsgo.sh +0 -0
- package/repos/tsgo/_tools/release-prepare.sh +0 -0
- package/repos/tsgo/_tools/setup-repo.sh +0 -0
- package/repos/tsgo/_tools/update-flake-vendor-hash.sh +0 -0
- package/repos/tsgo/_tools/version-prepare.sh +0 -0
|
File without changes
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Effect, Path } from 'effect';
|
|
1
|
+
import { Effect, FileSystem, Path } from 'effect';
|
|
2
2
|
import { HarnessError } from './Errors.ts';
|
|
3
3
|
type JsonRecord = Record<string, unknown>;
|
|
4
4
|
interface ManagedFileDeclaration {
|
|
@@ -7,6 +7,7 @@ interface ManagedFileDeclaration {
|
|
|
7
7
|
readonly targetPath: string;
|
|
8
8
|
readonly contentType: string;
|
|
9
9
|
readonly managed: boolean;
|
|
10
|
+
readonly content: string;
|
|
10
11
|
readonly targetUsage?: string;
|
|
11
12
|
}
|
|
12
13
|
interface ManagedFilesContribution {
|
|
@@ -123,6 +124,7 @@ export declare const discoverProvider: (harness: string) => Effect.Effect<{
|
|
|
123
124
|
targetPath: string;
|
|
124
125
|
contentType: string;
|
|
125
126
|
managed: boolean;
|
|
127
|
+
content: string;
|
|
126
128
|
}[];
|
|
127
129
|
};
|
|
128
130
|
snippets: {
|
|
@@ -135,6 +137,7 @@ export declare const discoverProvider: (harness: string) => Effect.Effect<{
|
|
|
135
137
|
targetPath: string;
|
|
136
138
|
contentType: string;
|
|
137
139
|
managed: boolean;
|
|
140
|
+
content: string;
|
|
138
141
|
}[];
|
|
139
142
|
};
|
|
140
143
|
contributions: {
|
|
@@ -165,5 +168,5 @@ export declare const discoverProvider: (harness: string) => Effect.Effect<{
|
|
|
165
168
|
artifactReferences: JsonRecord;
|
|
166
169
|
};
|
|
167
170
|
internalHarnessSurfaces: JsonRecord;
|
|
168
|
-
}, HarnessError | import("effect/PlatformError").PlatformError,
|
|
171
|
+
}, HarnessError | import("effect/PlatformError").PlatformError, FileSystem.FileSystem | Path.Path>;
|
|
169
172
|
export {};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Effect, Path } from 'effect';
|
|
1
|
+
import { Effect, FileSystem, Path } from 'effect';
|
|
2
2
|
import { readJson } from "../platform/Json.js";
|
|
3
3
|
import { HarnessError } from "./Errors.js";
|
|
4
4
|
import { isRecord } from "./verify/JsonFields.js";
|
|
@@ -31,27 +31,31 @@ const expectStringArray = Effect.fnUntraced(function* (value, source) {
|
|
|
31
31
|
const array = yield* expectArray(value, source);
|
|
32
32
|
return yield* Effect.forEach(array, (entry, index) => expectString(entry, `${source}[${index}]`));
|
|
33
33
|
});
|
|
34
|
-
const expectManagedFileDeclaration = Effect.fnUntraced(function* (value, source) {
|
|
34
|
+
const expectManagedFileDeclaration = Effect.fnUntraced(function* (value, source, artifactRoot) {
|
|
35
35
|
const file = yield* expectRecord(value, source);
|
|
36
|
+
const path = yield* Path.Path;
|
|
37
|
+
const fs = yield* FileSystem.FileSystem;
|
|
38
|
+
const sourcePath = yield* expectString(file.sourcePath, `${source}.sourcePath`);
|
|
36
39
|
const targetUsage = file.targetUsage === undefined
|
|
37
40
|
? undefined
|
|
38
41
|
: yield* expectString(file.targetUsage, `${source}.targetUsage`);
|
|
39
42
|
return {
|
|
40
43
|
id: yield* expectString(file.id, `${source}.id`),
|
|
41
|
-
sourcePath
|
|
44
|
+
sourcePath,
|
|
42
45
|
targetPath: yield* expectString(file.targetPath, `${source}.targetPath`),
|
|
43
46
|
contentType: yield* expectString(file.contentType, `${source}.contentType`),
|
|
44
47
|
managed: yield* expectBoolean(file.managed, `${source}.managed`),
|
|
48
|
+
content: yield* fs.readFileString(path.join(artifactRoot, sourcePath)),
|
|
45
49
|
...(targetUsage === undefined ? {} : { targetUsage }),
|
|
46
50
|
};
|
|
47
51
|
});
|
|
48
|
-
const expectManagedFilesContribution = Effect.fnUntraced(function* (value, source) {
|
|
52
|
+
const expectManagedFilesContribution = Effect.fnUntraced(function* (value, source, artifactRoot) {
|
|
49
53
|
const contribution = yield* expectRecord(value, source);
|
|
50
54
|
const files = yield* expectArray(contribution.files, `${source}.files`);
|
|
51
55
|
return {
|
|
52
56
|
mode: yield* expectString(contribution.mode, `${source}.mode`),
|
|
53
57
|
targetBasePath: yield* expectString(contribution.targetBasePath, `${source}.targetBasePath`),
|
|
54
|
-
files: yield* Effect.forEach(files, (file, index) => expectManagedFileDeclaration(file, `${source}.files[${index}]
|
|
58
|
+
files: yield* Effect.forEach(files, (file, index) => expectManagedFileDeclaration(file, `${source}.files[${index}]`, artifactRoot)),
|
|
55
59
|
};
|
|
56
60
|
});
|
|
57
61
|
function expectNamedRecord(record, field, source) {
|
|
@@ -123,8 +127,8 @@ export const discoverProvider = Effect.fnUntraced(function* (harness) {
|
|
|
123
127
|
targetManagedSurfaces: {
|
|
124
128
|
targetReceives: yield* expectStringArray(managedSurfaces.targetReceives, `provider profile.profiles.${defaultProfile}.managedSurfaces.targetReceives`),
|
|
125
129
|
targetDoesNotReceive: yield* expectStringArray(managedSurfaces.targetDoesNotReceive, `provider profile.profiles.${defaultProfile}.managedSurfaces.targetDoesNotReceive`),
|
|
126
|
-
documentationBundle: yield* expectManagedFilesContribution(contributions.documentationBundle, `provider profile.profiles.${defaultProfile}.contributions.documentationBundle
|
|
127
|
-
snippets: yield* expectManagedFilesContribution(contributions.snippets, `provider profile.profiles.${defaultProfile}.contributions.snippets
|
|
130
|
+
documentationBundle: yield* expectManagedFilesContribution(contributions.documentationBundle, `provider profile.profiles.${defaultProfile}.contributions.documentationBundle`, artifactRoot),
|
|
131
|
+
snippets: yield* expectManagedFilesContribution(contributions.snippets, `provider profile.profiles.${defaultProfile}.contributions.snippets`, artifactRoot),
|
|
128
132
|
contributions: {
|
|
129
133
|
packageJson: yield* expectNamedRecord(contributions, 'packageJson', `provider profile.profiles.${defaultProfile}.contributions`),
|
|
130
134
|
tsconfig: yield* expectNamedRecord(contributions, 'tsconfig', `provider profile.profiles.${defaultProfile}.contributions`),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProviderDiscovery.js","sourceRoot":"","sources":["../../../src/harness/ProviderDiscovery.ts"],"names":[],"mappings":"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","sourcesContent":["import { Effect, Path } from 'effect'\nimport { readJson } from '../platform/Json.ts'\nimport { HarnessError } from './Errors.ts'\nimport { isRecord } from './verify/JsonFields.ts'\n\ntype JsonRecord = Record<string, unknown>\n\ninterface ManagedFileDeclaration {\n readonly id: string\n readonly sourcePath: string\n readonly targetPath: string\n readonly contentType: string\n readonly managed: boolean\n readonly targetUsage?: string\n}\n\ninterface ManagedFilesContribution {\n readonly mode: string\n readonly targetBasePath: string\n readonly files: ReadonlyArray<ManagedFileDeclaration>\n}\n\nexport interface ProviderDiscovery {\n readonly schemaVersion: 1\n readonly artifactRoot: string\n readonly providerProfilePath: string\n readonly providerProfileRelativePath: 'provider/effect-harness.provider.json'\n readonly packageLocator: {\n readonly packageName: string\n readonly packageVersion: string\n readonly binName: 'effect-harness'\n readonly binPath: string\n readonly discoveryCommand: string\n readonly packageFiles: ReadonlyArray<string>\n }\n readonly provider: {\n readonly id: string\n readonly contractVersion: string\n readonly providerVersion: string\n readonly defaultProfile: string\n }\n readonly selectedProfile: string\n readonly discovery: {\n readonly mode: 'provider-discovery'\n readonly consumer: 'prelude'\n readonly profileSource: 'provider/effect-harness.provider.json'\n readonly targetLifecycleOwner: string\n }\n readonly deliveryModes: {\n readonly internalHarness: JsonRecord\n readonly providerArtifactReference: JsonRecord\n readonly exportedHarness: JsonRecord\n }\n readonly targetManagedSurfaces: {\n readonly targetReceives: ReadonlyArray<string>\n readonly targetDoesNotReceive: ReadonlyArray<string>\n readonly documentationBundle: ManagedFilesContribution\n readonly snippets: ManagedFilesContribution\n readonly contributions: {\n readonly packageJson: JsonRecord\n readonly tsconfig: JsonRecord\n readonly editorPolicy: JsonRecord\n readonly lintGuardrails: JsonRecord\n readonly testPolicy: JsonRecord\n readonly verificationPolicy: JsonRecord\n }\n }\n readonly artifactOnlyReferences: {\n readonly mode: string\n readonly targetDelivery: string\n readonly packageSurface: ReadonlyArray<string>\n readonly references: JsonRecord\n }\n readonly sourceIdentities: {\n readonly defaultSourceEntry: string\n readonly sourceEntries: ReadonlyArray<string>\n readonly sourceBoundary: {\n readonly providerRepoInternal: boolean\n readonly targetDelivery: string\n readonly targetMustNotReceive: ReadonlyArray<string>\n readonly allowedTargetSourceIdentity: ReadonlyArray<string>\n }\n readonly providerSourceEntries: JsonRecord\n readonly artifactReferences: JsonRecord\n }\n readonly internalHarnessSurfaces: JsonRecord\n}\n\nfunction decodeJsonRecord(value: unknown, source: string): Effect.Effect<JsonRecord, HarnessError> {\n return isRecord(value)\n ? Effect.succeed(value)\n : Effect.fail(new HarnessError({ message: `${source} must be a JSON object` }))\n}\n\nfunction expectRecord(value: unknown, source: string): Effect.Effect<JsonRecord, HarnessError> {\n return isRecord(value)\n ? Effect.succeed(value)\n : Effect.fail(new HarnessError({ message: `${source} must be a JSON object` }))\n}\n\nfunction expectString(value: unknown, source: string): Effect.Effect<string, HarnessError> {\n return typeof value === 'string'\n ? Effect.succeed(value)\n : Effect.fail(new HarnessError({ message: `${source} must be a string` }))\n}\n\nfunction expectBoolean(value: unknown, source: string): Effect.Effect<boolean, HarnessError> {\n return typeof value === 'boolean'\n ? Effect.succeed(value)\n : Effect.fail(new HarnessError({ message: `${source} must be a boolean` }))\n}\n\nfunction expectArray(value: unknown, source: string): Effect.Effect<ReadonlyArray<unknown>, HarnessError> {\n return Array.isArray(value)\n ? Effect.succeed(value)\n : Effect.fail(new HarnessError({ message: `${source} must be an array` }))\n}\n\nconst expectStringArray = Effect.fnUntraced(function* (value: unknown, source: string) {\n const array = yield* expectArray(value, source)\n return yield* Effect.forEach(array, (entry, index) => expectString(entry, `${source}[${index}]`))\n})\n\nconst expectManagedFileDeclaration = Effect.fnUntraced(function* (value: unknown, source: string) {\n const file = yield* expectRecord(value, source)\n const targetUsage = file.targetUsage === undefined\n ? undefined\n : yield* expectString(file.targetUsage, `${source}.targetUsage`)\n\n return {\n id: yield* expectString(file.id, `${source}.id`),\n sourcePath: yield* expectString(file.sourcePath, `${source}.sourcePath`),\n targetPath: yield* expectString(file.targetPath, `${source}.targetPath`),\n contentType: yield* expectString(file.contentType, `${source}.contentType`),\n managed: yield* expectBoolean(file.managed, `${source}.managed`),\n ...(targetUsage === undefined ? {} : { targetUsage }),\n } satisfies ManagedFileDeclaration\n})\n\nconst expectManagedFilesContribution = Effect.fnUntraced(function* (value: unknown, source: string) {\n const contribution = yield* expectRecord(value, source)\n const files = yield* expectArray(contribution.files, `${source}.files`)\n return {\n mode: yield* expectString(contribution.mode, `${source}.mode`),\n targetBasePath: yield* expectString(contribution.targetBasePath, `${source}.targetBasePath`),\n files: yield* Effect.forEach(files, (file, index) => expectManagedFileDeclaration(file, `${source}.files[${index}]`)),\n } satisfies ManagedFilesContribution\n})\n\nfunction expectNamedRecord(record: JsonRecord, field: string, source: string): Effect.Effect<JsonRecord, HarnessError> {\n return expectRecord(record[field], `${source}.${field}`)\n}\n\nconst expectDeliveryModes = Effect.fnUntraced(function* (providerProfile: JsonRecord) {\n const deliveryModes = yield* expectNamedRecord(providerProfile, 'deliveryModes', 'provider profile')\n return {\n internalHarness: yield* expectNamedRecord(deliveryModes, 'internalHarness', 'provider profile.deliveryModes'),\n providerArtifactReference: yield* expectNamedRecord(deliveryModes, 'providerArtifactReference', 'provider profile.deliveryModes'),\n exportedHarness: yield* expectNamedRecord(deliveryModes, 'exportedHarness', 'provider profile.deliveryModes'),\n }\n})\n\nconst expectArtifactReferences = Effect.fnUntraced(function* (providerProfile: JsonRecord) {\n const artifactReferences = yield* expectNamedRecord(providerProfile, 'artifactReferences', 'provider profile')\n const references = yield* expectNamedRecord(artifactReferences, 'references', 'provider profile.artifactReferences')\n return {\n mode: yield* expectString(artifactReferences.mode, 'provider profile.artifactReferences.mode'),\n targetDelivery: yield* expectString(artifactReferences.targetDelivery, 'provider profile.artifactReferences.targetDelivery'),\n packageSurface: yield* expectStringArray(artifactReferences.packageSurface, 'provider profile.artifactReferences.packageSurface'),\n references,\n }\n})\n\nexport const discoverProvider = Effect.fnUntraced(function* (harness: string) {\n const path = yield* Path.Path\n const artifactRoot = path.resolve(harness)\n const providerProfileRelativePath = 'provider/effect-harness.provider.json'\n const providerProfilePath = path.join(artifactRoot, providerProfileRelativePath)\n\n const providerProfile = yield* readJson(providerProfilePath, decodeJsonRecord)\n const packageManifest = yield* readJson(path.join(artifactRoot, 'package.json'), decodeJsonRecord)\n const provider = yield* expectNamedRecord(providerProfile, 'provider', 'provider profile')\n const profiles = yield* expectNamedRecord(providerProfile, 'profiles', 'provider profile')\n const defaultProfile = yield* expectString(provider.defaultProfile, 'provider profile.provider.defaultProfile')\n const selectedProfile = yield* expectNamedRecord(profiles, defaultProfile, `provider profile.profiles.${defaultProfile}`)\n const contributions = yield* expectNamedRecord(selectedProfile, 'contributions', `provider profile.profiles.${defaultProfile}`)\n const managedSurfaces = yield* expectNamedRecord(selectedProfile, 'managedSurfaces', `provider profile.profiles.${defaultProfile}`)\n const sourceBoundary = yield* expectNamedRecord(selectedProfile, 'sourceBoundary', `provider profile.profiles.${defaultProfile}`)\n const selfConformance = yield* expectNamedRecord(providerProfile, 'selfConformance', 'provider profile')\n const packageBin = yield* expectNamedRecord(packageManifest, 'bin', 'package.json')\n const artifactOnlyReferences = yield* expectArtifactReferences(providerProfile)\n const deliveryModes = yield* expectDeliveryModes(providerProfile)\n\n return {\n schemaVersion: 1,\n artifactRoot,\n providerProfilePath,\n providerProfileRelativePath,\n packageLocator: {\n packageName: yield* expectString(packageManifest.name, 'package.json.name'),\n packageVersion: yield* expectString(packageManifest.version, 'package.json.version'),\n binName: 'effect-harness',\n binPath: yield* expectString(packageBin['effect-harness'], 'package.json.bin.effect-harness'),\n discoveryCommand: 'npx --yes @sayoriqwq/effect-harness provider-discover',\n packageFiles: yield* expectStringArray(packageManifest.files, 'package.json.files'),\n },\n provider: {\n id: yield* expectString(provider.id, 'provider profile.provider.id'),\n contractVersion: yield* expectString(provider.contractVersion, 'provider profile.provider.contractVersion'),\n providerVersion: yield* expectString(provider.providerVersion, 'provider profile.provider.providerVersion'),\n defaultProfile,\n },\n selectedProfile: defaultProfile,\n discovery: {\n mode: 'provider-discovery',\n consumer: 'prelude',\n profileSource: providerProfileRelativePath,\n targetLifecycleOwner: yield* expectString(selfConformance.lifecycleOwner, 'provider profile.selfConformance.lifecycleOwner'),\n },\n deliveryModes,\n targetManagedSurfaces: {\n targetReceives: yield* expectStringArray(managedSurfaces.targetReceives, `provider profile.profiles.${defaultProfile}.managedSurfaces.targetReceives`),\n targetDoesNotReceive: yield* expectStringArray(managedSurfaces.targetDoesNotReceive, `provider profile.profiles.${defaultProfile}.managedSurfaces.targetDoesNotReceive`),\n documentationBundle: yield* expectManagedFilesContribution(contributions.documentationBundle, `provider profile.profiles.${defaultProfile}.contributions.documentationBundle`),\n snippets: yield* expectManagedFilesContribution(contributions.snippets, `provider profile.profiles.${defaultProfile}.contributions.snippets`),\n contributions: {\n packageJson: yield* expectNamedRecord(contributions, 'packageJson', `provider profile.profiles.${defaultProfile}.contributions`),\n tsconfig: yield* expectNamedRecord(contributions, 'tsconfig', `provider profile.profiles.${defaultProfile}.contributions`),\n editorPolicy: yield* expectNamedRecord(contributions, 'editorPolicy', `provider profile.profiles.${defaultProfile}.contributions`),\n lintGuardrails: yield* expectNamedRecord(contributions, 'lintGuardrails', `provider profile.profiles.${defaultProfile}.contributions`),\n testPolicy: yield* expectNamedRecord(contributions, 'testPolicy', `provider profile.profiles.${defaultProfile}.contributions`),\n verificationPolicy: yield* expectNamedRecord(contributions, 'verificationPolicy', `provider profile.profiles.${defaultProfile}.contributions`),\n },\n },\n artifactOnlyReferences,\n sourceIdentities: {\n defaultSourceEntry: yield* expectString(selectedProfile.sourceEntry, `provider profile.profiles.${defaultProfile}.sourceEntry`),\n sourceEntries: yield* expectStringArray(selectedProfile.sourceEntries, `provider profile.profiles.${defaultProfile}.sourceEntries`),\n sourceBoundary: {\n providerRepoInternal: yield* expectBoolean(sourceBoundary.providerRepoInternal, `provider profile.profiles.${defaultProfile}.sourceBoundary.providerRepoInternal`),\n targetDelivery: yield* expectString(sourceBoundary.targetDelivery, `provider profile.profiles.${defaultProfile}.sourceBoundary.targetDelivery`),\n targetMustNotReceive: yield* expectStringArray(sourceBoundary.targetMustNotReceive, `provider profile.profiles.${defaultProfile}.sourceBoundary.targetMustNotReceive`),\n allowedTargetSourceIdentity: yield* expectStringArray(sourceBoundary.allowedTargetSourceIdentity, `provider profile.profiles.${defaultProfile}.sourceBoundary.allowedTargetSourceIdentity`),\n },\n providerSourceEntries: yield* expectNamedRecord(providerProfile, 'sourceEntries', 'provider profile'),\n artifactReferences: artifactOnlyReferences.references,\n },\n internalHarnessSurfaces: deliveryModes.internalHarness,\n } satisfies ProviderDiscovery\n})\n"]}
|
|
1
|
+
{"version":3,"file":"ProviderDiscovery.js","sourceRoot":"","sources":["../../../src/harness/ProviderDiscovery.ts"],"names":[],"mappings":"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","sourcesContent":["import { Effect, FileSystem, Path } from 'effect'\nimport { readJson } from '../platform/Json.ts'\nimport { HarnessError } from './Errors.ts'\nimport { isRecord } from './verify/JsonFields.ts'\n\ntype JsonRecord = Record<string, unknown>\n\ninterface ManagedFileDeclaration {\n readonly id: string\n readonly sourcePath: string\n readonly targetPath: string\n readonly contentType: string\n readonly managed: boolean\n readonly content: string\n readonly targetUsage?: string\n}\n\ninterface ManagedFilesContribution {\n readonly mode: string\n readonly targetBasePath: string\n readonly files: ReadonlyArray<ManagedFileDeclaration>\n}\n\nexport interface ProviderDiscovery {\n readonly schemaVersion: 1\n readonly artifactRoot: string\n readonly providerProfilePath: string\n readonly providerProfileRelativePath: 'provider/effect-harness.provider.json'\n readonly packageLocator: {\n readonly packageName: string\n readonly packageVersion: string\n readonly binName: 'effect-harness'\n readonly binPath: string\n readonly discoveryCommand: string\n readonly packageFiles: ReadonlyArray<string>\n }\n readonly provider: {\n readonly id: string\n readonly contractVersion: string\n readonly providerVersion: string\n readonly defaultProfile: string\n }\n readonly selectedProfile: string\n readonly discovery: {\n readonly mode: 'provider-discovery'\n readonly consumer: 'prelude'\n readonly profileSource: 'provider/effect-harness.provider.json'\n readonly targetLifecycleOwner: string\n }\n readonly deliveryModes: {\n readonly internalHarness: JsonRecord\n readonly providerArtifactReference: JsonRecord\n readonly exportedHarness: JsonRecord\n }\n readonly targetManagedSurfaces: {\n readonly targetReceives: ReadonlyArray<string>\n readonly targetDoesNotReceive: ReadonlyArray<string>\n readonly documentationBundle: ManagedFilesContribution\n readonly snippets: ManagedFilesContribution\n readonly contributions: {\n readonly packageJson: JsonRecord\n readonly tsconfig: JsonRecord\n readonly editorPolicy: JsonRecord\n readonly lintGuardrails: JsonRecord\n readonly testPolicy: JsonRecord\n readonly verificationPolicy: JsonRecord\n }\n }\n readonly artifactOnlyReferences: {\n readonly mode: string\n readonly targetDelivery: string\n readonly packageSurface: ReadonlyArray<string>\n readonly references: JsonRecord\n }\n readonly sourceIdentities: {\n readonly defaultSourceEntry: string\n readonly sourceEntries: ReadonlyArray<string>\n readonly sourceBoundary: {\n readonly providerRepoInternal: boolean\n readonly targetDelivery: string\n readonly targetMustNotReceive: ReadonlyArray<string>\n readonly allowedTargetSourceIdentity: ReadonlyArray<string>\n }\n readonly providerSourceEntries: JsonRecord\n readonly artifactReferences: JsonRecord\n }\n readonly internalHarnessSurfaces: JsonRecord\n}\n\nfunction decodeJsonRecord(value: unknown, source: string): Effect.Effect<JsonRecord, HarnessError> {\n return isRecord(value)\n ? Effect.succeed(value)\n : Effect.fail(new HarnessError({ message: `${source} must be a JSON object` }))\n}\n\nfunction expectRecord(value: unknown, source: string): Effect.Effect<JsonRecord, HarnessError> {\n return isRecord(value)\n ? Effect.succeed(value)\n : Effect.fail(new HarnessError({ message: `${source} must be a JSON object` }))\n}\n\nfunction expectString(value: unknown, source: string): Effect.Effect<string, HarnessError> {\n return typeof value === 'string'\n ? Effect.succeed(value)\n : Effect.fail(new HarnessError({ message: `${source} must be a string` }))\n}\n\nfunction expectBoolean(value: unknown, source: string): Effect.Effect<boolean, HarnessError> {\n return typeof value === 'boolean'\n ? Effect.succeed(value)\n : Effect.fail(new HarnessError({ message: `${source} must be a boolean` }))\n}\n\nfunction expectArray(value: unknown, source: string): Effect.Effect<ReadonlyArray<unknown>, HarnessError> {\n return Array.isArray(value)\n ? Effect.succeed(value)\n : Effect.fail(new HarnessError({ message: `${source} must be an array` }))\n}\n\nconst expectStringArray = Effect.fnUntraced(function* (value: unknown, source: string) {\n const array = yield* expectArray(value, source)\n return yield* Effect.forEach(array, (entry, index) => expectString(entry, `${source}[${index}]`))\n})\n\nconst expectManagedFileDeclaration = Effect.fnUntraced(function* (value: unknown, source: string, artifactRoot: string) {\n const file = yield* expectRecord(value, source)\n const path = yield* Path.Path\n const fs = yield* FileSystem.FileSystem\n const sourcePath = yield* expectString(file.sourcePath, `${source}.sourcePath`)\n const targetUsage = file.targetUsage === undefined\n ? undefined\n : yield* expectString(file.targetUsage, `${source}.targetUsage`)\n\n return {\n id: yield* expectString(file.id, `${source}.id`),\n sourcePath,\n targetPath: yield* expectString(file.targetPath, `${source}.targetPath`),\n contentType: yield* expectString(file.contentType, `${source}.contentType`),\n managed: yield* expectBoolean(file.managed, `${source}.managed`),\n content: yield* fs.readFileString(path.join(artifactRoot, sourcePath)),\n ...(targetUsage === undefined ? {} : { targetUsage }),\n } satisfies ManagedFileDeclaration\n})\n\nconst expectManagedFilesContribution = Effect.fnUntraced(function* (value: unknown, source: string, artifactRoot: string) {\n const contribution = yield* expectRecord(value, source)\n const files = yield* expectArray(contribution.files, `${source}.files`)\n return {\n mode: yield* expectString(contribution.mode, `${source}.mode`),\n targetBasePath: yield* expectString(contribution.targetBasePath, `${source}.targetBasePath`),\n files: yield* Effect.forEach(files, (file, index) => expectManagedFileDeclaration(file, `${source}.files[${index}]`, artifactRoot)),\n } satisfies ManagedFilesContribution\n})\n\nfunction expectNamedRecord(record: JsonRecord, field: string, source: string): Effect.Effect<JsonRecord, HarnessError> {\n return expectRecord(record[field], `${source}.${field}`)\n}\n\nconst expectDeliveryModes = Effect.fnUntraced(function* (providerProfile: JsonRecord) {\n const deliveryModes = yield* expectNamedRecord(providerProfile, 'deliveryModes', 'provider profile')\n return {\n internalHarness: yield* expectNamedRecord(deliveryModes, 'internalHarness', 'provider profile.deliveryModes'),\n providerArtifactReference: yield* expectNamedRecord(deliveryModes, 'providerArtifactReference', 'provider profile.deliveryModes'),\n exportedHarness: yield* expectNamedRecord(deliveryModes, 'exportedHarness', 'provider profile.deliveryModes'),\n }\n})\n\nconst expectArtifactReferences = Effect.fnUntraced(function* (providerProfile: JsonRecord) {\n const artifactReferences = yield* expectNamedRecord(providerProfile, 'artifactReferences', 'provider profile')\n const references = yield* expectNamedRecord(artifactReferences, 'references', 'provider profile.artifactReferences')\n return {\n mode: yield* expectString(artifactReferences.mode, 'provider profile.artifactReferences.mode'),\n targetDelivery: yield* expectString(artifactReferences.targetDelivery, 'provider profile.artifactReferences.targetDelivery'),\n packageSurface: yield* expectStringArray(artifactReferences.packageSurface, 'provider profile.artifactReferences.packageSurface'),\n references,\n }\n})\n\nexport const discoverProvider = Effect.fnUntraced(function* (harness: string) {\n const path = yield* Path.Path\n const artifactRoot = path.resolve(harness)\n const providerProfileRelativePath = 'provider/effect-harness.provider.json'\n const providerProfilePath = path.join(artifactRoot, providerProfileRelativePath)\n\n const providerProfile = yield* readJson(providerProfilePath, decodeJsonRecord)\n const packageManifest = yield* readJson(path.join(artifactRoot, 'package.json'), decodeJsonRecord)\n const provider = yield* expectNamedRecord(providerProfile, 'provider', 'provider profile')\n const profiles = yield* expectNamedRecord(providerProfile, 'profiles', 'provider profile')\n const defaultProfile = yield* expectString(provider.defaultProfile, 'provider profile.provider.defaultProfile')\n const selectedProfile = yield* expectNamedRecord(profiles, defaultProfile, `provider profile.profiles.${defaultProfile}`)\n const contributions = yield* expectNamedRecord(selectedProfile, 'contributions', `provider profile.profiles.${defaultProfile}`)\n const managedSurfaces = yield* expectNamedRecord(selectedProfile, 'managedSurfaces', `provider profile.profiles.${defaultProfile}`)\n const sourceBoundary = yield* expectNamedRecord(selectedProfile, 'sourceBoundary', `provider profile.profiles.${defaultProfile}`)\n const selfConformance = yield* expectNamedRecord(providerProfile, 'selfConformance', 'provider profile')\n const packageBin = yield* expectNamedRecord(packageManifest, 'bin', 'package.json')\n const artifactOnlyReferences = yield* expectArtifactReferences(providerProfile)\n const deliveryModes = yield* expectDeliveryModes(providerProfile)\n\n return {\n schemaVersion: 1,\n artifactRoot,\n providerProfilePath,\n providerProfileRelativePath,\n packageLocator: {\n packageName: yield* expectString(packageManifest.name, 'package.json.name'),\n packageVersion: yield* expectString(packageManifest.version, 'package.json.version'),\n binName: 'effect-harness',\n binPath: yield* expectString(packageBin['effect-harness'], 'package.json.bin.effect-harness'),\n discoveryCommand: 'npx --yes @sayoriqwq/effect-harness provider-discover',\n packageFiles: yield* expectStringArray(packageManifest.files, 'package.json.files'),\n },\n provider: {\n id: yield* expectString(provider.id, 'provider profile.provider.id'),\n contractVersion: yield* expectString(provider.contractVersion, 'provider profile.provider.contractVersion'),\n providerVersion: yield* expectString(provider.providerVersion, 'provider profile.provider.providerVersion'),\n defaultProfile,\n },\n selectedProfile: defaultProfile,\n discovery: {\n mode: 'provider-discovery',\n consumer: 'prelude',\n profileSource: providerProfileRelativePath,\n targetLifecycleOwner: yield* expectString(selfConformance.lifecycleOwner, 'provider profile.selfConformance.lifecycleOwner'),\n },\n deliveryModes,\n targetManagedSurfaces: {\n targetReceives: yield* expectStringArray(managedSurfaces.targetReceives, `provider profile.profiles.${defaultProfile}.managedSurfaces.targetReceives`),\n targetDoesNotReceive: yield* expectStringArray(managedSurfaces.targetDoesNotReceive, `provider profile.profiles.${defaultProfile}.managedSurfaces.targetDoesNotReceive`),\n documentationBundle: yield* expectManagedFilesContribution(contributions.documentationBundle, `provider profile.profiles.${defaultProfile}.contributions.documentationBundle`, artifactRoot),\n snippets: yield* expectManagedFilesContribution(contributions.snippets, `provider profile.profiles.${defaultProfile}.contributions.snippets`, artifactRoot),\n contributions: {\n packageJson: yield* expectNamedRecord(contributions, 'packageJson', `provider profile.profiles.${defaultProfile}.contributions`),\n tsconfig: yield* expectNamedRecord(contributions, 'tsconfig', `provider profile.profiles.${defaultProfile}.contributions`),\n editorPolicy: yield* expectNamedRecord(contributions, 'editorPolicy', `provider profile.profiles.${defaultProfile}.contributions`),\n lintGuardrails: yield* expectNamedRecord(contributions, 'lintGuardrails', `provider profile.profiles.${defaultProfile}.contributions`),\n testPolicy: yield* expectNamedRecord(contributions, 'testPolicy', `provider profile.profiles.${defaultProfile}.contributions`),\n verificationPolicy: yield* expectNamedRecord(contributions, 'verificationPolicy', `provider profile.profiles.${defaultProfile}.contributions`),\n },\n },\n artifactOnlyReferences,\n sourceIdentities: {\n defaultSourceEntry: yield* expectString(selectedProfile.sourceEntry, `provider profile.profiles.${defaultProfile}.sourceEntry`),\n sourceEntries: yield* expectStringArray(selectedProfile.sourceEntries, `provider profile.profiles.${defaultProfile}.sourceEntries`),\n sourceBoundary: {\n providerRepoInternal: yield* expectBoolean(sourceBoundary.providerRepoInternal, `provider profile.profiles.${defaultProfile}.sourceBoundary.providerRepoInternal`),\n targetDelivery: yield* expectString(sourceBoundary.targetDelivery, `provider profile.profiles.${defaultProfile}.sourceBoundary.targetDelivery`),\n targetMustNotReceive: yield* expectStringArray(sourceBoundary.targetMustNotReceive, `provider profile.profiles.${defaultProfile}.sourceBoundary.targetMustNotReceive`),\n allowedTargetSourceIdentity: yield* expectStringArray(sourceBoundary.allowedTargetSourceIdentity, `provider profile.profiles.${defaultProfile}.sourceBoundary.allowedTargetSourceIdentity`),\n },\n providerSourceEntries: yield* expectNamedRecord(providerProfile, 'sourceEntries', 'provider profile'),\n artifactReferences: artifactOnlyReferences.references,\n },\n internalHarnessSurfaces: deliveryModes.internalHarness,\n } satisfies ProviderDiscovery\n})\n"]}
|
|
@@ -158,7 +158,7 @@ const expectedPackageGroups = {
|
|
|
158
158
|
},
|
|
159
159
|
testing: {
|
|
160
160
|
field: 'devDependencies',
|
|
161
|
-
packageNames: ['@effect/vitest'],
|
|
161
|
+
packageNames: ['@effect/vitest', 'vitest'],
|
|
162
162
|
},
|
|
163
163
|
diagnostics: {
|
|
164
164
|
field: 'devDependencies',
|
|
@@ -168,11 +168,15 @@ const expectedPackageGroups = {
|
|
|
168
168
|
field: 'devDependencies',
|
|
169
169
|
packageNames: ['@typescript/native-preview'],
|
|
170
170
|
},
|
|
171
|
+
linting: {
|
|
172
|
+
field: 'devDependencies',
|
|
173
|
+
packageNames: ['@antfu/eslint-config', 'eslint'],
|
|
174
|
+
},
|
|
171
175
|
};
|
|
172
176
|
const expectedLintCommand = 'pnpm lint --max-warnings 0';
|
|
173
177
|
const expectedLintScript = 'eslint';
|
|
174
178
|
const expectedTestCommand = 'pnpm test';
|
|
175
|
-
const expectedTestScript = 'vitest run
|
|
179
|
+
const expectedTestScript = 'vitest run';
|
|
176
180
|
const expectedVerifyCommand = 'pnpm verify';
|
|
177
181
|
const expectedVerifyScript = 'node bin/effect-harness.ts verify --harness .';
|
|
178
182
|
function assertPackageBaseline(errors, profileBaseline) {
|
|
@@ -275,7 +279,7 @@ function assertLintGuardrailsContribution(errors, contributions, packageManifest
|
|
|
275
279
|
assertArrayContainsString(errors, doesNotOwn, 'tsgo rule severity map', 'provider profile lintGuardrails.layers.doesNotOwn');
|
|
276
280
|
const rules = recordField(errors, lintGuardrails, 'rules', 'provider profile lintGuardrails contribution');
|
|
277
281
|
const restrictedImports = arrayField(errors, rules, 'restrictedImports', 'provider profile lintGuardrails.rules');
|
|
278
|
-
for (const source of ['node:test', '
|
|
282
|
+
for (const source of ['node:test', '@effect/cli', '@effect/cli/*', 'repos/effect/**', 'repos/tsgo/**']) {
|
|
279
283
|
assertArrayContainsString(errors, restrictedImports, source, 'provider profile lintGuardrails.rules.restrictedImports');
|
|
280
284
|
const eslintMarker = source.endsWith('/**')
|
|
281
285
|
? source.slice(0, -3)
|
|
@@ -284,6 +288,16 @@ function assertLintGuardrailsContribution(errors, contributions, packageManifest
|
|
|
284
288
|
: source;
|
|
285
289
|
assertEslintConfigContains(errors, eslintText, eslintMarker);
|
|
286
290
|
}
|
|
291
|
+
const restrictedVitestImports = arrayField(errors, rules, 'restrictedVitestImports', 'provider profile lintGuardrails.rules');
|
|
292
|
+
for (const importName of ['describe', 'it', 'test']) {
|
|
293
|
+
assertArrayContainsString(errors, restrictedVitestImports, importName, 'provider profile lintGuardrails.rules.restrictedVitestImports');
|
|
294
|
+
}
|
|
295
|
+
const allowedVitestImports = arrayField(errors, rules, 'allowedVitestImports', 'provider profile lintGuardrails.rules');
|
|
296
|
+
for (const importName of ['vi', 'beforeEach', 'afterEach', 'beforeAll', 'afterAll']) {
|
|
297
|
+
assertArrayContainsString(errors, allowedVitestImports, importName, 'provider profile lintGuardrails.rules.allowedVitestImports');
|
|
298
|
+
}
|
|
299
|
+
assertEslintConfigContains(errors, eslintText, 'vitest');
|
|
300
|
+
assertEslintConfigContains(errors, eslintText, 'importNames');
|
|
287
301
|
const restrictedSyntax = arrayField(errors, rules, 'restrictedSyntax', 'provider profile lintGuardrails.rules');
|
|
288
302
|
for (const syntax of ['Context.Tag', 'Effect.catchAllCause', 'Effect.ignore', 'Effect.serviceOption', '{ disableValidation: true }', 'plain it() in tests']) {
|
|
289
303
|
assertArrayContainsString(errors, restrictedSyntax, syntax, 'provider profile lintGuardrails.rules.restrictedSyntax');
|
|
@@ -297,21 +311,22 @@ function assertLintGuardrailsContribution(errors, contributions, packageManifest
|
|
|
297
311
|
assertEslintConfigContains(errors, eslintText, marker);
|
|
298
312
|
}
|
|
299
313
|
}
|
|
300
|
-
function assertTestPolicyContribution(errors, contributions
|
|
314
|
+
function assertTestPolicyContribution(errors, contributions) {
|
|
301
315
|
const testPolicy = recordField(errors, contributions, 'testPolicy', 'provider profile.profiles.codex-effect-v4.contributions');
|
|
302
316
|
assertStringValue(errors, stringField(errors, testPolicy, 'mode', 'provider profile testPolicy contribution'), 'command-policy', 'provider profile testPolicy.mode');
|
|
303
317
|
assertStringValue(errors, stringField(errors, testPolicy, 'stage', 'provider profile testPolicy contribution'), 'tests', 'provider profile testPolicy.stage');
|
|
304
318
|
assertStringValue(errors, stringField(errors, testPolicy, 'command', 'provider profile testPolicy contribution'), expectedTestCommand, 'provider profile testPolicy.command');
|
|
305
319
|
assertStringValue(errors, stringField(errors, testPolicy, 'packageScript', 'provider profile testPolicy contribution'), expectedTestScript, 'provider profile testPolicy.packageScript');
|
|
306
320
|
assertStringValue(errors, stringField(errors, testPolicy, 'framework', 'provider profile testPolicy contribution'), '@effect/vitest', 'provider profile testPolicy.framework');
|
|
307
|
-
assertArrayContainsString(errors, arrayField(errors, testPolicy, 'expectedEntries', 'provider profile testPolicy contribution'), 'tests
|
|
321
|
+
assertArrayContainsString(errors, arrayField(errors, testPolicy, 'expectedEntries', 'provider profile testPolicy contribution'), 'tests/**/*.test.ts', 'provider profile testPolicy.expectedEntries');
|
|
308
322
|
assertArrayContainsString(errors, arrayField(errors, testPolicy, 'effectEntrypoints', 'provider profile testPolicy contribution'), 'it.effect', 'provider profile testPolicy.effectEntrypoints');
|
|
309
323
|
assertArrayContainsString(errors, arrayField(errors, testPolicy, 'effectEntrypoints', 'provider profile testPolicy contribution'), 'it.live', 'provider profile testPolicy.effectEntrypoints');
|
|
310
324
|
assertArrayContainsString(errors, arrayField(errors, testPolicy, 'effectEntrypoints', 'provider profile testPolicy contribution'), 'layer', 'provider profile testPolicy.effectEntrypoints');
|
|
311
325
|
assertArrayContainsString(errors, arrayField(errors, testPolicy, 'disallowedImports', 'provider profile testPolicy contribution'), 'node:test', 'provider profile testPolicy.disallowedImports');
|
|
312
|
-
|
|
313
|
-
const
|
|
314
|
-
|
|
326
|
+
const disallowedVitestImports = arrayField(errors, testPolicy, 'disallowedVitestImports', 'provider profile testPolicy contribution');
|
|
327
|
+
for (const importName of ['describe', 'it', 'test']) {
|
|
328
|
+
assertArrayContainsString(errors, disallowedVitestImports, importName, 'provider profile testPolicy.disallowedVitestImports');
|
|
329
|
+
}
|
|
315
330
|
}
|
|
316
331
|
function stageRecordByTag(stages, tag) {
|
|
317
332
|
return stages?.find(stage => isRecord(stage) && stage.tag === tag);
|
|
@@ -377,11 +392,16 @@ function assertPackageScriptsContribution(errors, packageContribution, packageMa
|
|
|
377
392
|
const contributionScripts = recordField(errors, packageContribution, 'scripts', 'provider profile packageJson contribution');
|
|
378
393
|
const prepare = recordField(errors, contributionScripts, 'prepare', 'provider profile packageJson.scripts');
|
|
379
394
|
const typecheck = recordField(errors, contributionScripts, 'typecheck', 'provider profile packageJson.scripts');
|
|
395
|
+
const test = recordField(errors, contributionScripts, 'test', 'provider profile packageJson.scripts');
|
|
396
|
+
const lint = recordField(errors, contributionScripts, 'lint', 'provider profile packageJson.scripts');
|
|
380
397
|
assertStringValue(errors, stringField(errors, prepare, 'defaultCommand', 'provider profile packageJson.scripts.prepare'), expectedPrepareCommand, 'provider profile packageJson.scripts.prepare.defaultCommand');
|
|
381
398
|
assertStringValue(errors, stringField(errors, typecheck, 'defaultCommand', 'provider profile packageJson.scripts.typecheck'), expectedTypecheckCommand, 'provider profile packageJson.scripts.typecheck.defaultCommand');
|
|
399
|
+
assertStringValue(errors, stringField(errors, test, 'defaultCommand', 'provider profile packageJson.scripts.test'), expectedTestScript, 'provider profile packageJson.scripts.test.defaultCommand');
|
|
400
|
+
assertStringValue(errors, stringField(errors, lint, 'defaultCommand', 'provider profile packageJson.scripts.lint'), expectedLintScript, 'provider profile packageJson.scripts.lint.defaultCommand');
|
|
382
401
|
const manifestScripts = recordField(errors, packageManifest, 'scripts', 'package.json');
|
|
383
402
|
assertStringValue(errors, stringField(errors, manifestScripts, 'prepare', 'package.json.scripts'), expectedPrepareCommand, 'package.json.scripts.prepare');
|
|
384
403
|
assertStringValue(errors, stringField(errors, manifestScripts, 'typecheck', 'package.json.scripts'), expectedTypecheckCommand, 'package.json.scripts.typecheck');
|
|
404
|
+
assertStringValue(errors, stringField(errors, manifestScripts, 'lint', 'package.json.scripts'), expectedLintScript, 'package.json.scripts.lint');
|
|
385
405
|
}
|
|
386
406
|
function assertPackageJsonContribution(errors, contributions, packageManifest, workspaceText) {
|
|
387
407
|
const packageJson = recordField(errors, contributions, 'packageJson', 'provider profile.profiles.codex-effect-v4.contributions');
|
|
@@ -592,7 +612,7 @@ export const verifyProviderProfileContract = Effect.fnUntraced(function* (errors
|
|
|
592
612
|
assertTsconfigContributionMetadata(errors, contributions);
|
|
593
613
|
assertEditorPolicyContribution(errors, contributions, effectContract, tsgoContract, vscodeSettings);
|
|
594
614
|
assertLintGuardrailsContribution(errors, contributions, packageManifest, eslintText);
|
|
595
|
-
assertTestPolicyContribution(errors, contributions
|
|
615
|
+
assertTestPolicyContribution(errors, contributions);
|
|
596
616
|
assertVerificationPolicyContribution(errors, contributions, packageManifest);
|
|
597
617
|
yield* assertManagedFileBundle(errors, harness, recordField(errors, contributions, 'documentationBundle', 'provider profile.profiles.codex-effect-v4.contributions'), '.prelude/providers/effect-harness/docs', [
|
|
598
618
|
{
|