|
1 | 1 | import fs from "fs"; |
2 | 2 | import path from "path"; |
3 | | -import { COMMENT_BLOCK, COMMENT_LINE, PLATFORMS, copyFromSrcToDest, processMacros, writeFileSyncIfChanged } from "./utils"; |
| 3 | +import { COMMENT_BLOCK, COMMENT_LINE, PLATFORMS, copyFromSrcToDest, processMacros, withGeneratorLock, writeFileSyncIfChanged } from "./utils"; |
4 | 4 |
|
5 | 5 | /** |
6 | 6 | * Main function to generate from a template: |
@@ -123,65 +123,67 @@ function baseEditFn(options: { |
123 | 123 | } |
124 | 124 |
|
125 | 125 |
|
126 | | -const baseDir = path.resolve(__dirname, "..", "packages"); |
127 | | -const srcDir = path.resolve(baseDir, "template"); |
128 | | - |
129 | | -// Copy package-template.json to package.json in the template, |
130 | | -// applying macros and adding a comment field. |
131 | | -const packageTemplateContent = fs.readFileSync( |
132 | | - path.join(srcDir, "package-template.json"), |
133 | | - "utf-8" |
134 | | -); |
135 | | -const processedPackageJson = processMacros(packageTemplateContent, PLATFORMS["template"]); |
136 | | -writeFileSyncIfChanged( |
137 | | - path.join(srcDir, "package.json"), |
138 | | - processPackageJson(processedPackageJson) |
139 | | -); |
140 | | - |
141 | | -generateFromTemplate({ |
142 | | - src: srcDir, |
143 | | - dest: path.resolve(baseDir, "js"), |
144 | | - editFn: (relativePath, content) => { |
145 | | - return baseEditFn({ relativePath, content, platforms: PLATFORMS["js"] }); |
146 | | - }, |
147 | | - filterFn: (relativePath) => { |
148 | | - const ignores = [ |
149 | | - "postcss.config.js", |
150 | | - "tailwind.config.js", |
151 | | - "quetzal.config.json", |
152 | | - "components.json", |
153 | | - ".env", |
154 | | - ".env.local", |
155 | | - "scripts/", |
156 | | - "quetzal-translations/", |
157 | | - "src/components/", |
158 | | - "src/components-page/", |
159 | | - "src/generated/", |
160 | | - "src/providers/", |
161 | | - "src/global.css", |
162 | | - "src/global.d.ts", |
163 | | - ]; |
164 | | - |
165 | | - if (ignores.some((ignorePath) => relativePath.startsWith(ignorePath)) || relativePath.endsWith(".tsx")) { |
166 | | - return false; |
167 | | - } else { |
168 | | - return true; |
169 | | - } |
170 | | - }, |
171 | | -}); |
172 | | - |
173 | | -generateFromTemplate({ |
174 | | - src: srcDir, |
175 | | - dest: path.resolve(baseDir, "stack"), |
176 | | - editFn: (relativePath, content) => { |
177 | | - return baseEditFn({ relativePath, content, platforms: PLATFORMS["next"] }); |
178 | | - }, |
179 | | -}); |
180 | | - |
181 | | -generateFromTemplate({ |
182 | | - src: srcDir, |
183 | | - dest: path.resolve(baseDir, "react"), |
184 | | - editFn: (relativePath, content) => { |
185 | | - return baseEditFn({ relativePath, content, platforms: PLATFORMS["react"] }); |
186 | | - }, |
187 | | -}); |
| 126 | +withGeneratorLock(async () => { |
| 127 | + const baseDir = path.resolve(__dirname, "..", "packages"); |
| 128 | + const srcDir = path.resolve(baseDir, "template"); |
| 129 | + |
| 130 | + // Copy package-template.json to package.json in the template, |
| 131 | + // applying macros and adding a comment field. |
| 132 | + const packageTemplateContent = fs.readFileSync( |
| 133 | + path.join(srcDir, "package-template.json"), |
| 134 | + "utf-8" |
| 135 | + ); |
| 136 | + const processedPackageJson = processMacros(packageTemplateContent, PLATFORMS["template"]); |
| 137 | + writeFileSyncIfChanged( |
| 138 | + path.join(srcDir, "package.json"), |
| 139 | + processPackageJson(processedPackageJson) |
| 140 | + ); |
| 141 | + |
| 142 | + generateFromTemplate({ |
| 143 | + src: srcDir, |
| 144 | + dest: path.resolve(baseDir, "js"), |
| 145 | + editFn: (relativePath, content) => { |
| 146 | + return baseEditFn({ relativePath, content, platforms: PLATFORMS["js"] }); |
| 147 | + }, |
| 148 | + filterFn: (relativePath) => { |
| 149 | + const ignores = [ |
| 150 | + "postcss.config.js", |
| 151 | + "tailwind.config.js", |
| 152 | + "quetzal.config.json", |
| 153 | + "components.json", |
| 154 | + ".env", |
| 155 | + ".env.local", |
| 156 | + "scripts/", |
| 157 | + "quetzal-translations/", |
| 158 | + "src/components/", |
| 159 | + "src/components-page/", |
| 160 | + "src/generated/", |
| 161 | + "src/providers/", |
| 162 | + "src/global.css", |
| 163 | + "src/global.d.ts", |
| 164 | + ]; |
| 165 | + |
| 166 | + if (ignores.some((ignorePath) => relativePath.startsWith(ignorePath)) || relativePath.endsWith(".tsx")) { |
| 167 | + return false; |
| 168 | + } else { |
| 169 | + return true; |
| 170 | + } |
| 171 | + }, |
| 172 | + }); |
| 173 | + |
| 174 | + generateFromTemplate({ |
| 175 | + src: srcDir, |
| 176 | + dest: path.resolve(baseDir, "stack"), |
| 177 | + editFn: (relativePath, content) => { |
| 178 | + return baseEditFn({ relativePath, content, platforms: PLATFORMS["next"] }); |
| 179 | + }, |
| 180 | + }); |
| 181 | + |
| 182 | + generateFromTemplate({ |
| 183 | + src: srcDir, |
| 184 | + dest: path.resolve(baseDir, "react"), |
| 185 | + editFn: (relativePath, content) => { |
| 186 | + return baseEditFn({ relativePath, content, platforms: PLATFORMS["react"] }); |
| 187 | + }, |
| 188 | + }); |
| 189 | +}).catch(console.error); |
0 commit comments