create-puck-app 0.10.1-canary.5dabebb → 0.10.1-canary.cc20c52

Sign up to get free protection for your applications and to get access to all the features.
package/index.js CHANGED
@@ -125,7 +125,7 @@ program
125
125
  const targetPath = filePath
126
126
  .replace(templatePath, appPath)
127
127
  .replace(".hbs", "")
128
- .replace("gitignore", ".gitignore"); // .gitignore gets ignored by npm during publish, so we have to rename it
128
+ .replace("gitignore", ".gitignore"); // Rename gitignore back to .gitignore (.gitignore) gets ignored by npm during publish
129
129
 
130
130
  let data;
131
131
 
package/package.json CHANGED
@@ -1,12 +1,16 @@
1
1
  {
2
2
  "name": "create-puck-app",
3
- "version": "0.10.1-canary.5dabebb",
3
+ "version": "0.10.1-canary.cc20c52",
4
4
  "private": false,
5
5
  "license": "MIT",
6
6
  "type": "module",
7
7
  "bin": {
8
8
  "create-puck-app": "./index.js"
9
9
  },
10
+ "scripts": {
11
+ "generate": "node scripts/generate.js",
12
+ "prepublishOnly": "yarn generate"
13
+ },
10
14
  "dependencies": {
11
15
  "commander": "^10.0.1",
12
16
  "glob": "^10.3.4",
@@ -0,0 +1,72 @@
1
+ #!/usr/bin/env node
2
+
3
+ import fs from "fs";
4
+ import path from "path";
5
+ import { glob } from "glob";
6
+ import { dirname } from "path";
7
+ import { fileURLToPath } from "url";
8
+
9
+ const verbose = false;
10
+
11
+ const run = async () => {
12
+ const __filename = fileURLToPath(import.meta.url);
13
+ const __dirname = dirname(__filename);
14
+
15
+ // Copy template files to the new directory
16
+ const recipePath = path.join(__dirname, "../../../recipes");
17
+ const templatePath = path.join(__dirname, "../templates");
18
+
19
+ if (!fs.existsSync(recipePath)) {
20
+ console.error(`No recipe directory could be found at ${recipePath}.`);
21
+ return;
22
+ }
23
+
24
+ if (!fs.existsSync(templatePath)) {
25
+ console.error(`No template directory could be found at ${templatePath}.`);
26
+ return;
27
+ }
28
+
29
+ // Compile handlebars templates
30
+ const recipeFiles = glob.sync(`**/*`, {
31
+ cwd: recipePath,
32
+ nodir: true,
33
+ dot: true,
34
+ });
35
+
36
+ console.warn(
37
+ `⚠️ The following files use handlebars templates. Please manually update them:`
38
+ );
39
+
40
+ let counter = 0;
41
+
42
+ for (const recipeFile of recipeFiles) {
43
+ const filePath = path.join(recipePath, recipeFile);
44
+
45
+ const targetPath = filePath
46
+ .replace(recipePath, templatePath)
47
+ .replace(".gitignore", "gitignore"); // rename .gitignore to gitignore so NPM publish doesn't ignore it
48
+
49
+ // Don't copy file if it's templated by handlebars
50
+ if (fs.existsSync(`${targetPath}.hbs`)) {
51
+ console.warn(`- ${recipeFile}`);
52
+ } else {
53
+ if (verbose) {
54
+ console.log(`Copying ${filePath} -> ${targetPath}`);
55
+ }
56
+
57
+ const data = await fs.readFileSync(filePath, "utf-8");
58
+
59
+ const dir = path.dirname(targetPath);
60
+
61
+ await fs.mkdirSync(dir, { recursive: true });
62
+
63
+ await fs.writeFileSync(targetPath, data);
64
+
65
+ counter += 1;
66
+ }
67
+ }
68
+
69
+ console.log(`Copied ${counter} files into generator!`);
70
+ };
71
+
72
+ await run();
@@ -1,4 +0,0 @@
1
- module.exports = {
2
- root: true,
3
- extends: ["custom"],
4
- };
@@ -1,32 +0,0 @@
1
- "use client";
2
-
3
- import type { Data } from "@measured/puck";
4
- import { Puck, Render } from "@measured/puck";
5
- import config from "../../puck.config";
6
-
7
- export function Client({
8
- path,
9
- data,
10
- isEdit,
11
- }: {
12
- path: string;
13
- data: Data;
14
- isEdit: boolean;
15
- }) {
16
- if (isEdit) {
17
- return (
18
- <Puck
19
- config={config}
20
- data={data}
21
- onPublish={async (data: Data) => {
22
- await fetch("/api/puck", {
23
- method: "post",
24
- body: JSON.stringify({ data, path }),
25
- });
26
- }}
27
- />
28
- );
29
- }
30
-
31
- return <Render config={config} data={data} />;
32
- }
@@ -1,49 +0,0 @@
1
- import { Client } from "./client";
2
- import { notFound } from "next/navigation";
3
- import resolvePuckPath from "./resolve-puck-path";
4
- import { Metadata } from "next";
5
- import { Data } from "@measured/puck";
6
- import fs from "fs";
7
-
8
- // Replace with call to your database
9
- const getPage = (path: string) => {
10
- const allData: Record<string, Data> | null = fs.existsSync("database.json")
11
- ? JSON.parse(fs.readFileSync("database.json", "utf-8"))
12
- : null;
13
-
14
- return allData ? allData[path] : null;
15
- };
16
-
17
- export async function generateMetadata({
18
- params,
19
- }: {
20
- params: { puckPath: string[] };
21
- }): Promise<Metadata> {
22
- const { isEdit, path } = resolvePuckPath(params.puckPath);
23
-
24
- if (isEdit) {
25
- return {
26
- title: "Puck: " + path,
27
- };
28
- }
29
-
30
- return {
31
- title: getPage(path)?.root.title,
32
- };
33
- }
34
-
35
- export default async function Page({
36
- params,
37
- }: {
38
- params: { puckPath: string[] };
39
- }) {
40
- const { isEdit, path } = resolvePuckPath(params.puckPath);
41
-
42
- const data = getPage(path);
43
-
44
- if (!data && !isEdit) {
45
- return notFound();
46
- }
47
-
48
- return <Client isEdit={isEdit} path={path} data={data} />;
49
- }
@@ -1,15 +0,0 @@
1
- const resolvePuckPath = (puckPath: string[] = []) => {
2
- const hasPath = puckPath.length > 0;
3
-
4
- const isEdit = hasPath ? puckPath[puckPath.length - 1] === "edit" : false;
5
-
6
- return {
7
- isEdit,
8
- path: `/${(isEdit
9
- ? [...puckPath].slice(0, puckPath.length - 1)
10
- : [...puckPath]
11
- ).join("/")}`,
12
- };
13
- };
14
-
15
- export default resolvePuckPath;
@@ -1,25 +0,0 @@
1
- import { revalidatePath } from "next/cache";
2
- import { NextResponse } from "next/server";
3
- import fs from "fs";
4
-
5
- export async function POST(request: Request) {
6
- const payload = await request.json();
7
-
8
- const existingData = JSON.parse(
9
- fs.existsSync("database.json")
10
- ? fs.readFileSync("database.json", "utf-8")
11
- : "{}"
12
- );
13
-
14
- const updatedData = {
15
- ...existingData,
16
- [payload.path]: payload.data,
17
- };
18
-
19
- fs.writeFileSync("database.json", JSON.stringify(updatedData));
20
-
21
- // Purge Next.js cache
22
- revalidatePath(payload.path);
23
-
24
- return NextResponse.json({ status: "ok" });
25
- }
@@ -1,14 +0,0 @@
1
- import "@measured/puck/dist/index.css";
2
- import "./styles.css";
3
-
4
- export default function RootLayout({
5
- children,
6
- }: {
7
- children: React.ReactNode;
8
- }) {
9
- return (
10
- <html lang="en">
11
- <body>{children}</body>
12
- </html>
13
- );
14
- }
@@ -1 +0,0 @@
1
- export { default, generateMetadata } from "./[...puckPath]/page";
@@ -1,5 +0,0 @@
1
- html,
2
- body {
3
- margin: 0;
4
- padding: 0;
5
- }
@@ -1 +0,0 @@
1
- {"/":{"content":[{"type":"HeadingBlock","props":{"title":"Edit this page by adding /edit to the end of the URL","id":"HeadingBlock-1694032984497"}}],"root":{"title":""}}}
@@ -1,36 +0,0 @@
1
- # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2
-
3
- # dependencies
4
- /node_modules
5
- /.pnp
6
- .pnp.js
7
-
8
- # testing
9
- /coverage
10
-
11
- # next.js
12
- /.next/
13
- /out/
14
-
15
- # production
16
- /build
17
-
18
- # misc
19
- .DS_Store
20
- *.pem
21
-
22
- # debug
23
- npm-debug.log*
24
- yarn-debug.log*
25
- yarn-error.log*
26
-
27
- # local env files
28
- .env.local
29
- .env.development.local
30
- .env.test.local
31
- .env.production.local
32
-
33
- # vercel
34
- .vercel
35
-
36
- database.json
@@ -1,5 +0,0 @@
1
- /// <reference types="next" />
2
- /// <reference types="next/image-types/global" />
3
-
4
- // NOTE: This file should not be edited
5
- // see https://nextjs.org/docs/basic-features/typescript for more information.
@@ -1,4 +0,0 @@
1
- module.exports = {
2
- reactStrictMode: true,
3
- transpilePackages: ["ui"],
4
- };
@@ -1,25 +0,0 @@
1
- import type { Config } from "@measured/puck";
2
-
3
- type Props = {
4
- HeadingBlock: { title: string };
5
- };
6
-
7
- export const config: Config<Props> = {
8
- components: {
9
- HeadingBlock: {
10
- fields: {
11
- title: { type: "text" },
12
- },
13
- defaultProps: {
14
- title: "Heading",
15
- },
16
- render: ({ title }) => (
17
- <div style={{ padding: 64 }}>
18
- <h1>{title}</h1>
19
- </div>
20
- ),
21
- },
22
- },
23
- };
24
-
25
- export default config;
@@ -1,20 +0,0 @@
1
- {
2
- "$schema": "https://json.schemastore.org/tsconfig",
3
- "display": "Default",
4
- "compilerOptions": {
5
- "composite": false,
6
- "declaration": true,
7
- "declarationMap": true,
8
- "esModuleInterop": true,
9
- "forceConsistentCasingInFileNames": true,
10
- "inlineSources": false,
11
- "isolatedModules": true,
12
- "moduleResolution": "node",
13
- "noUnusedLocals": false,
14
- "noUnusedParameters": false,
15
- "preserveWatchOutput": true,
16
- "skipLibCheck": true,
17
- "strict": true
18
- },
19
- "exclude": ["node_modules"]
20
- }
@@ -1,21 +0,0 @@
1
- {
2
- "$schema": "https://json.schemastore.org/tsconfig",
3
- "display": "Next.js",
4
- "extends": "./base.json",
5
- "compilerOptions": {
6
- "plugins": [{ "name": "next" }],
7
- "allowJs": true,
8
- "declaration": false,
9
- "declarationMap": false,
10
- "incremental": true,
11
- "jsx": "preserve",
12
- "lib": ["dom", "dom.iterable", "esnext"],
13
- "module": "esnext",
14
- "noEmit": true,
15
- "resolveJsonModule": true,
16
- "strict": false,
17
- "target": "es5"
18
- },
19
- "include": ["src", "next-env.d.ts"],
20
- "exclude": ["node_modules"]
21
- }
@@ -1,8 +0,0 @@
1
- {
2
- "extends": "./tsconfig/nextjs.json",
3
- "compilerOptions": {
4
- "plugins": [{ "name": "next" }]
5
- },
6
- "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
7
- "exclude": ["node_modules"]
8
- }