create-platformatic 1.49.1 → 1.51.8

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.
@@ -0,0 +1,101 @@
1
+ import { test } from 'node:test'
2
+ import { equal } from 'node:assert'
3
+ import { executeCreatePlatformatic, keys, walk } from './helper.mjs'
4
+ import { timeout } from './timeout.mjs'
5
+ import { isFileAccessible } from '../../src/utils.mjs'
6
+ import { join } from 'node:path'
7
+ import { tmpdir } from 'os'
8
+ import { mkdtemp, rm } from 'node:fs/promises'
9
+
10
+ let tmpDir
11
+ test.beforeEach(async () => {
12
+ tmpDir = await mkdtemp(join(tmpdir(), 'test-create-platformatic-'))
13
+ })
14
+
15
+ test.afterEach(async () => {
16
+ try {
17
+ await rm(tmpDir, { recursive: true, force: true })
18
+ } catch (e) {
19
+ // on purpose, in win the resource might be still "busy"
20
+ }
21
+ })
22
+
23
+ test('Creates a Platformatic Stackable without typescript', { timeout }, async () => {
24
+ // The actions must match IN ORDER
25
+ const actions = [{
26
+ match: 'What kind of project do you want to create?',
27
+ do: [keys.DOWN, keys.ENTER] // Stackable
28
+ }, {
29
+ match: 'Where would you like to create your project?',
30
+ do: [keys.ENTER]
31
+ }, {
32
+ match: 'What is the name of the stackable?',
33
+ do: [keys.ENTER] // my-stackable
34
+ }, {
35
+ match: 'Do you want to use TypeScript',
36
+ do: [keys.ENTER] // no
37
+ }, {
38
+ match: 'Do you want to init the git repository',
39
+ do: [keys.DOWN, keys.ENTER] // yes
40
+ }]
41
+ await executeCreatePlatformatic(tmpDir, actions, {
42
+ done: 'Stackable created successfully!'
43
+ })
44
+
45
+ const baseProjectDir = join(tmpDir, 'platformatic')
46
+ const files = await walk(baseProjectDir)
47
+ console.log('==> created files', files)
48
+ equal(await isFileAccessible(join(baseProjectDir, '.gitignore')), true)
49
+ equal(await isFileAccessible(join(baseProjectDir, 'index.js')), true)
50
+ equal(await isFileAccessible(join(baseProjectDir, 'index.d.ts')), true)
51
+ equal(await isFileAccessible(join(baseProjectDir, 'config.d.ts')), true)
52
+ equal(await isFileAccessible(join(baseProjectDir, 'package.json')), true)
53
+ equal(await isFileAccessible(join(baseProjectDir, 'plugins', 'example.js')), true)
54
+ equal(await isFileAccessible(join(baseProjectDir, 'lib', 'schema.js')), true)
55
+ equal(await isFileAccessible(join(baseProjectDir, 'lib', 'generator.js')), true)
56
+ equal(await isFileAccessible(join(baseProjectDir, 'cli', 'create.js')), true)
57
+ equal(await isFileAccessible(join(baseProjectDir, 'cli', 'start.js')), true)
58
+ equal(await isFileAccessible(join(baseProjectDir, 'test', 'index.test.js')), true)
59
+ equal(await isFileAccessible(join(baseProjectDir, 'test', 'schema.test.js')), true)
60
+ equal(await isFileAccessible(join(baseProjectDir, 'test', 'generator.test.js')), true)
61
+ })
62
+
63
+ test('Creates a Platformatic Stackable with typescript', { timeout }, async () => {
64
+ // The actions must match IN ORDER
65
+ const actions = [{
66
+ match: 'What kind of project do you want to create?',
67
+ do: [keys.DOWN, keys.ENTER] // Stackable
68
+ }, {
69
+ match: 'Where would you like to create your project?',
70
+ do: [keys.ENTER]
71
+ }, {
72
+ match: 'What is the name of the stackable?',
73
+ do: [keys.ENTER] // my-stackable
74
+ }, {
75
+ match: 'Do you want to use TypeScript',
76
+ do: [keys.DOWN, keys.ENTER] // yes
77
+ }, {
78
+ match: 'Do you want to init the git repository',
79
+ do: [keys.ENTER] // no
80
+ }]
81
+ await executeCreatePlatformatic(tmpDir, actions, {
82
+ done: 'Stackable created successfully!'
83
+ })
84
+
85
+ const baseProjectDir = join(tmpDir, 'platformatic')
86
+ const files = await walk(baseProjectDir)
87
+ console.log('==> created files', files)
88
+ equal(await isFileAccessible(join(baseProjectDir, '.gitignore')), true)
89
+ equal(await isFileAccessible(join(baseProjectDir, 'index.ts')), true)
90
+ equal(await isFileAccessible(join(baseProjectDir, 'index.d.ts')), true)
91
+ equal(await isFileAccessible(join(baseProjectDir, 'config.d.ts')), true)
92
+ equal(await isFileAccessible(join(baseProjectDir, 'package.json')), true)
93
+ equal(await isFileAccessible(join(baseProjectDir, 'plugins', 'example.ts')), true)
94
+ equal(await isFileAccessible(join(baseProjectDir, 'lib', 'schema.ts')), true)
95
+ equal(await isFileAccessible(join(baseProjectDir, 'lib', 'generator.ts')), true)
96
+ equal(await isFileAccessible(join(baseProjectDir, 'cli', 'create.ts')), true)
97
+ equal(await isFileAccessible(join(baseProjectDir, 'cli', 'start.ts')), true)
98
+ equal(await isFileAccessible(join(baseProjectDir, 'test', 'index.test.ts')), true)
99
+ equal(await isFileAccessible(join(baseProjectDir, 'test', 'schema.test.ts')), true)
100
+ equal(await isFileAccessible(join(baseProjectDir, 'test', 'generator.test.ts')), true)
101
+ })
@@ -0,0 +1,3 @@
1
+ 'use strict'
2
+
3
+ export const timeout = 120_000
@@ -0,0 +1,61 @@
1
+ import { tmpdir } from 'os'
2
+ import { join } from 'path'
3
+ import { execa } from 'execa'
4
+ import { test } from 'node:test'
5
+ import { equal, match } from 'node:assert'
6
+
7
+ import { isFileAccessible } from '../../src/utils.mjs'
8
+ import { createGitRepository, GIT_FIRST_COMMIT_MESSAGE, GIT_MAIN_BRANCH } from '../../src/create-git-repository.mjs'
9
+ import { mkdir, rm, writeFile } from 'fs/promises'
10
+
11
+ const loggerSpy = {
12
+ _debug: [],
13
+ _info: [],
14
+ _error: [],
15
+
16
+ debug: function (...args) { this._debug.push(args) },
17
+ info: function (...args) { this._info.push(args) },
18
+ error: function (...args) { this._error.push(args) },
19
+
20
+ reset: function () {
21
+ this._debug = []
22
+ this._info = []
23
+ this._error = []
24
+ }
25
+ }
26
+
27
+ const tmpDir = join(tmpdir(), 'test-create-platformatic-git-repo')
28
+ test.beforeEach(async () => {
29
+ loggerSpy.reset()
30
+ await rm(tmpDir, { recursive: true, force: true })
31
+ await mkdir(tmpDir, { recursive: true })
32
+ })
33
+
34
+ test('should create the git repo', async () => {
35
+ await writeFile(join(tmpDir, 'README.md'), '')
36
+
37
+ await createGitRepository(loggerSpy, tmpDir)
38
+
39
+ equal(loggerSpy._debug[0][0], 'Git repository initialized.')
40
+ equal(loggerSpy._debug[1][0], 'Git commit done.')
41
+ equal(loggerSpy._info[0][0], 'Git repository initialized.')
42
+ equal(loggerSpy._error.length, 0)
43
+
44
+ equal(await isFileAccessible(join(tmpDir, '.git/config')), true)
45
+
46
+ const lastCommit = await execa('git', ['show', '-1'], { cwd: tmpDir })
47
+ match(lastCommit.stdout, new RegExp(GIT_FIRST_COMMIT_MESSAGE))
48
+
49
+ const branch = await execa('git', ['branch'], { cwd: tmpDir })
50
+ match(branch.stdout, new RegExp(GIT_MAIN_BRANCH))
51
+ })
52
+
53
+ test('should not create the git repository if already exists', async () => {
54
+ await execa('git', ['init'], { cwd: tmpDir })
55
+
56
+ await createGitRepository(loggerSpy, tmpDir)
57
+
58
+ equal(loggerSpy._debug.length, 0)
59
+ equal(loggerSpy._info[0][0], 'Git repository already exists.')
60
+ equal(loggerSpy._error.length, 0)
61
+ })
@@ -0,0 +1,71 @@
1
+ import { test } from 'node:test'
2
+ import { deepEqual } from 'node:assert'
3
+ import { MockAgent, setGlobalDispatcher } from 'undici'
4
+ import { fetchStackables } from '../../src/index.mjs'
5
+ import { setTimeout } from 'node:timers/promises'
6
+
7
+ const mockAgent = new MockAgent({
8
+ keepAliveTimeout: 10,
9
+ keepAliveMaxTimeout: 10
10
+ })
11
+ mockAgent.disableNetConnect()
12
+
13
+ setGlobalDispatcher(mockAgent)
14
+
15
+ const MARKETPLACE_HOST = 'https://marketplace.platformatic.dev'
16
+
17
+ const mockPool = mockAgent.get(MARKETPLACE_HOST)
18
+ const defaultStackables = ['@platformatic/composer', '@platformatic/db', '@platformatic/service']
19
+
20
+ test('should fetch stackables from the marketplace', async () => {
21
+ const mockStackables = [
22
+ { name: 'mock-service-1' },
23
+ { name: 'mock-service-2' },
24
+ { name: 'mock-service-3' }
25
+ ]
26
+
27
+ mockPool.intercept({ path: '/templates' }).reply(200, mockStackables)
28
+
29
+ const stackables = await fetchStackables()
30
+ deepEqual(stackables, mockStackables.map(s => s.name))
31
+ })
32
+
33
+ test('should fetch private stackables from the marketplace', async () => {
34
+ const mockStackables = [
35
+ { name: 'mock-service-1' },
36
+ { name: 'mock-service-2' },
37
+ { name: 'mock-service-3' },
38
+ { name: 'private-mock-service-1' }
39
+ ]
40
+
41
+ mockPool.intercept({ path: '/templates' }).reply(200, mockStackables)
42
+
43
+ const stackables = await fetchStackables(MARKETPLACE_HOST)
44
+ deepEqual(stackables, mockStackables.map(s => s.name))
45
+ })
46
+
47
+ test('should fetch only public stackables if user api key is wrong', async () => {
48
+ const mockStackables = [
49
+ { name: 'mock-service-1' },
50
+ { name: 'mock-service-2' },
51
+ { name: 'mock-service-3' }
52
+ ]
53
+
54
+ mockPool.intercept({ path: '/templates' }).reply(401)
55
+ mockPool.intercept({ path: '/templates' }).reply(200, mockStackables)
56
+
57
+ const stackables = await fetchStackables(MARKETPLACE_HOST)
58
+ deepEqual(stackables, mockStackables.map(s => s.name))
59
+ })
60
+
61
+ test('should return default stackables if fetching from the marketplace takes too long', async () => {
62
+ mockPool.intercept({ path: '/templates' }).reply(200, async () => await setTimeout(6000, []))
63
+ const stackables = await fetchStackables()
64
+ deepEqual(stackables, defaultStackables)
65
+ })
66
+
67
+ test('should return default stackables if fetching from the marketplace errors', async () => {
68
+ mockPool.intercept({ path: '/templates' }).replyWithError(new Error())
69
+ const stackables = await fetchStackables()
70
+ deepEqual(stackables, defaultStackables)
71
+ })
@@ -0,0 +1,291 @@
1
+ 'use strict'
2
+
3
+ import { test } from 'node:test'
4
+ import { equal, deepEqual, notEqual, doesNotThrow } from 'node:assert'
5
+ import { randomBetween, sleep, getDependencyVersion, findDBConfigFile, findServiceConfigFile, isFileAccessible, isCurrentVersionSupported, minimumSupportedNodeVersions, findRuntimeConfigFile, findComposerConfigFile, convertServiceNameToPrefix, addPrefixToEnv, safeMkdir } from '../../src/utils.mjs'
6
+ import { tmpdir } from 'os'
7
+ import { join } from 'path'
8
+ import esmock from 'esmock'
9
+ import semver from 'semver'
10
+ import { mkdir, mkdtemp, rm, writeFile } from 'fs/promises'
11
+
12
+ test('getUsername from git', async () => {
13
+ const name = 'lukeskywalker'
14
+ const { getUsername } = await esmock.strict('../../src/utils.mjs', {
15
+ execa: {
16
+ execa: (command) => {
17
+ if (command === 'git') {
18
+ return { stdout: name }
19
+ }
20
+ return ''
21
+ }
22
+ }
23
+ })
24
+ const username = await getUsername()
25
+ equal(username, name)
26
+ })
27
+
28
+ test('getUsername from whoami', async () => {
29
+ const name = 'hansolo'
30
+ const { getUsername } = await esmock.strict('../../src/utils.mjs', {
31
+ execa: {
32
+ execa: (command) => {
33
+ if (command === 'whoami') {
34
+ return { stdout: name }
35
+ }
36
+ return ''
37
+ }
38
+ }
39
+ })
40
+ const username = await getUsername()
41
+ equal(username, name)
42
+ })
43
+
44
+ test('if getUsername from git failed, it tries whoim', async () => {
45
+ const name = 'lukeskywalker'
46
+
47
+ const { getUsername } = await esmock.strict('../../src/utils.mjs', {
48
+ execa: {
49
+ execa: (command) => {
50
+ if (command === 'git') {
51
+ throw new Error('git failed')
52
+ }
53
+ if (command === 'whoami') {
54
+ return { stdout: name }
55
+ }
56
+
57
+ return ''
58
+ }
59
+ }
60
+ })
61
+ const username = await getUsername()
62
+ equal(username, name)
63
+ })
64
+
65
+ test('if both git usern.ame and whoami fail, no username is set', async () => {
66
+ const { getUsername } = await esmock.strict('../../src/utils.mjs', {
67
+ execa: {
68
+ execa: (command) => {
69
+ if (command === 'git') {
70
+ throw new Error('git failed')
71
+ }
72
+ if (command === 'whoami') {
73
+ throw new Error('whoami failed')
74
+ }
75
+ return ''
76
+ }
77
+ }
78
+ })
79
+ const username = await getUsername()
80
+ equal(username, null)
81
+ })
82
+
83
+ test('getUsername - no username found', async () => {
84
+ const { getUsername } = await esmock.strict('../../src/utils.mjs', {
85
+ execa: {
86
+ execa: (command) => {
87
+ return ''
88
+ }
89
+ }
90
+ })
91
+ const username = await getUsername()
92
+ equal(username, null)
93
+ })
94
+
95
+ test('randomBetween', async () => {
96
+ const min = 1
97
+ const max = 10
98
+ const random = randomBetween(min, max)
99
+ equal(random >= min && random <= max, true)
100
+ })
101
+
102
+ test('sleep', async () => {
103
+ const start = Date.now()
104
+ await sleep(100)
105
+ const end = Date.now()
106
+ // We cannot assert the exact drift because timers
107
+ // are imprecise
108
+ equal(end - start >= 90, true)
109
+ })
110
+
111
+ test('getDependencyVersion', async () => {
112
+ const fastifyVersion = await getDependencyVersion('fastify')
113
+ // We cannot assert the exact version because it changes
114
+ equal(semver.valid(fastifyVersion), fastifyVersion)
115
+ equal(semver.gt(fastifyVersion, '4.10.0'), true)
116
+
117
+ const typescriptVersion = await getDependencyVersion('typescript')
118
+ // We cannot assert the exact version because it changes
119
+ equal(semver.valid(typescriptVersion), typescriptVersion)
120
+ equal(semver.gt(typescriptVersion, '5.0.0'), true)
121
+
122
+ const platformaticConfig = await getDependencyVersion('@platformatic/config')
123
+ // We cannot assert the exact version because it changes
124
+ equal(semver.valid(platformaticConfig), platformaticConfig)
125
+ equal(semver.gt(platformaticConfig, '1.0.0'), true)
126
+
127
+ const typesVersion = await getDependencyVersion('@types/node')
128
+ // We cannot assert the exact version because it changes
129
+ equal(semver.valid(typesVersion), typesVersion)
130
+ equal(semver.gt(typesVersion, '20.0.0'), true)
131
+
132
+ const unkownVersion = await getDependencyVersion('@types/npm')
133
+ equal(unkownVersion, undefined)
134
+ })
135
+
136
+ test('findDBConfigFile', async () => {
137
+ const tmpDir1 = await mkdtemp(join(tmpdir(), 'test-create-platformatic-'))
138
+ const tmpDir2 = await mkdtemp(join(tmpdir(), 'test-create-platformatic-'))
139
+ const config = join(tmpDir1, 'platformatic.db.yml')
140
+ await writeFile(config, 'TEST')
141
+ equal(await findDBConfigFile(tmpDir1), 'platformatic.db.yml')
142
+ equal(await findDBConfigFile(tmpDir2), undefined)
143
+ await rm(tmpDir1, { recursive: true, force: true })
144
+ await rm(tmpDir2, { recursive: true, force: true })
145
+ })
146
+
147
+ test('findServiceConfigFile', async () => {
148
+ const tmpDir1 = await mkdtemp(join(tmpdir(), 'test-create-platformatic-'))
149
+ const tmpDir2 = await mkdtemp(join(tmpdir(), 'test-create-platformatic-'))
150
+ const config = join(tmpDir1, 'platformatic.service.toml')
151
+ await writeFile(config, 'TEST')
152
+ equal(await findServiceConfigFile(tmpDir1), 'platformatic.service.toml')
153
+ equal(await findServiceConfigFile(tmpDir2), undefined)
154
+ await rm(tmpDir1, { recursive: true, force: true })
155
+ await rm(tmpDir2, { recursive: true, force: true })
156
+ })
157
+
158
+ test('findComposerConfigFile', async () => {
159
+ const tmpDir1 = await mkdtemp(join(tmpdir(), 'test-create-platformatic-'))
160
+ const tmpDir2 = await mkdtemp(join(tmpdir(), 'test-create-platformatic-'))
161
+ const config = join(tmpDir1, 'platformatic.composer.yml')
162
+ await writeFile(config, 'TEST')
163
+ equal(await findComposerConfigFile(tmpDir1), 'platformatic.composer.yml')
164
+ equal(await findComposerConfigFile(tmpDir2), undefined)
165
+ await rm(tmpDir1, { recursive: true, force: true })
166
+ await rm(tmpDir2, { recursive: true, force: true })
167
+ })
168
+
169
+ test('findRuntimeConfigFile', async () => {
170
+ const tmpDir1 = await mkdtemp(join(tmpdir(), 'test-create-platformatic-'))
171
+ const tmpDir2 = await mkdtemp(join(tmpdir(), 'test-create-platformatic-'))
172
+ const config = join(tmpDir1, 'platformatic.runtime.yml')
173
+ await writeFile(config, 'TEST')
174
+ equal(await findRuntimeConfigFile(tmpDir1), 'platformatic.runtime.yml')
175
+ equal(await findRuntimeConfigFile(tmpDir2), undefined)
176
+ await rm(tmpDir1, { recursive: true, force: true })
177
+ await rm(tmpDir2, { recursive: true, force: true })
178
+ })
179
+
180
+ test('isFileAccessible', async () => {
181
+ const tmpDir1 = await mkdtemp(join(tmpdir(), 'test-create-platformatic-'))
182
+ const config = join(tmpDir1, 'platformatic.db.yml')
183
+ await writeFile(config, 'TEST')
184
+ equal(await isFileAccessible(config), true)
185
+ const config2 = join(tmpDir1, 'platformatic2.db.yml')
186
+ equal(await isFileAccessible(config2), false)
187
+ await rm(tmpDir1, { recursive: true, force: true })
188
+ })
189
+
190
+ test('minimumSupportedNodeVersions', async () => {
191
+ equal(Array.isArray(minimumSupportedNodeVersions), true)
192
+ notEqual(minimumSupportedNodeVersions.length, 0)
193
+ })
194
+
195
+ test('isCurrentVersionSupported', async () => {
196
+ const { major, minor, patch } = semver.minVersion(minimumSupportedNodeVersions[0])
197
+ {
198
+ // major - 1 not supported
199
+ const nodeVersion = `${major - 1}.${minor}.${patch}`
200
+ const supported = isCurrentVersionSupported(nodeVersion)
201
+ equal(supported, false)
202
+ }
203
+ {
204
+ // minor - 1 not supported
205
+ const nodeVersion = `${major}.${minor - 1}.${patch}`
206
+ const supported = isCurrentVersionSupported(nodeVersion)
207
+ equal(supported, false)
208
+ }
209
+ {
210
+ // v16 more than minimum is supported
211
+ const supported = isCurrentVersionSupported(`${major}.${minor + 2}.${patch}`)
212
+ equal(supported, true)
213
+ }
214
+
215
+ // node version 20 test, to check greater and lesser major version
216
+ {
217
+ // v18.0.0 is not supported
218
+ const nodeVersion = '18.0.0'
219
+ const supported = isCurrentVersionSupported(nodeVersion)
220
+ equal(supported, false)
221
+ }
222
+ {
223
+ // v18.8.0 is supported
224
+ const nodeVersion = '18.8.0'
225
+ const supported = isCurrentVersionSupported(nodeVersion)
226
+ equal(supported, true)
227
+ }
228
+ {
229
+ // v20.5.1 is not supported
230
+ const supported = isCurrentVersionSupported('20.5.1')
231
+ equal(supported, false)
232
+ }
233
+ {
234
+ // v20.6.0 is supported
235
+ const nodeVersion = '20.6.0'
236
+ const supported = isCurrentVersionSupported(nodeVersion)
237
+ equal(supported, true)
238
+ }
239
+ {
240
+ // v19.0.0 is not supported
241
+ const supported = isCurrentVersionSupported('19.0.0')
242
+ equal(supported, false)
243
+ }
244
+ {
245
+ // v19.9.0 is not supported
246
+ const supported = isCurrentVersionSupported('19.9.0')
247
+ equal(supported, false)
248
+ }
249
+ for (const version of minimumSupportedNodeVersions) {
250
+ const supported = isCurrentVersionSupported(version)
251
+ equal(supported, true)
252
+ }
253
+ })
254
+
255
+ test('should convert service name to env prefix', async () => {
256
+ const expectations = {
257
+ 'my-service': 'MY_SERVICE',
258
+ a: 'A',
259
+ MY_SERVICE: 'MY_SERVICE',
260
+ asderas123: 'ASDERAS123'
261
+ }
262
+
263
+ Object.entries(expectations).forEach((exp) => {
264
+ const converted = convertServiceNameToPrefix(exp[0])
265
+ equal(exp[1], converted)
266
+ })
267
+ })
268
+
269
+ test('should add prefix to a key/value object', async () => {
270
+ const prefix = 'MY_PREFIX'
271
+ const env = {
272
+ PLT_HOSTNAME: 'myhost',
273
+ PORT: '3042'
274
+ }
275
+ deepEqual(addPrefixToEnv(env, prefix), {
276
+ MY_PREFIX_PLT_HOSTNAME: 'myhost',
277
+ MY_PREFIX_PORT: '3042'
278
+ })
279
+ })
280
+
281
+ test('safeMkdir should not throw if dir already exists', async () => {
282
+ const tempDirectory = join(tmpdir(), 'safeMkdirTest')
283
+ test.after(async () => {
284
+ await rm(tempDirectory, { recursive: true })
285
+ })
286
+ await mkdir(tempDirectory)
287
+
288
+ doesNotThrow(async () => {
289
+ await safeMkdir(tempDirectory)
290
+ })
291
+ })
package/help/db.txt DELETED
@@ -1,11 +0,0 @@
1
- Welcome to Platformatic DB Creator.
2
-
3
- Available options are:
4
- * --help - Display this message
5
- * -h, --hostname <hostname>`: The hostname where Platformatic DB server will listen for connections.
6
- * -p, --port <port>`: The port where Platformatic DB server will listen for connections.
7
- * -db, --database <database_name>`: The name of the database to use. Default: `sqlite`.
8
- * -m, --migrations <path>`: Relative path to the migrations folder. Default: `./migrations`.
9
- * -t, --types <boolean>`: Set true to enable type autogeneration. Default: `true`.
10
- * -ts, --typescript <boolean>`: Set true to enable TypeScript plugins. Default: `false`.
11
-
package/help/help.txt DELETED
@@ -1,8 +0,0 @@
1
- Welcome to Platformatic DB Creator.
2
-
3
- Available commands are:
4
- * db
5
- * service
6
-
7
- Available options are:
8
- * --help - Display this message
package/help/service.txt DELETED
@@ -1,7 +0,0 @@
1
- Welcome to Platformatic Service Creator.
2
-
3
- Available options are:
4
- * --help - Display this message
5
- * -h, --hostname <hostname>`: The hostname where Platformatic DB server will listen for connections.
6
- * -p, --port <port>`: The port where Platformatic DB server will listen for connections.
7
-