@contentful/create-studio-experiences 1.37.1-dev-20250425T1024-b8bfdfb.0
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/LICENSE +21 -0
- package/README.md +62 -0
- package/dist/constants.d.ts +7 -0
- package/dist/constants.js +8 -0
- package/dist/constants.js.map +1 -0
- package/dist/content.d.ts +724 -0
- package/dist/content.js +983 -0
- package/dist/content.js.map +1 -0
- package/dist/copyTemplates.d.ts +1 -0
- package/dist/copyTemplates.js +20 -0
- package/dist/copyTemplates.js.map +1 -0
- package/dist/ctflClient.d.ts +85 -0
- package/dist/ctflClient.js +253 -0
- package/dist/ctflClient.js.map +1 -0
- package/dist/fsClient.d.ts +13 -0
- package/dist/fsClient.js +84 -0
- package/dist/fsClient.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +296 -0
- package/dist/index.js.map +1 -0
- package/dist/models.d.ts +27 -0
- package/dist/models.js +32 -0
- package/dist/models.js.map +1 -0
- package/dist/utils.d.ts +7 -0
- package/dist/utils.js +24 -0
- package/dist/utils.js.map +1 -0
- package/package.json +64 -0
- package/templates/nextjs-marketing-demo/.env.template +5 -0
- package/templates/nextjs-marketing-demo/.eslintrc.json +3 -0
- package/templates/nextjs-marketing-demo/README.md +22 -0
- package/templates/nextjs-marketing-demo/next.config.mjs +21 -0
- package/templates/nextjs-marketing-demo/src/app/[locale]/[slug]/page.tsx +50 -0
- package/templates/nextjs-marketing-demo/src/app/favicon.ico +0 -0
- package/templates/nextjs-marketing-demo/src/app/fonts/GeistMonoVF.woff +0 -0
- package/templates/nextjs-marketing-demo/src/app/fonts/GeistVF.woff +0 -0
- package/templates/nextjs-marketing-demo/src/app/globals.css +37 -0
- package/templates/nextjs-marketing-demo/src/app/layout.tsx +34 -0
- package/templates/nextjs-marketing-demo/src/app/page.module.css +19 -0
- package/templates/nextjs-marketing-demo/src/assets/Logo.svg +8 -0
- package/templates/nextjs-marketing-demo/src/components/ButtonComponentRegistration.tsx +125 -0
- package/templates/nextjs-marketing-demo/src/components/CardComponentRegistration.tsx +54 -0
- package/templates/nextjs-marketing-demo/src/components/Container.tsx +15 -0
- package/templates/nextjs-marketing-demo/src/components/Experience.tsx +16 -0
- package/templates/nextjs-marketing-demo/src/components/Footer/Footer.tsx +42 -0
- package/templates/nextjs-marketing-demo/src/components/Footer/FooterDebugging.tsx +23 -0
- package/templates/nextjs-marketing-demo/src/components/Footer/FooterNav.tsx +34 -0
- package/templates/nextjs-marketing-demo/src/components/Footer/styles.module.css +51 -0
- package/templates/nextjs-marketing-demo/src/components/Header/Header.tsx +15 -0
- package/templates/nextjs-marketing-demo/src/components/Header/HeaderNav.tsx +59 -0
- package/templates/nextjs-marketing-demo/src/components/Header/styles.module.css +30 -0
- package/templates/nextjs-marketing-demo/src/components/Icon.tsx +21 -0
- package/templates/nextjs-marketing-demo/src/components/RatingStarsComponentRegistration.tsx +49 -0
- package/templates/nextjs-marketing-demo/src/getExperience.ts +40 -0
- package/templates/nextjs-marketing-demo/src/middleware.ts +17 -0
- package/templates/nextjs-marketing-demo/src/studio-config.ts +139 -0
- package/templates/nextjs-marketing-demo/tsconfig.json +26 -0
- package/templates/react-vite-ts/.env.template +5 -0
- package/templates/react-vite-ts/README.md +50 -0
- package/templates/react-vite-ts/eslint.config.js +25 -0
- package/templates/react-vite-ts/index.html +13 -0
- package/templates/react-vite-ts/public/vite.svg +1 -0
- package/templates/react-vite-ts/src/App.css +4 -0
- package/templates/react-vite-ts/src/App.tsx +37 -0
- package/templates/react-vite-ts/src/assets/react.svg +1 -0
- package/templates/react-vite-ts/src/index.css +0 -0
- package/templates/react-vite-ts/src/main.tsx +10 -0
- package/templates/react-vite-ts/src/studio-config.ts +67 -0
- package/templates/react-vite-ts/src/vite-env.d.ts +1 -0
- package/templates/react-vite-ts/tsconfig.app.json +24 -0
- package/templates/react-vite-ts/tsconfig.json +4 -0
- package/templates/react-vite-ts/tsconfig.node.json +22 -0
- package/templates/react-vite-ts/vite.config.ts +7 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
#! /usr/bin/env node
|
|
2
|
+
import { isCancel, cancel, confirm, intro, outro, select, spinner as Spinner, text, password, log, } from '@clack/prompts';
|
|
3
|
+
import yargs from 'yargs';
|
|
4
|
+
import { CtflClient } from './ctflClient.js';
|
|
5
|
+
import { allFrameworks } from './models.js';
|
|
6
|
+
import { FsClient } from './fsClient.js';
|
|
7
|
+
import { generateContentTypeId, isValidPackageName } from './utils.js';
|
|
8
|
+
import { CONSTANTS } from './constants.js';
|
|
9
|
+
const args = await yargs(process.argv.slice(2))
|
|
10
|
+
.option('host', {
|
|
11
|
+
alias: 'h',
|
|
12
|
+
type: 'string',
|
|
13
|
+
description: 'Contentful host to use (defaults to contentful.com)',
|
|
14
|
+
default: 'contentful.com',
|
|
15
|
+
})
|
|
16
|
+
.option('token', {
|
|
17
|
+
alias: 't',
|
|
18
|
+
type: 'string',
|
|
19
|
+
description: 'authToken to use',
|
|
20
|
+
})
|
|
21
|
+
//allows the option to cleanup at the end
|
|
22
|
+
.option('dev', {
|
|
23
|
+
alias: 'd',
|
|
24
|
+
type: 'boolean',
|
|
25
|
+
description: 'dev mode',
|
|
26
|
+
default: false,
|
|
27
|
+
hidden: true,
|
|
28
|
+
})
|
|
29
|
+
.strict()
|
|
30
|
+
.parse();
|
|
31
|
+
const onCancel = (answer) => {
|
|
32
|
+
if (isCancel(answer)) {
|
|
33
|
+
cancel('Ok, bye!');
|
|
34
|
+
process.exit();
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
init().catch((e) => {
|
|
38
|
+
console.error(e);
|
|
39
|
+
});
|
|
40
|
+
async function init() {
|
|
41
|
+
const spinner = Spinner();
|
|
42
|
+
const ctflClient = new CtflClient(args.host);
|
|
43
|
+
const fsClient = new FsClient(args.host);
|
|
44
|
+
if (args.token) {
|
|
45
|
+
const validToken = await ctflClient.setAuthToken(args.token);
|
|
46
|
+
if (!validToken) {
|
|
47
|
+
console.error('\nInvalid token\n');
|
|
48
|
+
process.exit(1);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
try {
|
|
52
|
+
intro(`👋 Welcome to Contentful Studio Experiences!\nWe will guide you through creating a new project that will be ready-to-go with Studio Experiences!`);
|
|
53
|
+
const projectType = await select({
|
|
54
|
+
message: 'Pick a project type.',
|
|
55
|
+
options: allFrameworks.map((framework) => {
|
|
56
|
+
return {
|
|
57
|
+
label: framework.color(framework.display),
|
|
58
|
+
value: framework.name,
|
|
59
|
+
};
|
|
60
|
+
}),
|
|
61
|
+
});
|
|
62
|
+
onCancel(projectType);
|
|
63
|
+
const framework = allFrameworks.find((f) => f.name === projectType);
|
|
64
|
+
const variantType = await select({
|
|
65
|
+
message: `What type of ${framework?.display} project?`,
|
|
66
|
+
options: framework.variants.map((variant) => {
|
|
67
|
+
return {
|
|
68
|
+
label: variant.color(variant.display),
|
|
69
|
+
value: variant.name,
|
|
70
|
+
};
|
|
71
|
+
}),
|
|
72
|
+
});
|
|
73
|
+
onCancel(variantType);
|
|
74
|
+
const variant = framework.variants.find((v) => v.name === variantType);
|
|
75
|
+
const projectName = (await text({
|
|
76
|
+
message: 'Where should we install the project?',
|
|
77
|
+
initialValue: variant.defaultDir,
|
|
78
|
+
validate(dir) {
|
|
79
|
+
if (dir.length === 0)
|
|
80
|
+
return `Value is required!`;
|
|
81
|
+
if (fsClient.directoryExists(dir)) {
|
|
82
|
+
return `Directory ${dir} already exists`;
|
|
83
|
+
//todo enable directory deleting
|
|
84
|
+
}
|
|
85
|
+
else if (!isValidPackageName(dir)) {
|
|
86
|
+
return `${dir} is not a valid package name`;
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
}));
|
|
90
|
+
onCancel(projectName);
|
|
91
|
+
let contentTypeId;
|
|
92
|
+
let contentEntryId;
|
|
93
|
+
const useExistingSpace = await confirm({
|
|
94
|
+
message: 'Would you like to connect the project to an existing space with Studio Experiences?',
|
|
95
|
+
});
|
|
96
|
+
onCancel(useExistingSpace);
|
|
97
|
+
if (useExistingSpace) {
|
|
98
|
+
if (!args.token) {
|
|
99
|
+
const confirmAnswer = await confirm({
|
|
100
|
+
message: "Next, a browser window will open where you will log in (or sign up if you don't have an account) to Contentful, and authorize this CLI tool. Once done, you will see your access token, where you can copy it and paste it back into the command window. \n\nAre you ready to continue?",
|
|
101
|
+
});
|
|
102
|
+
onCancel(confirmAnswer);
|
|
103
|
+
if (!confirmAnswer) {
|
|
104
|
+
outro('Ok, bye!');
|
|
105
|
+
process.exit();
|
|
106
|
+
}
|
|
107
|
+
await ctflClient.getAuthToken();
|
|
108
|
+
const authToken = await password({
|
|
109
|
+
message: 'Enter your Contentful management token from the browser window:',
|
|
110
|
+
validate(token) {
|
|
111
|
+
if (token.length === 0)
|
|
112
|
+
return `Value is required!`;
|
|
113
|
+
},
|
|
114
|
+
});
|
|
115
|
+
onCancel(authToken);
|
|
116
|
+
spinner.start('Validating token...');
|
|
117
|
+
const validToken = await ctflClient.setAuthToken(authToken, true);
|
|
118
|
+
if (!validToken) {
|
|
119
|
+
console.error('\nInvalid token\n');
|
|
120
|
+
process.exit(1);
|
|
121
|
+
}
|
|
122
|
+
spinner.stop('Token validated!');
|
|
123
|
+
}
|
|
124
|
+
const orgs = await ctflClient.getOrgs();
|
|
125
|
+
const selectedOrgId = (await select({
|
|
126
|
+
message: 'Select an organization for the space.',
|
|
127
|
+
options: orgs.map((org) => {
|
|
128
|
+
return {
|
|
129
|
+
label: org.name,
|
|
130
|
+
value: org.id,
|
|
131
|
+
};
|
|
132
|
+
}),
|
|
133
|
+
}));
|
|
134
|
+
onCancel(selectedOrgId);
|
|
135
|
+
const selectedOrg = orgs.find((org) => org.id === selectedOrgId);
|
|
136
|
+
ctflClient.org = selectedOrg;
|
|
137
|
+
const spaces = await ctflClient.getSpacesForOrg(selectedOrgId);
|
|
138
|
+
const spaceEnablements = await ctflClient.getSpaceEnablements(selectedOrgId);
|
|
139
|
+
const studioExperiencesEnabledSpaceIds = spaceEnablements
|
|
140
|
+
.filter((val) => val.studioExperiences.enabled)
|
|
141
|
+
.map((spaceEnablement) => spaceEnablement.sys.space.sys.id);
|
|
142
|
+
const spacesWithStudioExperienceEnabled = spaces.filter((space) => {
|
|
143
|
+
return studioExperiencesEnabledSpaceIds.includes(space.id);
|
|
144
|
+
});
|
|
145
|
+
const selectedSpaceId = await select({
|
|
146
|
+
message: 'Select the space to use.',
|
|
147
|
+
options: spacesWithStudioExperienceEnabled.map((space) => {
|
|
148
|
+
return {
|
|
149
|
+
label: space.name,
|
|
150
|
+
value: space.id,
|
|
151
|
+
};
|
|
152
|
+
}),
|
|
153
|
+
});
|
|
154
|
+
onCancel(selectedSpaceId);
|
|
155
|
+
const selectedSpace = spaces.find((space) => space.id === selectedSpaceId);
|
|
156
|
+
ctflClient.space = selectedSpace;
|
|
157
|
+
const environments = await ctflClient.getEnvironments();
|
|
158
|
+
let env = environments.length === 1 ? environments[0] : undefined;
|
|
159
|
+
if (environments.length > 1) {
|
|
160
|
+
const selectedEnv = await select({
|
|
161
|
+
message: 'Select the environment to use.',
|
|
162
|
+
options: environments.map((env) => {
|
|
163
|
+
return {
|
|
164
|
+
label: env.name,
|
|
165
|
+
value: env.id,
|
|
166
|
+
};
|
|
167
|
+
}),
|
|
168
|
+
});
|
|
169
|
+
onCancel(selectedEnv);
|
|
170
|
+
env = environments.find((item) => item.id === selectedEnv);
|
|
171
|
+
}
|
|
172
|
+
ctflClient.env = env;
|
|
173
|
+
const apiKeys = await ctflClient.getApiKeys();
|
|
174
|
+
if (apiKeys.length === 0) {
|
|
175
|
+
spinner.start('No API keys are currently found, creating one.');
|
|
176
|
+
const newApiKey = await ctflClient.createApiKeys();
|
|
177
|
+
await ctflClient.getPreviewAccessToken(newApiKey.previewKeyId);
|
|
178
|
+
spinner.stop('API key created!');
|
|
179
|
+
}
|
|
180
|
+
else if (apiKeys.find((item) => item.name === ctflClient.apiKeysName)) {
|
|
181
|
+
log.message('Using existing API key for Studio Experiences.');
|
|
182
|
+
const selectedApiKey = apiKeys.find((apiKey) => apiKey.name === ctflClient.apiKeysName);
|
|
183
|
+
ctflClient.apiKey = selectedApiKey;
|
|
184
|
+
await ctflClient.getPreviewAccessToken(selectedApiKey.previewKeyId);
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
const createNewOption = { label: 'Create new API key', value: 'create' };
|
|
188
|
+
const selectedApiKeyId = await select({
|
|
189
|
+
message: 'Select API key to use.',
|
|
190
|
+
options: [
|
|
191
|
+
...apiKeys.map((apiKey) => {
|
|
192
|
+
return {
|
|
193
|
+
label: apiKey.name,
|
|
194
|
+
value: apiKey.accessToken,
|
|
195
|
+
};
|
|
196
|
+
}),
|
|
197
|
+
createNewOption,
|
|
198
|
+
],
|
|
199
|
+
});
|
|
200
|
+
onCancel(selectedApiKeyId);
|
|
201
|
+
if (selectedApiKeyId === createNewOption.value) {
|
|
202
|
+
spinner.start('Creating new API key.');
|
|
203
|
+
const apiKey = await ctflClient.createApiKeys();
|
|
204
|
+
await ctflClient.getPreviewAccessToken(apiKey.previewKeyId);
|
|
205
|
+
spinner.stop('API key created!');
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
const selectedApiKey = apiKeys.find((apiKey) => apiKey.accessToken === selectedApiKeyId);
|
|
209
|
+
ctflClient.apiKey = selectedApiKey;
|
|
210
|
+
await ctflClient.getPreviewAccessToken(selectedApiKey.previewKeyId);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
let contentTypeName;
|
|
214
|
+
const existingContentType = await ctflClient.getExistingExperienceType();
|
|
215
|
+
if (existingContentType) {
|
|
216
|
+
contentTypeName = existingContentType.name;
|
|
217
|
+
contentTypeId = existingContentType.id;
|
|
218
|
+
log.message(`Using existing content type for Experiences: ${contentTypeName}`);
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
contentTypeName = (await text({
|
|
222
|
+
message: 'Enter a name for the content type for Experiences',
|
|
223
|
+
initialValue: CONSTANTS.contentType,
|
|
224
|
+
validate(input) {
|
|
225
|
+
if (input.length === 0)
|
|
226
|
+
return `Value is required!`;
|
|
227
|
+
if (input.length > 50)
|
|
228
|
+
return 'Value must be 50 characters or less.';
|
|
229
|
+
},
|
|
230
|
+
}));
|
|
231
|
+
onCancel(contentTypeName);
|
|
232
|
+
contentTypeId = generateContentTypeId(contentTypeName);
|
|
233
|
+
await ctflClient.createContentType(contentTypeName, contentTypeId);
|
|
234
|
+
}
|
|
235
|
+
contentEntryId = await ctflClient.getContentEntry(CONSTANTS.slug, contentTypeId);
|
|
236
|
+
if (!contentEntryId) {
|
|
237
|
+
contentEntryId = await ctflClient.createContentEntry(CONSTANTS.title, CONSTANTS.slug, contentTypeId);
|
|
238
|
+
}
|
|
239
|
+
const previewEnvironments = await ctflClient.getPreviewEnvironments();
|
|
240
|
+
const previewEnv = previewEnvironments.find((item) => item.url === `http://localhost:${variant.devPort}`);
|
|
241
|
+
if (previewEnvironments.length === 0 || !previewEnv) {
|
|
242
|
+
spinner.start('No content preview environments for Studio Experiences currently found, creating one.');
|
|
243
|
+
await ctflClient.createPreviewEnvironment(variant.devPort, contentTypeName, contentTypeId);
|
|
244
|
+
spinner.stop('Content preview environment created!');
|
|
245
|
+
}
|
|
246
|
+
else if (previewEnv) {
|
|
247
|
+
log.message('Using existing content preview environment for Studio Experiences.');
|
|
248
|
+
ctflClient.previewEnvironment = previewEnv;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
const projectDir = fsClient.getProjectDir(projectName);
|
|
252
|
+
spinner.start(`Creating a new project using ${variant.display}, this might take a minute ⏰`);
|
|
253
|
+
await fsClient.createProject(variant, projectName);
|
|
254
|
+
spinner.stop('Done creating project and installing dependencies!');
|
|
255
|
+
const envFileData = useExistingSpace && contentTypeId
|
|
256
|
+
? ctflClient.getEnvFileData(contentTypeId)
|
|
257
|
+
: {
|
|
258
|
+
environment: ctflClient.env?.id ?? CONSTANTS.environment,
|
|
259
|
+
spaceId: '*YOUR SPACE ID*',
|
|
260
|
+
accessToken: '*YOUR ACCESS TOKEN*',
|
|
261
|
+
previewAccessToken: '*YOUR PREVIEW ACCESS TOKEN*',
|
|
262
|
+
experienceTypeId: '*YOUR EXPERIENCE CONTENT TYPE ID*',
|
|
263
|
+
};
|
|
264
|
+
fsClient.copyEnvFile(projectDir, envFileData);
|
|
265
|
+
const outroMessages = [
|
|
266
|
+
'🚀 Your project is ready!\n',
|
|
267
|
+
useExistingSpace && contentEntryId
|
|
268
|
+
? `* Launch Contentful Studio Experiences: https://app.${args.host}/spaces/${ctflClient.space?.id}/experiences/${contentEntryId}`
|
|
269
|
+
: '* Launch Contentful and navigate to Experiences: https://app.${args.host}/',
|
|
270
|
+
`* Navigate to your project folder using the terminal: \`cd ${projectName}\``,
|
|
271
|
+
...(useExistingSpace
|
|
272
|
+
? []
|
|
273
|
+
: ['* Update your .env.local config file with the necessary environment variables.']),
|
|
274
|
+
'* Start your project by running `npm run dev` in the terminal.',
|
|
275
|
+
'* Once your project is running, reload the Studio Experiences canvas.\n',
|
|
276
|
+
`For additional help, refer to the docs: https://www.contentful.com/developers/docs/experiences/set-up-experiences-sdk/`,
|
|
277
|
+
];
|
|
278
|
+
outro(outroMessages.join('\n'));
|
|
279
|
+
if (args.dev) {
|
|
280
|
+
const shouldCleanup = await confirm({
|
|
281
|
+
message: 'Cleanup?',
|
|
282
|
+
});
|
|
283
|
+
onCancel(shouldCleanup);
|
|
284
|
+
if (shouldCleanup) {
|
|
285
|
+
fsClient.deleteDirectory(projectDir);
|
|
286
|
+
if (!args.token) {
|
|
287
|
+
await ctflClient.deleteAuthToken();
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
catch (e) {
|
|
293
|
+
console.log(e);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/models.d.ts
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
type ColorFunc = (str: string | number) => string;
|
|
2
|
+
export interface Framework {
|
|
3
|
+
name: string;
|
|
4
|
+
display: string;
|
|
5
|
+
color: ColorFunc;
|
|
6
|
+
variants: FrameworkVariant[];
|
|
7
|
+
}
|
|
8
|
+
export interface FrameworkVariant {
|
|
9
|
+
name: string;
|
|
10
|
+
display: string;
|
|
11
|
+
color: ColorFunc;
|
|
12
|
+
installCommand: string;
|
|
13
|
+
pathsToCopy: string[];
|
|
14
|
+
defaultDir: string;
|
|
15
|
+
devPort: string;
|
|
16
|
+
templateDir: string;
|
|
17
|
+
additionalDeps?: string[];
|
|
18
|
+
}
|
|
19
|
+
export declare const allFrameworks: Framework[];
|
|
20
|
+
export type EnvFileData = {
|
|
21
|
+
environment: string;
|
|
22
|
+
spaceId: string;
|
|
23
|
+
accessToken: string;
|
|
24
|
+
previewAccessToken: string;
|
|
25
|
+
experienceTypeId: string;
|
|
26
|
+
};
|
|
27
|
+
export {};
|
package/dist/models.js
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import kleur from 'kleur';
|
|
2
|
+
export const allFrameworks = [
|
|
3
|
+
{
|
|
4
|
+
name: 'react',
|
|
5
|
+
display: 'React',
|
|
6
|
+
color: kleur.cyan,
|
|
7
|
+
variants: [
|
|
8
|
+
{
|
|
9
|
+
name: 'vite-ts',
|
|
10
|
+
display: 'React Vite + TypeScript',
|
|
11
|
+
color: kleur.white,
|
|
12
|
+
installCommand: 'npm create vite@latest PROJECT_NAME -- --template react-ts',
|
|
13
|
+
pathsToCopy: ['src', '.env.template'],
|
|
14
|
+
defaultDir: 'studio-experiences-react-app',
|
|
15
|
+
devPort: '5173',
|
|
16
|
+
templateDir: 'react-vite-ts',
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
name: 'next-demo-marketing',
|
|
20
|
+
display: 'NextJS Marketing Demo',
|
|
21
|
+
color: kleur.white,
|
|
22
|
+
installCommand: 'npx create-next-app@latest PROJECT_NAME --ts --eslint --app --src-dir --no-import-alias --no-tailwind',
|
|
23
|
+
pathsToCopy: ['src', '.env.template', 'next.config.mjs'],
|
|
24
|
+
defaultDir: 'nextjs-marketing-demo',
|
|
25
|
+
devPort: '3000',
|
|
26
|
+
templateDir: 'nextjs-marketing-demo',
|
|
27
|
+
additionalDeps: ['next-i18n-router'],
|
|
28
|
+
},
|
|
29
|
+
],
|
|
30
|
+
},
|
|
31
|
+
];
|
|
32
|
+
//# sourceMappingURL=models.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.js","sourceRoot":"","sources":["../src/models.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAuB1B,MAAM,CAAC,MAAM,aAAa,GAAgB;IACxC;QACE,IAAI,EAAE,OAAO;QACb,OAAO,EAAE,OAAO;QAChB,KAAK,EAAE,KAAK,CAAC,IAAI;QACjB,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,yBAAyB;gBAClC,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,cAAc,EAAE,4DAA4D;gBAC5E,WAAW,EAAE,CAAC,KAAK,EAAE,eAAe,CAAC;gBACrC,UAAU,EAAE,8BAA8B;gBAC1C,OAAO,EAAE,MAAM;gBACf,WAAW,EAAE,eAAe;aAC7B;YACD;gBACE,IAAI,EAAE,qBAAqB;gBAC3B,OAAO,EAAE,uBAAuB;gBAChC,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,cAAc,EACZ,uGAAuG;gBACzG,WAAW,EAAE,CAAC,KAAK,EAAE,eAAe,EAAE,iBAAiB,CAAC;gBACxD,UAAU,EAAE,uBAAuB;gBACnC,OAAO,EAAE,MAAM;gBACf,WAAW,EAAE,uBAAuB;gBACpC,cAAc,EAAE,CAAC,kBAAkB,CAAC;aACrC;SACF;KACF;CACF,CAAC"}
|
package/dist/utils.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Converts a string to a valid Content Type ID format, i.e. only alphanumeric characters
|
|
3
|
+
* @param {string} input - The input string to be converted.
|
|
4
|
+
* @returns {string} The converted string.
|
|
5
|
+
*/
|
|
6
|
+
export declare const generateContentTypeId: (input: string) => string;
|
|
7
|
+
export declare const isValidPackageName: (projectName: string) => boolean;
|
package/dist/utils.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Converts a string to a valid Content Type ID format, i.e. only alphanumeric characters
|
|
3
|
+
* @param {string} input - The input string to be converted.
|
|
4
|
+
* @returns {string} The converted string.
|
|
5
|
+
*/
|
|
6
|
+
export const generateContentTypeId = (input) => {
|
|
7
|
+
// Remove non-alphanumeric characters and split by them
|
|
8
|
+
const words = input.split(/[\W_]+/);
|
|
9
|
+
// Convert the first word to lowercase, and the rest to lowercase with the first letter capitalized
|
|
10
|
+
return words
|
|
11
|
+
.map((word, index) => {
|
|
12
|
+
if (index === 0) {
|
|
13
|
+
return word.toLowerCase();
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();
|
|
17
|
+
}
|
|
18
|
+
})
|
|
19
|
+
.join('');
|
|
20
|
+
};
|
|
21
|
+
export const isValidPackageName = (projectName) => {
|
|
22
|
+
return /^(?:@[a-z\d\-*~][a-z\d\-*._~]*\/)?[a-z\d\-~][a-z\d\-._~]*$/.test(projectName);
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,KAAa,EAAU,EAAE;IAC7D,uDAAuD;IACvD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAEpC,mGAAmG;IACnG,OAAO,KAAK;SACT,GAAG,CAAC,CAAC,IAAY,EAAE,KAAa,EAAE,EAAE;QACnC,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;YAChB,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;QAC5B,CAAC;aAAM,CAAC;YACN,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QACpE,CAAC;IACH,CAAC,CAAC;SACD,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,WAAmB,EAAE,EAAE;IACxD,OAAO,4DAA4D,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;AACxF,CAAC,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@contentful/create-studio-experiences",
|
|
3
|
+
"version": "1.37.1-dev-20250425T1024-b8bfdfb.0",
|
|
4
|
+
"description": "A CLI tool to get up and running with Contentful Studio Experiences quickly",
|
|
5
|
+
"homepage": "https://github.com/contentful/experience-builder/tree/next/packages/create-studio-experiences#readme",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/contentful/experience-builder.git",
|
|
9
|
+
"directory": "packages/create-studio-experiences"
|
|
10
|
+
},
|
|
11
|
+
"bugs": {
|
|
12
|
+
"url": "https://github.com/contentful/experience-builder/issues"
|
|
13
|
+
},
|
|
14
|
+
"type": "module",
|
|
15
|
+
"publishConfig": {
|
|
16
|
+
"registry": "https://npm.pkg.github.com/"
|
|
17
|
+
},
|
|
18
|
+
"main": "./dist/index.js",
|
|
19
|
+
"module": "./dist/esm/index.js",
|
|
20
|
+
"types": "./dist/index.d.ts",
|
|
21
|
+
"files": [
|
|
22
|
+
"readme.md",
|
|
23
|
+
"package.json",
|
|
24
|
+
"dist/**/*.*",
|
|
25
|
+
"bin/**/*.*",
|
|
26
|
+
"templates/**/*.*"
|
|
27
|
+
],
|
|
28
|
+
"scripts": {
|
|
29
|
+
"precreate": "npm run copy-templates",
|
|
30
|
+
"create": "node ./dist/index.js -d",
|
|
31
|
+
"postcreate": "npm run delete-templates",
|
|
32
|
+
"copy-templates": "node ./dist/copyTemplates.js",
|
|
33
|
+
"delete-templates": "rimraf ./templates",
|
|
34
|
+
"dev": "tsc --watch",
|
|
35
|
+
"_prebuild": "npm uninstall -g && rimraf dist",
|
|
36
|
+
"prebuild": "rimraf dist",
|
|
37
|
+
"prepack": "npm run copy-templates",
|
|
38
|
+
"postpack": "npm run delete-templates",
|
|
39
|
+
"build": "tsc",
|
|
40
|
+
"lint": "eslint src --ext '.ts,.tsx,.js,.jsx' --max-warnings 0 --ignore-path ../../.eslintignore",
|
|
41
|
+
"lint:fix": "eslint src --ext '.ts,.tsx,.js,.jsx' --fix",
|
|
42
|
+
"test": "echo \"Error: no test specified\" && exit 1",
|
|
43
|
+
"depcruise": "depcruise src",
|
|
44
|
+
"create-studio-experiences": "node dist/index.js"
|
|
45
|
+
},
|
|
46
|
+
"author": "Contentful GmbH",
|
|
47
|
+
"license": "MIT",
|
|
48
|
+
"devDependencies": {
|
|
49
|
+
"@types/yargs": "^17.0.28",
|
|
50
|
+
"eslint-plugin-prettier": "^5.0.1",
|
|
51
|
+
"typescript": "^5.2.2"
|
|
52
|
+
},
|
|
53
|
+
"bin": {
|
|
54
|
+
"create-studio-experiences": "./dist/index.js"
|
|
55
|
+
},
|
|
56
|
+
"dependencies": {
|
|
57
|
+
"@clack/prompts": "^0.7.0",
|
|
58
|
+
"cross-spawn": "^7.0.5",
|
|
59
|
+
"kleur": "^4.1.5",
|
|
60
|
+
"open": "^10.1.0",
|
|
61
|
+
"yargs": "^17.7.2"
|
|
62
|
+
},
|
|
63
|
+
"gitHead": "bb4537c49db187bbf8e801750c16ddab649477a1"
|
|
64
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# Experiences NextJS Marketing Demo
|
|
2
|
+
|
|
3
|
+
This app is a starter template for Studio Experiences, showcasing an example marketing website.
|
|
4
|
+
|
|
5
|
+
## How to Start
|
|
6
|
+
|
|
7
|
+
1. Copy the `.env.template` file to `.env` in this project directory and set the environment variables as described in [Config](#config)
|
|
8
|
+
2. Set the content preview URL of the experience type to `http://localhost:3000/{entry.fields.slug}`
|
|
9
|
+
3. Run `npm run dev`
|
|
10
|
+
|
|
11
|
+
## Config
|
|
12
|
+
|
|
13
|
+
The app reads several environment variables to configure its behavior:
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
NEXT_PUBLIC_CTFL_ENVIRONMENT=<environment>
|
|
17
|
+
NEXT_PUBLIC_CTFL_SPACE=<space>
|
|
18
|
+
NEXT_PUBLIC_CTFL_ACCESS_TOKEN=<access token>
|
|
19
|
+
NEXT_PUBLIC_CTFL_PREVIEW_ACCESS_TOKEN=<preview access token>
|
|
20
|
+
NEXT_PUBLIC_CTFL_EXPERIENCE_TYPE=<experience type>
|
|
21
|
+
NEXT_PUBLIC_CTFL_DOMAIN=<domain> (contentful.com (prod) or flinkly.com (staging))
|
|
22
|
+
```
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/** @type {import('next').NextConfig} */
|
|
2
|
+
const nextConfig = {
|
|
3
|
+
async redirects() {
|
|
4
|
+
return [
|
|
5
|
+
{
|
|
6
|
+
source: '/',
|
|
7
|
+
destination: '/home-page',
|
|
8
|
+
permanent: true,
|
|
9
|
+
},
|
|
10
|
+
];
|
|
11
|
+
},
|
|
12
|
+
webpack(config) {
|
|
13
|
+
config.module.rules.push({
|
|
14
|
+
test: /\.svg$/,
|
|
15
|
+
use: ['@svgr/webpack'],
|
|
16
|
+
});
|
|
17
|
+
return config;
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
export default nextConfig;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import Experience from '@/components/Experience';
|
|
2
|
+
import Header from '@/components/Header/Header';
|
|
3
|
+
import Footer from '@/components/Footer/Footer';
|
|
4
|
+
import { getExperience } from '@/getExperience';
|
|
5
|
+
import { detachExperienceStyles } from '@contentful/experiences-sdk-react';
|
|
6
|
+
import { Layout } from 'antd';
|
|
7
|
+
import {
|
|
8
|
+
Footer as LayoutFooter,
|
|
9
|
+
Header as LayoutHeader,
|
|
10
|
+
Content as LayoutContent,
|
|
11
|
+
} from 'antd/es/layout/layout';
|
|
12
|
+
import styles from '@/app/page.module.css';
|
|
13
|
+
import '../../../studio-config';
|
|
14
|
+
|
|
15
|
+
type Page = {
|
|
16
|
+
params: { locale?: string; slug?: string; preview?: string };
|
|
17
|
+
searchParams: { [key: string]: string | string[] | undefined };
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export default async function ExperiencePage({ params, searchParams }: Page) {
|
|
21
|
+
const { locale = 'en-US', slug = 'home-page' } = params || {};
|
|
22
|
+
const { isPreview, expEditorMode } = searchParams;
|
|
23
|
+
const preview = isPreview === 'true';
|
|
24
|
+
const editorMode = expEditorMode === 'true';
|
|
25
|
+
const { experience, error } = await getExperience(slug, locale, preview, editorMode);
|
|
26
|
+
|
|
27
|
+
if (error) {
|
|
28
|
+
return <>{error.message}</>;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// extract the styles from the experience
|
|
32
|
+
const stylesheet = experience ? detachExperienceStyles(experience) : null;
|
|
33
|
+
|
|
34
|
+
// experience currently needs to be stringified manually to be passed to the component
|
|
35
|
+
const experienceJSON = experience ? JSON.stringify(experience) : null;
|
|
36
|
+
return (
|
|
37
|
+
<Layout className={styles.layout}>
|
|
38
|
+
{stylesheet && <style>{stylesheet}</style>}
|
|
39
|
+
<LayoutHeader className={styles.header}>
|
|
40
|
+
<Header />
|
|
41
|
+
</LayoutHeader>
|
|
42
|
+
<LayoutContent className={styles.content}>
|
|
43
|
+
<Experience experienceJSON={experienceJSON} locale={locale} />
|
|
44
|
+
</LayoutContent>
|
|
45
|
+
<LayoutFooter className={styles.footer}>
|
|
46
|
+
<Footer />
|
|
47
|
+
</LayoutFooter>
|
|
48
|
+
</Layout>
|
|
49
|
+
);
|
|
50
|
+
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
:root {
|
|
2
|
+
/**
|
|
3
|
+
* Colors
|
|
4
|
+
* https://ant.design/docs/spec/colors
|
|
5
|
+
*/
|
|
6
|
+
--gray-1: #fff;
|
|
7
|
+
--gray-5: #d9d9d9;
|
|
8
|
+
--gray-7: #8c8c8c;
|
|
9
|
+
--gray-9: #434343;
|
|
10
|
+
--gray-12: #141414;
|
|
11
|
+
--orange-2: #ffe7ba;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
html,
|
|
15
|
+
body {
|
|
16
|
+
max-width: 100vw;
|
|
17
|
+
overflow-x: hidden;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
body {
|
|
21
|
+
color: var(--gray-12);
|
|
22
|
+
background: var(--gray-1);
|
|
23
|
+
font-family: Arial, Helvetica, sans-serif;
|
|
24
|
+
-webkit-font-smoothing: antialiased;
|
|
25
|
+
-moz-osx-font-smoothing: grayscale;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
* {
|
|
29
|
+
box-sizing: border-box;
|
|
30
|
+
padding: 0;
|
|
31
|
+
margin: 0;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
a {
|
|
35
|
+
color: inherit;
|
|
36
|
+
text-decoration: none;
|
|
37
|
+
}
|