Skip to content

Commit cf56644

Browse files
committed
Merge branch 'feat/docker-run-to-docker-compose-enh' into chore/all-my-stuffs
# Conflicts: # package.json # pnpm-lock.yaml
2 parents 0e87628 + c6f9d46 commit cf56644

File tree

4 files changed

+104
-45
lines changed

4 files changed

+104
-45
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@
6161
"colord": "^2.9.3",
6262
"composerize-ts": "^0.6.2",
6363
"countries-db": "^1.2.0",
64+
"composerize": "^1.6.12",
6465
"country-code-lookup": "^0.1.0",
6566
"crc": "^4.3.2",
6667
"cron-validator": "^1.3.1",

pnpm-lock.yaml

Lines changed: 36 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
declare module 'composerize' {
2-
const composerize: (arg: string) => string;
2+
const composerize: (commands: string, existingDockerComposeFile?: string, conversion?: string, indent?: number) => string;
33
export default composerize;
44
}

src/tools/docker-run-to-docker-compose-converter/docker-run-to-docker-compose-converter.vue

Lines changed: 66 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,94 @@
11
<script setup lang="ts">
2-
import { MessageType, composerize } from 'composerize-ts';
3-
import { withDefaultOnError } from '@/utils/defaults';
2+
import composerize from 'composerize';
43
import { useDownloadFileFromBase64 } from '@/composable/downloadBase64';
54
import { textToBase64 } from '@/utils/base64';
65
import TextareaCopyable from '@/components/TextareaCopyable.vue';
76
8-
const dockerRun = ref(
7+
const dockerRuns = ref(
98
'docker run -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock:ro --restart always --log-opt max-size=1g nginx',
109
);
10+
const indentSize = useStorage('docker-run-to-compose:indent-size', 4);
1111
12-
const conversionResult = computed(() =>
13-
withDefaultOnError(() => composerize(dockerRun.value.trim()), { yaml: '', messages: [] }),
12+
const existingDockerComposeFile = ref(
13+
'',
1414
);
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+
1531
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+
2734
const dockerComposeBase64 = computed(() => `data:application/yaml;base64,${textToBase64(dockerCompose.value)}`);
2835
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+
};
2942
</script>
3043

3144
<template>
3245
<div>
3346
<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):"
3649
style="font-family: monospace"
3750
multiline
3851
raw-text
3952
monospace
40-
placeholder="Your docker run command to convert..."
41-
rows="3"
53+
placeholder="Your docker run command(s) to convert..."
54+
rows="4"
4255
/>
4356

4457
<n-divider />
4558

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+
4692
<TextareaCopyable :value="dockerCompose" language="yaml" />
4793

4894
<div mt-5 flex justify-center>
@@ -51,30 +97,6 @@ const { download } = useDownloadFileFromBase64({ source: dockerComposeBase64, fi
5197
</c-button>
5298
</div>
5399

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-
78100
<div v-if="errors.length > 0">
79101
<n-alert title="The following errors occured" type="error" mt-5>
80102
<ul>

0 commit comments

Comments
 (0)