1
1
<script setup lang="ts">
2
- import { MessageType , composerize } from ' composerize-ts' ;
3
- import { withDefaultOnError } from ' @/utils/defaults' ;
2
+ import composerize from ' composerize' ;
4
3
import { useDownloadFileFromBase64 } from ' @/composable/downloadBase64' ;
5
4
import { textToBase64 } from ' @/utils/base64' ;
6
5
import TextareaCopyable from ' @/components/TextareaCopyable.vue' ;
7
6
8
- const dockerRun = ref (
7
+ const dockerRuns = ref (
9
8
' docker run -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock:ro --restart always --log-opt max-size=1g nginx' ,
10
9
);
10
+ const indentSize = useStorage (' docker-run-to-compose:indent-size' , 4 );
11
11
12
- const conversionResult = computed (() =>
13
- withDefaultOnError (() => composerize ( dockerRun . value . trim ()), { yaml: ' ' , messages: [] }) ,
12
+ const existingDockerComposeFile = ref (
13
+ ' ' ,
14
14
);
15
+ const format = useStorage (' docker-run-to-compose:format' , ' latest' );
16
+ const formatOptions = [
17
+ { value: ' v2x' , label: ' V2 - 2.x' },
18
+ { value: ' v3x' , label: ' V2 - 3.x' },
19
+ { value: ' latest' , label: ' CommonSpec' },
20
+ ];
21
+
22
+ const conversionResult = computed (() => {
23
+ try {
24
+ return { yaml: composerize (dockerRuns .value .trim (), existingDockerComposeFile .value , format .value , indentSize .value ), errors: [] };
25
+ }
26
+ catch (e : any ) {
27
+ return { yaml: ' #see error messages' , errors: e .toString ().split (' \n ' ) };
28
+ }
29
+ });
30
+
15
31
const dockerCompose = computed (() => conversionResult .value .yaml );
16
- const notImplemented = computed (() =>
17
- conversionResult .value .messages .filter (msg => msg .type === MessageType .notImplemented ).map (msg => msg .value ),
18
- );
19
- const notComposable = computed (() =>
20
- conversionResult .value .messages .filter (msg => msg .type === MessageType .notTranslatable ).map (msg => msg .value ),
21
- );
22
- const errors = computed (() =>
23
- conversionResult .value .messages
24
- .filter (msg => msg .type === MessageType .errorDuringConversion )
25
- .map (msg => msg .value ),
26
- );
32
+ const errors = computed (() => conversionResult .value .errors );
33
+
27
34
const dockerComposeBase64 = computed (() => ` data:application/yaml;base64,${textToBase64 (dockerCompose .value )} ` );
28
35
const { download } = useDownloadFileFromBase64 ({ source: dockerComposeBase64 , filename: ' docker-compose.yml' });
36
+
37
+ const MONACO_EDITOR_OPTIONS = {
38
+ automaticLayout: true ,
39
+ formatOnType: true ,
40
+ formatOnPaste: true ,
41
+ };
29
42
</script >
30
43
31
44
<template >
32
45
<div >
33
46
<c-input-text
34
- v-model:value =" dockerRun "
35
- label =" Your docker run command:"
47
+ v-model:value =" dockerRuns "
48
+ label =" Your docker run command(s) :"
36
49
style =" font-family : monospace "
37
50
multiline
38
51
raw-text
39
52
monospace
40
- placeholder =" Your docker run command to convert..."
41
- rows =" 3 "
53
+ placeholder =" Your docker run command(s) to convert..."
54
+ rows =" 4 "
42
55
/>
43
56
44
57
<n-divider />
45
58
59
+ <c-label label =" Eventually, paste your existing Docker Compose:" >
60
+ <div relative w-full >
61
+ <c-monaco-editor
62
+ v-model:value =" existingDockerComposeFile"
63
+ theme =" vs-dark"
64
+ language =" yaml"
65
+ height =" 100px"
66
+ :options =" MONACO_EDITOR_OPTIONS"
67
+ />
68
+ </div >
69
+ </c-label >
70
+
71
+ <n-divider />
72
+
73
+ <n-grid cols =" 4" x-gap =" 12" w-full >
74
+ <n-gi span =" 2" >
75
+ <c-select
76
+ v-model:value =" format"
77
+ label-position =" top"
78
+ label =" Docker Compose format:"
79
+ :options =" formatOptions"
80
+ placeholder =" Select Docker Compose format"
81
+ />
82
+ </n-gi >
83
+ <n-gi span =" 2" >
84
+ <n-form-item label =" Indent size:" label-placement =" top" label-width =" 100" :show-feedback =" false" >
85
+ <n-input-number v-model:value =" indentSize" min =" 0" max =" 10" w-100px />
86
+ </n-form-item >
87
+ </n-gi >
88
+ </n-grid >
89
+
90
+ <n-divider />
91
+
46
92
<TextareaCopyable :value =" dockerCompose" language =" yaml" />
47
93
48
94
<div mt-5 flex justify-center >
@@ -51,30 +97,6 @@ const { download } = useDownloadFileFromBase64({ source: dockerComposeBase64, fi
51
97
</c-button >
52
98
</div >
53
99
54
- <div v-if =" notComposable.length > 0" >
55
- <n-alert title =" This options are not translatable to docker-compose" type =" info" mt-5 >
56
- <ul >
57
- <li v-for =" (message, index) of notComposable" :key =" index" >
58
- {{ message }}
59
- </li >
60
- </ul >
61
- </n-alert >
62
- </div >
63
-
64
- <div v-if =" notImplemented.length > 0" >
65
- <n-alert
66
- title =" This options are not yet implemented and therefore haven't been translated to docker-compose"
67
- type =" warning"
68
- mt-5
69
- >
70
- <ul >
71
- <li v-for =" (message, index) of notImplemented" :key =" index" >
72
- {{ message }}
73
- </li >
74
- </ul >
75
- </n-alert >
76
- </div >
77
-
78
100
<div v-if =" errors.length > 0" >
79
101
<n-alert title =" The following errors occured" type =" error" mt-5 >
80
102
<ul >
0 commit comments