create-pyric 0.1.0-alpha.10

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.
@@ -0,0 +1,244 @@
1
+ /**
2
+ * Shared project scaffold used by `create-pyric` and `pyric init`.
3
+ *
4
+ * Never prompts. Idempotent: existing files are merged (package.json) or
5
+ * skipped; `--force` overwrites scaffold-owned files only.
6
+ */
7
+ import { writeFile, readFile, mkdir, access } from 'node:fs/promises';
8
+ import { join, basename, resolve } from 'node:path';
9
+ import { TEMPLATES } from './templates.js';
10
+ export { TEMPLATES };
11
+ /** Return a copy of `t` with `pyric` / `@pyric/cli` deps rewritten for `mode`. */
12
+ export function applyDepsMode(t, mode, opts) {
13
+ const WORKSPACE_PKGS = ['pyric', '@pyric/cli'];
14
+ const rewrite = (section) => {
15
+ const next = { ...section };
16
+ for (const pkg of WORKSPACE_PKGS) {
17
+ if (!(pkg in next))
18
+ continue;
19
+ next[pkg] =
20
+ mode === 'vendor'
21
+ ? (opts.vendorSpecs?.[pkg] ?? next[pkg])
22
+ : opts.version
23
+ ? `^${opts.version}`
24
+ : next[pkg];
25
+ }
26
+ if (mode === 'vendor' && '@pyric/cli' in next && !('pyric' in next) && opts.vendorSpecs?.pyric) {
27
+ next.pyric = opts.vendorSpecs.pyric;
28
+ }
29
+ return next;
30
+ };
31
+ const overrides = mode === 'vendor' && opts.vendorSpecs?.pyric ? { pyric: opts.vendorSpecs.pyric } : t.overrides;
32
+ return {
33
+ ...t,
34
+ dependencies: rewrite(t.dependencies),
35
+ devDependencies: rewrite(t.devDependencies),
36
+ overrides,
37
+ };
38
+ }
39
+ function detectIndent(raw) {
40
+ const m = raw.match(/\n([ \t]+)"/);
41
+ if (!m)
42
+ return 2;
43
+ const ws = m[1];
44
+ return ws.includes('\t') ? '\t' : ws.length;
45
+ }
46
+ /** Merge template fields into an existing package.json. Never overwrites. */
47
+ export function mergeIntoExistingPackageJson(raw, projectName, template) {
48
+ let parsed;
49
+ try {
50
+ parsed = JSON.parse(raw);
51
+ }
52
+ catch (e) {
53
+ throw new Error(`package.json is not valid JSON: ${e instanceof Error ? e.message : String(e)}`);
54
+ }
55
+ const indent = detectIndent(raw);
56
+ const added = [];
57
+ const conflicts = [];
58
+ if (parsed.name === undefined) {
59
+ parsed.name = projectName;
60
+ added.push('name');
61
+ }
62
+ if (parsed.type === undefined) {
63
+ parsed.type = 'module';
64
+ added.push('type');
65
+ }
66
+ else if (parsed.type !== 'module') {
67
+ conflicts.push({ key: 'type', existing: parsed.type, wanted: 'module' });
68
+ }
69
+ if (parsed.private === undefined) {
70
+ parsed.private = true;
71
+ added.push('private');
72
+ }
73
+ const mergeObject = (field, wanted) => {
74
+ if (parsed[field] === undefined) {
75
+ parsed[field] = {};
76
+ }
77
+ const obj = parsed[field];
78
+ for (const [key, value] of Object.entries(wanted)) {
79
+ if (obj[key] === undefined) {
80
+ obj[key] = value;
81
+ added.push(`${field}.${key}`);
82
+ }
83
+ else if (obj[key] !== value) {
84
+ conflicts.push({ key: `${field}.${key}`, existing: obj[key], wanted: value });
85
+ }
86
+ }
87
+ };
88
+ mergeObject('scripts', template.scripts);
89
+ mergeObject('dependencies', template.dependencies);
90
+ mergeObject('devDependencies', template.devDependencies);
91
+ if (template.overrides)
92
+ mergeObject('overrides', template.overrides);
93
+ return {
94
+ contents: JSON.stringify(parsed, null, indent) + '\n',
95
+ added,
96
+ conflicts,
97
+ unchanged: added.length === 0 && conflicts.length === 0,
98
+ };
99
+ }
100
+ export function packageJsonFor(name, t) {
101
+ return (JSON.stringify({
102
+ name,
103
+ version: '0.0.0',
104
+ type: 'module',
105
+ private: true,
106
+ scripts: t.scripts,
107
+ dependencies: t.dependencies,
108
+ devDependencies: t.devDependencies,
109
+ ...(t.overrides ? { overrides: t.overrides } : {}),
110
+ }, null, 2) + '\n');
111
+ }
112
+ async function defaultExists(path) {
113
+ try {
114
+ await access(path);
115
+ return true;
116
+ }
117
+ catch {
118
+ return false;
119
+ }
120
+ }
121
+ /** Reclaim `--force dir` / `--json dir` when a parser bound the value as the flag. */
122
+ export function normalizeBoolFlags(flags, positional) {
123
+ for (const key of ['force', 'json']) {
124
+ const v = flags.get(key);
125
+ if (typeof v === 'string') {
126
+ positional.push(v);
127
+ flags.set(key, true);
128
+ }
129
+ }
130
+ }
131
+ /**
132
+ * Write the scaffold into `dir`. Caller prepares vendor tarballs / pin when
133
+ * needed and may pass `effectiveTemplate`.
134
+ */
135
+ export async function runScaffold(request, deps = {}) {
136
+ const out = deps.stdout ?? process.stdout;
137
+ const err = deps.stderr ?? process.stderr;
138
+ const cwd = deps.cwd ?? process.cwd();
139
+ const write = deps.writeFile ?? writeFile;
140
+ const read = deps.readFile ?? readFile;
141
+ const mk = deps.mkdir ?? mkdir;
142
+ const exists = deps.exists ?? defaultExists;
143
+ const label = request.commandLabel ?? 'create-pyric';
144
+ const templateName = request.template ?? 'web';
145
+ if (templateName !== 'web' && templateName !== 'node' && templateName !== 'static') {
146
+ err.write(`${label}: unknown template '${templateName}' (expected web|node|static)\n`);
147
+ return 1;
148
+ }
149
+ const template = TEMPLATES[templateName];
150
+ const depsMode = request.depsMode ?? 'npm';
151
+ const pinVersion = request.pinVersion ?? null;
152
+ const dir = request.dir ? resolve(cwd, request.dir) : cwd;
153
+ const projectName = request.name && request.name.length > 0 ? request.name : basename(dir);
154
+ const force = request.force === true;
155
+ const json = request.json === true;
156
+ const report = json ? err : out;
157
+ try {
158
+ for (const d of [dir, ...template.dirs.map((d) => join(dir, d))]) {
159
+ await mk(d, { recursive: true });
160
+ }
161
+ }
162
+ catch (e) {
163
+ err.write(`${label}: failed to create project directories: ${e instanceof Error ? e.message : String(e)}\n`);
164
+ return 2;
165
+ }
166
+ const effective = request.effectiveTemplate ??
167
+ applyDepsMode(template, depsMode === 'vendor' ? 'vendor' : 'npm', {
168
+ version: pinVersion,
169
+ });
170
+ const result = {
171
+ template: templateName,
172
+ dir,
173
+ depsMode,
174
+ created: [...(request.preCreated ?? [])],
175
+ merged: [],
176
+ skipped: [],
177
+ conflicts: [],
178
+ nextSteps: template.nextSteps,
179
+ };
180
+ const pkgPath = join(dir, 'package.json');
181
+ let pkgMerge = null;
182
+ try {
183
+ if (await exists(pkgPath)) {
184
+ const raw = (await read(pkgPath, 'utf-8'));
185
+ const text = typeof raw === 'string' ? raw : String(raw);
186
+ pkgMerge = mergeIntoExistingPackageJson(text, projectName, effective);
187
+ result.conflicts = pkgMerge.conflicts;
188
+ if (pkgMerge.unchanged) {
189
+ result.skipped.push('package.json');
190
+ }
191
+ else {
192
+ await write(pkgPath, pkgMerge.contents, 'utf-8');
193
+ result.merged.push('package.json');
194
+ }
195
+ }
196
+ else {
197
+ await write(pkgPath, packageJsonFor(projectName, effective), 'utf-8');
198
+ result.created.push('package.json');
199
+ }
200
+ }
201
+ catch (e) {
202
+ err.write(`${label}: failed to handle package.json: ${e instanceof Error ? e.message : String(e)}\n`);
203
+ return 2;
204
+ }
205
+ for (const t of template.files(projectName)) {
206
+ const path = join(dir, t.name);
207
+ if (!force && (await exists(path))) {
208
+ result.skipped.push(t.name);
209
+ continue;
210
+ }
211
+ try {
212
+ await write(path, t.content, 'utf-8');
213
+ result.created.push(t.name);
214
+ }
215
+ catch (e) {
216
+ err.write(`${label}: failed to write ${t.name}: ${e instanceof Error ? e.message : String(e)}\n`);
217
+ return 2;
218
+ }
219
+ }
220
+ report.write(`${label}: scaffolded ${templateName} project "${projectName}" in ${dir}\n`);
221
+ for (const c of result.created)
222
+ report.write(` + wrote ${c}\n`);
223
+ for (const m of result.merged) {
224
+ report.write(` ~ merged ${m} (added: ${pkgMerge.added.join(', ')})\n`);
225
+ }
226
+ for (const s of result.skipped)
227
+ report.write(` · skipped ${s} (already exists)\n`);
228
+ if (result.conflicts.length > 0) {
229
+ report.write('\npackage.json — kept your values for these keys (pyric wanted different):\n');
230
+ for (const c of result.conflicts) {
231
+ report.write(` · ${c.key}: ${JSON.stringify(c.existing)} (pyric would have set ${JSON.stringify(c.wanted)})\n`);
232
+ }
233
+ }
234
+ report.write(depsMode === 'vendor'
235
+ ? '\n deps: vendored pyric + @pyric/cli into vendor/ — installs offline, no registry\n'
236
+ : `\n deps: pyric + @pyric/cli from npm${pinVersion ? ` (^${pinVersion})` : ''}\n`);
237
+ report.write('\nNext steps:\n');
238
+ for (const s of result.nextSteps)
239
+ report.write(` ${s}\n`);
240
+ if (json)
241
+ out.write(JSON.stringify(result) + '\n');
242
+ return 0;
243
+ }
244
+ //# sourceMappingURL=scaffold.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Scaffold templates for `pyric init` (engine in `./init.js`).
3
+ *
4
+ * `web` (the default) scaffolds a **Vite app** wired to the `@pyric/cli/vite`
5
+ * plugin: `vite dev` runs the app's CANONICAL `firebase/*` imports against the
6
+ * in-process sandbox; `vite build` ships the real `firebase` package. One
7
+ * toolchain, no graduation cliff — the sandbox↔Firebase swap is environmental
8
+ * (dev vs build), never a code edit (the design rationale section 9).
9
+ *
10
+ * `static` is the serve-era scaffold (no bundler): a static app `pyric dev`
11
+ * runs against the in-page sandbox via a runtime import map. For pre-built /
12
+ * retrofit apps, or anyone who wants zero build step.
13
+ *
14
+ * `node` is the script-style scaffold (backend fixtures, agent loops). Its
15
+ * canonical imports are swapped by the dev command and remain Firebase under
16
+ * the production command.
17
+ */
18
+ export interface ScaffoldTemplate {
19
+ /** package.json pieces merged into existing files / written into new ones. */
20
+ scripts: Record<string, string>;
21
+ dependencies: Record<string, string>;
22
+ devDependencies: Record<string, string>;
23
+ /** npm/bun `overrides` (optional). Vendor mode sets `{ pyric: file:… }` so a
24
+ * transitive `pyric` dep can't resolve to the published placeholder. */
25
+ overrides?: Record<string, string>;
26
+ /** Directories created before writing files (relative to the project dir). */
27
+ dirs: string[];
28
+ /** Scaffold-owned files, relative path → content. */
29
+ files(name: string): Array<{
30
+ name: string;
31
+ content: string;
32
+ }>;
33
+ /** Literal commands for the report / `--json` consumers. */
34
+ nextSteps: string[];
35
+ }
36
+ export declare const TEMPLATES: Record<'web' | 'node' | 'static', ScaffoldTemplate>;
37
+ //# sourceMappingURL=templates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,8EAA8E;IAC9E,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC;6EACyE;IACzE,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,8EAA8E;IAC9E,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,qDAAqD;IACrD,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9D,4DAA4D;IAC5D,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAiiBD,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,KAAK,GAAG,MAAM,GAAG,QAAQ,EAAE,gBAAgB,CA+EzE,CAAC"}