22import { Command , Program , BaseCommandOptions } from "./types" ;
33import { createLogger } from "./utils/createLogger" ;
44import {
5- defaultPolywrapManifest ,
6- DeployPackage ,
75 intlMsg ,
86 parseManifestFileOption ,
9- PolywrapProject ,
10- DeployJob ,
11- DeployStep ,
127 parseLogFileOption ,
8+ Deployer ,
9+ defaultDeployManifest ,
1310} from "../lib" ;
1411
15- import { DeployManifest } from "@polywrap/polywrap-manifest-types-js" ;
1612import fs from "fs" ;
17- import nodePath from "path" ;
13+ import path from "path" ;
1814import yaml from "yaml" ;
19- import { validate } from "jsonschema" ;
2015
21- const defaultManifestStr = defaultPolywrapManifest . join ( " | " ) ;
16+ const defaultManifestStr = defaultDeployManifest . join ( " | " ) ;
2217const pathStr = intlMsg . commands_deploy_options_o_path ( ) ;
2318
2419export interface DeployCommandOptions extends BaseCommandOptions {
2520 manifestFile : string ;
2621 outputFile : string | false ;
2722}
2823
29- type ManifestJob = DeployManifest [ "jobs" ] [ number ] ;
30- type ManifestStep = ManifestJob [ "steps" ] [ number ] ;
31-
3224export const deploy : Command = {
3325 setup : ( program : Program ) => {
3426 program
@@ -55,7 +47,7 @@ export const deploy: Command = {
5547 await run ( {
5648 manifestFile : parseManifestFileOption (
5749 options . manifestFile ,
58- defaultPolywrapManifest
50+ defaultDeployManifest
5951 ) ,
6052 outputFile : options . outputFile || false ,
6153 verbose : options . verbose || false ,
@@ -70,81 +62,11 @@ async function run(options: Required<DeployCommandOptions>): Promise<void> {
7062 const { manifestFile, outputFile, verbose, quiet, logFile } = options ;
7163 const logger = createLogger ( { verbose, quiet, logFile } ) ;
7264
73- const project = new PolywrapProject ( {
74- rootDir : nodePath . dirname ( manifestFile ) ,
75- polywrapManifestPath : manifestFile ,
76- logger,
77- } ) ;
78- await project . validate ( ) ;
79-
80- const deployManifest = await project . getDeployManifest ( ) ;
81-
82- if ( ! deployManifest ) {
83- throw new Error ( "No deploy manifest found." ) ;
84- }
85-
86- const allStepsFromAllJobs = Object . entries ( deployManifest . jobs ) . flatMap (
87- ( [ jobName , job ] ) => {
88- return job . steps . map ( ( step ) => ( {
89- jobName,
90- ...step ,
91- } ) ) ;
92- }
93- ) ;
94-
95- const packageNames = [
96- ...new Set ( allStepsFromAllJobs . map ( ( step ) => step . package ) ) ,
97- ] ;
98-
99- sanitizePackages ( packageNames ) ;
100-
101- await project . cacheDeployModules ( packageNames ) ;
102-
103- const packageMapEntries = await Promise . all (
104- packageNames . map ( async ( packageName ) => {
105- const deployerPackage = await project . getDeployModule ( packageName ) ;
106- return [ packageName , deployerPackage ] ;
107- } )
108- ) ;
109-
110- const packageMap = Object . fromEntries ( packageMapEntries ) ;
111-
112- const stepToPackageMap : Record <
113- string ,
114- DeployPackage & { jobName : string }
115- > = { } ;
116-
117- for ( const step of allStepsFromAllJobs ) {
118- stepToPackageMap [ step . name ] = {
119- ...packageMap [ step . package ] ,
120- jobName : step . jobName ,
121- } ;
122- }
123-
124- validateManifestWithExts ( deployManifest , stepToPackageMap ) ;
125-
126- const jobs = Object . entries ( deployManifest . jobs ) . map ( ( [ jobName , job ] ) => {
127- const steps : DeployStep [ ] = job . steps . map ( ( step ) => {
128- return new DeployStep ( {
129- name : step . name ,
130- uriOrStepResult : step . uri ,
131- deployer : stepToPackageMap [ step . name ] . deployer ,
132- config : step . config ?? { } ,
133- } ) ;
134- } ) ;
135-
136- return new DeployJob ( {
137- name : jobName ,
138- steps,
139- config : job . config ?? { } ,
140- logger,
141- } ) ;
142- } ) ;
143-
144- const jobResults = await Promise . all ( jobs . map ( ( job ) => job . run ( ) ) ) ;
65+ const deployer = await Deployer . create ( manifestFile , logger ) ;
66+ const jobResults = await deployer . run ( ) ;
14567
14668 if ( outputFile ) {
147- const outputFileExt = nodePath . extname ( outputFile ) . substring ( 1 ) ;
69+ const outputFileExt = path . extname ( outputFile ) . substring ( 1 ) ;
14870 if ( ! outputFileExt ) throw new Error ( "Require output file extension" ) ;
14971 switch ( outputFileExt ) {
15072 case "yaml" :
@@ -164,61 +86,3 @@ async function run(options: Required<DeployCommandOptions>): Promise<void> {
16486 }
16587 process . exit ( 0 ) ;
16688}
167-
168- function sanitizePackages ( packages : string [ ] ) {
169- const unrecognizedPackages : string [ ] = [ ] ;
170-
171- const availableDeployers = fs . readdirSync (
172- nodePath . join ( __dirname , ".." , "lib" , "defaults" , "deploy-modules" )
173- ) ;
174-
175- packages . forEach ( ( p ) => {
176- if ( ! availableDeployers . includes ( p ) ) {
177- unrecognizedPackages . push ( p ) ;
178- }
179- } ) ;
180-
181- if ( unrecognizedPackages . length ) {
182- throw new Error (
183- `Unrecognized packages: ${ unrecognizedPackages . join ( ", " ) } `
184- ) ;
185- }
186- }
187-
188- function validateManifestWithExts (
189- deployManifest : DeployManifest ,
190- stepToPackageMap : Record < string , DeployPackage & { jobName : string } >
191- ) {
192- const errors = Object . entries ( stepToPackageMap ) . flatMap (
193- ( [ stepName , step ] ) => {
194- const jobEntry = Object . entries ( deployManifest . jobs ) . find (
195- ( [ jobName ] ) => jobName === step . jobName
196- ) as [ string , ManifestJob ] ;
197-
198- const job = jobEntry [ 1 ] ;
199-
200- const stepToValidate = job . steps . find (
201- ( s ) => s . name === stepName
202- ) as ManifestStep ;
203-
204- return step . manifestExt
205- ? validate (
206- {
207- ...job . config ,
208- ...stepToValidate . config ,
209- } ,
210- step . manifestExt
211- ) . errors
212- : [ ] ;
213- }
214- ) ;
215-
216- if ( errors . length ) {
217- throw new Error (
218- [
219- `Validation errors encountered while sanitizing DeployManifest format ${ deployManifest . format } ` ,
220- ...errors . map ( ( error ) => error . toString ( ) ) ,
221- ] . join ( "\n" )
222- ) ;
223- }
224- }
0 commit comments