@cedarjs/cli 7.0.0 → 8.0.0-canary.3263
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.
- package/dist/commands/build/buildHandler.js +2 -1
- package/dist/commands/build.js +1 -1
- package/dist/commands/check.js +2 -1
- package/dist/commands/deploy/baremetal/baremetalHandler.js +1 -1
- package/dist/commands/deploy/baremetal.js +1 -1
- package/dist/commands/deploy/flightcontrolHandler.js +1 -1
- package/dist/commands/deploy/helpers/deployHandler.js +1 -1
- package/dist/commands/deploy/netlify.js +1 -1
- package/dist/commands/deploy/renderHandler.js +1 -1
- package/dist/commands/deploy/serverlessHandler.js +2 -1
- package/dist/commands/deploy/vercel.js +1 -1
- package/dist/commands/destroy/handlerHelpers.js +1 -1
- package/dist/commands/destroy/page/pageHandler.js +2 -1
- package/dist/commands/destroy/scaffold/scaffoldHandler.js +2 -1
- package/dist/commands/destroy/sdl/sdlHandler.js +2 -1
- package/dist/commands/dev/devHandler.js +3 -4
- package/dist/commands/dev/packageWatchCommands.js +8 -3
- package/dist/commands/dev.js +1 -1
- package/dist/commands/execHandler.js +2 -1
- package/dist/commands/experimental/live-queries/liveQueries.js +1 -1
- package/dist/commands/experimental/live-queries/liveQueriesHandler.js +3 -3
- package/dist/commands/experimental/setupInngest.js +1 -1
- package/dist/commands/experimental/setupInngestHandler.js +1 -1
- package/dist/commands/experimental/setupOpentelemetry.js +1 -1
- package/dist/commands/experimental/setupOpentelemetryHandler.js +2 -1
- package/dist/commands/experimental/setupReactCompiler.js +1 -1
- package/dist/commands/experimental/setupReactCompilerHandler.js +4 -4
- package/dist/commands/experimental/setupRsc.js +1 -1
- package/dist/commands/experimental/setupRscHandler.js +2 -1
- package/dist/commands/experimental/setupStreamingSsr.js +1 -1
- package/dist/commands/experimental/setupStreamingSsrHandler.js +3 -2
- package/dist/commands/generate/cell/cell.js +20 -0
- package/dist/commands/generate/cell/cellHandler.js +68 -20
- package/dist/commands/generate/cell/templates/cell.tsx.template +21 -2
- package/dist/commands/generate/cell/templates/cellFragment.tsx.template +43 -0
- package/dist/commands/generate/cell/templates/cellList.tsx.template +21 -2
- package/dist/commands/generate/cell/templates/storiesFragment.tsx.template +23 -0
- package/dist/commands/generate/cell/templates/test.js.template +1 -1
- package/dist/commands/generate/cell/templates/testFragment.js.template +30 -0
- package/dist/commands/generate/dataMigration/dataMigration.js +2 -1
- package/dist/commands/generate/dbAuth/dbAuthHandler.js +23 -3
- package/dist/commands/generate/dbAuth/templates/login.oauth.tsx.template +164 -0
- package/dist/commands/generate/dbAuth/templates/signup.oauth.tsx.template +147 -0
- package/dist/commands/generate/directive/directiveHandler.js +2 -1
- package/dist/commands/generate/function/functionHandler.js +2 -1
- package/dist/commands/generate/job/jobHandler.js +2 -1
- package/dist/commands/generate/model/modelHandler.js +2 -1
- package/dist/commands/generate/ogImage/ogImageHandler.js +2 -1
- package/dist/commands/generate/package/filesTask.js +9 -12
- package/dist/commands/generate/package/packageHandler.js +3 -4
- package/dist/commands/generate/page/pageHandler.js +2 -1
- package/dist/commands/generate/realtime/realtime.js +1 -1
- package/dist/commands/generate/realtime/realtimeHandler.js +2 -9
- package/dist/commands/generate/realtime/templates/subscriptions/blank/blank.ts.template +1 -1
- package/dist/commands/generate/scaffold/scaffoldHandler.js +10 -5
- package/dist/commands/generate/scaffold/templates/components/NameForm.tsx.template +3 -3
- package/dist/commands/generate/scaffold/templates/lib/formatters.test.tsx.template +11 -0
- package/dist/commands/generate/scaffold/templates/lib/formatters.tsx.template +13 -1
- package/dist/commands/generate/script/scriptHandler.js +2 -1
- package/dist/commands/generate/sdl/sdlHandler.js +2 -1
- package/dist/commands/generate/secret/secret.js +1 -1
- package/dist/commands/generate/service/serviceHandler.js +47 -38
- package/dist/commands/generate/service/templates/service.ts.template +22 -8
- package/dist/commands/generate/service/templates/test.ts.template +1 -1
- package/dist/commands/generate/yargsCommandHelpers.js +1 -1
- package/dist/commands/generate/yargsHandlerHelpers.js +2 -1
- package/dist/commands/generate.js +1 -1
- package/dist/commands/info.js +1 -1
- package/dist/commands/lint.js +1 -1
- package/dist/commands/prerenderHandler.js +11 -4
- package/dist/commands/prismaHandler.js +7 -2
- package/dist/commands/record/init.js +1 -1
- package/dist/commands/serve.js +2 -1
- package/dist/commands/setup/auth/auth.js +2 -4
- package/dist/commands/setup/cache/cache.js +1 -1
- package/dist/commands/setup/cache/cacheHandler.js +2 -1
- package/dist/commands/setup/database/postgres.js +1 -1
- package/dist/commands/setup/database/postgresHandler.js +3 -1
- package/dist/commands/setup/deploy/providers/baremetalHandler.js +2 -1
- package/dist/commands/setup/deploy/providers/coherence.js +1 -1
- package/dist/commands/setup/deploy/providers/coherenceHandler.js +7 -6
- package/dist/commands/setup/deploy/providers/flightcontrolHandler.js +2 -1
- package/dist/commands/setup/deploy/providers/netlifyHandler.js +2 -1
- package/dist/commands/setup/deploy/providers/renderHandler.js +2 -1
- package/dist/commands/setup/deploy/providers/serverlessHandler.js +2 -1
- package/dist/commands/setup/deploy/providers/universalDeployHandler.js +4 -6
- package/dist/commands/setup/deploy/providers/vercelHandler.js +2 -1
- package/dist/commands/setup/docker/docker.js +1 -1
- package/dist/commands/setup/docker/dockerHandler.js +2 -1
- package/dist/commands/setup/generator/generator.js +1 -1
- package/dist/commands/setup/generator/generatorHandler.js +1 -1
- package/dist/commands/setup/graphql/features/fragments/fragments.js +1 -1
- package/dist/commands/setup/graphql/features/fragments/fragmentsHandler.js +3 -5
- package/dist/commands/setup/graphql/features/trustedDocuments/trustedDocuments.js +1 -1
- package/dist/commands/setup/graphql/features/trustedDocuments/trustedDocumentsHandler.js +2 -1
- package/dist/commands/setup/i18n/i18n.js +1 -1
- package/dist/commands/setup/i18n/i18nHandler.js +1 -1
- package/dist/commands/setup/jobs/jobs.js +1 -1
- package/dist/commands/setup/jobs/jobsHandler.js +2 -1
- package/dist/commands/setup/mailer/mailer.js +1 -1
- package/dist/commands/setup/mailer/mailerHandler.js +2 -1
- package/dist/commands/setup/middleware/ogImage/ogImage.js +1 -1
- package/dist/commands/setup/middleware/ogImage/ogImageHandler.js +2 -1
- package/dist/commands/setup/monitoring/sentry/sentry.js +1 -1
- package/dist/commands/setup/monitoring/sentry/sentryHandler.js +8 -7
- package/dist/commands/setup/neon/neon.js +1 -1
- package/dist/commands/setup/neon/neonHandler.js +5 -9
- package/dist/commands/setup/package/package.js +1 -1
- package/dist/commands/setup/package/packageHandler.js +4 -4
- package/dist/commands/setup/realtime/addRealtimeToGraphql.js +1 -1
- package/dist/commands/setup/realtime/realtime.js +1 -1
- package/dist/commands/setup/realtime/realtimeHandler.js +4 -16
- package/dist/commands/setup/realtime/templates/subscriptions/countdown/countdown.ts.template +1 -1
- package/dist/commands/setup/realtime/templates/subscriptions/newMessage/newMessage.ts.template +1 -1
- package/dist/commands/setup/server-file/serverFile.js +1 -1
- package/dist/commands/setup/server-file/serverFileHandler.js +2 -1
- package/dist/commands/setup/tenancy/authCodemod.js +66 -0
- package/dist/commands/setup/tenancy/dbCodemod.js +64 -0
- package/dist/commands/setup/tenancy/graphqlCodemod.js +88 -0
- package/dist/commands/setup/tenancy/preflight.js +49 -0
- package/dist/commands/setup/tenancy/schemaPrisma.js +81 -0
- package/dist/commands/setup/tenancy/signupCodemod.js +153 -0
- package/dist/commands/setup/tenancy/templates/InvitePage.tsx.template +63 -0
- package/dist/commands/setup/tenancy/templates/OrgScope.tsx.template +40 -0
- package/dist/commands/setup/tenancy/templates/ensureDefaultOrganizations.dataMigration.ts.template +39 -0
- package/dist/commands/setup/tenancy/templates/organizations.scenarios.ts.template +59 -0
- package/dist/commands/setup/tenancy/templates/organizations.sdl.ts.template +89 -0
- package/dist/commands/setup/tenancy/templates/organizations.test.ts.template +389 -0
- package/dist/commands/setup/tenancy/templates/organizations.ts.template +394 -0
- package/dist/commands/setup/tenancy/templates/requireMembership.test.ts.template +35 -0
- package/dist/commands/setup/tenancy/templates/requireMembership.ts.template +25 -0
- package/dist/commands/setup/tenancy/tenancy.js +30 -0
- package/dist/commands/setup/tenancy/tenancyHandler.js +425 -0
- package/dist/commands/setup/ui/libraries/chakra-uiHandler.js +2 -1
- package/dist/commands/setup/ui/libraries/mantineHandler.js +2 -1
- package/dist/commands/setup/ui/libraries/tailwindcssHandler.js +2 -1
- package/dist/commands/setup/uploads/schemaPrisma.js +41 -0
- package/dist/commands/setup/uploads/serverFile.js +151 -0
- package/dist/commands/setup/uploads/templates/requireUploadToken.ts.template +15 -0
- package/dist/commands/setup/uploads/templates/srcLibUploads.ts.template +23 -24
- package/dist/commands/setup/uploads/templates/uploads.sdl.ts.template +79 -0
- package/dist/commands/setup/uploads/templates/uploads.ts.template +89 -0
- package/dist/commands/setup/uploads/templates/withDataUri.ts.template +14 -0
- package/dist/commands/setup/uploads/templates/withSignedUrl.ts.template +16 -0
- package/dist/commands/setup/uploads/uploads.js +49 -7
- package/dist/commands/setup/uploads/uploadsHandler.js +256 -69
- package/dist/commands/setup.js +2 -1
- package/dist/commands/studio.js +1 -1
- package/dist/commands/test/testHandler.js +25 -71
- package/dist/commands/test/viteVersionCheck.js +75 -0
- package/dist/commands/test.js +10 -18
- package/dist/commands/type-checkHandler.js +1 -1
- package/dist/commands/upgrade/preUpgradeScripts.js +3 -3
- package/dist/commands/upgrade/upgrade.js +1 -1
- package/dist/commands/upgrade/upgradeHandler.js +2 -1
- package/dist/index.js +5 -8
- package/dist/lib/exit.js +1 -1
- package/dist/lib/index.js +6 -25
- package/dist/lib/loadEnvFiles.js +1 -1
- package/dist/lib/plugin.js +1 -1
- package/dist/lib/test.js +1 -1
- package/dist/lib/updateCheck.js +4 -4
- package/dist/middleware/checkNodeVersion.js +4 -4
- package/package.json +18 -18
- package/dist/commands/setup/uploads/dbCodemod.js +0 -28
- package/dist/commands/setup/uploads/templates/signedUrl.ts.template +0 -21
- package/dist/commands/test/testHandlerEsm.js +0 -109
- package/dist/commands/testEsm.js +0 -41
|
@@ -1,25 +1,24 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
__PATH_IMPORT____S3_IMPORTS__import {
|
|
2
|
+
__FS_IMPORT__
|
|
3
|
+
__DB_IMPORT__
|
|
4
|
+
__DB_MAX_IMPORT__
|
|
5
|
+
defineStorageTargets,
|
|
6
|
+
defineUploadProfiles,
|
|
7
|
+
} from '@cedarjs/uploads'
|
|
8
|
+
__GET_PATHS_IMPORT__
|
|
9
|
+
__S3_CLIENT__
|
|
10
|
+
/**
|
|
11
|
+
* Where files live. Each target is a provider instance; the Upload row
|
|
12
|
+
* records which target holds a file so it can be read, served, and deleted
|
|
13
|
+
* later. Look one up by name with `resolveTarget(targets, upload.target)`.
|
|
14
|
+
*/
|
|
15
|
+
export const targets = defineStorageTargets({
|
|
16
|
+
__TARGETS__})
|
|
4
17
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
export const
|
|
11
|
-
|
|
12
|
-
})
|
|
13
|
-
|
|
14
|
-
export const urlSigner = new UrlSigner({
|
|
15
|
-
secret: process.env.UPLOADS_SECRET,
|
|
16
|
-
endpoint: '/signedUrl',
|
|
17
|
-
})
|
|
18
|
-
|
|
19
|
-
const { saveFiles, storagePrismaExtension } = setupStorage({
|
|
20
|
-
uploadsConfig,
|
|
21
|
-
storageAdapter: fsStorage,
|
|
22
|
-
urlSigner,
|
|
23
|
-
})
|
|
24
|
-
|
|
25
|
-
export { saveFiles, storagePrismaExtension }
|
|
18
|
+
/**
|
|
19
|
+
* What clients may upload. A profile names a target and the constraints the
|
|
20
|
+
* server signs into every upload token issued for it. The client never
|
|
21
|
+
* supplies constraints; it names a profile.
|
|
22
|
+
*/
|
|
23
|
+
export const profiles = defineUploadProfiles({
|
|
24
|
+
__PROFILES__})
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
export const schema = gql`
|
|
2
|
+
type Upload {
|
|
3
|
+
id: String!
|
|
4
|
+
target: String!
|
|
5
|
+
status: String!
|
|
6
|
+
filename: String!
|
|
7
|
+
mimeType: String!
|
|
8
|
+
size: BigInt!
|
|
9
|
+
storageKey: String
|
|
10
|
+
userId: String
|
|
11
|
+
organizationId: String
|
|
12
|
+
createdAt: DateTime!
|
|
13
|
+
updatedAt: DateTime!
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
type UploadToken {
|
|
17
|
+
token: String!
|
|
18
|
+
"""
|
|
19
|
+
The profile's constraints, echoed for client-side UX (file-picker
|
|
20
|
+
filters, pre-upload validation). The authoritative copy is inside the
|
|
21
|
+
signed token.
|
|
22
|
+
"""
|
|
23
|
+
allowedMimeTypes: [String!]!
|
|
24
|
+
maxFileSize: BigInt!
|
|
25
|
+
maxFiles: Int!
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
type PresignedUploadUrl {
|
|
29
|
+
uploadId: String!
|
|
30
|
+
url: String!
|
|
31
|
+
method: String!
|
|
32
|
+
headers: JSON!
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
input CreatePresignedUploadUrlInput {
|
|
36
|
+
filename: String!
|
|
37
|
+
contentType: String!
|
|
38
|
+
size: BigInt!
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
input UploadFileInput {
|
|
42
|
+
filename: String!
|
|
43
|
+
mimeType: String!
|
|
44
|
+
"""
|
|
45
|
+
The file's bytes, base64-encoded. Only for profiles whose target stores
|
|
46
|
+
files inline in the database.
|
|
47
|
+
"""
|
|
48
|
+
data: String!
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
type Query {
|
|
52
|
+
"""
|
|
53
|
+
Issues an upload token for a server-defined profile. The profile name
|
|
54
|
+
must match a key of \`profiles\` in api/src/lib/uploads.
|
|
55
|
+
"""
|
|
56
|
+
requestUploadToken(profile: String!): UploadToken! @requireAuth
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
type Mutation {
|
|
60
|
+
"""
|
|
61
|
+
Direct-to-storage uploads: returns a presigned URL for one file. Send the
|
|
62
|
+
upload token in the x-upload-token header.
|
|
63
|
+
"""
|
|
64
|
+
createPresignedUploadUrl(
|
|
65
|
+
input: CreatePresignedUploadUrlInput!
|
|
66
|
+
): PresignedUploadUrl! @requireAuth @requireUploadToken
|
|
67
|
+
|
|
68
|
+
"""
|
|
69
|
+
Confirms a direct-to-storage upload once the client has PUT the bytes.
|
|
70
|
+
"""
|
|
71
|
+
confirmUpload(uploadId: String!): Upload! @requireAuth
|
|
72
|
+
|
|
73
|
+
"""
|
|
74
|
+
Stores a small file sent as base64, for profiles whose target keeps files
|
|
75
|
+
inline in the database.
|
|
76
|
+
"""
|
|
77
|
+
uploadFile(profile: String!, input: UploadFileInput!): Upload! @requireAuth
|
|
78
|
+
}
|
|
79
|
+
`
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import {
|
|
2
|
+
confirmUpload as confirmUploadRecord,
|
|
3
|
+
createPresignedUpload,
|
|
4
|
+
getUploadTokenPayload,
|
|
5
|
+
isMimeTypeAllowed,
|
|
6
|
+
issueUploadToken,
|
|
7
|
+
resolveProfile,
|
|
8
|
+
resolveTarget,
|
|
9
|
+
storeFile,
|
|
10
|
+
UploadError,
|
|
11
|
+
} from '@cedarjs/uploads'
|
|
12
|
+
|
|
13
|
+
import { db } from 'src/lib/db'
|
|
14
|
+
import { profiles, targets } from 'src/lib/uploads'
|
|
15
|
+
|
|
16
|
+
const secret = () => {
|
|
17
|
+
if (!process.env.UPLOAD_TOKEN_SECRET) {
|
|
18
|
+
throw new Error(
|
|
19
|
+
'UPLOAD_TOKEN_SECRET is not set. Generate one with `yarn cedar generate secret` and add it to .env.',
|
|
20
|
+
)
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
return process.env.UPLOAD_TOKEN_SECRET
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export const requestUploadToken = ({ profile }: { profile: string }) => {
|
|
27
|
+
return issueUploadToken({
|
|
28
|
+
profiles,
|
|
29
|
+
profile,
|
|
30
|
+
secret: secret(),
|
|
31
|
+
currentUser: context.currentUser,
|
|
32
|
+
})
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export const createPresignedUploadUrl = ({
|
|
36
|
+
input,
|
|
37
|
+
}: {
|
|
38
|
+
input: { filename: string; contentType: string; size: bigint | number }
|
|
39
|
+
}) => {
|
|
40
|
+
return createPresignedUpload({
|
|
41
|
+
db,
|
|
42
|
+
targets,
|
|
43
|
+
tokenPayload: getUploadTokenPayload(context),
|
|
44
|
+
input,
|
|
45
|
+
})
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export const confirmUpload = ({ uploadId }: { uploadId: string }) => {
|
|
49
|
+
return confirmUploadRecord({
|
|
50
|
+
db,
|
|
51
|
+
targets,
|
|
52
|
+
uploadId,
|
|
53
|
+
currentUser: context.currentUser,
|
|
54
|
+
})
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export const uploadFile = async ({
|
|
58
|
+
profile: profileName,
|
|
59
|
+
input,
|
|
60
|
+
}: {
|
|
61
|
+
profile: string
|
|
62
|
+
input: { filename: string; mimeType: string; data: string }
|
|
63
|
+
}) => {
|
|
64
|
+
const profile = resolveProfile(profiles, profileName)
|
|
65
|
+
const target = resolveTarget(targets, profile.target)
|
|
66
|
+
|
|
67
|
+
if (target.providerType !== 'db') {
|
|
68
|
+
throw new UploadError(
|
|
69
|
+
'NOT_SUPPORTED',
|
|
70
|
+
`Upload profile '${profile.name}' does not store files in the database. Use an upload token instead.`,
|
|
71
|
+
)
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
if (!isMimeTypeAllowed(profile.allowedMimeTypes, input.mimeType)) {
|
|
75
|
+
throw new UploadError(
|
|
76
|
+
'MIME_TYPE_NOT_ALLOWED',
|
|
77
|
+
`File type '${input.mimeType}' is not allowed for upload profile '${profile.name}'.`,
|
|
78
|
+
)
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
return storeFile(target, {
|
|
82
|
+
db,
|
|
83
|
+
filename: input.filename,
|
|
84
|
+
mimeType: input.mimeType,
|
|
85
|
+
data: Buffer.from(input.data, 'base64'),
|
|
86
|
+
maxSize: profile.maxFileSize,
|
|
87
|
+
userId: context.currentUser ? String(context.currentUser.id) : undefined,
|
|
88
|
+
})
|
|
89
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { createWithDataUriDirective } from '@cedarjs/uploads'
|
|
2
|
+
|
|
3
|
+
import { db } from 'src/lib/db'
|
|
4
|
+
import { targets } from 'src/lib/uploads'
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Resolves a field holding an Upload id to a base64 data: URI of the file.
|
|
8
|
+
* Every resolved field embeds the whole file, so use it for small files only.
|
|
9
|
+
*/
|
|
10
|
+
const withDataUri = createWithDataUriDirective({ db, targets })
|
|
11
|
+
|
|
12
|
+
export const schema = withDataUri.schema
|
|
13
|
+
|
|
14
|
+
export default withDataUri
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { createWithSignedUrlDirective } from '@cedarjs/uploads'
|
|
2
|
+
|
|
3
|
+
import { db } from 'src/lib/db'
|
|
4
|
+
import { targets } from 'src/lib/uploads'
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Resolves a field holding an Upload id to a time-limited URL for the file,
|
|
8
|
+
* from whichever storage target holds it. Files download by default; pass
|
|
9
|
+
* `disposition: 'inline'` to render them in the browser instead, and only
|
|
10
|
+
* for MIME types you trust.
|
|
11
|
+
*/
|
|
12
|
+
const withSignedUrl = createWithSignedUrlDirective({ db, targets })
|
|
13
|
+
|
|
14
|
+
export const schema = withSignedUrl.schema
|
|
15
|
+
|
|
16
|
+
export default withSignedUrl
|
|
@@ -1,26 +1,68 @@
|
|
|
1
|
-
import
|
|
1
|
+
import prompts from "prompts";
|
|
2
|
+
import { recordTelemetryAttributes } from "@cedarjs/cli-helpers/telemetry";
|
|
3
|
+
import { requireTTYOrExit } from "@cedarjs/cli-helpers/tty";
|
|
2
4
|
const command = "uploads";
|
|
3
|
-
const description = "
|
|
5
|
+
const description = "Set up file uploads and storage: storage targets, upload profiles, the upload routes, and the GraphQL API";
|
|
6
|
+
const TARGET_CHOICES = ["fs", "db", "s3"];
|
|
7
|
+
const TARGET_DESCRIPTIONS = {
|
|
8
|
+
fs: "Local filesystem, uploaded through the api server (development, single-server deploys)",
|
|
9
|
+
db: "Inline in the database, for small files like avatars and thumbnails",
|
|
10
|
+
s3: "S3 or S3-compatible storage, uploaded straight from the browser with presigned URLs"
|
|
11
|
+
};
|
|
4
12
|
const builder = (yargs) => {
|
|
5
|
-
yargs.option("
|
|
13
|
+
return yargs.option("targets", {
|
|
14
|
+
choices: TARGET_CHOICES,
|
|
15
|
+
description: "Storage targets to configure: fs (local filesystem), db (inline in the database), s3 (direct-to-S3 presigned uploads). Prompts when omitted.",
|
|
16
|
+
type: "array"
|
|
17
|
+
}).option("force", {
|
|
6
18
|
alias: "f",
|
|
7
19
|
default: false,
|
|
8
20
|
description: "Overwrite existing configuration",
|
|
9
21
|
type: "boolean"
|
|
10
22
|
});
|
|
11
23
|
};
|
|
24
|
+
function toTargetChoices(values) {
|
|
25
|
+
const choices = TARGET_CHOICES;
|
|
26
|
+
return [...new Set(values)].filter(
|
|
27
|
+
(t) => choices.includes(t)
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
async function promptForTargets() {
|
|
31
|
+
requireTTYOrExit("--targets");
|
|
32
|
+
const response = await prompts({
|
|
33
|
+
type: "multiselect",
|
|
34
|
+
name: "targets",
|
|
35
|
+
message: "Which storage targets do you want to configure?",
|
|
36
|
+
instructions: false,
|
|
37
|
+
hint: "Space to toggle, enter to confirm",
|
|
38
|
+
min: 1,
|
|
39
|
+
choices: TARGET_CHOICES.map((value) => ({
|
|
40
|
+
title: value,
|
|
41
|
+
description: TARGET_DESCRIPTIONS[value],
|
|
42
|
+
value,
|
|
43
|
+
selected: value !== "s3"
|
|
44
|
+
}))
|
|
45
|
+
});
|
|
46
|
+
if (response.targets === void 0) {
|
|
47
|
+
process.exit(0);
|
|
48
|
+
}
|
|
49
|
+
return toTargetChoices(response.targets);
|
|
50
|
+
}
|
|
12
51
|
const handler = async (options) => {
|
|
52
|
+
const targets = options.targets?.length ? toTargetChoices(options.targets) : await promptForTargets();
|
|
13
53
|
recordTelemetryAttributes({
|
|
14
54
|
command: "setup uploads",
|
|
15
|
-
|
|
16
|
-
|
|
55
|
+
targets: targets.join(","),
|
|
56
|
+
force: options.force
|
|
17
57
|
});
|
|
18
58
|
const { handler: handler2 } = await import("./uploadsHandler.js");
|
|
19
|
-
return handler2(options);
|
|
59
|
+
return handler2({ targets, force: options.force });
|
|
20
60
|
};
|
|
21
61
|
export {
|
|
62
|
+
TARGET_CHOICES,
|
|
22
63
|
builder,
|
|
23
64
|
command,
|
|
24
65
|
description,
|
|
25
|
-
handler
|
|
66
|
+
handler,
|
|
67
|
+
toTargetChoices
|
|
26
68
|
};
|