Files
winos-config/scripts/gen-dsc-resources-types.ts
EthanShoeDev 58b8ee5807 notes
2025-12-01 01:34:43 -05:00

92 lines
2.5 KiB
TypeScript

import { Command, FileSystem, Path } from '@effect/platform';
import { BunContext, BunRuntime } from '@effect/platform-bun';
import { Effect, Logger, LogLevel } from 'effect';
import { jsonSchemaToEffectSchema, runCommand } from './lib/script-utils';
const getDscResourceJsonSchema = (resourceType: string) =>
Effect.gen(function* () {
const commandParts = [
'dsc',
'resource',
'schema',
'--resource',
resourceType,
] as const;
yield* Effect.logDebug(`Running command: ${commandParts.join(' ')}`);
const schemaString = yield* Command.make(...commandParts).pipe(
Command.string,
);
return schemaString.trim();
});
const getAvailableDscResources = () =>
Effect.gen(function* () {
yield* Effect.logDebug('Getting available DSC resources...');
const dscrResourcesListOutput = yield* Command.make(
'dsc',
'resource',
'list',
'-o',
'json',
).pipe(Command.string);
yield* Effect.logDebug(
`DSC resources list output: ${dscrResourcesListOutput}`,
);
return [] as Array<string>;
});
const genDscResourcesTypes = Effect.gen(function* () {
yield* Effect.log('Starting DSC resources types generation...');
const availableResourceTypes = yield* getAvailableDscResources();
yield* Effect.log(
`Found available resource types: ${availableResourceTypes.join(', ')}`,
);
const fs = yield* FileSystem.FileSystem;
const path = yield* Path.Path;
const outputDir = path.join(
process.cwd(),
'src',
'dsc-resource-schema-types',
);
yield* Effect.logDebug(`Output directory: ${outputDir}`);
if (yield* fs.exists(outputDir)) {
yield* Effect.log('Removing existing output directory...');
yield* fs.remove(outputDir, { recursive: true, force: true });
}
yield* fs.makeDirectory(outputDir, { recursive: true });
for (const schemaType of availableResourceTypes) {
yield* Effect.logDebug(`Processing: ${schemaType}`);
const jsonSchema = yield* getDscResourceJsonSchema(schemaType);
const effectSchema = yield* jsonSchemaToEffectSchema({
jsonSchema,
name: schemaType,
});
const outputPath = path.join(outputDir, `${schemaType}.gen.ts`);
yield* fs.writeFileString(outputPath, effectSchema);
yield* Effect.log(`Generated: ${schemaType}.gen.ts`);
}
yield* Effect.log('DSC types generation complete!');
});
BunRuntime.runMain(
genDscResourcesTypes.pipe(
Effect.provide(BunContext.layer),
Logger.withMinimumLogLevel(LogLevel.Debug),
Effect.scoped,
),
);