@slicemachine/adapter-next 0.3.2-dev-next-release.5 → 0.3.2-dev-next-release.7
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/hooks/project-init.cjs +330 -58
- package/dist/hooks/project-init.cjs.map +1 -1
- package/dist/hooks/project-init.js +331 -59
- package/dist/hooks/project-init.js.map +1 -1
- package/dist/hooks/slice-create.cjs +3 -2
- package/dist/hooks/slice-create.cjs.map +1 -1
- package/dist/hooks/slice-create.js +3 -2
- package/dist/hooks/slice-create.js.map +1 -1
- package/dist/hooks/sliceSimulator-setup-read.cjs +3 -5
- package/dist/hooks/sliceSimulator-setup-read.cjs.map +1 -1
- package/dist/hooks/sliceSimulator-setup-read.js +3 -5
- package/dist/hooks/sliceSimulator-setup-read.js.map +1 -1
- package/dist/lib/checkHasAppRouter.cjs +10 -0
- package/dist/lib/checkHasAppRouter.cjs.map +1 -0
- package/dist/lib/checkHasAppRouter.d.ts +5 -0
- package/dist/lib/checkHasAppRouter.js +10 -0
- package/dist/lib/checkHasAppRouter.js.map +1 -0
- package/dist/lib/checkHasSrcDirectory.cjs +8 -0
- package/dist/lib/checkHasSrcDirectory.cjs.map +1 -0
- package/dist/lib/checkHasSrcDirectory.d.ts +5 -0
- package/dist/lib/checkHasSrcDirectory.js +8 -0
- package/dist/lib/checkHasSrcDirectory.js.map +1 -0
- package/dist/lib/getJSFileExtension.cjs +16 -0
- package/dist/lib/getJSFileExtension.cjs.map +1 -0
- package/dist/lib/getJSFileExtension.d.ts +7 -0
- package/dist/lib/getJSFileExtension.js +16 -0
- package/dist/lib/getJSFileExtension.js.map +1 -0
- package/dist/lib/upsertGlobalContentTypes.cjs +1 -1
- package/dist/lib/upsertGlobalContentTypes.cjs.map +1 -1
- package/dist/lib/upsertGlobalContentTypes.js +1 -1
- package/dist/lib/upsertGlobalContentTypes.js.map +1 -1
- package/dist/lib/upsertSliceLibraryIndexFile.cjs +3 -3
- package/dist/lib/upsertSliceLibraryIndexFile.cjs.map +1 -1
- package/dist/lib/upsertSliceLibraryIndexFile.js +3 -3
- package/dist/lib/upsertSliceLibraryIndexFile.js.map +1 -1
- package/dist/types.d.ts +40 -0
- package/package.json +3 -4
- package/src/hooks/project-init.ts +412 -64
- package/src/hooks/slice-create.ts +3 -5
- package/src/hooks/sliceSimulator-setup-read.ts +3 -5
- package/src/lib/checkHasAppRouter.ts +22 -0
- package/src/lib/checkHasSrcDirectory.ts +15 -0
- package/src/lib/getJSFileExtension.ts +29 -0
- package/src/lib/upsertGlobalContentTypes.ts +3 -1
- package/src/lib/upsertSliceLibraryIndexFile.ts +3 -4
- package/src/types.ts +44 -0
- package/dist/lib/getJSOrTSXFileExtension.cjs +0 -18
- package/dist/lib/getJSOrTSXFileExtension.cjs.map +0 -1
- package/dist/lib/getJSOrTSXFileExtension.d.ts +0 -8
- package/dist/lib/getJSOrTSXFileExtension.js +0 -18
- package/dist/lib/getJSOrTSXFileExtension.js.map +0 -1
- package/src/lib/getJSOrTSXFileExtension.ts +0 -26
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import * as fs from "node:fs/promises";
|
|
2
2
|
import * as path from "node:path";
|
|
3
|
-
import {
|
|
3
|
+
import { source } from "common-tags";
|
|
4
|
+
import { checkHasAppRouter } from "../lib/checkHasAppRouter.js";
|
|
5
|
+
import { checkHasSrcDirectory } from "../lib/checkHasSrcDirectory.js";
|
|
6
|
+
import { checkIsTypeScriptProject } from "../lib/checkIsTypeScriptProject.js";
|
|
4
7
|
import { checkPathExists } from "../lib/checkPathExists.js";
|
|
5
|
-
import {
|
|
8
|
+
import { getJSFileExtension } from "../lib/getJSFileExtension.js";
|
|
6
9
|
import { rejectIfNecessary } from "../lib/rejectIfNecessary.js";
|
|
7
|
-
import { checkIsTypeScriptProject } from "../lib/checkIsTypeScriptProject.js";
|
|
8
10
|
const installDependencies = async ({ installDependencies: installDependencies2 }) => {
|
|
9
11
|
await installDependencies2({
|
|
10
12
|
dependencies: {
|
|
@@ -19,16 +21,126 @@ const createPrismicIOFile = async ({ helpers, options }) => {
|
|
|
19
21
|
helpers,
|
|
20
22
|
options
|
|
21
23
|
});
|
|
22
|
-
const
|
|
24
|
+
const hasSrcDirectory = await checkHasSrcDirectory({ helpers });
|
|
25
|
+
const hasAppRouter = await checkHasAppRouter({ helpers });
|
|
26
|
+
const extension = await getJSFileExtension({ helpers, options });
|
|
27
|
+
const filename = `prismicio.${extension}`;
|
|
28
|
+
const filePath = hasSrcDirectory ? helpers.joinPathFromRoot("src", filename) : helpers.joinPathFromRoot(filename);
|
|
23
29
|
if (await checkPathExists(filePath)) {
|
|
24
30
|
return;
|
|
25
31
|
}
|
|
32
|
+
let createClientContents;
|
|
33
|
+
if (hasAppRouter) {
|
|
34
|
+
if (isTypeScriptProject) {
|
|
35
|
+
createClientContents = source`
|
|
36
|
+
/**
|
|
37
|
+
* Creates a Prismic client for the project's repository. The client is used to
|
|
38
|
+
* query content from the Prismic API.
|
|
39
|
+
*
|
|
40
|
+
* @param config - Configuration for the Prismic client.
|
|
41
|
+
*/
|
|
42
|
+
export const createClient = (config: prismicNext.CreateClientConfig = {}) => {
|
|
43
|
+
const client = prismic.createClient(repositoryName, {
|
|
44
|
+
routes,
|
|
45
|
+
fetchOptions:
|
|
46
|
+
process.env.NODE_ENV === 'production'
|
|
47
|
+
? { next: { tags: ['prismic'] }, cache: 'force-cache' }
|
|
48
|
+
: { next: { revalidate: 5 } },
|
|
49
|
+
...config,
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
prismicNext.enableAutoPreviews({
|
|
53
|
+
client,
|
|
54
|
+
previewData: config.previewData,
|
|
55
|
+
req: config.req,
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
return client;
|
|
59
|
+
};
|
|
60
|
+
`;
|
|
61
|
+
} else {
|
|
62
|
+
createClientContents = source`
|
|
63
|
+
/**
|
|
64
|
+
* Creates a Prismic client for the project's repository. The client is used to
|
|
65
|
+
* query content from the Prismic API.
|
|
66
|
+
*
|
|
67
|
+
* @param {prismicNext.CreateClientConfig} config - Configuration for the Prismic client.
|
|
68
|
+
*/
|
|
69
|
+
export const createClient = (config = {}) => {
|
|
70
|
+
const client = prismic.createClient(repositoryName, {
|
|
71
|
+
routes,
|
|
72
|
+
fetchOptions:
|
|
73
|
+
process.env.NODE_ENV === 'production'
|
|
74
|
+
? { next: { tags: ['prismic'] }, cache: 'force-cache' }
|
|
75
|
+
: { next: { revalidate: 5 } },
|
|
76
|
+
...config,
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
prismicNext.enableAutoPreviews({
|
|
80
|
+
client,
|
|
81
|
+
previewData: config.previewData,
|
|
82
|
+
req: config.req,
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
return client;
|
|
86
|
+
};
|
|
87
|
+
`;
|
|
88
|
+
}
|
|
89
|
+
} else {
|
|
90
|
+
if (isTypeScriptProject) {
|
|
91
|
+
createClientContents = source`
|
|
92
|
+
/**
|
|
93
|
+
* Creates a Prismic client for the project's repository. The client is used to
|
|
94
|
+
* query content from the Prismic API.
|
|
95
|
+
*
|
|
96
|
+
* @param config - Configuration for the Prismic client.
|
|
97
|
+
*/
|
|
98
|
+
export const createClient = (config: prismicNext.CreateClientConfig = {}) => {
|
|
99
|
+
const client = prismic.createClient(repositoryName, {
|
|
100
|
+
routes,
|
|
101
|
+
...config,
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
prismicNext.enableAutoPreviews({
|
|
105
|
+
client,
|
|
106
|
+
previewData: config.previewData,
|
|
107
|
+
req: config.req,
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
return client;
|
|
111
|
+
};
|
|
112
|
+
`;
|
|
113
|
+
} else {
|
|
114
|
+
createClientContents = source`
|
|
115
|
+
/**
|
|
116
|
+
* Creates a Prismic client for the project's repository. The client is used to
|
|
117
|
+
* query content from the Prismic API.
|
|
118
|
+
*
|
|
119
|
+
* @param {prismicNext.CreateClientConfig} config - Configuration for the Prismic client.
|
|
120
|
+
*/
|
|
121
|
+
export const createClient = (config = {}) => {
|
|
122
|
+
const client = prismic.createClient(repositoryName, {
|
|
123
|
+
routes,
|
|
124
|
+
...config,
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
prismicNext.enableAutoPreviews({
|
|
128
|
+
client,
|
|
129
|
+
previewData: config.previewData,
|
|
130
|
+
req: config.req,
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
return client;
|
|
134
|
+
};
|
|
135
|
+
`;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
26
138
|
let contents;
|
|
27
139
|
if (isTypeScriptProject) {
|
|
28
|
-
contents =
|
|
140
|
+
contents = source`
|
|
29
141
|
import * as prismic from "@prismicio/client";
|
|
30
142
|
import * as prismicNext from "@prismicio/next";
|
|
31
|
-
import config from "
|
|
143
|
+
import config from "${hasSrcDirectory ? ".." : "."}/slicemachine.config.json";
|
|
32
144
|
|
|
33
145
|
/**
|
|
34
146
|
* The project's Prismic repository name.
|
|
@@ -36,8 +148,7 @@ const createPrismicIOFile = async ({ helpers, options }) => {
|
|
|
36
148
|
export const repositoryName = config.repositoryName;
|
|
37
149
|
|
|
38
150
|
/**
|
|
39
|
-
* A list of Route Resolver objects that define how a document's \`url\` field
|
|
40
|
-
* is resolved.
|
|
151
|
+
* A list of Route Resolver objects that define how a document's \`url\` field is resolved.
|
|
41
152
|
*
|
|
42
153
|
* {@link https://prismic.io/docs/route-resolver#route-resolver}
|
|
43
154
|
*/
|
|
@@ -53,32 +164,13 @@ const createPrismicIOFile = async ({ helpers, options }) => {
|
|
|
53
164
|
},
|
|
54
165
|
];
|
|
55
166
|
|
|
56
|
-
|
|
57
|
-
* Creates a Prismic client for the project's repository. The client is used to
|
|
58
|
-
* query content from the Prismic API.
|
|
59
|
-
*
|
|
60
|
-
* @param config - Configuration for the Prismic client.
|
|
61
|
-
*/
|
|
62
|
-
export const createClient = (config: prismicNext.CreateClientConfig = {}) => {
|
|
63
|
-
const client = prismic.createClient(repositoryName, {
|
|
64
|
-
routes,
|
|
65
|
-
...config,
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
prismicNext.enableAutoPreviews({
|
|
69
|
-
client,
|
|
70
|
-
previewData: config.previewData,
|
|
71
|
-
req: config.req,
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
return client;
|
|
75
|
-
};
|
|
167
|
+
${createClientContents}
|
|
76
168
|
`;
|
|
77
169
|
} else {
|
|
78
|
-
contents =
|
|
170
|
+
contents = source`
|
|
79
171
|
import * as prismic from "@prismicio/client";
|
|
80
172
|
import * as prismicNext from "@prismicio/next";
|
|
81
|
-
import config from "
|
|
173
|
+
import config from "${hasSrcDirectory ? ".." : "."}/slicemachine.config.json";
|
|
82
174
|
|
|
83
175
|
/**
|
|
84
176
|
* The project's Prismic repository name.
|
|
@@ -86,8 +178,7 @@ const createPrismicIOFile = async ({ helpers, options }) => {
|
|
|
86
178
|
export const repositoryName = config.repositoryName;
|
|
87
179
|
|
|
88
180
|
/**
|
|
89
|
-
* A list of Route Resolver objects that define how a document's \`url\` field
|
|
90
|
-
* is resolved.
|
|
181
|
+
* A list of Route Resolver objects that define how a document's \`url\` field is resolved.
|
|
91
182
|
*
|
|
92
183
|
* {@link https://prismic.io/docs/route-resolver#route-resolver}
|
|
93
184
|
*
|
|
@@ -105,26 +196,7 @@ const createPrismicIOFile = async ({ helpers, options }) => {
|
|
|
105
196
|
},
|
|
106
197
|
];
|
|
107
198
|
|
|
108
|
-
|
|
109
|
-
* Creates a Prismic client for the project's repository. The client is used to
|
|
110
|
-
* query content from the Prismic API.
|
|
111
|
-
*
|
|
112
|
-
* @param {prismicNext.CreateClientConfig} config - Configuration for the Prismic client.
|
|
113
|
-
*/
|
|
114
|
-
export const createClient = (config = {}) => {
|
|
115
|
-
const client = prismic.createClient(repositoryName, {
|
|
116
|
-
routes,
|
|
117
|
-
...config,
|
|
118
|
-
});
|
|
119
|
-
|
|
120
|
-
prismicNext.enableAutoPreviews({
|
|
121
|
-
client,
|
|
122
|
-
previewData: config.previewData,
|
|
123
|
-
req: config.req,
|
|
124
|
-
});
|
|
125
|
-
|
|
126
|
-
return client;
|
|
127
|
-
};
|
|
199
|
+
${createClientContents}
|
|
128
200
|
`;
|
|
129
201
|
}
|
|
130
202
|
if (options.format) {
|
|
@@ -133,17 +205,22 @@ const createPrismicIOFile = async ({ helpers, options }) => {
|
|
|
133
205
|
await fs.writeFile(filePath, contents);
|
|
134
206
|
};
|
|
135
207
|
const createSliceSimulatorPage = async ({ helpers, options }) => {
|
|
136
|
-
const
|
|
137
|
-
const
|
|
208
|
+
const hasSrcDirectory = await checkHasSrcDirectory({ helpers });
|
|
209
|
+
const hasAppRouter = await checkHasAppRouter({ helpers });
|
|
210
|
+
const extension = await getJSFileExtension({ helpers, options, jsx: true });
|
|
211
|
+
const filePath = helpers.joinPathFromRoot(...[
|
|
212
|
+
hasSrcDirectory ? "src" : void 0,
|
|
213
|
+
hasAppRouter ? `app/slice-simulator/page.${extension}` : `pages/slice-simulator.${extension}`
|
|
214
|
+
].filter((segment) => Boolean(segment)));
|
|
138
215
|
if (await checkPathExists(filePath)) {
|
|
139
216
|
return;
|
|
140
217
|
}
|
|
141
218
|
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
|
142
|
-
let contents =
|
|
219
|
+
let contents = source`
|
|
143
220
|
import { SliceSimulator } from "@slicemachine/adapter-next/simulator";
|
|
144
221
|
import { SliceZone } from "@prismicio/react";
|
|
145
222
|
|
|
146
|
-
import { components } from "
|
|
223
|
+
import { components } from "${hasAppRouter ? "../.." : ".."}/slices";
|
|
147
224
|
|
|
148
225
|
export default function SliceSimulatorPage() {
|
|
149
226
|
return (
|
|
@@ -158,11 +235,206 @@ const createSliceSimulatorPage = async ({ helpers, options }) => {
|
|
|
158
235
|
}
|
|
159
236
|
await fs.writeFile(filePath, contents);
|
|
160
237
|
};
|
|
238
|
+
const createPreviewRoute = async ({ helpers, options }) => {
|
|
239
|
+
const hasSrcDirectory = await checkHasSrcDirectory({ helpers });
|
|
240
|
+
const hasAppRouter = await checkHasAppRouter({ helpers });
|
|
241
|
+
const isTypeScriptProject = await checkIsTypeScriptProject({
|
|
242
|
+
helpers,
|
|
243
|
+
options
|
|
244
|
+
});
|
|
245
|
+
const extension = await getJSFileExtension({ helpers, options });
|
|
246
|
+
const filePath = helpers.joinPathFromRoot(...[
|
|
247
|
+
hasSrcDirectory ? "src" : void 0,
|
|
248
|
+
hasAppRouter ? `app/api/preview/route.${extension}` : `pages/api/preview.${extension}`
|
|
249
|
+
].filter((segment) => Boolean(segment)));
|
|
250
|
+
if (await checkPathExists(filePath)) {
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
let contents;
|
|
254
|
+
if (hasAppRouter) {
|
|
255
|
+
if (isTypeScriptProject) {
|
|
256
|
+
contents = source`
|
|
257
|
+
import { NextRequest } from "next/server";
|
|
258
|
+
import { draftMode } from "next/headers";
|
|
259
|
+
import { redirectToPreviewURL } from "@prismicio/next";
|
|
260
|
+
|
|
261
|
+
import { createClient } from "../../../prismicio";
|
|
262
|
+
|
|
263
|
+
export async function GET(request: NextRequest) {
|
|
264
|
+
const client = createClient();
|
|
265
|
+
|
|
266
|
+
draftMode().enable();
|
|
267
|
+
|
|
268
|
+
await redirectToPreviewURL({ client, request });
|
|
269
|
+
}
|
|
270
|
+
`;
|
|
271
|
+
} else {
|
|
272
|
+
contents = source`
|
|
273
|
+
import { draftMode } from "next/headers";
|
|
274
|
+
import { redirectToPreviewURL } from "@prismicio/next";
|
|
275
|
+
|
|
276
|
+
import { createClient } from "../../../prismicio";
|
|
277
|
+
|
|
278
|
+
export async function GET(request) {
|
|
279
|
+
const client = createClient();
|
|
280
|
+
|
|
281
|
+
draftMode().enable();
|
|
282
|
+
|
|
283
|
+
await redirectToPreviewURL({ client, request });
|
|
284
|
+
}
|
|
285
|
+
`;
|
|
286
|
+
}
|
|
287
|
+
} else {
|
|
288
|
+
if (isTypeScriptProject) {
|
|
289
|
+
contents = source`
|
|
290
|
+
import { NextApiRequest, NextApiResponse } from "next";
|
|
291
|
+
import { setPreviewData, redirectToPreviewURL } from "@prismicio/next";
|
|
292
|
+
|
|
293
|
+
import { createClient } from "../../prismicio";
|
|
294
|
+
|
|
295
|
+
export default async (req: NextApiRequest, res: NextApiResponse) => {
|
|
296
|
+
const client = createClient({ req });
|
|
297
|
+
|
|
298
|
+
await setPreviewData({ req, res });
|
|
299
|
+
|
|
300
|
+
await redirectToPreviewURL({ req, res, client });
|
|
301
|
+
};
|
|
302
|
+
`;
|
|
303
|
+
} else {
|
|
304
|
+
contents = source`
|
|
305
|
+
import { setPreviewData, redirectToPreviewURL } from "@prismicio/next";
|
|
306
|
+
|
|
307
|
+
import { createClient } from "../../prismicio";
|
|
308
|
+
|
|
309
|
+
export default async (req, res) => {
|
|
310
|
+
const client = createClient({ req });
|
|
311
|
+
|
|
312
|
+
await setPreviewData({ req, res });
|
|
313
|
+
|
|
314
|
+
await redirectToPreviewURL({ req, res, client });
|
|
315
|
+
};
|
|
316
|
+
`;
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
if (options.format) {
|
|
320
|
+
contents = await helpers.format(contents, filePath);
|
|
321
|
+
}
|
|
322
|
+
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
|
323
|
+
await fs.writeFile(filePath, contents);
|
|
324
|
+
};
|
|
325
|
+
const createExitPreviewRoute = async ({ helpers, options }) => {
|
|
326
|
+
const hasSrcDirectory = await checkHasSrcDirectory({ helpers });
|
|
327
|
+
const hasAppRouter = await checkHasAppRouter({ helpers });
|
|
328
|
+
const isTypeScriptProject = await checkIsTypeScriptProject({
|
|
329
|
+
helpers,
|
|
330
|
+
options
|
|
331
|
+
});
|
|
332
|
+
const extension = await getJSFileExtension({ helpers, options });
|
|
333
|
+
const filePath = helpers.joinPathFromRoot(...[
|
|
334
|
+
hasSrcDirectory ? "src" : void 0,
|
|
335
|
+
hasAppRouter ? `app/api/exit-preview/route.${extension}` : `pages/api/exit-preview.${extension}`
|
|
336
|
+
].filter((segment) => Boolean(segment)));
|
|
337
|
+
if (await checkPathExists(filePath)) {
|
|
338
|
+
return;
|
|
339
|
+
}
|
|
340
|
+
let contents;
|
|
341
|
+
if (hasAppRouter) {
|
|
342
|
+
contents = `
|
|
343
|
+
import { exitPreview } from "@prismicio/next";
|
|
344
|
+
|
|
345
|
+
export async function GET() {
|
|
346
|
+
return await exitPreview();
|
|
347
|
+
}
|
|
348
|
+
`;
|
|
349
|
+
} else {
|
|
350
|
+
if (isTypeScriptProject) {
|
|
351
|
+
contents = source`
|
|
352
|
+
import { NextApiRequest, NextApiResponse } from "next";
|
|
353
|
+
import { exitPreview } from "@prismicio/next";
|
|
354
|
+
|
|
355
|
+
export async function handler(req: NextApiRequest, res: NextApiResponse) {
|
|
356
|
+
return await exitPreview({ req, res });
|
|
357
|
+
}
|
|
358
|
+
`;
|
|
359
|
+
} else {
|
|
360
|
+
contents = source`
|
|
361
|
+
import { exitPreview } from "@prismicio/next";
|
|
362
|
+
|
|
363
|
+
export async function handler(req, res) {
|
|
364
|
+
return await exitPreview({ req, res });
|
|
365
|
+
}
|
|
366
|
+
`;
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
if (options.format) {
|
|
370
|
+
contents = await helpers.format(contents, filePath);
|
|
371
|
+
}
|
|
372
|
+
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
|
373
|
+
await fs.writeFile(filePath, contents);
|
|
374
|
+
};
|
|
375
|
+
const modifySliceMachineConfig = async ({ helpers, options }) => {
|
|
376
|
+
var _a;
|
|
377
|
+
const hasSrcDirectory = await checkHasSrcDirectory({ helpers });
|
|
378
|
+
const project = await helpers.getProject();
|
|
379
|
+
(_a = project.config).localSliceSimulatorURL || (_a.localSliceSimulatorURL = "http://localhost:3000/slice-simulator");
|
|
380
|
+
if (hasSrcDirectory && JSON.stringify(project.config.libraries) === JSON.stringify(["./slices"])) {
|
|
381
|
+
try {
|
|
382
|
+
const entries = await fs.readdir(helpers.joinPathFromRoot("slices"));
|
|
383
|
+
if (!entries.map((entry) => path.parse(entry).name).includes("index")) {
|
|
384
|
+
project.config.libraries = ["./src/slices"];
|
|
385
|
+
}
|
|
386
|
+
} catch (error) {
|
|
387
|
+
if (error instanceof Error && "code" in error && error.code === "ENOENT") {
|
|
388
|
+
project.config.libraries = ["./src/slices"];
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
const filePath = helpers.joinPathFromRoot("slicemachine.config.json");
|
|
393
|
+
let contents = JSON.stringify(project.config);
|
|
394
|
+
if (options.format) {
|
|
395
|
+
contents = await helpers.format(contents, filePath);
|
|
396
|
+
}
|
|
397
|
+
await fs.writeFile(helpers.joinPathFromRoot("slicemachine.config.json"), contents);
|
|
398
|
+
};
|
|
399
|
+
const createRevalidateRoute = async ({ helpers, options }) => {
|
|
400
|
+
const hasAppRouter = await checkHasAppRouter({ helpers });
|
|
401
|
+
if (!hasAppRouter) {
|
|
402
|
+
return;
|
|
403
|
+
}
|
|
404
|
+
const hasSrcDirectory = await checkHasSrcDirectory({ helpers });
|
|
405
|
+
const extension = await getJSFileExtension({ helpers, options });
|
|
406
|
+
const filePath = helpers.joinPathFromRoot(...[
|
|
407
|
+
hasSrcDirectory ? "src" : void 0,
|
|
408
|
+
`app/api/revalidate/route.${extension}`
|
|
409
|
+
].filter((segment) => Boolean(segment)));
|
|
410
|
+
if (await checkPathExists(filePath)) {
|
|
411
|
+
return;
|
|
412
|
+
}
|
|
413
|
+
let contents = source`
|
|
414
|
+
import { NextResponse } from "next/server";
|
|
415
|
+
import { revalidateTag } from "next/cache";
|
|
416
|
+
|
|
417
|
+
export async function POST() {
|
|
418
|
+
revalidateTag("prismic");
|
|
419
|
+
|
|
420
|
+
return NextResponse.json({ revalidated: true, now: Date.now() });
|
|
421
|
+
}
|
|
422
|
+
`;
|
|
423
|
+
if (options.format) {
|
|
424
|
+
contents = await helpers.format(contents, filePath);
|
|
425
|
+
}
|
|
426
|
+
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
|
427
|
+
await fs.writeFile(filePath, contents);
|
|
428
|
+
};
|
|
161
429
|
const projectInit = async ({ installDependencies: _installDependencies }, context) => {
|
|
162
430
|
rejectIfNecessary(await Promise.allSettled([
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
431
|
+
installDependencies({ installDependencies: _installDependencies }),
|
|
432
|
+
modifySliceMachineConfig(context),
|
|
433
|
+
createPrismicIOFile(context),
|
|
434
|
+
createSliceSimulatorPage(context),
|
|
435
|
+
createPreviewRoute(context),
|
|
436
|
+
createExitPreviewRoute(context),
|
|
437
|
+
createRevalidateRoute(context)
|
|
166
438
|
]));
|
|
167
439
|
};
|
|
168
440
|
export {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-init.js","sources":["../../../src/hooks/project-init.ts"],"sourcesContent":["import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport type {\n\tProjectInitHook,\n\tProjectInitHookData,\n\tSliceMachineContext,\n} from \"@slicemachine/plugin-kit\";\nimport { stripIndent } from \"common-tags\";\n\nimport { checkPathExists } from \"../lib/checkPathExists\";\nimport { getJSOrTSXFileExtension } from \"../lib/getJSOrTSXFileExtension\";\nimport { rejectIfNecessary } from \"../lib/rejectIfNecessary\";\n\nimport type { PluginOptions } from \"../types\";\nimport { checkIsTypeScriptProject } from \"../lib/checkIsTypeScriptProject\";\n\ntype InstallDependenciesArgs = {\n\tinstallDependencies: ProjectInitHookData[\"installDependencies\"];\n};\n\nconst installDependencies = async ({\n\tinstallDependencies,\n}: InstallDependenciesArgs) => {\n\tawait installDependencies({\n\t\tdependencies: {\n\t\t\t\"@prismicio/client\": \"latest\",\n\t\t\t\"@prismicio/react\": \"latest\",\n\t\t\t\"@prismicio/next\": \"latest\",\n\t\t},\n\t});\n};\n\ntype CreatePrismicIOFileArgs = SliceMachineContext<PluginOptions>;\n\nconst createPrismicIOFile = async ({\n\thelpers,\n\toptions,\n}: CreatePrismicIOFileArgs) => {\n\tconst isTypeScriptProject = await checkIsTypeScriptProject({\n\t\thelpers,\n\t\toptions,\n\t});\n\n\tconst filePath = helpers.joinPathFromRoot(\n\t\tisTypeScriptProject ? \"prismicio.ts\" : \"prismicio.js\",\n\t);\n\n\tif (await checkPathExists(filePath)) {\n\t\treturn;\n\t}\n\n\tlet contents: string;\n\n\tif (isTypeScriptProject) {\n\t\tcontents = stripIndent`\n\t\t\timport * as prismic from \"@prismicio/client\";\n\t\t\timport * as prismicNext from \"@prismicio/next\";\n\t\t\timport config from \"./slicemachine.config.json\";\n\n\t\t\t/**\n\t\t\t * The project's Prismic repository name.\n\t\t\t */\n\t\t\texport const repositoryName = config.repositoryName;\n\n\t\t\t/**\n\t\t\t * A list of Route Resolver objects that define how a document's \\`url\\` field\n\t\t\t * is resolved.\n\t\t\t *\n\t\t\t * {@link https://prismic.io/docs/route-resolver#route-resolver}\n\t\t\t */\n\t\t\t// TODO: Update the routes array to match your project's route structure.\n\t\t\tconst routes: prismic.ClientConfig[\"routes\"] = [\n\t\t\t\t{\n\t\t\t\t\ttype: \"homepage\",\n\t\t\t\t\tpath: \"/\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttype: \"page\",\n\t\t\t\t\tpath: \"/:uid\",\n\t\t\t\t},\n\t\t\t];\n\n\t\t\t/**\n\t\t\t * Creates a Prismic client for the project's repository. The client is used to\n\t\t\t * query content from the Prismic API.\n\t\t\t *\n\t\t\t * @param config - Configuration for the Prismic client.\n\t\t\t */\n\t\t\texport const createClient = (config: prismicNext.CreateClientConfig = {}) => {\n\t\t\t\tconst client = prismic.createClient(repositoryName, {\n\t\t\t\t\troutes,\n\t\t\t\t\t...config,\n\t\t\t\t});\n\n\t\t\t\tprismicNext.enableAutoPreviews({\n\t\t\t\t\tclient,\n\t\t\t\t\tpreviewData: config.previewData,\n\t\t\t\t\treq: config.req,\n\t\t\t\t});\n\n\t\t\t\treturn client;\n\t\t\t};\n\t\t`;\n\t} else {\n\t\tcontents = stripIndent`\n\t\t\timport * as prismic from \"@prismicio/client\";\n\t\t\timport * as prismicNext from \"@prismicio/next\";\n\t\t\timport config from \"./slicemachine.config.json\";\n\n\t\t\t/**\n\t\t\t * The project's Prismic repository name.\n\t\t\t */\n\t\t\texport const repositoryName = config.repositoryName;\n\n\t\t\t/**\n\t\t\t * A list of Route Resolver objects that define how a document's \\`url\\` field\n\t\t\t * is resolved.\n\t\t\t *\n\t\t\t * {@link https://prismic.io/docs/route-resolver#route-resolver}\n\t\t\t *\n\t\t\t * @type {prismic.ClientConfig[\"routes\"]}\n\t\t\t */\n\t\t\t// TODO: Update the routes array to match your project's route structure.\n\t\t\tconst routes = [\n\t\t\t\t{\n\t\t\t\t\ttype: \"homepage\",\n\t\t\t\t\tpath: \"/\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttype: \"page\",\n\t\t\t\t\tpath: \"/:uid\",\n\t\t\t\t},\n\t\t\t];\n\n\t\t\t/**\n\t\t\t * Creates a Prismic client for the project's repository. The client is used to\n\t\t\t * query content from the Prismic API.\n\t\t\t *\n\t\t\t * @param {prismicNext.CreateClientConfig} config - Configuration for the Prismic client.\n\t\t\t */\n\t\t\texport const createClient = (config = {}) => {\n\t\t\t\tconst client = prismic.createClient(repositoryName, {\n\t\t\t\t\troutes,\n\t\t\t\t\t...config,\n\t\t\t\t});\n\n\t\t\t\tprismicNext.enableAutoPreviews({\n\t\t\t\t\tclient,\n\t\t\t\t\tpreviewData: config.previewData,\n\t\t\t\t\treq: config.req,\n\t\t\t\t});\n\n\t\t\t\treturn client;\n\t\t\t};\n\t\t`;\n\t}\n\n\tif (options.format) {\n\t\tcontents = await helpers.format(contents, filePath);\n\t}\n\n\tawait fs.writeFile(filePath, contents);\n};\n\ntype CreateSliceSimulatorPageArgs = SliceMachineContext<PluginOptions>;\n\nconst createSliceSimulatorPage = async ({\n\thelpers,\n\toptions,\n}: CreateSliceSimulatorPageArgs) => {\n\tconst srcDirectoryExists = await checkPathExists(\n\t\thelpers.joinPathFromRoot(\"src\"),\n\t);\n\n\tconst filePath = helpers.joinPathFromRoot(\n\t\tsrcDirectoryExists ? \"src/pages\" : \"pages\",\n\t\t`slice-simulator.${await getJSOrTSXFileExtension({ helpers, options })}`,\n\t);\n\n\tif (await checkPathExists(filePath)) {\n\t\treturn;\n\t}\n\n\tawait fs.mkdir(path.dirname(filePath), { recursive: true });\n\n\tlet contents = stripIndent`\n\t\timport { SliceSimulator } from \"@slicemachine/adapter-next/simulator\";\n\t\timport { SliceZone } from \"@prismicio/react\";\n\n\t\timport { components } from \"../slices\";\n\n\t\texport default function SliceSimulatorPage() {\n\t\t\treturn (\n\t\t\t\t<SliceSimulator\n\t\t\t\t\tsliceZone={(props) => <SliceZone {...props} components={components} />}\n\t\t\t\t/>\n\t\t\t);\n\t\t}\n\t`;\n\n\tif (options.format) {\n\t\tcontents = await helpers.format(contents, filePath);\n\t}\n\n\tawait fs.writeFile(filePath, contents);\n};\n\nexport const projectInit: ProjectInitHook<PluginOptions> = async (\n\t{ installDependencies: _installDependencies },\n\tcontext,\n) => {\n\trejectIfNecessary(\n\t\tawait Promise.allSettled([\n\t\t\tawait installDependencies({ installDependencies: _installDependencies }),\n\t\t\tawait createPrismicIOFile(context),\n\t\t\tawait createSliceSimulatorPage(context),\n\t\t]),\n\t);\n};\n"],"names":["installDependencies"],"mappings":";;;;;;;AAoBA,MAAM,sBAAsB,OAAO,EAClC,qBAAAA,2BAC6B;AAC7B,QAAMA,qBAAoB;AAAA,IACzB,cAAc;AAAA,MACb,qBAAqB;AAAA,MACrB,oBAAoB;AAAA,MACpB,mBAAmB;AAAA,IACnB;AAAA,EAAA,CACD;AACF;AAIA,MAAM,sBAAsB,OAAO,EAClC,SACA,cAC6B;AACvB,QAAA,sBAAsB,MAAM,yBAAyB;AAAA,IAC1D;AAAA,IACA;AAAA,EAAA,CACA;AAED,QAAM,WAAW,QAAQ,iBACxB,sBAAsB,iBAAiB,cAAc;AAGlD,MAAA,MAAM,gBAAgB,QAAQ,GAAG;AACpC;AAAA,EACA;AAEG,MAAA;AAEJ,MAAI,qBAAqB;AACb,eAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,OAiDL;AACK,eAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmDX;AAED,MAAI,QAAQ,QAAQ;AACnB,eAAW,MAAM,QAAQ,OAAO,UAAU,QAAQ;AAAA,EAClD;AAEK,QAAA,GAAG,UAAU,UAAU,QAAQ;AACtC;AAIA,MAAM,2BAA2B,OAAO,EACvC,SACA,cACkC;AAClC,QAAM,qBAAqB,MAAM,gBAChC,QAAQ,iBAAiB,KAAK,CAAC;AAGhC,QAAM,WAAW,QAAQ,iBACxB,qBAAqB,cAAc,SACnC,mBAAmB,MAAM,wBAAwB,EAAE,SAAS,QAAA,CAAS,GAAG;AAGrE,MAAA,MAAM,gBAAgB,QAAQ,GAAG;AACpC;AAAA,EACA;AAEK,QAAA,GAAG,MAAM,KAAK,QAAQ,QAAQ,GAAG,EAAE,WAAW,KAAA,CAAM;AAE1D,MAAI,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAef,MAAI,QAAQ,QAAQ;AACnB,eAAW,MAAM,QAAQ,OAAO,UAAU,QAAQ;AAAA,EAClD;AAEK,QAAA,GAAG,UAAU,UAAU,QAAQ;AACtC;AAEO,MAAM,cAA8C,OAC1D,EAAE,qBAAqB,qBAAA,GACvB,YACG;AAEF,oBAAA,MAAM,QAAQ,WAAW;AAAA,IACxB,MAAM,oBAAoB,EAAE,qBAAqB,sBAAsB;AAAA,IACvE,MAAM,oBAAoB,OAAO;AAAA,IACjC,MAAM,yBAAyB,OAAO;AAAA,EACtC,CAAA,CAAC;AAEJ;"}
|
|
1
|
+
{"version":3,"file":"project-init.js","sources":["../../../src/hooks/project-init.ts"],"sourcesContent":["import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport type {\n\tProjectInitHook,\n\tProjectInitHookData,\n\tSliceMachineContext,\n} from \"@slicemachine/plugin-kit\";\nimport { source } from \"common-tags\";\n\nimport { checkHasAppRouter } from \"../lib/checkHasAppRouter\";\nimport { checkHasSrcDirectory } from \"../lib/checkHasSrcDirectory\";\nimport { checkIsTypeScriptProject } from \"../lib/checkIsTypeScriptProject\";\nimport { checkPathExists } from \"../lib/checkPathExists\";\nimport { getJSFileExtension } from \"../lib/getJSFileExtension\";\nimport { rejectIfNecessary } from \"../lib/rejectIfNecessary\";\n\nimport type { PluginOptions } from \"../types\";\n\ntype InstallDependenciesArgs = {\n\tinstallDependencies: ProjectInitHookData[\"installDependencies\"];\n};\n\nconst installDependencies = async ({\n\tinstallDependencies,\n}: InstallDependenciesArgs) => {\n\tawait installDependencies({\n\t\tdependencies: {\n\t\t\t\"@prismicio/client\": \"latest\",\n\t\t\t\"@prismicio/react\": \"latest\",\n\t\t\t\"@prismicio/next\": \"latest\",\n\t\t},\n\t});\n};\n\ntype CreatePrismicIOFileArgs = SliceMachineContext<PluginOptions>;\n\nconst createPrismicIOFile = async ({\n\thelpers,\n\toptions,\n}: CreatePrismicIOFileArgs) => {\n\tconst isTypeScriptProject = await checkIsTypeScriptProject({\n\t\thelpers,\n\t\toptions,\n\t});\n\tconst hasSrcDirectory = await checkHasSrcDirectory({ helpers });\n\tconst hasAppRouter = await checkHasAppRouter({ helpers });\n\n\tconst extension = await getJSFileExtension({ helpers, options });\n\tconst filename = `prismicio.${extension}`;\n\tconst filePath = hasSrcDirectory\n\t\t? helpers.joinPathFromRoot(\"src\", filename)\n\t\t: helpers.joinPathFromRoot(filename);\n\n\tif (await checkPathExists(filePath)) {\n\t\treturn;\n\t}\n\n\tlet createClientContents: string;\n\n\tif (hasAppRouter) {\n\t\tif (isTypeScriptProject) {\n\t\t\tcreateClientContents = source`\n\t\t\t\t/**\n\t\t\t\t * Creates a Prismic client for the project's repository. The client is used to\n\t\t\t\t * query content from the Prismic API.\n\t\t\t\t *\n\t\t\t\t * @param config - Configuration for the Prismic client.\n\t\t\t\t */\n\t\t\t\texport const createClient = (config: prismicNext.CreateClientConfig = {}) => {\n\t\t\t\t\tconst client = prismic.createClient(repositoryName, {\n\t\t\t\t\t\troutes,\n\t\t\t\t\t\tfetchOptions:\n\t\t\t\t\t\t\tprocess.env.NODE_ENV === 'production'\n\t\t\t\t\t\t\t\t? { next: { tags: ['prismic'] }, cache: 'force-cache' }\n\t\t\t\t\t\t\t\t: { next: { revalidate: 5 } },\n\t\t\t\t\t\t...config,\n\t\t\t\t\t});\n\n\t\t\t\t\tprismicNext.enableAutoPreviews({\n\t\t\t\t\t\tclient,\n\t\t\t\t\t\tpreviewData: config.previewData,\n\t\t\t\t\t\treq: config.req,\n\t\t\t\t\t});\n\n\t\t\t\t\treturn client;\n\t\t\t\t};\n\t\t\t`;\n\t\t} else {\n\t\t\tcreateClientContents = source`\n\t\t\t\t/**\n\t\t\t\t * Creates a Prismic client for the project's repository. The client is used to\n\t\t\t\t * query content from the Prismic API.\n\t\t\t\t *\n\t\t\t\t * @param {prismicNext.CreateClientConfig} config - Configuration for the Prismic client.\n\t\t\t\t */\n\t\t\t\texport const createClient = (config = {}) => {\n\t\t\t\t\tconst client = prismic.createClient(repositoryName, {\n\t\t\t\t\t\troutes,\n\t\t\t\t\t\tfetchOptions:\n\t\t\t\t\t\t\tprocess.env.NODE_ENV === 'production'\n\t\t\t\t\t\t\t\t? { next: { tags: ['prismic'] }, cache: 'force-cache' }\n\t\t\t\t\t\t\t\t: { next: { revalidate: 5 } },\n\t\t\t\t\t\t...config,\n\t\t\t\t\t});\n\n\t\t\t\t\tprismicNext.enableAutoPreviews({\n\t\t\t\t\t\tclient,\n\t\t\t\t\t\tpreviewData: config.previewData,\n\t\t\t\t\t\treq: config.req,\n\t\t\t\t\t});\n\n\t\t\t\t\treturn client;\n\t\t\t\t};\n\t\t\t`;\n\t\t}\n\t} else {\n\t\tif (isTypeScriptProject) {\n\t\t\tcreateClientContents = source`\n\t\t\t\t/**\n\t\t\t\t * Creates a Prismic client for the project's repository. The client is used to\n\t\t\t\t * query content from the Prismic API.\n\t\t\t\t *\n\t\t\t\t * @param config - Configuration for the Prismic client.\n\t\t\t\t */\n\t\t\t\texport const createClient = (config: prismicNext.CreateClientConfig = {}) => {\n\t\t\t\t\tconst client = prismic.createClient(repositoryName, {\n\t\t\t\t\t\troutes,\n\t\t\t\t\t\t...config,\n\t\t\t\t\t});\n\n\t\t\t\t\tprismicNext.enableAutoPreviews({\n\t\t\t\t\t\tclient,\n\t\t\t\t\t\tpreviewData: config.previewData,\n\t\t\t\t\t\treq: config.req,\n\t\t\t\t\t});\n\n\t\t\t\t\treturn client;\n\t\t\t\t};\n\t\t\t`;\n\t\t} else {\n\t\t\tcreateClientContents = source`\n\t\t\t\t/**\n\t\t\t\t * Creates a Prismic client for the project's repository. The client is used to\n\t\t\t\t * query content from the Prismic API.\n\t\t\t\t *\n\t\t\t\t * @param {prismicNext.CreateClientConfig} config - Configuration for the Prismic client.\n\t\t\t\t */\n\t\t\t\texport const createClient = (config = {}) => {\n\t\t\t\t\tconst client = prismic.createClient(repositoryName, {\n\t\t\t\t\t\troutes,\n\t\t\t\t\t\t...config,\n\t\t\t\t\t});\n\n\t\t\t\t\tprismicNext.enableAutoPreviews({\n\t\t\t\t\t\tclient,\n\t\t\t\t\t\tpreviewData: config.previewData,\n\t\t\t\t\t\treq: config.req,\n\t\t\t\t\t});\n\n\t\t\t\t\treturn client;\n\t\t\t\t};\n\t\t\t`;\n\t\t}\n\t}\n\n\tlet contents: string;\n\n\tif (isTypeScriptProject) {\n\t\tcontents = source`\n\t\t\timport * as prismic from \"@prismicio/client\";\n\t\t\timport * as prismicNext from \"@prismicio/next\";\n\t\t\timport config from \"${hasSrcDirectory ? \"..\" : \".\"}/slicemachine.config.json\";\n\n\t\t\t/**\n\t\t\t * The project's Prismic repository name.\n\t\t\t */\n\t\t\texport const repositoryName = config.repositoryName;\n\n\t\t\t/**\n\t\t\t * A list of Route Resolver objects that define how a document's \\`url\\` field is resolved.\n\t\t\t *\n\t\t\t * {@link https://prismic.io/docs/route-resolver#route-resolver}\n\t\t\t */\n\t\t\t// TODO: Update the routes array to match your project's route structure.\n\t\t\tconst routes: prismic.ClientConfig[\"routes\"] = [\n\t\t\t\t{\n\t\t\t\t\ttype: \"homepage\",\n\t\t\t\t\tpath: \"/\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttype: \"page\",\n\t\t\t\t\tpath: \"/:uid\",\n\t\t\t\t},\n\t\t\t];\n\n\t\t\t${createClientContents}\n\t\t`;\n\t} else {\n\t\tcontents = source`\n\t\t\timport * as prismic from \"@prismicio/client\";\n\t\t\timport * as prismicNext from \"@prismicio/next\";\n\t\t\timport config from \"${hasSrcDirectory ? \"..\" : \".\"}/slicemachine.config.json\";\n\n\t\t\t/**\n\t\t\t * The project's Prismic repository name.\n\t\t\t */\n\t\t\texport const repositoryName = config.repositoryName;\n\n\t\t\t/**\n\t\t\t * A list of Route Resolver objects that define how a document's \\`url\\` field is resolved.\n\t\t\t *\n\t\t\t * {@link https://prismic.io/docs/route-resolver#route-resolver}\n\t\t\t *\n\t\t\t * @type {prismic.ClientConfig[\"routes\"]}\n\t\t\t */\n\t\t\t// TODO: Update the routes array to match your project's route structure.\n\t\t\tconst routes = [\n\t\t\t\t{\n\t\t\t\t\ttype: \"homepage\",\n\t\t\t\t\tpath: \"/\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttype: \"page\",\n\t\t\t\t\tpath: \"/:uid\",\n\t\t\t\t},\n\t\t\t];\n\n\t\t\t${createClientContents}\n\t\t`;\n\t}\n\n\tif (options.format) {\n\t\tcontents = await helpers.format(contents, filePath);\n\t}\n\n\tawait fs.writeFile(filePath, contents);\n};\n\ntype CreateSliceSimulatorPageArgs = SliceMachineContext<PluginOptions>;\n\nconst createSliceSimulatorPage = async ({\n\thelpers,\n\toptions,\n}: CreateSliceSimulatorPageArgs) => {\n\tconst hasSrcDirectory = await checkHasSrcDirectory({ helpers });\n\tconst hasAppRouter = await checkHasAppRouter({ helpers });\n\n\tconst extension = await getJSFileExtension({ helpers, options, jsx: true });\n\tconst filePath = helpers.joinPathFromRoot(\n\t\t...[\n\t\t\thasSrcDirectory ? \"src\" : undefined,\n\t\t\thasAppRouter\n\t\t\t\t? `app/slice-simulator/page.${extension}`\n\t\t\t\t: `pages/slice-simulator.${extension}`,\n\t\t].filter((segment): segment is NonNullable<typeof segment> =>\n\t\t\tBoolean(segment),\n\t\t),\n\t);\n\n\tif (await checkPathExists(filePath)) {\n\t\treturn;\n\t}\n\n\tawait fs.mkdir(path.dirname(filePath), { recursive: true });\n\n\tlet contents = source`\n\t\timport { SliceSimulator } from \"@slicemachine/adapter-next/simulator\";\n\t\timport { SliceZone } from \"@prismicio/react\";\n\n\t\timport { components } from \"${hasAppRouter ? \"../..\" : \"..\"}/slices\";\n\n\t\texport default function SliceSimulatorPage() {\n\t\t\treturn (\n\t\t\t\t<SliceSimulator\n\t\t\t\t\tsliceZone={(props) => <SliceZone {...props} components={components} />}\n\t\t\t\t/>\n\t\t\t);\n\t\t}\n\t`;\n\n\tif (options.format) {\n\t\tcontents = await helpers.format(contents, filePath);\n\t}\n\n\tawait fs.writeFile(filePath, contents);\n};\n\nconst createPreviewRoute = async ({\n\thelpers,\n\toptions,\n}: SliceMachineContext<PluginOptions>) => {\n\tconst hasSrcDirectory = await checkHasSrcDirectory({ helpers });\n\tconst hasAppRouter = await checkHasAppRouter({ helpers });\n\tconst isTypeScriptProject = await checkIsTypeScriptProject({\n\t\thelpers,\n\t\toptions,\n\t});\n\n\tconst extension = await getJSFileExtension({ helpers, options });\n\tconst filePath = helpers.joinPathFromRoot(\n\t\t...[\n\t\t\thasSrcDirectory ? \"src\" : undefined,\n\t\t\thasAppRouter\n\t\t\t\t? `app/api/preview/route.${extension}`\n\t\t\t\t: `pages/api/preview.${extension}`,\n\t\t].filter((segment): segment is NonNullable<typeof segment> =>\n\t\t\tBoolean(segment),\n\t\t),\n\t);\n\n\tif (await checkPathExists(filePath)) {\n\t\treturn;\n\t}\n\n\tlet contents: string;\n\n\tif (hasAppRouter) {\n\t\tif (isTypeScriptProject) {\n\t\t\tcontents = source`\n\t\t\t\timport { NextRequest } from \"next/server\";\n\t\t\t\timport { draftMode } from \"next/headers\";\n\t\t\t\timport { redirectToPreviewURL } from \"@prismicio/next\";\n\n\t\t\t\timport { createClient } from \"../../../prismicio\";\n\n\t\t\t\texport async function GET(request: NextRequest) {\n\t\t\t\t\tconst client = createClient();\n\n\t\t\t\t\tdraftMode().enable();\n\n\t\t\t\t\tawait redirectToPreviewURL({ client, request });\n\t\t\t\t}\n\t\t\t`;\n\t\t} else {\n\t\t\tcontents = source`\n\t\t\t\timport { draftMode } from \"next/headers\";\n\t\t\t\timport { redirectToPreviewURL } from \"@prismicio/next\";\n\n\t\t\t\timport { createClient } from \"../../../prismicio\";\n\n\t\t\t\texport async function GET(request) {\n\t\t\t\t\tconst client = createClient();\n\n\t\t\t\t\tdraftMode().enable();\n\n\t\t\t\t\tawait redirectToPreviewURL({ client, request });\n\t\t\t\t}\n\t\t\t`;\n\t\t}\n\t} else {\n\t\tif (isTypeScriptProject) {\n\t\t\tcontents = source`\n\t\t\t\timport { NextApiRequest, NextApiResponse } from \"next\";\n\t\t\t\timport { setPreviewData, redirectToPreviewURL } from \"@prismicio/next\";\n\n\t\t\t\timport { createClient } from \"../../prismicio\";\n\n\t\t\t\texport default async (req: NextApiRequest, res: NextApiResponse) => {\n\t\t\t\t\tconst client = createClient({ req });\n\n\t\t\t\t\tawait setPreviewData({ req, res });\n\n\t\t\t\t\tawait redirectToPreviewURL({ req, res, client });\n\t\t\t\t};\n\t\t\t`;\n\t\t} else {\n\t\t\tcontents = source`\n\t\t\t\timport { setPreviewData, redirectToPreviewURL } from \"@prismicio/next\";\n\n\t\t\t\timport { createClient } from \"../../prismicio\";\n\n\t\t\t\texport default async (req, res) => {\n\t\t\t\t\tconst client = createClient({ req });\n\n\t\t\t\t\tawait setPreviewData({ req, res });\n\n\t\t\t\t\tawait redirectToPreviewURL({ req, res, client });\n\t\t\t\t};\n\t\t\t`;\n\t\t}\n\t}\n\n\tif (options.format) {\n\t\tcontents = await helpers.format(contents, filePath);\n\t}\n\n\tawait fs.mkdir(path.dirname(filePath), { recursive: true });\n\tawait fs.writeFile(filePath, contents);\n};\n\nconst createExitPreviewRoute = async ({\n\thelpers,\n\toptions,\n}: SliceMachineContext<PluginOptions>) => {\n\tconst hasSrcDirectory = await checkHasSrcDirectory({ helpers });\n\tconst hasAppRouter = await checkHasAppRouter({ helpers });\n\tconst isTypeScriptProject = await checkIsTypeScriptProject({\n\t\thelpers,\n\t\toptions,\n\t});\n\n\tconst extension = await getJSFileExtension({ helpers, options });\n\tconst filePath = helpers.joinPathFromRoot(\n\t\t...[\n\t\t\thasSrcDirectory ? \"src\" : undefined,\n\t\t\thasAppRouter\n\t\t\t\t? `app/api/exit-preview/route.${extension}`\n\t\t\t\t: `pages/api/exit-preview.${extension}`,\n\t\t].filter((segment): segment is NonNullable<typeof segment> =>\n\t\t\tBoolean(segment),\n\t\t),\n\t);\n\n\tif (await checkPathExists(filePath)) {\n\t\treturn;\n\t}\n\n\tlet contents: string;\n\n\tif (hasAppRouter) {\n\t\tcontents = `\n\t\t\timport { exitPreview } from \"@prismicio/next\";\n\n\t\t\texport async function GET() {\n\t\t\t\treturn await exitPreview();\n\t\t\t}\n\t\t`;\n\t} else {\n\t\tif (isTypeScriptProject) {\n\t\t\tcontents = source`\n\t\t\t\timport { NextApiRequest, NextApiResponse } from \"next\";\n\t\t\t\timport { exitPreview } from \"@prismicio/next\";\n\n\t\t\t\texport async function handler(req: NextApiRequest, res: NextApiResponse) {\n\t\t\t\t\treturn await exitPreview({ req, res });\n\t\t\t\t}\n\t\t\t`;\n\t\t} else {\n\t\t\tcontents = source`\n\t\t\t\timport { exitPreview } from \"@prismicio/next\";\n\n\t\t\t\texport async function handler(req, res) {\n\t\t\t\t\treturn await exitPreview({ req, res });\n\t\t\t\t}\n\t\t\t`;\n\t\t}\n\t}\n\n\tif (options.format) {\n\t\tcontents = await helpers.format(contents, filePath);\n\t}\n\n\tawait fs.mkdir(path.dirname(filePath), { recursive: true });\n\tawait fs.writeFile(filePath, contents);\n};\n\nconst modifySliceMachineConfig = async ({\n\thelpers,\n\toptions,\n}: SliceMachineContext<PluginOptions>) => {\n\tconst hasSrcDirectory = await checkHasSrcDirectory({ helpers });\n\tconst project = await helpers.getProject();\n\n\t// Add Slice Simulator URL.\n\tproject.config.localSliceSimulatorURL ||=\n\t\t\"http://localhost:3000/slice-simulator\";\n\n\t// Nest the default Slice Library in the src directory if it exists and\n\t// is empty.\n\tif (\n\t\thasSrcDirectory &&\n\t\tJSON.stringify(project.config.libraries) === JSON.stringify([\"./slices\"])\n\t) {\n\t\ttry {\n\t\t\tconst entries = await fs.readdir(helpers.joinPathFromRoot(\"slices\"));\n\n\t\t\tif (!entries.map((entry) => path.parse(entry).name).includes(\"index\")) {\n\t\t\t\tproject.config.libraries = [\"./src/slices\"];\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (\n\t\t\t\terror instanceof Error &&\n\t\t\t\t\"code\" in error &&\n\t\t\t\terror.code === \"ENOENT\"\n\t\t\t) {\n\t\t\t\t// The directory does not exist, which means we\n\t\t\t\t// can safely nest the library.\n\t\t\t\tproject.config.libraries = [\"./src/slices\"];\n\t\t\t}\n\t\t}\n\t}\n\n\tconst filePath = helpers.joinPathFromRoot(\"slicemachine.config.json\");\n\n\tlet contents = JSON.stringify(project.config);\n\n\tif (options.format) {\n\t\tcontents = await helpers.format(contents, filePath);\n\t}\n\n\tawait fs.writeFile(\n\t\thelpers.joinPathFromRoot(\"slicemachine.config.json\"),\n\t\tcontents,\n\t);\n};\n\nconst createRevalidateRoute = async ({\n\thelpers,\n\toptions,\n}: SliceMachineContext<PluginOptions>) => {\n\tconst hasAppRouter = await checkHasAppRouter({ helpers });\n\n\tif (!hasAppRouter) {\n\t\treturn;\n\t}\n\n\tconst hasSrcDirectory = await checkHasSrcDirectory({ helpers });\n\n\tconst extension = await getJSFileExtension({ helpers, options });\n\tconst filePath = helpers.joinPathFromRoot(\n\t\t...[\n\t\t\thasSrcDirectory ? \"src\" : undefined,\n\t\t\t`app/api/revalidate/route.${extension}`,\n\t\t].filter((segment): segment is NonNullable<typeof segment> =>\n\t\t\tBoolean(segment),\n\t\t),\n\t);\n\n\tif (await checkPathExists(filePath)) {\n\t\treturn;\n\t}\n\n\tlet contents = source`\n\t\timport { NextResponse } from \"next/server\";\n\t\timport { revalidateTag } from \"next/cache\";\n\n\t\texport async function POST() {\n\t\t\trevalidateTag(\"prismic\");\n\n\t\t\treturn NextResponse.json({ revalidated: true, now: Date.now() });\n\t\t}\n\t`;\n\n\tif (options.format) {\n\t\tcontents = await helpers.format(contents, filePath);\n\t}\n\n\tawait fs.mkdir(path.dirname(filePath), { recursive: true });\n\tawait fs.writeFile(filePath, contents);\n};\n\nexport const projectInit: ProjectInitHook<PluginOptions> = async (\n\t{ installDependencies: _installDependencies },\n\tcontext,\n) => {\n\trejectIfNecessary(\n\t\tawait Promise.allSettled([\n\t\t\tinstallDependencies({ installDependencies: _installDependencies }),\n\t\t\tmodifySliceMachineConfig(context),\n\t\t\tcreatePrismicIOFile(context),\n\t\t\tcreateSliceSimulatorPage(context),\n\t\t\tcreatePreviewRoute(context),\n\t\t\tcreateExitPreviewRoute(context),\n\t\t\tcreateRevalidateRoute(context),\n\t\t]),\n\t);\n};\n"],"names":["installDependencies"],"mappings":"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"}
|
|
@@ -5,7 +5,7 @@ const fs = require("node:fs/promises");
|
|
|
5
5
|
const path = require("node:path");
|
|
6
6
|
const buildSliceDirectoryPath = require("../lib/buildSliceDirectoryPath.cjs");
|
|
7
7
|
const checkIsTypeScriptProject = require("../lib/checkIsTypeScriptProject.cjs");
|
|
8
|
-
const
|
|
8
|
+
const getJSFileExtension = require("../lib/getJSFileExtension.cjs");
|
|
9
9
|
const pascalCase = require("../lib/pascalCase.cjs");
|
|
10
10
|
const rejectIfNecessary = require("../lib/rejectIfNecessary.cjs");
|
|
11
11
|
const updateSliceModelFile = require("../lib/updateSliceModelFile.cjs");
|
|
@@ -30,7 +30,8 @@ function _interopNamespaceDefault(e) {
|
|
|
30
30
|
const fs__namespace = /* @__PURE__ */ _interopNamespaceDefault(fs);
|
|
31
31
|
const path__namespace = /* @__PURE__ */ _interopNamespaceDefault(path);
|
|
32
32
|
const createComponentFile = async ({ dir, data, helpers, options }) => {
|
|
33
|
-
const
|
|
33
|
+
const extension = await getJSFileExtension.getJSFileExtension({ helpers, options, jsx: true });
|
|
34
|
+
const filePath = path__namespace.join(dir, `index.${extension}`);
|
|
34
35
|
const model = data.model;
|
|
35
36
|
const pascalName = pascalCase.pascalCase(model.name);
|
|
36
37
|
let contents;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slice-create.cjs","sources":["../../../src/hooks/slice-create.ts"],"sourcesContent":["import type {\n\tSliceCreateHook,\n\tSliceCreateHookData,\n\tSliceMachineContext,\n} from \"@slicemachine/plugin-kit\";\nimport { stripIndent } from \"common-tags\";\nimport * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\n\nimport { buildSliceDirectoryPath } from \"../lib/buildSliceDirectoryPath\";\nimport { checkIsTypeScriptProject } from \"../lib/checkIsTypeScriptProject\";\nimport {
|
|
1
|
+
{"version":3,"file":"slice-create.cjs","sources":["../../../src/hooks/slice-create.ts"],"sourcesContent":["import type {\n\tSliceCreateHook,\n\tSliceCreateHookData,\n\tSliceMachineContext,\n} from \"@slicemachine/plugin-kit\";\nimport { stripIndent } from \"common-tags\";\nimport * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\n\nimport { buildSliceDirectoryPath } from \"../lib/buildSliceDirectoryPath\";\nimport { checkIsTypeScriptProject } from \"../lib/checkIsTypeScriptProject\";\nimport { getJSFileExtension } from \"../lib/getJSFileExtension\";\nimport { pascalCase } from \"../lib/pascalCase\";\nimport { rejectIfNecessary } from \"../lib/rejectIfNecessary\";\nimport { updateSliceModelFile } from \"../lib/updateSliceModelFile\";\nimport { upsertGlobalContentTypes } from \"../lib/upsertGlobalContentTypes\";\nimport { upsertSliceLibraryIndexFile } from \"../lib/upsertSliceLibraryIndexFile\";\n\nimport type { PluginOptions } from \"../types\";\n\ntype Args = {\n\tdir: string;\n\tdata: SliceCreateHookData;\n} & SliceMachineContext<PluginOptions>;\n\nconst createComponentFile = async ({ dir, data, helpers, options }: Args) => {\n\tconst extension = await getJSFileExtension({ helpers, options, jsx: true });\n\tconst filePath = path.join(dir, `index.${extension}`);\n\tconst model = data.model;\n\tconst pascalName = pascalCase(model.name);\n\n\tlet contents: string;\n\n\tconst isTypeScriptProject = await checkIsTypeScriptProject({\n\t\thelpers,\n\t\toptions,\n\t});\n\n\tif (isTypeScriptProject) {\n\t\tcontents = stripIndent`\n\t\t\timport { Content } from \"@prismicio/client\";\n\t\t\timport { SliceComponentProps } from \"@prismicio/react\";\n\n\t\t\t/**\n\t\t\t * Props for \\`${pascalName}\\`.\n\t\t\t */\n\t\t\texport type ${pascalName}Props = SliceComponentProps<Content.${pascalName}Slice>;\n\n\t\t\t/**\n\t\t\t * Component for \"${model.name}\" Slices.\n\t\t\t */\n\t\t\tconst ${pascalName} = ({ slice }: ${pascalName}Props): JSX.Element => {\n\t\t\t\treturn (\n\t\t\t\t\t<section\n\t\t\t\t\t\tdata-slice-type={slice.slice_type}\n\t\t\t\t\t\tdata-slice-variation={slice.variation}\n\t\t\t\t\t>\n\t\t\t\t\t\tPlaceholder component for ${model.id} (variation: {slice.variation}) Slices\n\t\t\t\t\t</section>\n\t\t\t\t);\n\t\t\t};\n\n\t\t\texport default ${pascalName}\n\t\t`;\n\t} else {\n\t\tcontents = stripIndent`\n\t\t\t/**\n\t\t\t * @typedef {import(\"@prismicio/client\").Content.${pascalName}Slice} ${pascalName}Slice\n\t\t\t * @typedef {import(\"@prismicio/react\").SliceComponentProps<${pascalName}Slice>} ${pascalName}Props\n\t\t\t * @param {${pascalName}Props}\n\t\t\t */\n\t\t\tconst ${pascalName} = ({ slice }) => {\n\t\t\t\treturn (\n\t\t\t\t\t<section\n\t\t\t\t\t\tdata-slice-type={slice.slice_type}\n\t\t\t\t\t\tdata-slice-variation={slice.variation}\n\t\t\t\t\t>\n\t\t\t\t\t\tPlaceholder component for ${model.id} (variation: {slice.variation}) Slices\n\t\t\t\t\t</section>\n\t\t\t\t);\n\t\t\t};\n\n\t\t\texport default ${pascalName};\n\t\t`;\n\t}\n\n\tif (options.format) {\n\t\tcontents = await helpers.format(contents, filePath);\n\t}\n\n\tawait fs.writeFile(filePath, contents);\n};\n\nexport const sliceCreate: SliceCreateHook<PluginOptions> = async (\n\tdata,\n\tcontext,\n) => {\n\tconst dir = buildSliceDirectoryPath({\n\t\tlibraryID: data.libraryID,\n\t\tmodel: data.model,\n\t\thelpers: context.helpers,\n\t});\n\n\tawait fs.mkdir(dir, { recursive: true });\n\n\trejectIfNecessary(\n\t\tawait Promise.allSettled([\n\t\t\tupdateSliceModelFile({\n\t\t\t\tlibraryID: data.libraryID,\n\t\t\t\tmodel: data.model,\n\t\t\t\t...context,\n\t\t\t}),\n\t\t\tcreateComponentFile({ dir, data, ...context }),\n\t\t]),\n\t);\n\n\trejectIfNecessary(\n\t\tawait Promise.allSettled([\n\t\t\tupsertGlobalContentTypes(context),\n\t\t\tupsertSliceLibraryIndexFile({ libraryID: data.libraryID, ...context }),\n\t\t]),\n\t);\n};\n"],"names":["getJSFileExtension","path","pascalCase","checkIsTypeScriptProject","stripIndent","fs","buildSliceDirectoryPath","rejectIfNecessary","updateSliceModelFile","upsertGlobalContentTypes","upsertSliceLibraryIndexFile"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyBA,MAAM,sBAAsB,OAAO,EAAE,KAAK,MAAM,SAAS,cAAmB;AACrE,QAAA,YAAY,MAAMA,mBAAAA,mBAAmB,EAAE,SAAS,SAAS,KAAK,MAAM;AAC1E,QAAM,WAAWC,gBAAK,KAAK,KAAK,SAAS,WAAW;AACpD,QAAM,QAAQ,KAAK;AACb,QAAA,aAAaC,WAAAA,WAAW,MAAM,IAAI;AAEpC,MAAA;AAEE,QAAA,sBAAsB,MAAMC,kDAAyB;AAAA,IAC1D;AAAA,IACA;AAAA,EAAA,CACA;AAED,MAAI,qBAAqB;AACb,eAAAC,WAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,oBAKO;AAAA;AAAA,iBAEH,iDAAiD;AAAA;AAAA;AAAA,uBAG3C,MAAM;AAAA;AAAA,WAElB,4BAA4B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kCAML,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA,oBAKpB;AAAA;AAAA,EAAA,OAEZ;AACK,eAAAA,WAAAA;AAAAA;AAAAA,sDAEyC,oBAAoB;AAAA,iEACT,qBAAqB;AAAA,gBACtE;AAAA;AAAA,WAEL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kCAMuB,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA,oBAKpB;AAAA;AAAA,EAElB;AAED,MAAI,QAAQ,QAAQ;AACnB,eAAW,MAAM,QAAQ,OAAO,UAAU,QAAQ;AAAA,EAClD;AAEK,QAAAC,cAAG,UAAU,UAAU,QAAQ;AACtC;AAEa,MAAA,cAA8C,OAC1D,MACA,YACG;AACH,QAAM,MAAMC,wBAAAA,wBAAwB;AAAA,IACnC,WAAW,KAAK;AAAA,IAChB,OAAO,KAAK;AAAA,IACZ,SAAS,QAAQ;AAAA,EAAA,CACjB;AAED,QAAMD,cAAG,MAAM,KAAK,EAAE,WAAW,MAAM;AAGtCE,sCAAA,MAAM,QAAQ,WAAW;AAAA,IACxBC,0CAAqB;AAAA,MACpB,WAAW,KAAK;AAAA,MAChB,OAAO,KAAK;AAAA,MACZ,GAAG;AAAA,IAAA,CACH;AAAA,IACD,oBAAoB,EAAE,KAAK,MAAM,GAAG,SAAS;AAAA,EAC7C,CAAA,CAAC;AAIFD,sCAAA,MAAM,QAAQ,WAAW;AAAA,IACxBE,yBAAAA,yBAAyB,OAAO;AAAA,IAChCC,wDAA4B,EAAE,WAAW,KAAK,WAAW,GAAG,SAAS;AAAA,EACrE,CAAA,CAAC;AAEJ;;"}
|
|
@@ -3,14 +3,15 @@ import * as fs from "node:fs/promises";
|
|
|
3
3
|
import * as path from "node:path";
|
|
4
4
|
import { buildSliceDirectoryPath } from "../lib/buildSliceDirectoryPath.js";
|
|
5
5
|
import { checkIsTypeScriptProject } from "../lib/checkIsTypeScriptProject.js";
|
|
6
|
-
import {
|
|
6
|
+
import { getJSFileExtension } from "../lib/getJSFileExtension.js";
|
|
7
7
|
import { pascalCase } from "../lib/pascalCase.js";
|
|
8
8
|
import { rejectIfNecessary } from "../lib/rejectIfNecessary.js";
|
|
9
9
|
import { updateSliceModelFile } from "../lib/updateSliceModelFile.js";
|
|
10
10
|
import { upsertGlobalContentTypes } from "../lib/upsertGlobalContentTypes.js";
|
|
11
11
|
import { upsertSliceLibraryIndexFile } from "../lib/upsertSliceLibraryIndexFile.js";
|
|
12
12
|
const createComponentFile = async ({ dir, data, helpers, options }) => {
|
|
13
|
-
const
|
|
13
|
+
const extension = await getJSFileExtension({ helpers, options, jsx: true });
|
|
14
|
+
const filePath = path.join(dir, `index.${extension}`);
|
|
14
15
|
const model = data.model;
|
|
15
16
|
const pascalName = pascalCase(model.name);
|
|
16
17
|
let contents;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slice-create.js","sources":["../../../src/hooks/slice-create.ts"],"sourcesContent":["import type {\n\tSliceCreateHook,\n\tSliceCreateHookData,\n\tSliceMachineContext,\n} from \"@slicemachine/plugin-kit\";\nimport { stripIndent } from \"common-tags\";\nimport * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\n\nimport { buildSliceDirectoryPath } from \"../lib/buildSliceDirectoryPath\";\nimport { checkIsTypeScriptProject } from \"../lib/checkIsTypeScriptProject\";\nimport {
|
|
1
|
+
{"version":3,"file":"slice-create.js","sources":["../../../src/hooks/slice-create.ts"],"sourcesContent":["import type {\n\tSliceCreateHook,\n\tSliceCreateHookData,\n\tSliceMachineContext,\n} from \"@slicemachine/plugin-kit\";\nimport { stripIndent } from \"common-tags\";\nimport * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\n\nimport { buildSliceDirectoryPath } from \"../lib/buildSliceDirectoryPath\";\nimport { checkIsTypeScriptProject } from \"../lib/checkIsTypeScriptProject\";\nimport { getJSFileExtension } from \"../lib/getJSFileExtension\";\nimport { pascalCase } from \"../lib/pascalCase\";\nimport { rejectIfNecessary } from \"../lib/rejectIfNecessary\";\nimport { updateSliceModelFile } from \"../lib/updateSliceModelFile\";\nimport { upsertGlobalContentTypes } from \"../lib/upsertGlobalContentTypes\";\nimport { upsertSliceLibraryIndexFile } from \"../lib/upsertSliceLibraryIndexFile\";\n\nimport type { PluginOptions } from \"../types\";\n\ntype Args = {\n\tdir: string;\n\tdata: SliceCreateHookData;\n} & SliceMachineContext<PluginOptions>;\n\nconst createComponentFile = async ({ dir, data, helpers, options }: Args) => {\n\tconst extension = await getJSFileExtension({ helpers, options, jsx: true });\n\tconst filePath = path.join(dir, `index.${extension}`);\n\tconst model = data.model;\n\tconst pascalName = pascalCase(model.name);\n\n\tlet contents: string;\n\n\tconst isTypeScriptProject = await checkIsTypeScriptProject({\n\t\thelpers,\n\t\toptions,\n\t});\n\n\tif (isTypeScriptProject) {\n\t\tcontents = stripIndent`\n\t\t\timport { Content } from \"@prismicio/client\";\n\t\t\timport { SliceComponentProps } from \"@prismicio/react\";\n\n\t\t\t/**\n\t\t\t * Props for \\`${pascalName}\\`.\n\t\t\t */\n\t\t\texport type ${pascalName}Props = SliceComponentProps<Content.${pascalName}Slice>;\n\n\t\t\t/**\n\t\t\t * Component for \"${model.name}\" Slices.\n\t\t\t */\n\t\t\tconst ${pascalName} = ({ slice }: ${pascalName}Props): JSX.Element => {\n\t\t\t\treturn (\n\t\t\t\t\t<section\n\t\t\t\t\t\tdata-slice-type={slice.slice_type}\n\t\t\t\t\t\tdata-slice-variation={slice.variation}\n\t\t\t\t\t>\n\t\t\t\t\t\tPlaceholder component for ${model.id} (variation: {slice.variation}) Slices\n\t\t\t\t\t</section>\n\t\t\t\t);\n\t\t\t};\n\n\t\t\texport default ${pascalName}\n\t\t`;\n\t} else {\n\t\tcontents = stripIndent`\n\t\t\t/**\n\t\t\t * @typedef {import(\"@prismicio/client\").Content.${pascalName}Slice} ${pascalName}Slice\n\t\t\t * @typedef {import(\"@prismicio/react\").SliceComponentProps<${pascalName}Slice>} ${pascalName}Props\n\t\t\t * @param {${pascalName}Props}\n\t\t\t */\n\t\t\tconst ${pascalName} = ({ slice }) => {\n\t\t\t\treturn (\n\t\t\t\t\t<section\n\t\t\t\t\t\tdata-slice-type={slice.slice_type}\n\t\t\t\t\t\tdata-slice-variation={slice.variation}\n\t\t\t\t\t>\n\t\t\t\t\t\tPlaceholder component for ${model.id} (variation: {slice.variation}) Slices\n\t\t\t\t\t</section>\n\t\t\t\t);\n\t\t\t};\n\n\t\t\texport default ${pascalName};\n\t\t`;\n\t}\n\n\tif (options.format) {\n\t\tcontents = await helpers.format(contents, filePath);\n\t}\n\n\tawait fs.writeFile(filePath, contents);\n};\n\nexport const sliceCreate: SliceCreateHook<PluginOptions> = async (\n\tdata,\n\tcontext,\n) => {\n\tconst dir = buildSliceDirectoryPath({\n\t\tlibraryID: data.libraryID,\n\t\tmodel: data.model,\n\t\thelpers: context.helpers,\n\t});\n\n\tawait fs.mkdir(dir, { recursive: true });\n\n\trejectIfNecessary(\n\t\tawait Promise.allSettled([\n\t\t\tupdateSliceModelFile({\n\t\t\t\tlibraryID: data.libraryID,\n\t\t\t\tmodel: data.model,\n\t\t\t\t...context,\n\t\t\t}),\n\t\t\tcreateComponentFile({ dir, data, ...context }),\n\t\t]),\n\t);\n\n\trejectIfNecessary(\n\t\tawait Promise.allSettled([\n\t\t\tupsertGlobalContentTypes(context),\n\t\t\tupsertSliceLibraryIndexFile({ libraryID: data.libraryID, ...context }),\n\t\t]),\n\t);\n};\n"],"names":[],"mappings":";;;;;;;;;;;AAyBA,MAAM,sBAAsB,OAAO,EAAE,KAAK,MAAM,SAAS,cAAmB;AACrE,QAAA,YAAY,MAAM,mBAAmB,EAAE,SAAS,SAAS,KAAK,MAAM;AAC1E,QAAM,WAAW,KAAK,KAAK,KAAK,SAAS,WAAW;AACpD,QAAM,QAAQ,KAAK;AACb,QAAA,aAAa,WAAW,MAAM,IAAI;AAEpC,MAAA;AAEE,QAAA,sBAAsB,MAAM,yBAAyB;AAAA,IAC1D;AAAA,IACA;AAAA,EAAA,CACA;AAED,MAAI,qBAAqB;AACb,eAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAKO;AAAA;AAAA,iBAEH,iDAAiD;AAAA;AAAA;AAAA,uBAG3C,MAAM;AAAA;AAAA,WAElB,4BAA4B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kCAML,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA,oBAKpB;AAAA;AAAA,EAAA,OAEZ;AACK,eAAA;AAAA;AAAA,sDAEyC,oBAAoB;AAAA,iEACT,qBAAqB;AAAA,gBACtE;AAAA;AAAA,WAEL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kCAMuB,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA,oBAKpB;AAAA;AAAA,EAElB;AAED,MAAI,QAAQ,QAAQ;AACnB,eAAW,MAAM,QAAQ,OAAO,UAAU,QAAQ;AAAA,EAClD;AAEK,QAAA,GAAG,UAAU,UAAU,QAAQ;AACtC;AAEa,MAAA,cAA8C,OAC1D,MACA,YACG;AACH,QAAM,MAAM,wBAAwB;AAAA,IACnC,WAAW,KAAK;AAAA,IAChB,OAAO,KAAK;AAAA,IACZ,SAAS,QAAQ;AAAA,EAAA,CACjB;AAED,QAAM,GAAG,MAAM,KAAK,EAAE,WAAW,MAAM;AAGtC,oBAAA,MAAM,QAAQ,WAAW;AAAA,IACxB,qBAAqB;AAAA,MACpB,WAAW,KAAK;AAAA,MAChB,OAAO,KAAK;AAAA,MACZ,GAAG;AAAA,IAAA,CACH;AAAA,IACD,oBAAoB,EAAE,KAAK,MAAM,GAAG,SAAS;AAAA,EAC7C,CAAA,CAAC;AAIF,oBAAA,MAAM,QAAQ,WAAW;AAAA,IACxB,yBAAyB,OAAO;AAAA,IAChC,4BAA4B,EAAE,WAAW,KAAK,WAAW,GAAG,SAAS;AAAA,EACrE,CAAA,CAAC;AAEJ;"}
|
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
|
3
3
|
const commonTags = require("common-tags");
|
|
4
4
|
const node_module = require("node:module");
|
|
5
5
|
const index = require('./../_node_modules/node-fetch/src/index.cjs');
|
|
6
|
-
const
|
|
6
|
+
const getJSFileExtension = require("../lib/getJSFileExtension.cjs");
|
|
7
7
|
const REQUIRED_DEPENDENCIES = ["@prismicio/react"];
|
|
8
8
|
const createStep1 = async ({ project, helpers }) => {
|
|
9
9
|
const require2 = node_module.createRequire(project.root);
|
|
@@ -51,10 +51,8 @@ const createStep1 = async ({ project, helpers }) => {
|
|
|
51
51
|
};
|
|
52
52
|
};
|
|
53
53
|
const createStep2 = async ({ helpers, options }) => {
|
|
54
|
-
const
|
|
55
|
-
|
|
56
|
-
options
|
|
57
|
-
})}`;
|
|
54
|
+
const extension = await getJSFileExtension.getJSFileExtension({ helpers, options, jsx: true });
|
|
55
|
+
const fileName = `slice-simulator.${extension}`;
|
|
58
56
|
const filePath = helpers.joinPathFromRoot("pages", fileName);
|
|
59
57
|
const fileContents = await helpers.format(commonTags.source`
|
|
60
58
|
import { SliceSimulator } from "@slicemachine/adapter-next/simulator";
|