@cedarjs/cli 7.0.1-next.467 → 7.1.0-rc.34
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 +1 -2
- package/dist/commands/build.js +1 -1
- package/dist/commands/check.js +1 -2
- package/dist/commands/deploy/baremetal/baremetalHandler.js +73 -364
- package/dist/commands/deploy/baremetal.js +1 -7
- 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 +1 -2
- package/dist/commands/deploy/vercel.js +1 -1
- package/dist/commands/destroy/handlerHelpers.js +1 -1
- package/dist/commands/destroy/page/pageHandler.js +1 -2
- package/dist/commands/destroy/scaffold/scaffoldHandler.js +26 -65
- package/dist/commands/destroy/sdl/sdlHandler.js +1 -2
- package/dist/commands/dev/devHandler.js +4 -3
- package/dist/commands/dev/packageWatchCommands.js +3 -8
- package/dist/commands/dev.js +1 -1
- package/dist/commands/execHandler.js +1 -2
- 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 +1 -2
- 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 +1 -2
- package/dist/commands/experimental/setupStreamingSsr.js +1 -1
- package/dist/commands/experimental/setupStreamingSsrHandler.js +2 -3
- package/dist/commands/generate/cell/cell.js +0 -20
- package/dist/commands/generate/cell/cellHandler.js +20 -68
- package/dist/commands/generate/cell/templates/cell.tsx.template +2 -21
- package/dist/commands/generate/cell/templates/cellList.tsx.template +2 -21
- package/dist/commands/generate/cell/templates/test.js.template +1 -1
- package/dist/commands/generate/dataMigration/dataMigration.js +1 -2
- package/dist/commands/generate/dbAuth/dbAuth.js +2 -6
- package/dist/commands/generate/dbAuth/dbAuthHandler.js +17 -80
- package/dist/commands/generate/dbAuth/templates/login.webAuthn.tsx.template +12 -20
- package/dist/commands/generate/directive/directiveHandler.js +1 -2
- package/dist/commands/generate/function/functionHandler.js +1 -2
- package/dist/commands/generate/helpers.js +0 -26
- package/dist/commands/generate/job/jobHandler.js +1 -2
- package/dist/commands/generate/model/modelHandler.js +1 -2
- package/dist/commands/generate/ogImage/ogImageHandler.js +1 -2
- package/dist/commands/generate/ogImage/templates/ogImage.og.tsx.template +1 -1
- package/dist/commands/generate/package/filesTask.js +12 -9
- package/dist/commands/generate/package/packageHandler.js +4 -3
- package/dist/commands/generate/package/templates/tsconfig.json.template +0 -1
- package/dist/commands/generate/page/pageHandler.js +1 -2
- package/dist/commands/generate/realtime/realtime.js +1 -1
- package/dist/commands/generate/realtime/realtimeHandler.js +9 -2
- package/dist/commands/generate/realtime/templates/liveQueries/blank/blank.service.ts.template +4 -12
- package/dist/commands/generate/realtime/templates/subscriptions/blank/blank.service.ts.template +2 -2
- package/dist/commands/generate/realtime/templates/subscriptions/blank/blank.ts.template +4 -4
- package/dist/commands/generate/scaffold/scaffold.js +1 -1
- package/dist/commands/generate/scaffold/scaffoldHandler.js +49 -93
- package/dist/commands/generate/scaffold/templates/assets/scaffold.tailwind.css.template +7 -12
- package/dist/commands/generate/scaffold/templates/components/EditNameCell.tsx.template +7 -5
- package/dist/commands/generate/scaffold/templates/components/NameForm.tsx.template +9 -10
- package/dist/commands/generate/scaffold/templates/lib/formatters.test.tsx.template +0 -11
- package/dist/commands/generate/scaffold/templates/lib/formatters.tsx.template +4 -16
- package/dist/commands/generate/script/scriptHandler.js +1 -2
- package/dist/commands/generate/script/templates/tsconfig.json.template +0 -1
- package/dist/commands/generate/sdl/sdlHandler.js +4 -10
- package/dist/commands/generate/secret/secret.js +1 -1
- package/dist/commands/generate/service/serviceHandler.js +49 -79
- package/dist/commands/generate/service/templates/service.ts.template +13 -40
- package/dist/commands/generate/service/templates/test.ts.template +6 -8
- package/dist/commands/generate/yargsCommandHelpers.js +1 -1
- package/dist/commands/generate/yargsHandlerHelpers.js +1 -2
- package/dist/commands/generate.js +1 -1
- package/dist/commands/info.js +1 -1
- package/dist/commands/jobsHandler.js +3 -5
- package/dist/commands/lint.js +1 -1
- package/dist/commands/prerenderHandler.js +4 -11
- package/dist/commands/prismaHandler.js +2 -7
- package/dist/commands/record/init.js +1 -1
- package/dist/commands/serve.js +1 -2
- package/dist/commands/setup/auth/auth.js +4 -2
- package/dist/commands/setup/cache/cache.js +1 -1
- package/dist/commands/setup/cache/cacheHandler.js +1 -2
- package/dist/commands/setup/cache/templates/memcached.ts.template +17 -14
- package/dist/commands/setup/cache/templates/redis.ts.template +20 -12
- package/dist/commands/setup/database/postgres.js +1 -1
- package/dist/commands/setup/database/postgresHandler.js +1 -3
- package/dist/commands/setup/deploy/providers/baremetal.js +0 -7
- package/dist/commands/setup/deploy/providers/baremetalHandler.js +21 -130
- package/dist/commands/setup/deploy/providers/coherence.js +1 -1
- package/dist/commands/setup/deploy/providers/coherenceHandler.js +6 -7
- package/dist/commands/setup/deploy/providers/flightcontrolHandler.js +1 -2
- package/dist/commands/setup/deploy/providers/netlifyHandler.js +1 -2
- package/dist/commands/setup/deploy/providers/renderHandler.js +1 -2
- package/dist/commands/setup/deploy/providers/serverlessHandler.js +1 -2
- package/dist/commands/setup/deploy/providers/universalDeployHandler.js +6 -4
- package/dist/commands/setup/deploy/providers/vercelHandler.js +1 -2
- package/dist/commands/setup/deploy/templates/baremetal.js +9 -119
- package/dist/commands/setup/deploy/templates/netlifyUD.js +0 -3
- package/dist/commands/setup/docker/docker.js +1 -1
- package/dist/commands/setup/docker/dockerHandler.js +1 -2
- 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 +5 -3
- package/dist/commands/setup/graphql/features/trustedDocuments/trustedDocuments.js +1 -1
- package/dist/commands/setup/graphql/features/trustedDocuments/trustedDocumentsHandler.js +1 -2
- 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 +1 -4
- package/dist/commands/setup/mailer/mailer.js +1 -1
- package/dist/commands/setup/mailer/mailerHandler.js +1 -2
- package/dist/commands/setup/middleware/ogImage/ogImage.js +1 -1
- package/dist/commands/setup/middleware/ogImage/ogImageHandler.js +1 -2
- package/dist/commands/setup/monitoring/sentry/sentry.js +1 -1
- package/dist/commands/setup/monitoring/sentry/sentryHandler.js +9 -13
- package/dist/commands/setup/monitoring/sentry/templates/sentryApi.ts.template +4 -1
- package/dist/commands/setup/monitoring/sentry/templates/sentryWeb.ts.template +4 -7
- package/dist/commands/setup/neon/neon.js +1 -1
- package/dist/commands/setup/neon/neonHandler.js +9 -5
- 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 +16 -4
- package/dist/commands/setup/realtime/templates/defer/fastAndSlowFields/fastAndSlowFields.ts.template +1 -4
- package/dist/commands/setup/realtime/templates/liveQueries/auctions/auctions.ts.template +4 -12
- package/dist/commands/setup/realtime/templates/subscriptions/countdown/countdown.ts.template +1 -1
- package/dist/commands/setup/realtime/templates/subscriptions/newMessage/newMessage.ts.template +2 -2
- package/dist/commands/setup/server-file/serverFile.js +1 -1
- package/dist/commands/setup/server-file/serverFileHandler.js +1 -2
- package/dist/commands/setup/ui/libraries/chakra-uiHandler.js +1 -2
- package/dist/commands/setup/ui/libraries/mantineHandler.js +1 -2
- package/dist/commands/setup/ui/libraries/tailwindcssHandler.js +82 -63
- package/dist/commands/setup/ui/templates/postcss.config.cjs.template +9 -0
- package/dist/commands/setup/uploads/dbCodemod.js +28 -0
- package/dist/commands/setup/uploads/templates/signedUrl.ts.template +21 -0
- package/dist/commands/setup/uploads/templates/srcLibUploads.ts.template +24 -23
- package/dist/commands/setup/uploads/uploads.js +7 -49
- package/dist/commands/setup/uploads/uploadsHandler.js +69 -277
- package/dist/commands/setup.js +1 -2
- package/dist/commands/studio.js +1 -1
- package/dist/commands/test/testHandler.js +71 -25
- package/dist/commands/test/testHandlerEsm.js +109 -0
- package/dist/commands/test.js +18 -10
- package/dist/commands/testEsm.js +41 -0
- 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 +1 -2
- package/dist/index.js +8 -5
- package/dist/lib/exit.js +1 -1
- package/dist/lib/index.js +31 -16
- 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 +27 -27
- package/dist/commands/deploy/baremetal/monitors.js +0 -66
- package/dist/commands/generate/cell/templates/cellFragment.tsx.template +0 -43
- package/dist/commands/generate/cell/templates/storiesFragment.tsx.template +0 -23
- package/dist/commands/generate/cell/templates/testFragment.js.template +0 -30
- package/dist/commands/generate/dbAuth/templates/changePassword.tsx.template +0 -131
- package/dist/commands/generate/dbAuth/templates/login.oauth.tsx.template +0 -164
- package/dist/commands/generate/dbAuth/templates/signup.oauth.tsx.template +0 -147
- package/dist/commands/generate/scaffold/templates/layouts/NamesScaffoldLayout.tsx.template +0 -18
- package/dist/commands/setup/tenancy/authCodemod.js +0 -66
- package/dist/commands/setup/tenancy/dbCodemod.js +0 -64
- package/dist/commands/setup/tenancy/graphqlCodemod.js +0 -88
- package/dist/commands/setup/tenancy/preflight.js +0 -49
- package/dist/commands/setup/tenancy/schemaPrisma.js +0 -81
- package/dist/commands/setup/tenancy/signupCodemod.js +0 -154
- package/dist/commands/setup/tenancy/templates/InvitePage.tsx.template +0 -72
- package/dist/commands/setup/tenancy/templates/OrgScope.tsx.template +0 -40
- package/dist/commands/setup/tenancy/templates/ensureDefaultOrganizations.dataMigration.ts.template +0 -39
- package/dist/commands/setup/tenancy/templates/organizations.scenarios.ts.template +0 -57
- package/dist/commands/setup/tenancy/templates/organizations.sdl.ts.template +0 -89
- package/dist/commands/setup/tenancy/templates/organizations.test.ts.template +0 -381
- package/dist/commands/setup/tenancy/templates/organizations.ts.template +0 -394
- package/dist/commands/setup/tenancy/templates/requireMembership.test.ts.template +0 -35
- package/dist/commands/setup/tenancy/templates/requireMembership.ts.template +0 -25
- package/dist/commands/setup/tenancy/tenancy.js +0 -30
- package/dist/commands/setup/tenancy/tenancyHandler.js +0 -425
- package/dist/commands/setup/uploads/gitignore.js +0 -17
- package/dist/commands/setup/uploads/schemaPrisma.js +0 -41
- package/dist/commands/setup/uploads/serverFile.js +0 -217
- package/dist/commands/setup/uploads/templates/requireUploadToken.ts.template +0 -15
- package/dist/commands/setup/uploads/templates/uploads.sdl.ts.template +0 -79
- package/dist/commands/setup/uploads/templates/uploads.ts.template +0 -98
- package/dist/commands/setup/uploads/templates/withDataUri.ts.template +0 -14
- package/dist/commands/setup/uploads/templates/withSignedUrl.ts.template +0 -16
- package/dist/commands/test/viteVersionCheck.js +0 -75
|
@@ -1,147 +0,0 @@
|
|
|
1
|
-
import { useEffect, useRef } from 'react'
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
Form,
|
|
5
|
-
Label,
|
|
6
|
-
TextField,
|
|
7
|
-
PasswordField,
|
|
8
|
-
FieldError,
|
|
9
|
-
Submit,
|
|
10
|
-
} from '@cedarjs/forms'
|
|
11
|
-
import { Link, navigate, routes } from '@cedarjs/router'
|
|
12
|
-
import { Metadata } from '@cedarjs/web'
|
|
13
|
-
import { toast, Toaster } from '@cedarjs/web/toast'
|
|
14
|
-
|
|
15
|
-
import { getOAuthUrl } from '@cedarjs/auth-dbauth-web/oauth'
|
|
16
|
-
|
|
17
|
-
import { useAuth } from 'src/auth'
|
|
18
|
-
|
|
19
|
-
const SignupPage = () => {
|
|
20
|
-
const { isAuthenticated, signUp } = useAuth()
|
|
21
|
-
|
|
22
|
-
useEffect(() => {
|
|
23
|
-
if (isAuthenticated) {
|
|
24
|
-
navigate(routes.home())
|
|
25
|
-
}
|
|
26
|
-
}, [isAuthenticated])
|
|
27
|
-
|
|
28
|
-
// focus on ${usernameLowerCase} box on page load
|
|
29
|
-
const ${usernameCamelCase}Ref = useRef<HTMLInputElement>(null)
|
|
30
|
-
useEffect(() => {
|
|
31
|
-
${usernameCamelCase}Ref.current?.focus()
|
|
32
|
-
}, [])
|
|
33
|
-
|
|
34
|
-
const onSubmit = async (data: Record<string, string>) => {
|
|
35
|
-
const response = await signUp({ username: data.${usernameCamelCase}, password: data.${passwordCamelCase} })
|
|
36
|
-
|
|
37
|
-
if (response.message) {
|
|
38
|
-
toast(response.message)
|
|
39
|
-
} else if (response.error) {
|
|
40
|
-
toast.error(response.error)
|
|
41
|
-
} else {
|
|
42
|
-
// user is signed in automatically
|
|
43
|
-
toast.success('Welcome!')
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
return (
|
|
48
|
-
<>
|
|
49
|
-
<Metadata title="Signup" />
|
|
50
|
-
|
|
51
|
-
<main className="rw-main">
|
|
52
|
-
<Toaster toastOptions={{ className: 'rw-toast', duration: 6000 }} />
|
|
53
|
-
<div className="rw-scaffold rw-login-container">
|
|
54
|
-
<div className="rw-segment">
|
|
55
|
-
<header className="rw-segment-header">
|
|
56
|
-
<h2 className="rw-heading rw-heading-secondary">Signup</h2>
|
|
57
|
-
</header>
|
|
58
|
-
|
|
59
|
-
<div className="rw-segment-main">
|
|
60
|
-
<div className="rw-form-wrapper">
|
|
61
|
-
<Form onSubmit={onSubmit} className="rw-form-wrapper">
|
|
62
|
-
<Label
|
|
63
|
-
name="${usernameCamelCase}"
|
|
64
|
-
className="rw-label"
|
|
65
|
-
errorClassName="rw-label rw-label-error"
|
|
66
|
-
>
|
|
67
|
-
${usernameTitleCase}
|
|
68
|
-
</Label>
|
|
69
|
-
<TextField
|
|
70
|
-
name="${usernameCamelCase}"
|
|
71
|
-
className="rw-input"
|
|
72
|
-
errorClassName="rw-input rw-input-error"
|
|
73
|
-
ref={${usernameCamelCase}Ref}
|
|
74
|
-
validation={{
|
|
75
|
-
required: {
|
|
76
|
-
value: true,
|
|
77
|
-
message: '${usernameTitleCase} is required',
|
|
78
|
-
},
|
|
79
|
-
}}
|
|
80
|
-
/>
|
|
81
|
-
<FieldError name="${usernameCamelCase}" className="rw-field-error" />
|
|
82
|
-
|
|
83
|
-
<Label
|
|
84
|
-
name="${passwordCamelCase}"
|
|
85
|
-
className="rw-label"
|
|
86
|
-
errorClassName="rw-label rw-label-error"
|
|
87
|
-
>
|
|
88
|
-
${passwordTitleCase}
|
|
89
|
-
</Label>
|
|
90
|
-
<PasswordField
|
|
91
|
-
name="${passwordCamelCase}"
|
|
92
|
-
className="rw-input"
|
|
93
|
-
errorClassName="rw-input rw-input-error"
|
|
94
|
-
autoComplete="current-password"
|
|
95
|
-
validation={{
|
|
96
|
-
required: {
|
|
97
|
-
value: true,
|
|
98
|
-
message: '${passwordTitleCase} is required',
|
|
99
|
-
},
|
|
100
|
-
}}
|
|
101
|
-
/>
|
|
102
|
-
<FieldError name="${passwordCamelCase}" className="rw-field-error" />
|
|
103
|
-
|
|
104
|
-
<div className="rw-button-group">
|
|
105
|
-
<Submit className="rw-button rw-button-blue">
|
|
106
|
-
Sign Up
|
|
107
|
-
</Submit>
|
|
108
|
-
</div>
|
|
109
|
-
</Form>
|
|
110
|
-
|
|
111
|
-
{/*
|
|
112
|
-
* OAuth signup buttons. Delete the ones for providers you
|
|
113
|
-
* haven't configured in `cedar setup auth dbAuth --oauth`.
|
|
114
|
-
* Each link is a full-page navigation to the provider's
|
|
115
|
-
* authorize route — it must not be turned into a fetch/XHR
|
|
116
|
-
* call.
|
|
117
|
-
*/}
|
|
118
|
-
<div className="rw-button-group">
|
|
119
|
-
<a
|
|
120
|
-
href={getOAuthUrl('google', { flow: 'signup' })}
|
|
121
|
-
className="rw-button rw-button-blue"
|
|
122
|
-
>
|
|
123
|
-
Continue with Google
|
|
124
|
-
</a>
|
|
125
|
-
<a
|
|
126
|
-
href={getOAuthUrl('github', { flow: 'signup' })}
|
|
127
|
-
className="rw-button rw-button-blue"
|
|
128
|
-
>
|
|
129
|
-
Continue with GitHub
|
|
130
|
-
</a>
|
|
131
|
-
</div>
|
|
132
|
-
</div>
|
|
133
|
-
</div>
|
|
134
|
-
</div>
|
|
135
|
-
<div className="rw-login-link">
|
|
136
|
-
<span>Already have an account?</span>{' '}
|
|
137
|
-
<Link to={routes.login()} className="rw-link">
|
|
138
|
-
Log in!
|
|
139
|
-
</Link>
|
|
140
|
-
</div>
|
|
141
|
-
</div>
|
|
142
|
-
</main>
|
|
143
|
-
</>
|
|
144
|
-
)
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
export default SignupPage
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import type { WrapperProps } from '@cedarjs/router'
|
|
2
|
-
|
|
3
|
-
import ScaffoldLayout from '${importLayoutNames}'
|
|
4
|
-
|
|
5
|
-
function ${pluralPascalName}ScaffoldLayout({ children }: WrapperProps) {
|
|
6
|
-
return (
|
|
7
|
-
<ScaffoldLayout
|
|
8
|
-
title="${pluralPascalName}"
|
|
9
|
-
titleTo="${pluralRouteName}"
|
|
10
|
-
buttonLabel="New ${singularPascalName}"
|
|
11
|
-
buttonTo="${newRouteName}"
|
|
12
|
-
>
|
|
13
|
-
{children}
|
|
14
|
-
</ScaffoldLayout>
|
|
15
|
-
)
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export default ${pluralPascalName}ScaffoldLayout
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
import j from "jscodeshift";
|
|
2
|
-
function buildMembershipsSelectProperty() {
|
|
3
|
-
const snippet = `
|
|
4
|
-
const __tenancySnippet = {
|
|
5
|
-
memberships: {
|
|
6
|
-
select: {
|
|
7
|
-
id: true,
|
|
8
|
-
organizationId: true,
|
|
9
|
-
role: true,
|
|
10
|
-
organization: { select: { id: true, slug: true, name: true } },
|
|
11
|
-
},
|
|
12
|
-
},
|
|
13
|
-
}
|
|
14
|
-
`;
|
|
15
|
-
const property = j.withParser("ts")(snippet).find(j.ObjectProperty, { key: { name: "memberships" } }).nodes()[0];
|
|
16
|
-
if (!property) {
|
|
17
|
-
throw new Error("CEDAR_CODEMOD_ERR_AUTH_SHAPE_NOT_FOUND");
|
|
18
|
-
}
|
|
19
|
-
return property;
|
|
20
|
-
}
|
|
21
|
-
function transform(fileInfo) {
|
|
22
|
-
const root = j.withParser("tsx")(fileInfo.source);
|
|
23
|
-
let selectFound = false;
|
|
24
|
-
root.find(j.CallExpression, {
|
|
25
|
-
callee: {
|
|
26
|
-
type: "MemberExpression",
|
|
27
|
-
object: {
|
|
28
|
-
type: "MemberExpression",
|
|
29
|
-
object: { name: "db" },
|
|
30
|
-
property: { name: "user" }
|
|
31
|
-
},
|
|
32
|
-
property: { name: "findUnique" }
|
|
33
|
-
}
|
|
34
|
-
}).forEach((path) => {
|
|
35
|
-
const [args] = path.node.arguments;
|
|
36
|
-
if (!j.ObjectExpression.check(args)) {
|
|
37
|
-
return;
|
|
38
|
-
}
|
|
39
|
-
const selectProperty = args.properties.find(
|
|
40
|
-
(prop) => j.ObjectProperty.check(prop) && j.Identifier.check(prop.key) && prop.key.name === "select"
|
|
41
|
-
);
|
|
42
|
-
if (!selectProperty || !j.ObjectProperty.check(selectProperty) || !j.ObjectExpression.check(selectProperty.value)) {
|
|
43
|
-
return;
|
|
44
|
-
}
|
|
45
|
-
const alreadyHasMemberships = selectProperty.value.properties.some(
|
|
46
|
-
(prop) => j.ObjectProperty.check(prop) && j.Identifier.check(prop.key) && prop.key.name === "memberships"
|
|
47
|
-
);
|
|
48
|
-
if (!alreadyHasMemberships) {
|
|
49
|
-
selectProperty.value.properties.push(buildMembershipsSelectProperty());
|
|
50
|
-
}
|
|
51
|
-
selectFound = true;
|
|
52
|
-
});
|
|
53
|
-
if (!selectFound) {
|
|
54
|
-
throw new Error("CEDAR_CODEMOD_ERR_AUTH_SHAPE_NOT_FOUND");
|
|
55
|
-
}
|
|
56
|
-
const tenancyExportSnippet = `export { hasOrgRole, requireMembership } from '@cedarjs/tenancy'
|
|
57
|
-
`;
|
|
58
|
-
const tenancyExport = j.withParser("ts")(tenancyExportSnippet).find(j.ExportNamedDeclaration).nodes()[0];
|
|
59
|
-
root.find(j.Program).forEach((path) => {
|
|
60
|
-
path.node.body.push(tenancyExport);
|
|
61
|
-
});
|
|
62
|
-
return root.toSource();
|
|
63
|
-
}
|
|
64
|
-
export {
|
|
65
|
-
transform as default
|
|
66
|
-
};
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
import j from "jscodeshift";
|
|
2
|
-
const DEFAULT_GLOBAL_MODELS = ["user", "organization", "membership"];
|
|
3
|
-
function transform(fileInfo, _api, options) {
|
|
4
|
-
const root = j.withParser("tsx")(fileInfo.source);
|
|
5
|
-
const tenantField = typeof options.tenantField === "string" ? options.tenantField : void 0;
|
|
6
|
-
const imports = root.find(j.ImportDeclaration);
|
|
7
|
-
imports.at(-1).insertAfter(
|
|
8
|
-
j.importDeclaration(
|
|
9
|
-
[j.importSpecifier(j.identifier("createTenancyExtension"))],
|
|
10
|
-
j.literal("@cedarjs/tenancy")
|
|
11
|
-
)
|
|
12
|
-
);
|
|
13
|
-
const configProperties = [
|
|
14
|
-
...tenantField ? [
|
|
15
|
-
j.objectProperty(
|
|
16
|
-
j.identifier("tenantField"),
|
|
17
|
-
j.stringLiteral(tenantField)
|
|
18
|
-
)
|
|
19
|
-
] : [],
|
|
20
|
-
j.objectProperty(
|
|
21
|
-
j.identifier("models"),
|
|
22
|
-
j.objectExpression([
|
|
23
|
-
j.objectProperty(
|
|
24
|
-
j.identifier("allExcept"),
|
|
25
|
-
j.arrayExpression(
|
|
26
|
-
DEFAULT_GLOBAL_MODELS.map((name) => j.stringLiteral(name))
|
|
27
|
-
)
|
|
28
|
-
)
|
|
29
|
-
])
|
|
30
|
-
)
|
|
31
|
-
];
|
|
32
|
-
let found = false;
|
|
33
|
-
root.find(j.VariableDeclaration, { declarations: [{ id: { name: "db" } }] }).forEach((path) => {
|
|
34
|
-
const dbDeclaration = path.node.declarations[0];
|
|
35
|
-
if (!j.VariableDeclarator.check(dbDeclaration)) {
|
|
36
|
-
return;
|
|
37
|
-
}
|
|
38
|
-
if (j.NewExpression.check(dbDeclaration.init)) {
|
|
39
|
-
throw new Error("CEDAR_CODEMOD_ERR_OLD_FORMAT");
|
|
40
|
-
}
|
|
41
|
-
if (!j.Expression.check(dbDeclaration.init)) {
|
|
42
|
-
return;
|
|
43
|
-
}
|
|
44
|
-
found = true;
|
|
45
|
-
const extensionCall = j.callExpression(
|
|
46
|
-
j.identifier("createTenancyExtension"),
|
|
47
|
-
[j.objectExpression(configProperties)]
|
|
48
|
-
);
|
|
49
|
-
dbDeclaration.init = j.callExpression(
|
|
50
|
-
j.memberExpression(dbDeclaration.init, j.identifier("$extends")),
|
|
51
|
-
[extensionCall]
|
|
52
|
-
);
|
|
53
|
-
});
|
|
54
|
-
if (!found) {
|
|
55
|
-
throw new Error("CEDAR_CODEMOD_ERR_DB_SHAPE_NOT_FOUND");
|
|
56
|
-
}
|
|
57
|
-
return root.toSource().replace(
|
|
58
|
-
"createTenancyExtension(",
|
|
59
|
-
"createTenancyExtension<typeof prismaClient>("
|
|
60
|
-
);
|
|
61
|
-
}
|
|
62
|
-
export {
|
|
63
|
-
transform as default
|
|
64
|
-
};
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
import j from "jscodeshift";
|
|
2
|
-
function buildContextProperty() {
|
|
3
|
-
const snippet = `
|
|
4
|
-
const __tenancySnippet = {
|
|
5
|
-
context: async ({ context: gqlContext }) => {
|
|
6
|
-
const { currentUser, event, request, params } = gqlContext
|
|
7
|
-
|
|
8
|
-
// A user whose getCurrentUser result doesn't carry memberships
|
|
9
|
-
// can't be matched to an organization, so the request runs with
|
|
10
|
-
// no current organization set.
|
|
11
|
-
if (!isUserWithMemberships(currentUser)) {
|
|
12
|
-
return {}
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
// Yoga can populate either \`event\` (Lambda-style deployments) or
|
|
16
|
-
// \`request\` (Fetch-API-style deployments); resolveCurrentOrg reads
|
|
17
|
-
// the organization header off either.
|
|
18
|
-
const requestEvent = event ?? request
|
|
19
|
-
|
|
20
|
-
if (!requestEvent) {
|
|
21
|
-
return {}
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
const currentOrg = await resolveCurrentOrg({
|
|
25
|
-
event: requestEvent,
|
|
26
|
-
variables: params.variables,
|
|
27
|
-
currentUser,
|
|
28
|
-
lookupOrg: async (idOrSlug) =>
|
|
29
|
-
(await db.organization.findUnique({
|
|
30
|
-
where: { id: idOrSlug },
|
|
31
|
-
select: { id: true, slug: true },
|
|
32
|
-
})) ??
|
|
33
|
-
db.organization.findUnique({
|
|
34
|
-
where: { slug: idOrSlug },
|
|
35
|
-
select: { id: true, slug: true },
|
|
36
|
-
}),
|
|
37
|
-
})
|
|
38
|
-
|
|
39
|
-
return { currentOrg }
|
|
40
|
-
},
|
|
41
|
-
}
|
|
42
|
-
`;
|
|
43
|
-
const property = j.withParser("ts")(snippet).find(j.ObjectProperty, { key: { name: "context" } }).nodes()[0];
|
|
44
|
-
if (!property) {
|
|
45
|
-
throw new Error("CEDAR_CODEMOD_ERR_GRAPHQL_HANDLER_NOT_FOUND");
|
|
46
|
-
}
|
|
47
|
-
return property;
|
|
48
|
-
}
|
|
49
|
-
function addNamedImport(root, names, source) {
|
|
50
|
-
const imports = root.find(j.ImportDeclaration);
|
|
51
|
-
imports.at(-1).insertAfter(
|
|
52
|
-
j.importDeclaration(
|
|
53
|
-
names.map((name) => j.importSpecifier(j.identifier(name))),
|
|
54
|
-
j.literal(source)
|
|
55
|
-
)
|
|
56
|
-
);
|
|
57
|
-
}
|
|
58
|
-
function transform(fileInfo) {
|
|
59
|
-
const root = j.withParser("tsx")(fileInfo.source);
|
|
60
|
-
const handlerCalls = root.find(j.CallExpression, {
|
|
61
|
-
callee: { name: "createGraphQLHandler" }
|
|
62
|
-
});
|
|
63
|
-
if (handlerCalls.length === 0) {
|
|
64
|
-
throw new Error("CEDAR_CODEMOD_ERR_GRAPHQL_HANDLER_NOT_FOUND");
|
|
65
|
-
}
|
|
66
|
-
handlerCalls.forEach((path) => {
|
|
67
|
-
const [config] = path.node.arguments;
|
|
68
|
-
if (!j.ObjectExpression.check(config)) {
|
|
69
|
-
throw new Error("CEDAR_CODEMOD_ERR_GRAPHQL_HANDLER_NOT_FOUND");
|
|
70
|
-
}
|
|
71
|
-
const hasContext = config.properties.some(
|
|
72
|
-
(prop) => j.ObjectProperty.check(prop) && j.Identifier.check(prop.key) && prop.key.name === "context"
|
|
73
|
-
);
|
|
74
|
-
if (hasContext) {
|
|
75
|
-
throw new Error("CEDAR_CODEMOD_ERR_GRAPHQL_CONTEXT_EXISTS");
|
|
76
|
-
}
|
|
77
|
-
config.properties.push(buildContextProperty());
|
|
78
|
-
});
|
|
79
|
-
addNamedImport(
|
|
80
|
-
root,
|
|
81
|
-
["isUserWithMemberships", "resolveCurrentOrg"],
|
|
82
|
-
"@cedarjs/tenancy"
|
|
83
|
-
);
|
|
84
|
-
return root.toSource();
|
|
85
|
-
}
|
|
86
|
-
export {
|
|
87
|
-
transform as default
|
|
88
|
-
};
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import fs from "node:fs";
|
|
2
|
-
import path from "node:path";
|
|
3
|
-
import { formatCedarCommand } from "@cedarjs/cli-helpers/packageManager/display";
|
|
4
|
-
const WEB_AUTH_EXTENSIONS = ["ts", "tsx", "js", "jsx"];
|
|
5
|
-
function hasWebAuthFile(webSrcPath) {
|
|
6
|
-
return WEB_AUTH_EXTENSIONS.some(
|
|
7
|
-
(extension) => fs.existsSync(path.join(webSrcPath, `auth.${extension}`))
|
|
8
|
-
);
|
|
9
|
-
}
|
|
10
|
-
function authNotSetUpMessage() {
|
|
11
|
-
return [
|
|
12
|
-
"Auth is not set up in this project.",
|
|
13
|
-
"",
|
|
14
|
-
"Tenancy builds on your app's auth: it adds memberships to",
|
|
15
|
-
"`getCurrentUser`, and resolves the current organization from the",
|
|
16
|
-
"signed-in user's memberships. Set up auth first, then run this command",
|
|
17
|
-
"again:",
|
|
18
|
-
"",
|
|
19
|
-
` ${formatCedarCommand(["setup", "auth", "dbAuth"])}`,
|
|
20
|
-
"",
|
|
21
|
-
"Any provider works. See https://cedarjs.com/docs/authentication"
|
|
22
|
-
].join("\n");
|
|
23
|
-
}
|
|
24
|
-
function noUserModelMessage(schemaPath) {
|
|
25
|
-
return [
|
|
26
|
-
`No \`User\` model found in ${schemaPath}.`,
|
|
27
|
-
"",
|
|
28
|
-
"Tenancy hangs memberships off your app's `User` model, so it needs one",
|
|
29
|
-
"before it can add `Organization` and `Membership`.",
|
|
30
|
-
"",
|
|
31
|
-
"dbAuth adds this model for you. Providers that authenticate against an",
|
|
32
|
-
"external service leave it to you: give `User` its own id and store the",
|
|
33
|
-
"provider's id in a column beside it, so memberships keep working if you",
|
|
34
|
-
"switch providers or add a second one.",
|
|
35
|
-
"",
|
|
36
|
-
`Add a model like this one, run \`${formatCedarCommand(["prisma", "migrate", "dev"])}\`, then`,
|
|
37
|
-
"run this command again:",
|
|
38
|
-
"",
|
|
39
|
-
" model User {",
|
|
40
|
-
" id String @id @default(cuid())",
|
|
41
|
-
" email String @unique",
|
|
42
|
-
" }"
|
|
43
|
-
].join("\n");
|
|
44
|
-
}
|
|
45
|
-
export {
|
|
46
|
-
authNotSetUpMessage,
|
|
47
|
-
hasWebAuthFile,
|
|
48
|
-
noUserModelMessage
|
|
49
|
-
};
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
const ORGANIZATION_MODEL = `model Organization {
|
|
2
|
-
id String @id @default(cuid())
|
|
3
|
-
name String
|
|
4
|
-
slug String @unique
|
|
5
|
-
createdAt DateTime @default(now())
|
|
6
|
-
updatedAt DateTime @updatedAt
|
|
7
|
-
memberships Membership[]
|
|
8
|
-
}`;
|
|
9
|
-
const MEMBERSHIP_MODEL = `model Membership {
|
|
10
|
-
id String @id @default(cuid())
|
|
11
|
-
role String
|
|
12
|
-
// Null while the membership is a pending invitation.
|
|
13
|
-
userId String?
|
|
14
|
-
organizationId String
|
|
15
|
-
invitedById String?
|
|
16
|
-
invitationToken String? @unique
|
|
17
|
-
createdAt DateTime @default(now())
|
|
18
|
-
updatedAt DateTime @updatedAt
|
|
19
|
-
user User? @relation(fields: [userId], references: [id])
|
|
20
|
-
organization Organization @relation(fields: [organizationId], references: [id])
|
|
21
|
-
invitedBy Membership? @relation("Inviter", fields: [invitedById], references: [id])
|
|
22
|
-
invitees Membership[] @relation("Inviter")
|
|
23
|
-
|
|
24
|
-
@@unique([userId, organizationId])
|
|
25
|
-
@@index([organizationId])
|
|
26
|
-
}`;
|
|
27
|
-
const RW_DATA_MIGRATION_MODEL = `model RW_DataMigration {
|
|
28
|
-
version String @id
|
|
29
|
-
name String
|
|
30
|
-
startedAt DateTime
|
|
31
|
-
finishedAt DateTime
|
|
32
|
-
}`;
|
|
33
|
-
function hasModel(schema, modelName) {
|
|
34
|
-
return new RegExp(`\\bmodel\\s+${modelName}\\s*\\{`).test(schema);
|
|
35
|
-
}
|
|
36
|
-
function addTenancyModels(schema) {
|
|
37
|
-
return [ORGANIZATION_MODEL, MEMBERSHIP_MODEL].reduce(appendModel, schema);
|
|
38
|
-
}
|
|
39
|
-
function appendModel(schema, model) {
|
|
40
|
-
if (schema.includes(model)) {
|
|
41
|
-
return schema;
|
|
42
|
-
}
|
|
43
|
-
return `${schema.trimEnd()}
|
|
44
|
-
|
|
45
|
-
${model}
|
|
46
|
-
`;
|
|
47
|
-
}
|
|
48
|
-
function addDataMigrationModel(schema) {
|
|
49
|
-
if (hasModel(schema, "RW_DataMigration")) {
|
|
50
|
-
return schema;
|
|
51
|
-
}
|
|
52
|
-
return `${schema.trimEnd()}
|
|
53
|
-
|
|
54
|
-
${RW_DATA_MIGRATION_MODEL}
|
|
55
|
-
`;
|
|
56
|
-
}
|
|
57
|
-
function editSchema(schema, options) {
|
|
58
|
-
if (!hasModel(schema, "User")) {
|
|
59
|
-
throw new Error("CEDAR_TENANCY_ERR_NO_USER_MODEL");
|
|
60
|
-
}
|
|
61
|
-
const organizationIsCustomized = hasModel(schema, "Organization") && !schema.includes(ORGANIZATION_MODEL);
|
|
62
|
-
const membershipIsCustomized = hasModel(schema, "Membership") && !schema.includes(MEMBERSHIP_MODEL);
|
|
63
|
-
const modelsCustomized = organizationIsCustomized || membershipIsCustomized;
|
|
64
|
-
if (modelsCustomized && !options.force) {
|
|
65
|
-
return { schema: addDataMigrationModel(schema), outcome: "skipped" };
|
|
66
|
-
}
|
|
67
|
-
const withTenancyModels = addTenancyModels(schema);
|
|
68
|
-
return {
|
|
69
|
-
schema: addDataMigrationModel(withTenancyModels),
|
|
70
|
-
outcome: modelsCustomized ? "forced" : "added"
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
export {
|
|
74
|
-
MEMBERSHIP_MODEL,
|
|
75
|
-
ORGANIZATION_MODEL,
|
|
76
|
-
RW_DATA_MIGRATION_MODEL,
|
|
77
|
-
addDataMigrationModel,
|
|
78
|
-
addTenancyModels,
|
|
79
|
-
editSchema,
|
|
80
|
-
hasModel
|
|
81
|
-
};
|
|
@@ -1,154 +0,0 @@
|
|
|
1
|
-
import j from "jscodeshift";
|
|
2
|
-
function useShorthandUserAttributes(fn) {
|
|
3
|
-
const [firstParam] = fn.params;
|
|
4
|
-
if (!j.ObjectPattern.check(firstParam)) {
|
|
5
|
-
throw new Error("CEDAR_CODEMOD_ERR_SIGNUP_SHAPE_NOT_FOUND");
|
|
6
|
-
}
|
|
7
|
-
const userAttributesProperty = firstParam.properties.find(
|
|
8
|
-
(prop) => j.ObjectProperty.check(prop) && j.Identifier.check(prop.key) && prop.key.name === "userAttributes"
|
|
9
|
-
);
|
|
10
|
-
if (!userAttributesProperty || !j.ObjectProperty.check(userAttributesProperty)) {
|
|
11
|
-
throw new Error("CEDAR_CODEMOD_ERR_SIGNUP_SHAPE_NOT_FOUND");
|
|
12
|
-
}
|
|
13
|
-
userAttributesProperty.value = j.identifier("userAttributes");
|
|
14
|
-
userAttributesProperty.shorthand = true;
|
|
15
|
-
}
|
|
16
|
-
function addInvitationTokenToUserAttributes(root) {
|
|
17
|
-
root.find(j.TSInterfaceDeclaration, { id: { name: "UserAttributes" } }).forEach((path) => {
|
|
18
|
-
const alreadyHasField = path.node.body.body.some(
|
|
19
|
-
(member) => j.TSPropertySignature.check(member) && j.Identifier.check(member.key) && member.key.name === "invitationToken"
|
|
20
|
-
);
|
|
21
|
-
if (alreadyHasField) {
|
|
22
|
-
return;
|
|
23
|
-
}
|
|
24
|
-
path.node.body.body.push(
|
|
25
|
-
j.tsPropertySignature(
|
|
26
|
-
j.identifier("invitationToken"),
|
|
27
|
-
j.tsTypeAnnotation(j.tsStringKeyword()),
|
|
28
|
-
true
|
|
29
|
-
// optional
|
|
30
|
-
)
|
|
31
|
-
);
|
|
32
|
-
});
|
|
33
|
-
}
|
|
34
|
-
function wrapCreateCall(fn) {
|
|
35
|
-
fn.async = true;
|
|
36
|
-
const ensureCallStatement = j.expressionStatement(
|
|
37
|
-
j.awaitExpression(
|
|
38
|
-
j.callExpression(j.identifier("ensureDefaultOrganization"), [
|
|
39
|
-
j.objectExpression([
|
|
40
|
-
j.objectProperty(
|
|
41
|
-
j.identifier("currentUser"),
|
|
42
|
-
j.objectExpression([
|
|
43
|
-
j.objectProperty(
|
|
44
|
-
j.identifier("id"),
|
|
45
|
-
j.memberExpression(j.identifier("user"), j.identifier("id"))
|
|
46
|
-
),
|
|
47
|
-
j.objectProperty(
|
|
48
|
-
j.identifier("memberships"),
|
|
49
|
-
j.arrayExpression([])
|
|
50
|
-
)
|
|
51
|
-
])
|
|
52
|
-
),
|
|
53
|
-
j.objectProperty(
|
|
54
|
-
j.identifier("invitationToken"),
|
|
55
|
-
// `userAttributes` is optional in dbAuth's signup handler options
|
|
56
|
-
j.optionalMemberExpression(
|
|
57
|
-
j.identifier("userAttributes"),
|
|
58
|
-
j.identifier("invitationToken")
|
|
59
|
-
)
|
|
60
|
-
)
|
|
61
|
-
])
|
|
62
|
-
])
|
|
63
|
-
)
|
|
64
|
-
);
|
|
65
|
-
const returnUserStatement = j.returnStatement(j.identifier("user"));
|
|
66
|
-
if (j.BlockStatement.check(fn.body)) {
|
|
67
|
-
const returnIndex = fn.body.body.findIndex(
|
|
68
|
-
(statement) => j.ReturnStatement.check(statement)
|
|
69
|
-
);
|
|
70
|
-
const returnStatement = fn.body.body[returnIndex];
|
|
71
|
-
if (returnIndex === -1 || !j.ReturnStatement.check(returnStatement) || !returnStatement.argument) {
|
|
72
|
-
throw new Error("CEDAR_CODEMOD_ERR_SIGNUP_SHAPE_NOT_FOUND");
|
|
73
|
-
}
|
|
74
|
-
const createUserStatement = j.variableDeclaration("const", [
|
|
75
|
-
j.variableDeclarator(
|
|
76
|
-
j.identifier("user"),
|
|
77
|
-
j.awaitExpression(returnStatement.argument)
|
|
78
|
-
)
|
|
79
|
-
]);
|
|
80
|
-
fn.body.body.splice(
|
|
81
|
-
returnIndex,
|
|
82
|
-
1,
|
|
83
|
-
createUserStatement,
|
|
84
|
-
ensureCallStatement,
|
|
85
|
-
returnUserStatement
|
|
86
|
-
);
|
|
87
|
-
return;
|
|
88
|
-
}
|
|
89
|
-
if (j.Expression.check(fn.body)) {
|
|
90
|
-
const createUserStatement = j.variableDeclaration("const", [
|
|
91
|
-
j.variableDeclarator(
|
|
92
|
-
j.identifier("user"),
|
|
93
|
-
j.awaitExpression(
|
|
94
|
-
// ast-types' `Expression` checker type isn't assignable to
|
|
95
|
-
// `awaitExpression`'s narrower `ExpressionKind` union (a gap in
|
|
96
|
-
// ast-types' generated types); the `check()` call above already
|
|
97
|
-
// guarantees `fn.body` is a valid expression node.
|
|
98
|
-
fn.body
|
|
99
|
-
)
|
|
100
|
-
)
|
|
101
|
-
]);
|
|
102
|
-
fn.body = j.blockStatement([
|
|
103
|
-
createUserStatement,
|
|
104
|
-
ensureCallStatement,
|
|
105
|
-
returnUserStatement
|
|
106
|
-
]);
|
|
107
|
-
return;
|
|
108
|
-
}
|
|
109
|
-
throw new Error("CEDAR_CODEMOD_ERR_SIGNUP_SHAPE_NOT_FOUND");
|
|
110
|
-
}
|
|
111
|
-
function transform(fileInfo) {
|
|
112
|
-
const root = j.withParser("tsx")(fileInfo.source);
|
|
113
|
-
const signupOptionsDeclarators = root.find(j.VariableDeclarator, {
|
|
114
|
-
id: { name: "signupOptions" }
|
|
115
|
-
});
|
|
116
|
-
if (signupOptionsDeclarators.length === 0) {
|
|
117
|
-
throw new Error("CEDAR_CODEMOD_ERR_SIGNUP_SHAPE_NOT_FOUND");
|
|
118
|
-
}
|
|
119
|
-
let handlerFound = false;
|
|
120
|
-
signupOptionsDeclarators.forEach((path) => {
|
|
121
|
-
const init = path.node.init;
|
|
122
|
-
if (!j.ObjectExpression.check(init)) {
|
|
123
|
-
return;
|
|
124
|
-
}
|
|
125
|
-
const handlerProperty = init.properties.find(
|
|
126
|
-
(prop) => j.ObjectProperty.check(prop) && j.Identifier.check(prop.key) && prop.key.name === "handler"
|
|
127
|
-
);
|
|
128
|
-
if (!handlerProperty || !j.ObjectProperty.check(handlerProperty)) {
|
|
129
|
-
return;
|
|
130
|
-
}
|
|
131
|
-
const handlerFn = handlerProperty.value;
|
|
132
|
-
if (!j.ArrowFunctionExpression.check(handlerFn) && !j.FunctionExpression.check(handlerFn)) {
|
|
133
|
-
return;
|
|
134
|
-
}
|
|
135
|
-
useShorthandUserAttributes(handlerFn);
|
|
136
|
-
wrapCreateCall(handlerFn);
|
|
137
|
-
handlerFound = true;
|
|
138
|
-
});
|
|
139
|
-
if (!handlerFound) {
|
|
140
|
-
throw new Error("CEDAR_CODEMOD_ERR_SIGNUP_SHAPE_NOT_FOUND");
|
|
141
|
-
}
|
|
142
|
-
addInvitationTokenToUserAttributes(root);
|
|
143
|
-
const imports = root.find(j.ImportDeclaration);
|
|
144
|
-
imports.at(-1).insertAfter(
|
|
145
|
-
j.importDeclaration(
|
|
146
|
-
[j.importSpecifier(j.identifier("ensureDefaultOrganization"))],
|
|
147
|
-
j.literal("src/services/organizations/organizations")
|
|
148
|
-
)
|
|
149
|
-
);
|
|
150
|
-
return root.toSource();
|
|
151
|
-
}
|
|
152
|
-
export {
|
|
153
|
-
transform as default
|
|
154
|
-
};
|