create-we8 0.1.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/README.md +82 -0
- package/dist/cli.d.ts +8 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +97 -0
- package/dist/cli.js.map +1 -0
- package/dist/copy-template.d.ts +12 -0
- package/dist/copy-template.d.ts.map +1 -0
- package/dist/copy-template.js +36 -0
- package/dist/copy-template.js.map +1 -0
- package/dist/files.d.ts +55 -0
- package/dist/files.d.ts.map +1 -0
- package/dist/files.js +373 -0
- package/dist/files.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/options.d.ts +78 -0
- package/dist/options.d.ts.map +1 -0
- package/dist/options.js +235 -0
- package/dist/options.js.map +1 -0
- package/dist/prompts.d.ts +24 -0
- package/dist/prompts.d.ts.map +1 -0
- package/dist/prompts.js +66 -0
- package/dist/prompts.js.map +1 -0
- package/dist/scaffold.d.ts +49 -0
- package/dist/scaffold.d.ts.map +1 -0
- package/dist/scaffold.js +178 -0
- package/dist/scaffold.js.map +1 -0
- package/package.json +58 -0
- package/template/.env.example +15 -0
- package/template/README.md +202 -0
- package/template/astro.config.mjs +23 -0
- package/template/package.json +29 -0
- package/template/public/favicon.svg +5 -0
- package/template/src/components/AnswerBlock.astro +31 -0
- package/template/src/components/JsonLd.astro +8 -0
- package/template/src/components/PostCard.astro +24 -0
- package/template/src/components/PostCta.astro +61 -0
- package/template/src/components/ResourceCard.astro +40 -0
- package/template/src/components/SiteFooter.astro +19 -0
- package/template/src/components/SiteHead.astro +36 -0
- package/template/src/components/SiteHeader.astro +34 -0
- package/template/src/layouts/BaseLayout.astro +61 -0
- package/template/src/layouts/PostLayout.astro +128 -0
- package/template/src/lib/data.ts +217 -0
- package/template/src/lib/fixture-backend.ts +84 -0
- package/template/src/lib/fixtures.ts +307 -0
- package/template/src/lib/markdown.ts +66 -0
- package/template/src/lib/seo.ts +191 -0
- package/template/src/lib/types.ts +180 -0
- package/template/src/lib/we8-backend.ts +254 -0
- package/template/src/pages/about.astro +96 -0
- package/template/src/pages/authors/[slug].astro +113 -0
- package/template/src/pages/blog/[slug].astro +28 -0
- package/template/src/pages/blog/index.astro +75 -0
- package/template/src/pages/contact.astro +106 -0
- package/template/src/pages/index.astro +106 -0
- package/template/src/pages/llms.txt.ts +64 -0
- package/template/src/pages/resources/[slug].astro +25 -0
- package/template/src/pages/resources.astro +95 -0
- package/template/src/pages/robots.txt.ts +18 -0
- package/template/src/pages/sitemap.xml.ts +22 -0
- package/template/src/styles/global.css +449 -0
- package/template/test/data-layer.test.ts +312 -0
- package/template/test/seo.test.ts +177 -0
- package/template/tsconfig.json +11 -0
- package/template/vitest.config.ts +18 -0
package/dist/options.js
ADDED
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What the scaffolder is being asked for: argument parsing, defaults, and the
|
|
3
|
+
* validation both the interactive and the non-interactive paths share.
|
|
4
|
+
*
|
|
5
|
+
* Nothing here touches the filesystem, so the whole decision layer is testable
|
|
6
|
+
* on its own, and the prompts become a way of filling in the same structure
|
|
7
|
+
* rather than a second implementation of it.
|
|
8
|
+
*/
|
|
9
|
+
import { resolve } from 'node:path';
|
|
10
|
+
import { isValidResourceName } from '@we8/cloudflare';
|
|
11
|
+
/** The version line the generated project depends on. */
|
|
12
|
+
export const WE8_VERSION_RANGE = '^0.1.0';
|
|
13
|
+
export const USAGE = `create-we8 - scaffold a we8 CMS project on Cloudflare
|
|
14
|
+
|
|
15
|
+
Usage:
|
|
16
|
+
npm create we8 [directory] [options]
|
|
17
|
+
|
|
18
|
+
Options:
|
|
19
|
+
--name <name> Project, Worker, and package name. Defaults to the
|
|
20
|
+
directory name.
|
|
21
|
+
--template <choice> astro (the starter site under site/) or none for a
|
|
22
|
+
headless-only backend. Default: astro
|
|
23
|
+
--headless Shorthand for --template none
|
|
24
|
+
--site-url <url> The site's public origin. Default:
|
|
25
|
+
http://localhost:8787, which is what local dev wants.
|
|
26
|
+
--d1-name <name> D1 database name. Default: <name>
|
|
27
|
+
--d1-id <uuid> The id from \`wrangler d1 create\`, if it already
|
|
28
|
+
exists. Left as a placeholder otherwise.
|
|
29
|
+
--r2-name <name> R2 bucket name. Default: <name>-media
|
|
30
|
+
--email <mode> off, console, or cloudflare. Default: off
|
|
31
|
+
--email-from <address> Required with --email cloudflare
|
|
32
|
+
--force Write into a directory that is not empty
|
|
33
|
+
--no-install Do not run npm install
|
|
34
|
+
--no-git Do not run git init
|
|
35
|
+
-y, --yes Take the defaults and ask nothing
|
|
36
|
+
-h, --help This
|
|
37
|
+
-v, --version The scaffolder version
|
|
38
|
+
|
|
39
|
+
After it finishes, the README in the new project has the exact next commands.
|
|
40
|
+
`;
|
|
41
|
+
/** Turns anything a person types into a name Cloudflare accepts, or an empty string. */
|
|
42
|
+
export function toResourceName(input) {
|
|
43
|
+
return input
|
|
44
|
+
.trim()
|
|
45
|
+
.toLowerCase()
|
|
46
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
47
|
+
.replace(/^-+|-+$/g, '')
|
|
48
|
+
.slice(0, 63)
|
|
49
|
+
.replace(/-+$/g, '');
|
|
50
|
+
}
|
|
51
|
+
/** The last segment of a path, as a starting point for the project name. */
|
|
52
|
+
export function directoryName(directory) {
|
|
53
|
+
const parts = directory.split(/[/\\]/).filter((part) => part.length > 0 && part !== '.');
|
|
54
|
+
return parts[parts.length - 1] ?? '';
|
|
55
|
+
}
|
|
56
|
+
function flagValue(argv, index) {
|
|
57
|
+
const value = argv[index + 1];
|
|
58
|
+
return value === undefined || value.startsWith('--') ? null : value;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Reads argv (without node and the script). A positional argument is the
|
|
62
|
+
* directory; an unknown flag is an error, because a silently ignored
|
|
63
|
+
* `--templat` would scaffold the wrong project shape without saying so.
|
|
64
|
+
*/
|
|
65
|
+
export function parseArgs(argv) {
|
|
66
|
+
const answers = {};
|
|
67
|
+
const result = { mode: 'scaffold', answers, yes: false };
|
|
68
|
+
const fail = (error) => ({ ...result, error });
|
|
69
|
+
for (let i = 0; i < argv.length; i += 1) {
|
|
70
|
+
const arg = argv[i];
|
|
71
|
+
if (arg === '-h' || arg === '--help' || arg === 'help')
|
|
72
|
+
return { ...result, mode: 'help' };
|
|
73
|
+
if (arg === '-v' || arg === '--version')
|
|
74
|
+
return { ...result, mode: 'version' };
|
|
75
|
+
if (arg === '-y' || arg === '--yes') {
|
|
76
|
+
result.yes = true;
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
if (arg === '--force') {
|
|
80
|
+
answers.force = true;
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
if (arg === '--no-install') {
|
|
84
|
+
answers.install = false;
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
if (arg === '--no-git') {
|
|
88
|
+
answers.git = false;
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
if (arg === '--headless') {
|
|
92
|
+
answers.template = 'none';
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
if (arg === '--from-workspace') {
|
|
96
|
+
answers.fromWorkspace = true;
|
|
97
|
+
const value = flagValue(argv, i);
|
|
98
|
+
if (value !== null) {
|
|
99
|
+
answers.workspaceRoot = value;
|
|
100
|
+
i += 1;
|
|
101
|
+
}
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
if (arg.startsWith('--')) {
|
|
105
|
+
const eq = arg.indexOf('=');
|
|
106
|
+
const name = eq === -1 ? arg : arg.slice(0, eq);
|
|
107
|
+
let value = eq === -1 ? flagValue(argv, i) : arg.slice(eq + 1);
|
|
108
|
+
if (eq === -1 && value !== null)
|
|
109
|
+
i += 1;
|
|
110
|
+
if (value === null)
|
|
111
|
+
return fail(`${name} needs a value`);
|
|
112
|
+
value = value.trim();
|
|
113
|
+
switch (name) {
|
|
114
|
+
case '--name':
|
|
115
|
+
answers.projectName = value;
|
|
116
|
+
break;
|
|
117
|
+
case '--template':
|
|
118
|
+
if (value !== 'astro' && value !== 'none') {
|
|
119
|
+
return fail(`--template must be astro or none, not "${value}"`);
|
|
120
|
+
}
|
|
121
|
+
answers.template = value;
|
|
122
|
+
break;
|
|
123
|
+
case '--site-url':
|
|
124
|
+
answers.siteUrl = value;
|
|
125
|
+
break;
|
|
126
|
+
case '--d1-name':
|
|
127
|
+
answers.databaseName = value;
|
|
128
|
+
break;
|
|
129
|
+
case '--d1-id':
|
|
130
|
+
answers.databaseId = value;
|
|
131
|
+
break;
|
|
132
|
+
case '--r2-name':
|
|
133
|
+
answers.bucketName = value;
|
|
134
|
+
break;
|
|
135
|
+
case '--email':
|
|
136
|
+
if (value !== 'off' && value !== 'console' && value !== 'cloudflare') {
|
|
137
|
+
return fail(`--email must be off, console, or cloudflare, not "${value}"`);
|
|
138
|
+
}
|
|
139
|
+
answers.email = value;
|
|
140
|
+
break;
|
|
141
|
+
case '--email-from':
|
|
142
|
+
answers.emailFrom = value;
|
|
143
|
+
break;
|
|
144
|
+
case '--workspace-root':
|
|
145
|
+
answers.workspaceRoot = value;
|
|
146
|
+
answers.fromWorkspace = true;
|
|
147
|
+
break;
|
|
148
|
+
default:
|
|
149
|
+
return fail(`unknown option "${name}"`);
|
|
150
|
+
}
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
if (answers.directory !== undefined)
|
|
154
|
+
return fail(`unexpected argument "${arg}"`);
|
|
155
|
+
answers.directory = arg;
|
|
156
|
+
}
|
|
157
|
+
return result;
|
|
158
|
+
}
|
|
159
|
+
/** The defaults a name implies, so prompts and flags agree on what they mean. */
|
|
160
|
+
export function defaultsFor(projectName) {
|
|
161
|
+
return {
|
|
162
|
+
databaseName: projectName,
|
|
163
|
+
bucketName: `${projectName}-media`.slice(0, 63),
|
|
164
|
+
// Local dev is the first thing a new project does, and this is the origin
|
|
165
|
+
// it runs on. The README says to change it before deploying, and the
|
|
166
|
+
// doctor fails a deployment that still advertises localhost.
|
|
167
|
+
siteUrl: 'http://localhost:8787',
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Fills a partial set of answers out into a complete one, or says what is
|
|
172
|
+
* missing. This is the non-interactive path in full: with `--yes` and a
|
|
173
|
+
* directory, nothing else is required.
|
|
174
|
+
*/
|
|
175
|
+
export function resolveOptions(answers, cwd = process.cwd()) {
|
|
176
|
+
const directory = answers.directory?.trim();
|
|
177
|
+
if (!directory) {
|
|
178
|
+
return { error: 'no directory given. Try: npm create we8 my-site' };
|
|
179
|
+
}
|
|
180
|
+
// `.` is a real answer: scaffolding into a directory somebody already made
|
|
181
|
+
// and named. Resolving first means the name comes from that directory rather
|
|
182
|
+
// than from a dot.
|
|
183
|
+
const rawName = answers.projectName ?? directoryName(resolve(cwd, directory));
|
|
184
|
+
const projectName = toResourceName(rawName);
|
|
185
|
+
if (!projectName) {
|
|
186
|
+
return {
|
|
187
|
+
error: `"${rawName}" has no letters or digits to make a name from. Pass one with --name.`,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
const defaults = defaultsFor(projectName);
|
|
191
|
+
const databaseName = toResourceName(answers.databaseName ?? defaults.databaseName);
|
|
192
|
+
const bucketName = toResourceName(answers.bucketName ?? defaults.bucketName);
|
|
193
|
+
for (const [label, value] of [
|
|
194
|
+
['--name', projectName],
|
|
195
|
+
['--d1-name', databaseName],
|
|
196
|
+
['--r2-name', bucketName],
|
|
197
|
+
]) {
|
|
198
|
+
if (!isValidResourceName(value)) {
|
|
199
|
+
return { error: `${label} "${value}" is not a name Cloudflare accepts.` };
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
const email = answers.email ?? 'off';
|
|
203
|
+
if (email === 'cloudflare' && !answers.emailFrom) {
|
|
204
|
+
return { error: '--email cloudflare needs --email-from, on a domain onboarded to Email Service.' };
|
|
205
|
+
}
|
|
206
|
+
const siteUrl = answers.siteUrl ?? defaults.siteUrl;
|
|
207
|
+
try {
|
|
208
|
+
const url = new URL(siteUrl);
|
|
209
|
+
if (url.protocol !== 'http:' && url.protocol !== 'https:') {
|
|
210
|
+
return { error: `--site-url "${siteUrl}" must be http or https.` };
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
catch {
|
|
214
|
+
return { error: `--site-url "${siteUrl}" is not a URL. Use a full origin, e.g. https://example.com` };
|
|
215
|
+
}
|
|
216
|
+
return {
|
|
217
|
+
options: {
|
|
218
|
+
directory,
|
|
219
|
+
projectName,
|
|
220
|
+
template: answers.template ?? 'astro',
|
|
221
|
+
databaseName,
|
|
222
|
+
bucketName,
|
|
223
|
+
databaseId: answers.databaseId,
|
|
224
|
+
siteUrl,
|
|
225
|
+
email,
|
|
226
|
+
emailFrom: answers.emailFrom,
|
|
227
|
+
force: answers.force ?? false,
|
|
228
|
+
fromWorkspace: answers.fromWorkspace ?? false,
|
|
229
|
+
workspaceRoot: answers.workspaceRoot,
|
|
230
|
+
install: answers.install ?? true,
|
|
231
|
+
git: answers.git ?? true,
|
|
232
|
+
},
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
//# sourceMappingURL=options.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"options.js","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The interactive path. Six questions, each with a default, and every one of
|
|
3
|
+
* them also settable as a flag: `--yes` and a directory is the whole
|
|
4
|
+
* non-interactive path, and the prompts only fill in the same structure.
|
|
5
|
+
*
|
|
6
|
+
* `node:readline/promises` rather than a prompt library, because the
|
|
7
|
+
* scaffolder is the first thing a stranger runs and it should not be a
|
|
8
|
+
* dependency tree.
|
|
9
|
+
*/
|
|
10
|
+
import { type ScaffoldOptions } from './options.js';
|
|
11
|
+
/** What a prompt session needs. A test passes its own; the CLI passes readline. */
|
|
12
|
+
export interface Asker {
|
|
13
|
+
question(prompt: string): Promise<string>;
|
|
14
|
+
close(): void;
|
|
15
|
+
}
|
|
16
|
+
/** Wraps stdin and stdout as an Asker. */
|
|
17
|
+
export declare function terminalAsker(): Asker;
|
|
18
|
+
/**
|
|
19
|
+
* Asks for whatever the flags did not already answer, and returns the merged
|
|
20
|
+
* set. Nothing here validates: `resolveOptions` does that for both paths, so
|
|
21
|
+
* one rule cannot drift from the other.
|
|
22
|
+
*/
|
|
23
|
+
export declare function promptForAnswers(given: Partial<ScaffoldOptions>, asker: Asker, cwd?: string): Promise<Partial<ScaffoldOptions>>;
|
|
24
|
+
//# sourceMappingURL=prompts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,OAAO,EAA8C,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAEhG,mFAAmF;AACnF,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1C,KAAK,IAAI,IAAI,CAAC;CACf;AAED,0CAA0C;AAC1C,wBAAgB,aAAa,IAAI,KAAK,CAQrC;AAoBD;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,OAAO,CAAC,eAAe,CAAC,EAC/B,KAAK,EAAE,KAAK,EACZ,GAAG,GAAE,MAAsB,GAC1B,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAyCnC"}
|
package/dist/prompts.js
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The interactive path. Six questions, each with a default, and every one of
|
|
3
|
+
* them also settable as a flag: `--yes` and a directory is the whole
|
|
4
|
+
* non-interactive path, and the prompts only fill in the same structure.
|
|
5
|
+
*
|
|
6
|
+
* `node:readline/promises` rather than a prompt library, because the
|
|
7
|
+
* scaffolder is the first thing a stranger runs and it should not be a
|
|
8
|
+
* dependency tree.
|
|
9
|
+
*/
|
|
10
|
+
import { createInterface } from 'node:readline/promises';
|
|
11
|
+
import { resolve } from 'node:path';
|
|
12
|
+
import { stdin, stdout } from 'node:process';
|
|
13
|
+
import { defaultsFor, directoryName, toResourceName } from './options.js';
|
|
14
|
+
/** Wraps stdin and stdout as an Asker. */
|
|
15
|
+
export function terminalAsker() {
|
|
16
|
+
const rl = createInterface({ input: stdin, output: stdout });
|
|
17
|
+
return {
|
|
18
|
+
question: (prompt) => rl.question(prompt),
|
|
19
|
+
close: () => {
|
|
20
|
+
rl.close();
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
async function ask(asker, question, fallback) {
|
|
25
|
+
const answer = (await asker.question(`${question} (${fallback}) `)).trim();
|
|
26
|
+
return answer.length > 0 ? answer : fallback;
|
|
27
|
+
}
|
|
28
|
+
async function askChoice(asker, question, choices, fallback) {
|
|
29
|
+
for (;;) {
|
|
30
|
+
const answer = await ask(asker, `${question} [${choices.join(' / ')}]`, fallback);
|
|
31
|
+
if (choices.includes(answer))
|
|
32
|
+
return answer;
|
|
33
|
+
console.log(` "${answer}" is not one of ${choices.join(', ')}.`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Asks for whatever the flags did not already answer, and returns the merged
|
|
38
|
+
* set. Nothing here validates: `resolveOptions` does that for both paths, so
|
|
39
|
+
* one rule cannot drift from the other.
|
|
40
|
+
*/
|
|
41
|
+
export async function promptForAnswers(given, asker, cwd = process.cwd()) {
|
|
42
|
+
const answers = { ...given };
|
|
43
|
+
if (answers.directory === undefined) {
|
|
44
|
+
answers.directory = await ask(asker, 'Where should the project go?', './my-we8-site');
|
|
45
|
+
}
|
|
46
|
+
if (answers.projectName === undefined) {
|
|
47
|
+
const suggested = toResourceName(directoryName(resolve(cwd, answers.directory))) || 'my-we8-site';
|
|
48
|
+
answers.projectName = await ask(asker, 'Project name (also the Worker name)', suggested);
|
|
49
|
+
}
|
|
50
|
+
const name = toResourceName(answers.projectName) || 'my-we8-site';
|
|
51
|
+
const defaults = defaultsFor(name);
|
|
52
|
+
if (answers.template === undefined) {
|
|
53
|
+
answers.template = await askChoice(asker, 'Include the Astro starter site, or headless only?', ['astro', 'none'], 'astro');
|
|
54
|
+
}
|
|
55
|
+
if (answers.databaseName === undefined) {
|
|
56
|
+
answers.databaseName = await ask(asker, 'D1 database name', defaults.databaseName);
|
|
57
|
+
}
|
|
58
|
+
if (answers.bucketName === undefined) {
|
|
59
|
+
answers.bucketName = await ask(asker, 'R2 bucket name', defaults.bucketName);
|
|
60
|
+
}
|
|
61
|
+
if (answers.siteUrl === undefined) {
|
|
62
|
+
answers.siteUrl = await ask(asker, 'Public origin of the site (change it before you deploy)', defaults.siteUrl);
|
|
63
|
+
}
|
|
64
|
+
return answers;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Assembling the project on disk: write the generated files, copy the template
|
|
3
|
+
* if one was asked for, then install and initialise git.
|
|
4
|
+
*
|
|
5
|
+
* The decisions all happened in `options.ts` and the contents all came from
|
|
6
|
+
* `files.ts`, so this file only moves bytes and reports what it moved.
|
|
7
|
+
*/
|
|
8
|
+
import { type DependencySpecs } from './files.js';
|
|
9
|
+
import type { ScaffoldOptions } from './options.js';
|
|
10
|
+
/** The template directory as it is named inside the published package. */
|
|
11
|
+
export declare const BUNDLED_TEMPLATE_DIR = "template";
|
|
12
|
+
export interface ScaffoldResult {
|
|
13
|
+
/** The absolute project directory. */
|
|
14
|
+
directory: string;
|
|
15
|
+
/** Every file written, relative to the project directory. */
|
|
16
|
+
written: string[];
|
|
17
|
+
/** Whether the template was copied in. */
|
|
18
|
+
templateCopied: boolean;
|
|
19
|
+
/** The checkout the we8 packages were linked from, when they were. */
|
|
20
|
+
workspaceRoot: string | null;
|
|
21
|
+
/** Whether `npm install` ran and succeeded. */
|
|
22
|
+
installed: boolean;
|
|
23
|
+
/** Whether `git init` ran and succeeded. */
|
|
24
|
+
gitInitialised: boolean;
|
|
25
|
+
/** Anything that went wrong but did not stop the scaffold. */
|
|
26
|
+
warnings: string[];
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Finds the checkout to link the we8 packages from. Explicit beats the
|
|
30
|
+
* environment beats walking up from this package, which is what happens when
|
|
31
|
+
* the scaffolder runs out of the repo it lives in.
|
|
32
|
+
*/
|
|
33
|
+
export declare function resolveWorkspaceRoot(options: Pick<ScaffoldOptions, 'fromWorkspace' | 'workspaceRoot'>, env?: NodeJS.ProcessEnv): string | null;
|
|
34
|
+
/**
|
|
35
|
+
* Where the Astro starter is. Published, it sits inside this package; in the
|
|
36
|
+
* repo it is a workspace, and `prepack` copies it in.
|
|
37
|
+
*/
|
|
38
|
+
export declare function resolveTemplateDir(workspaceRoot: string | null): string | null;
|
|
39
|
+
/**
|
|
40
|
+
* Rewrites the template's manifest for its new home: the site's own name, and
|
|
41
|
+
* we8 dependencies pointing wherever this scaffold points them.
|
|
42
|
+
*/
|
|
43
|
+
export declare function rewriteTemplateManifest(original: string, projectName: string, deps: DependencySpecs): string;
|
|
44
|
+
/**
|
|
45
|
+
* Writes the project. Refuses a directory that already has files in it unless
|
|
46
|
+
* `--force`, because scaffolding over somebody's work is not recoverable.
|
|
47
|
+
*/
|
|
48
|
+
export declare function scaffoldProject(options: ScaffoldOptions, cwd?: string): ScaffoldResult;
|
|
49
|
+
//# sourceMappingURL=scaffold.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,OAAO,EAAmC,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AACnF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEpD,0EAA0E;AAC1E,eAAO,MAAM,oBAAoB,aAAa,CAAC;AAa/C,MAAM,WAAW,cAAc;IAC7B,sCAAsC;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,6DAA6D;IAC7D,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,0CAA0C;IAC1C,cAAc,EAAE,OAAO,CAAC;IACxB,sEAAsE;IACtE,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,+CAA+C;IAC/C,SAAS,EAAE,OAAO,CAAC;IACnB,4CAA4C;IAC5C,cAAc,EAAE,OAAO,CAAC;IACxB,8DAA8D;IAC9D,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAgBD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,eAAe,GAAG,eAAe,CAAC,EACjE,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,GAAG,IAAI,CAiBf;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAU9E;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,eAAe,GACpB,MAAM,CA4BR;AAaD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,GAAE,MAAsB,GAAG,cAAc,CA4ErG"}
|
package/dist/scaffold.js
ADDED
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Assembling the project on disk: write the generated files, copy the template
|
|
3
|
+
* if one was asked for, then install and initialise git.
|
|
4
|
+
*
|
|
5
|
+
* The decisions all happened in `options.ts` and the contents all came from
|
|
6
|
+
* `files.ts`, so this file only moves bytes and reports what it moved.
|
|
7
|
+
*/
|
|
8
|
+
import { cpSync, existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
9
|
+
import { spawnSync } from 'node:child_process';
|
|
10
|
+
import { dirname, join, resolve } from 'node:path';
|
|
11
|
+
import { fileURLToPath } from 'node:url';
|
|
12
|
+
import { dependencySpecs, generatedFiles } from './files.js';
|
|
13
|
+
/** The template directory as it is named inside the published package. */
|
|
14
|
+
export const BUNDLED_TEMPLATE_DIR = 'template';
|
|
15
|
+
/** Copied from the template only when it is not one of these. */
|
|
16
|
+
const TEMPLATE_EXCLUDES = new Set([
|
|
17
|
+
'node_modules',
|
|
18
|
+
'dist',
|
|
19
|
+
'.astro',
|
|
20
|
+
// The template's own test suite proves the template; it is not part of a
|
|
21
|
+
// site somebody is about to write their own content into.
|
|
22
|
+
'test',
|
|
23
|
+
'vitest.config.ts',
|
|
24
|
+
]);
|
|
25
|
+
function packageRoot() {
|
|
26
|
+
// dist/scaffold.js, or src/scaffold.ts under a source runner.
|
|
27
|
+
return resolve(dirname(fileURLToPath(import.meta.url)), '..');
|
|
28
|
+
}
|
|
29
|
+
/** True for a checkout that has the workspaces this scaffolder links against. */
|
|
30
|
+
function looksLikeWorkspace(candidate) {
|
|
31
|
+
return (existsSync(join(candidate, 'packages', 'cms')) &&
|
|
32
|
+
existsSync(join(candidate, 'packages', 'cloudflare')) &&
|
|
33
|
+
existsSync(join(candidate, 'templates', 'astro-starter')));
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Finds the checkout to link the we8 packages from. Explicit beats the
|
|
37
|
+
* environment beats walking up from this package, which is what happens when
|
|
38
|
+
* the scaffolder runs out of the repo it lives in.
|
|
39
|
+
*/
|
|
40
|
+
export function resolveWorkspaceRoot(options, env = process.env) {
|
|
41
|
+
if (!options.fromWorkspace)
|
|
42
|
+
return null;
|
|
43
|
+
const explicit = options.workspaceRoot ?? env['WE8_WORKSPACE_ROOT'];
|
|
44
|
+
if (explicit) {
|
|
45
|
+
const absolute = resolve(explicit);
|
|
46
|
+
return looksLikeWorkspace(absolute) ? absolute : null;
|
|
47
|
+
}
|
|
48
|
+
let current = packageRoot();
|
|
49
|
+
for (let i = 0; i < 6; i += 1) {
|
|
50
|
+
if (looksLikeWorkspace(current))
|
|
51
|
+
return current;
|
|
52
|
+
const parent = dirname(current);
|
|
53
|
+
if (parent === current)
|
|
54
|
+
break;
|
|
55
|
+
current = parent;
|
|
56
|
+
}
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Where the Astro starter is. Published, it sits inside this package; in the
|
|
61
|
+
* repo it is a workspace, and `prepack` copies it in.
|
|
62
|
+
*/
|
|
63
|
+
export function resolveTemplateDir(workspaceRoot) {
|
|
64
|
+
const bundled = join(packageRoot(), BUNDLED_TEMPLATE_DIR);
|
|
65
|
+
if (existsSync(bundled))
|
|
66
|
+
return bundled;
|
|
67
|
+
const fromWorkspace = workspaceRoot ?? resolveWorkspaceRoot({ fromWorkspace: true, workspaceRoot: undefined });
|
|
68
|
+
if (fromWorkspace) {
|
|
69
|
+
const candidate = join(fromWorkspace, 'templates', 'astro-starter');
|
|
70
|
+
if (existsSync(candidate))
|
|
71
|
+
return candidate;
|
|
72
|
+
}
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Rewrites the template's manifest for its new home: the site's own name, and
|
|
77
|
+
* we8 dependencies pointing wherever this scaffold points them.
|
|
78
|
+
*/
|
|
79
|
+
export function rewriteTemplateManifest(original, projectName, deps) {
|
|
80
|
+
const manifest = JSON.parse(original);
|
|
81
|
+
manifest['name'] = `${projectName}-site`;
|
|
82
|
+
manifest['private'] = true;
|
|
83
|
+
manifest['description'] = `The ${projectName} website. Builds from fixtures until it is pointed at the CMS.`;
|
|
84
|
+
const dependencies = { ...manifest['dependencies'] };
|
|
85
|
+
if ('@we8/astro' in dependencies)
|
|
86
|
+
dependencies['@we8/astro'] = deps.astro;
|
|
87
|
+
if ('@we8/client' in dependencies)
|
|
88
|
+
dependencies['@we8/client'] = deps.client;
|
|
89
|
+
// Under --from-workspace the deps are file: paths installed with
|
|
90
|
+
// --install-links, so a packed @we8/astro cannot resolve its @we8/client
|
|
91
|
+
// range from the registry; the site declares the client explicitly. A
|
|
92
|
+
// registry install resolves it transitively and needs no extra entry.
|
|
93
|
+
if ('@we8/astro' in dependencies && deps.client.startsWith('file:')) {
|
|
94
|
+
dependencies['@we8/client'] = deps.client;
|
|
95
|
+
}
|
|
96
|
+
manifest['dependencies'] = dependencies;
|
|
97
|
+
const devDependencies = { ...manifest['devDependencies'] };
|
|
98
|
+
delete devDependencies['vitest'];
|
|
99
|
+
manifest['devDependencies'] = devDependencies;
|
|
100
|
+
const scripts = { ...manifest['scripts'] };
|
|
101
|
+
delete scripts['test'];
|
|
102
|
+
manifest['scripts'] = scripts;
|
|
103
|
+
return `${JSON.stringify(manifest, null, 2)}\n`;
|
|
104
|
+
}
|
|
105
|
+
function writeFile(directory, relativePath, contents) {
|
|
106
|
+
const target = join(directory, relativePath);
|
|
107
|
+
mkdirSync(dirname(target), { recursive: true });
|
|
108
|
+
writeFileSync(target, contents, 'utf8');
|
|
109
|
+
}
|
|
110
|
+
function run(command, args, cwd) {
|
|
111
|
+
const result = spawnSync(command, args, { cwd, stdio: 'inherit', shell: process.platform === 'win32' });
|
|
112
|
+
return !result.error && result.status === 0;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Writes the project. Refuses a directory that already has files in it unless
|
|
116
|
+
* `--force`, because scaffolding over somebody's work is not recoverable.
|
|
117
|
+
*/
|
|
118
|
+
export function scaffoldProject(options, cwd = process.cwd()) {
|
|
119
|
+
const directory = resolve(cwd, options.directory);
|
|
120
|
+
const warnings = [];
|
|
121
|
+
if (existsSync(directory)) {
|
|
122
|
+
const existing = readdirSync(directory).filter((name) => name !== '.git' && name !== '.DS_Store');
|
|
123
|
+
if (existing.length > 0 && !options.force) {
|
|
124
|
+
throw new Error(`${directory} is not empty (${String(existing.length)} entries). Pick another directory, or pass --force.`);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
mkdirSync(directory, { recursive: true });
|
|
128
|
+
const workspaceRoot = resolveWorkspaceRoot(options);
|
|
129
|
+
if (options.fromWorkspace && !workspaceRoot) {
|
|
130
|
+
warnings.push('could not find a we8 checkout to link from; falling back to the published version ranges');
|
|
131
|
+
}
|
|
132
|
+
const deps = dependencySpecs(options, workspaceRoot);
|
|
133
|
+
const written = [];
|
|
134
|
+
for (const file of generatedFiles(options, deps)) {
|
|
135
|
+
writeFile(directory, file.path, file.contents);
|
|
136
|
+
written.push(file.path);
|
|
137
|
+
}
|
|
138
|
+
let templateCopied = false;
|
|
139
|
+
if (options.template === 'astro') {
|
|
140
|
+
const templateDir = resolveTemplateDir(workspaceRoot);
|
|
141
|
+
if (!templateDir) {
|
|
142
|
+
warnings.push('the Astro template could not be found, so the project is headless-only');
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
const siteDir = join(directory, 'site');
|
|
146
|
+
cpSync(templateDir, siteDir, {
|
|
147
|
+
recursive: true,
|
|
148
|
+
filter: (source) => {
|
|
149
|
+
const name = source.slice(templateDir.length + 1).split(/[/\\]/)[0];
|
|
150
|
+
return name === undefined || !TEMPLATE_EXCLUDES.has(name);
|
|
151
|
+
},
|
|
152
|
+
});
|
|
153
|
+
writeFileSync(join(siteDir, 'package.json'), rewriteTemplateManifest(readFileSync(join(siteDir, 'package.json'), 'utf8'), options.projectName, deps), 'utf8');
|
|
154
|
+
written.push('site/');
|
|
155
|
+
templateCopied = true;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
let installed = false;
|
|
159
|
+
if (options.install) {
|
|
160
|
+
// --install-links only matters under --from-workspace: npm then packs the
|
|
161
|
+
// file: dependencies and installs real files instead of symlinking them.
|
|
162
|
+
// A symlinked @we8/astro resolves its .astro components outside the
|
|
163
|
+
// project root, which Astro's compiler cannot follow; unpacked files are
|
|
164
|
+
// also exactly the shape a registry install produces.
|
|
165
|
+
const installArgs = options.fromWorkspace ? ['install', '--install-links'] : ['install'];
|
|
166
|
+
installed = run('npm', installArgs, directory);
|
|
167
|
+
if (!installed)
|
|
168
|
+
warnings.push('npm install did not finish; run it yourself before anything else');
|
|
169
|
+
}
|
|
170
|
+
let gitInitialised = false;
|
|
171
|
+
if (options.git && !existsSync(join(directory, '.git'))) {
|
|
172
|
+
gitInitialised = run('git', ['init', '--quiet'], directory);
|
|
173
|
+
if (!gitInitialised)
|
|
174
|
+
warnings.push('git init did not run; the project is fine without it');
|
|
175
|
+
}
|
|
176
|
+
return { directory, written, templateCopied, workspaceRoot, installed, gitInitialised, warnings };
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=scaffold.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "create-we8",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"license": "MIT",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "git+https://github.com/reveriext/we8-package.git",
|
|
8
|
+
"directory": "packages/create-we8"
|
|
9
|
+
},
|
|
10
|
+
"homepage": "https://github.com/reveriext/we8-package/tree/main/packages/create-we8#readme",
|
|
11
|
+
"bugs": "https://github.com/reveriext/we8-package/issues",
|
|
12
|
+
"type": "module",
|
|
13
|
+
"description": "The we8 scaffolder: `npm create we8` assembles the CMS, the Cloudflare pack, and a template into a ready-to-deploy project.",
|
|
14
|
+
"keywords": [
|
|
15
|
+
"we8",
|
|
16
|
+
"cms",
|
|
17
|
+
"headless-cms",
|
|
18
|
+
"create",
|
|
19
|
+
"scaffold",
|
|
20
|
+
"starter",
|
|
21
|
+
"cloudflare-workers"
|
|
22
|
+
],
|
|
23
|
+
"main": "./dist/index.js",
|
|
24
|
+
"types": "./dist/index.d.ts",
|
|
25
|
+
"exports": {
|
|
26
|
+
".": {
|
|
27
|
+
"types": "./dist/index.d.ts",
|
|
28
|
+
"default": "./dist/index.js"
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
"bin": {
|
|
32
|
+
"create-we8": "./dist/cli.js"
|
|
33
|
+
},
|
|
34
|
+
"files": [
|
|
35
|
+
"dist",
|
|
36
|
+
"template",
|
|
37
|
+
"README.md"
|
|
38
|
+
],
|
|
39
|
+
"sideEffects": false,
|
|
40
|
+
"scripts": {
|
|
41
|
+
"build": "tsc -p tsconfig.build.json",
|
|
42
|
+
"typecheck": "tsc -p tsconfig.json",
|
|
43
|
+
"test": "vitest run",
|
|
44
|
+
"prepack": "npm run build && node dist/copy-template.js"
|
|
45
|
+
},
|
|
46
|
+
"publishConfig": {
|
|
47
|
+
"access": "public"
|
|
48
|
+
},
|
|
49
|
+
"dependencies": {
|
|
50
|
+
"@we8/cloudflare": "^0.1.0"
|
|
51
|
+
},
|
|
52
|
+
"devDependencies": {
|
|
53
|
+
"vitest": "^4.1.9"
|
|
54
|
+
},
|
|
55
|
+
"engines": {
|
|
56
|
+
"node": ">=20"
|
|
57
|
+
}
|
|
58
|
+
}
|