@loomwork/create-loom-app 0.0.0-stage → 0.1.1
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/LICENSE +202 -0
- package/NOTICE +8 -0
- package/README.md +79 -2
- package/dist/index.d.ts +69 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +505 -0
- package/dist/index.js.map +1 -0
- package/package.json +47 -3
- package/src/index.ts +500 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,505 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
+
var ownKeys = function(o) {
|
|
21
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
+
var ar = [];
|
|
23
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
+
return ar;
|
|
25
|
+
};
|
|
26
|
+
return ownKeys(o);
|
|
27
|
+
};
|
|
28
|
+
return function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
})();
|
|
36
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
+
exports.scaffoldFiles = void 0;
|
|
38
|
+
exports.globToRegExp = globToRegExp;
|
|
39
|
+
exports.workspaceGlobs = workspaceGlobs;
|
|
40
|
+
exports.findWorkspace = findWorkspace;
|
|
41
|
+
exports.loomPackages = loomPackages;
|
|
42
|
+
exports.releaseVersion = releaseVersion;
|
|
43
|
+
exports.registryPackageJson = registryPackageJson;
|
|
44
|
+
exports.linkPackageJson = linkPackageJson;
|
|
45
|
+
exports.assertNoLinkBelow = assertNoLinkBelow;
|
|
46
|
+
exports.assertTargetNotLinked = assertTargetNotLinked;
|
|
47
|
+
exports.run = run;
|
|
48
|
+
const fs = __importStar(require("node:fs"));
|
|
49
|
+
const path = __importStar(require("node:path"));
|
|
50
|
+
const scaffold_1 = require("@loomwork/scaffold");
|
|
51
|
+
/**
|
|
52
|
+
* The file map for a new Loom app (folder convention, wired via defineConfig).
|
|
53
|
+
* Templates live in `@loomwork/scaffold`, shared with `loom new`. Re-exported here as
|
|
54
|
+
* `scaffoldFiles` for backwards compatibility.
|
|
55
|
+
*/
|
|
56
|
+
exports.scaffoldFiles = scaffold_1.appFiles;
|
|
57
|
+
const USAGE = `usage: create-loom-app <directory> [--loom-path <loom checkout>] [--name <package>] [--force]
|
|
58
|
+
|
|
59
|
+
<directory> new app folder; refused when it already has files (unless --force)
|
|
60
|
+
--loom-path link the app to your built loom checkout (link: + pnpm overrides) instead of
|
|
61
|
+
installing @loomwork/* from npm. Without it, an app outside the loom workspace
|
|
62
|
+
depends on the published packages (^<this release>); inside the workspace
|
|
63
|
+
(apps/<name>) it gets workspace:*.
|
|
64
|
+
--name npm package name, may be scoped (default: the folder name, which must be a valid one)
|
|
65
|
+
--force scaffold into a non-empty folder: overwrites only the files this generates,
|
|
66
|
+
never deletes anything`;
|
|
67
|
+
/** A refusal: nothing has been written; exit code 2 (bad usage / refused, distinct from a crash). */
|
|
68
|
+
class Refusal extends Error {
|
|
69
|
+
}
|
|
70
|
+
// ── Where is the target? ─────────────────────────────────────────────────────
|
|
71
|
+
/**
|
|
72
|
+
* Glob (pnpm-workspace `packages:` syntax: `*` = one segment, `**` = any depth) → RegExp.
|
|
73
|
+
* `**` also matches zero segments: `**\/foo` matches top-level `foo`, `packages/**` matches
|
|
74
|
+
* `packages` itself.
|
|
75
|
+
*/
|
|
76
|
+
function globToRegExp(glob) {
|
|
77
|
+
const segs = glob.replace(/^\.\//, "").replace(/\/+$/, "").split("/");
|
|
78
|
+
let re = "";
|
|
79
|
+
segs.forEach((seg, i) => {
|
|
80
|
+
const last = i === segs.length - 1;
|
|
81
|
+
if (seg === "**") {
|
|
82
|
+
// zero or more whole segments
|
|
83
|
+
re += last ? (i === 0 ? ".*" : "(?:/.*)?") : "(?:.*/)?";
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
const part = seg.replace(/[.+^${}()|[\]\\]/g, "\\$&").replace(/\*/g, "[^/]*");
|
|
87
|
+
const prevGlobstar = i > 0 && segs[i - 1] === "**";
|
|
88
|
+
re += (i === 0 || prevGlobstar ? "" : "/") + part;
|
|
89
|
+
});
|
|
90
|
+
return new RegExp(`^${re}$`);
|
|
91
|
+
}
|
|
92
|
+
function unquote(raw) {
|
|
93
|
+
const t = raw.trim();
|
|
94
|
+
const m = /^(?:'([^']*)'|"([^"]*)"|([^\s#'"]+))\s*(?:#.*)?$/.exec(t);
|
|
95
|
+
if (!m)
|
|
96
|
+
throw new Refusal(`cannot parse pnpm-workspace.yaml entry ${JSON.stringify(raw)}`);
|
|
97
|
+
return (m[1] ?? m[2] ?? m[3]);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* The `packages:` globs of a pnpm-workspace.yaml (the only key we need; no YAML dependency).
|
|
101
|
+
* `undefined` = no `packages:` key (pnpm then treats every directory as a package). Anything we
|
|
102
|
+
* cannot read with confidence throws a {@link Refusal} rather than guessing "not a member".
|
|
103
|
+
*/
|
|
104
|
+
function workspaceGlobs(yaml) {
|
|
105
|
+
const lines = yaml.split(/\r?\n/);
|
|
106
|
+
const idx = lines.findIndex((l) => /^packages\s*:/.test(l));
|
|
107
|
+
if (idx < 0)
|
|
108
|
+
return undefined;
|
|
109
|
+
const fail = () => {
|
|
110
|
+
throw new Refusal("cannot confidently parse the `packages:` list of the enclosing pnpm-workspace.yaml; refusing to guess whether the target is a workspace member. Scaffold outside that workspace.");
|
|
111
|
+
};
|
|
112
|
+
const rest = lines[idx].replace(/^packages\s*:/, "").trim();
|
|
113
|
+
if (rest !== "" && !rest.startsWith("#")) {
|
|
114
|
+
// Inline / flow form, possibly spanning lines: packages: ['a/*', "b"]
|
|
115
|
+
if (!rest.startsWith("["))
|
|
116
|
+
return fail();
|
|
117
|
+
let text = rest;
|
|
118
|
+
for (let j = idx + 1; !text.includes("]") && j < lines.length; j++)
|
|
119
|
+
text += ` ${lines[j]}`;
|
|
120
|
+
const m = /^\[([^\]]*)\]\s*(?:#.*)?$/.exec(text);
|
|
121
|
+
if (!m)
|
|
122
|
+
return fail();
|
|
123
|
+
const items = m[1]
|
|
124
|
+
.split(",")
|
|
125
|
+
.map((x) => x.trim())
|
|
126
|
+
.filter((x) => x !== "");
|
|
127
|
+
return items.map(unquote);
|
|
128
|
+
}
|
|
129
|
+
const out = [];
|
|
130
|
+
for (let j = idx + 1; j < lines.length; j++) {
|
|
131
|
+
const line = lines[j];
|
|
132
|
+
if (/^\s*(#.*)?$/.test(line))
|
|
133
|
+
continue;
|
|
134
|
+
if (/^\S/.test(line))
|
|
135
|
+
break; // next top-level key
|
|
136
|
+
const m = /^\s*-\s*(.*)$/.exec(line);
|
|
137
|
+
if (!m)
|
|
138
|
+
return fail();
|
|
139
|
+
out.push(unquote(m[1]));
|
|
140
|
+
}
|
|
141
|
+
if (out.length === 0)
|
|
142
|
+
return fail();
|
|
143
|
+
return out;
|
|
144
|
+
}
|
|
145
|
+
function readName(manifest) {
|
|
146
|
+
try {
|
|
147
|
+
return JSON.parse(fs.readFileSync(manifest, "utf8")).name;
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
return undefined;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Walk up from `target` for a `pnpm-workspace.yaml` whose globs include it. Inside the loom
|
|
155
|
+
* checkout, `@loomwork/*` as `workspace:*` resolves; anywhere else it cannot.
|
|
156
|
+
*/
|
|
157
|
+
function findWorkspace(target) {
|
|
158
|
+
const abs = path.resolve(target);
|
|
159
|
+
for (let dir = abs;; dir = path.dirname(dir)) {
|
|
160
|
+
const file = path.join(dir, "pnpm-workspace.yaml");
|
|
161
|
+
if (fs.existsSync(file)) {
|
|
162
|
+
const rel = path.relative(dir, abs).split(path.sep).join("/");
|
|
163
|
+
const globs = workspaceGlobs(fs.readFileSync(file, "utf8"));
|
|
164
|
+
const member = rel === "" ||
|
|
165
|
+
globs === undefined ||
|
|
166
|
+
(globs.some((g) => !g.startsWith("!") && globToRegExp(g).test(rel)) &&
|
|
167
|
+
!globs.some((g) => g.startsWith("!") && globToRegExp(g.slice(1)).test(rel)));
|
|
168
|
+
if (member) {
|
|
169
|
+
const isLoom = readName(path.join(dir, "packages", "core", "package.json")) === "@loomwork/core";
|
|
170
|
+
return { root: dir, isLoom };
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
if (path.dirname(dir) === dir)
|
|
174
|
+
return { root: undefined, isLoom: false };
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
// ── A loom checkout to link to ───────────────────────────────────────────────
|
|
178
|
+
/** Every `@loomwork/*` package in a loom checkout: name → absolute directory. */
|
|
179
|
+
function loomPackages(loomRoot) {
|
|
180
|
+
const out = new Map();
|
|
181
|
+
for (const tier of ["packages", "plugins", "tools"]) {
|
|
182
|
+
const base = path.join(loomRoot, tier);
|
|
183
|
+
if (!fs.existsSync(base))
|
|
184
|
+
continue;
|
|
185
|
+
for (const entry of fs.readdirSync(base, { withFileTypes: true })) {
|
|
186
|
+
if (!entry.isDirectory())
|
|
187
|
+
continue;
|
|
188
|
+
const dir = path.join(base, entry.name);
|
|
189
|
+
const name = readName(path.join(dir, "package.json"));
|
|
190
|
+
if (name?.startsWith("@loomwork/"))
|
|
191
|
+
out.set(name, dir);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
return out;
|
|
195
|
+
}
|
|
196
|
+
/** `path.resolve` + `realpath` of the deepest existing ancestor, so `/var` vs `/private/var` can't skew a relative link. */
|
|
197
|
+
function realResolve(p) {
|
|
198
|
+
const abs = path.resolve(p);
|
|
199
|
+
const tail = [];
|
|
200
|
+
let cur = abs;
|
|
201
|
+
while (!fs.existsSync(cur) && path.dirname(cur) !== cur) {
|
|
202
|
+
tail.unshift(path.basename(cur));
|
|
203
|
+
cur = path.dirname(cur);
|
|
204
|
+
}
|
|
205
|
+
return path.join(fs.realpathSync(cur), ...tail);
|
|
206
|
+
}
|
|
207
|
+
/** Resolve and validate `--loom-path`: a loom checkout whose packages are built. */
|
|
208
|
+
function resolveLoomPath(raw, cwd) {
|
|
209
|
+
const root = realResolve(path.resolve(cwd, raw));
|
|
210
|
+
if (!fs.existsSync(root) || !fs.statSync(root).isDirectory()) {
|
|
211
|
+
throw new Refusal(`--loom-path "${raw}" is not a directory (resolved ${root})`);
|
|
212
|
+
}
|
|
213
|
+
if (!fs.existsSync(path.join(root, "pnpm-workspace.yaml")) ||
|
|
214
|
+
readName(path.join(root, "packages", "core", "package.json")) !== "@loomwork/core") {
|
|
215
|
+
throw new Refusal(`--loom-path "${raw}" is not a loom checkout (no pnpm-workspace.yaml with packages/core = @loomwork/core). Clone https://github.com/chhetrisushil/loom.git and point at its root.`);
|
|
216
|
+
}
|
|
217
|
+
const pkgs = loomPackages(root);
|
|
218
|
+
const unbuilt = ["@loomwork/core", "@loomwork/app", "@loomwork/cli", "@loomwork/testing"].filter((n) => {
|
|
219
|
+
const dir = pkgs.get(n);
|
|
220
|
+
return dir === undefined || !fs.existsSync(path.join(dir, "dist"));
|
|
221
|
+
});
|
|
222
|
+
if (unbuilt.length > 0) {
|
|
223
|
+
throw new Refusal(`the loom checkout at ${root} is not built (no dist/ in ${unbuilt.join(", ")}). Run \`pnpm install && pnpm build\` there first.`);
|
|
224
|
+
}
|
|
225
|
+
return root;
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* The release this initializer ships with, read from its own package.json (the package compiles
|
|
229
|
+
* to CommonJS directly under `dist/`, so `..` is the package root from `dist/` and from `src/`).
|
|
230
|
+
* An app created outside the loom workspace depends on `^<this>` from npm.
|
|
231
|
+
*/
|
|
232
|
+
function releaseVersion() {
|
|
233
|
+
const pkg = JSON.parse(fs.readFileSync(path.join(__dirname, "..", "package.json"), "utf8"));
|
|
234
|
+
return pkg.version;
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Rewrite the scaffolded `package.json` for an app that installs `@loomwork/*` from npm: every
|
|
238
|
+
* `workspace:*` loom dependency becomes `^<version>`. No overrides, so the app may also live
|
|
239
|
+
* inside another pnpm workspace.
|
|
240
|
+
*/
|
|
241
|
+
function registryPackageJson(json, version) {
|
|
242
|
+
const pkg = JSON.parse(json);
|
|
243
|
+
for (const table of [pkg.dependencies, pkg.devDependencies]) {
|
|
244
|
+
for (const name of Object.keys(table)) {
|
|
245
|
+
if (name.startsWith("@loomwork/"))
|
|
246
|
+
table[name] = `^${version}`;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
return `${JSON.stringify(pkg, null, 2)}\n`;
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Rewrite the scaffolded `package.json` for an app linked to a loom checkout: `@loomwork/*`
|
|
253
|
+
* dependencies become `*`, and `pnpm.overrides` redirects EVERY loom package to a `link:` into
|
|
254
|
+
* the checkout. All of them, not just the app's direct ones: a `link:` dependency does not bring
|
|
255
|
+
* its own `workspace:*` dependencies, so each transitive one must be mapped too — the same wiring
|
|
256
|
+
* `loom-examples` uses. (Everything, so a later `loom new sentinel` only adds `"…": "*"`.)
|
|
257
|
+
*/
|
|
258
|
+
function linkPackageJson(json, appRoot, loomRoot) {
|
|
259
|
+
const pkg = JSON.parse(json);
|
|
260
|
+
for (const table of [pkg.dependencies, pkg.devDependencies]) {
|
|
261
|
+
for (const name of Object.keys(table))
|
|
262
|
+
if (name.startsWith("@loomwork/"))
|
|
263
|
+
table[name] = "*";
|
|
264
|
+
}
|
|
265
|
+
const overrides = {};
|
|
266
|
+
for (const [name, dir] of [...loomPackages(loomRoot)].sort(([a], [b]) => a.localeCompare(b))) {
|
|
267
|
+
const rel = path.relative(appRoot, dir).split(path.sep).join("/");
|
|
268
|
+
overrides[name] = `link:${rel}`;
|
|
269
|
+
}
|
|
270
|
+
pkg.pnpm = { overrides };
|
|
271
|
+
return `${JSON.stringify(pkg, null, 2)}\n`;
|
|
272
|
+
}
|
|
273
|
+
/** Quote a path for the printed `cd` hint when the shell would split or expand it. */
|
|
274
|
+
function shellQuote(s) {
|
|
275
|
+
return /^[A-Za-z0-9_@%+=:,./~-]+$/.test(s) ? s : `'${s.replace(/'/g, `'\\''`)}'`;
|
|
276
|
+
}
|
|
277
|
+
function parseArgs(argv) {
|
|
278
|
+
const args = { force: false, help: false };
|
|
279
|
+
for (let i = 0; i < argv.length; i++) {
|
|
280
|
+
const a = argv[i];
|
|
281
|
+
const valued = (flag) => {
|
|
282
|
+
if (a !== flag)
|
|
283
|
+
return a.slice(flag.length + 1); // --flag=value
|
|
284
|
+
const v = argv[++i];
|
|
285
|
+
if (v === undefined || v.startsWith("-")) {
|
|
286
|
+
throw new Error(`create-loom-app: ${flag} needs a value\n${USAGE}`);
|
|
287
|
+
}
|
|
288
|
+
return v;
|
|
289
|
+
};
|
|
290
|
+
if (a === "--help" || a === "-h")
|
|
291
|
+
args.help = true;
|
|
292
|
+
else if (a === "--force")
|
|
293
|
+
args.force = true;
|
|
294
|
+
else if (a === "--loom-path" || a.startsWith("--loom-path="))
|
|
295
|
+
args.loomPath = valued("--loom-path");
|
|
296
|
+
else if (a === "--name" || a.startsWith("--name="))
|
|
297
|
+
args.name = valued("--name");
|
|
298
|
+
else if (a.startsWith("-")) {
|
|
299
|
+
// A flag is not a directory name. Without this, `create-loom-app --help` scaffolds eleven
|
|
300
|
+
// files into a folder literally called `--help` and reports success.
|
|
301
|
+
throw new Error(`create-loom-app: "${a}" is not a directory name\n${USAGE}`);
|
|
302
|
+
}
|
|
303
|
+
else if (args.target === undefined)
|
|
304
|
+
args.target = a;
|
|
305
|
+
else
|
|
306
|
+
throw new Error(`create-loom-app: unexpected extra argument "${a}"\n${USAGE}`);
|
|
307
|
+
}
|
|
308
|
+
return args;
|
|
309
|
+
}
|
|
310
|
+
/** Refuse when any component of `dest` below `root` (the target itself included) is a symbolic link. */
|
|
311
|
+
function assertNoLinkBelow(root, dest) {
|
|
312
|
+
const rel = path.relative(path.resolve(root), path.resolve(dest));
|
|
313
|
+
let cur = path.resolve(root);
|
|
314
|
+
for (const seg of rel.split(path.sep)) {
|
|
315
|
+
cur = path.join(cur, seg);
|
|
316
|
+
let st;
|
|
317
|
+
try {
|
|
318
|
+
st = fs.lstatSync(cur);
|
|
319
|
+
}
|
|
320
|
+
catch {
|
|
321
|
+
return; // nothing deeper exists
|
|
322
|
+
}
|
|
323
|
+
if (st.isSymbolicLink()) {
|
|
324
|
+
throw new Refusal(`refusing to write through the symbolic link "${path.relative(root, cur)}" - replace it with a real file or directory, or scaffold into a clean directory`);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Refuse a target that is, or lies below, a symbolic link under the project (cwd). Decided by FILESYSTEM
|
|
330
|
+
* IDENTITY (st_dev + st_ino), not path spelling. (1) The target's final component is never a link
|
|
331
|
+
* (the cwd itself is exempt: it is trusted even when reached through a link). (2) The nearest ancestor,
|
|
332
|
+
* in the spelling used, whose identity is the cwd's is the root: every component between it and the
|
|
333
|
+
* target is lstat-checked. (3) No spelled ancestor matches but the target's PHYSICAL parent chain
|
|
334
|
+
* reaches the cwd: refuse (a spelling the walk cannot cover). (4) Otherwise the target is genuinely
|
|
335
|
+
* outside the cwd and only its own final component is checked. A small copy of `containmentRootFor`
|
|
336
|
+
* from @loomwork/appgen (create-loom-app depends only on @loomwork/scaffold; no new edge).
|
|
337
|
+
*/
|
|
338
|
+
function assertTargetNotLinked(target, cwd) {
|
|
339
|
+
const stat = (p) => {
|
|
340
|
+
try {
|
|
341
|
+
return fs.statSync(p);
|
|
342
|
+
}
|
|
343
|
+
catch {
|
|
344
|
+
return undefined;
|
|
345
|
+
}
|
|
346
|
+
};
|
|
347
|
+
const same = (a, b) => a.dev === b.dev && a.ino === b.ino;
|
|
348
|
+
const abs = path.resolve(cwd, target);
|
|
349
|
+
const cwdId = stat(cwd);
|
|
350
|
+
const absId = stat(abs);
|
|
351
|
+
if (cwdId !== undefined && absId !== undefined && same(absId, cwdId))
|
|
352
|
+
return;
|
|
353
|
+
let isLink = false;
|
|
354
|
+
try {
|
|
355
|
+
isLink = fs.lstatSync(abs).isSymbolicLink();
|
|
356
|
+
}
|
|
357
|
+
catch {
|
|
358
|
+
/* not there yet */
|
|
359
|
+
}
|
|
360
|
+
if (isLink) {
|
|
361
|
+
throw new Refusal(`"${target}" is a symbolic link (${abs}); pass the real path of the directory, or scaffold into a real directory`);
|
|
362
|
+
}
|
|
363
|
+
if (cwdId === undefined)
|
|
364
|
+
return;
|
|
365
|
+
for (let a = path.dirname(abs);; a = path.dirname(a)) {
|
|
366
|
+
const st = stat(a);
|
|
367
|
+
if (st !== undefined && same(st, cwdId)) {
|
|
368
|
+
assertNoLinkBelow(a, abs);
|
|
369
|
+
return;
|
|
370
|
+
}
|
|
371
|
+
if (path.dirname(a) === a)
|
|
372
|
+
break;
|
|
373
|
+
}
|
|
374
|
+
let p = abs;
|
|
375
|
+
while (stat(p) === undefined && path.dirname(p) !== p)
|
|
376
|
+
p = path.dirname(p);
|
|
377
|
+
for (let cur = p;;) {
|
|
378
|
+
const st = stat(cur);
|
|
379
|
+
if (st === undefined)
|
|
380
|
+
return;
|
|
381
|
+
if (same(st, cwdId)) {
|
|
382
|
+
throw new Refusal(`"${target}" resolves inside the project through a spelling the symlink check cannot walk; pass a path relative to the project`);
|
|
383
|
+
}
|
|
384
|
+
const up = stat(path.join(cur, ".."));
|
|
385
|
+
if (up === undefined || same(up, st))
|
|
386
|
+
return; // reached "/": genuinely outside
|
|
387
|
+
cur = path.join(cur, "..");
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
/** Runs the CLI; returns the exit code. Every Refusal happens before the first write. */
|
|
391
|
+
function run(argv, cwd) {
|
|
392
|
+
let args;
|
|
393
|
+
try {
|
|
394
|
+
args = parseArgs(argv);
|
|
395
|
+
}
|
|
396
|
+
catch (err) {
|
|
397
|
+
console.error(err.message);
|
|
398
|
+
return 2;
|
|
399
|
+
}
|
|
400
|
+
if (args.help) {
|
|
401
|
+
console.log(USAGE);
|
|
402
|
+
return 0;
|
|
403
|
+
}
|
|
404
|
+
if (args.target === undefined) {
|
|
405
|
+
console.error(USAGE);
|
|
406
|
+
return 2;
|
|
407
|
+
}
|
|
408
|
+
const target = args.target;
|
|
409
|
+
try {
|
|
410
|
+
assertTargetNotLinked(target, cwd);
|
|
411
|
+
const root = realResolve(path.resolve(cwd, target));
|
|
412
|
+
// The package name: a valid npm name, or refuse with the name we would have used. Taken from
|
|
413
|
+
// the folder as TYPED (a symlinked target is refused above).
|
|
414
|
+
const dirName = path.basename(path.resolve(cwd, target));
|
|
415
|
+
const pkgName = args.name ?? dirName;
|
|
416
|
+
if (!(0, scaffold_1.isValidPackageName)(pkgName)) {
|
|
417
|
+
const hint = (0, scaffold_1.packageNameFrom)(args.name ?? dirName);
|
|
418
|
+
throw new Refusal(`"${pkgName}" is not a valid npm package name (lowercase letters, digits, - . _ ~, optionally @scope/; no spaces).${hint
|
|
419
|
+
? ` Try \`--name ${hint}\` or a folder called ${hint}.`
|
|
420
|
+
: " Pass a valid one with --name."}`);
|
|
421
|
+
}
|
|
422
|
+
// Never write into someone's project by accident.
|
|
423
|
+
let existing = 0;
|
|
424
|
+
if (fs.existsSync(root)) {
|
|
425
|
+
if (!fs.statSync(root).isDirectory())
|
|
426
|
+
throw new Refusal(`${root} exists and is not a directory`);
|
|
427
|
+
const entries = fs.readdirSync(root);
|
|
428
|
+
if (entries.length > 0 && !args.force) {
|
|
429
|
+
const shown = entries.slice(0, 5).join(", ") + (entries.length > 5 ? ", …" : "");
|
|
430
|
+
throw new Refusal(`${target === "." ? "the current directory" : `"${target}"`} is not empty (${shown}). Pick a new directory, or pass --force to scaffold into it (that overwrites only the files this generates and never deletes anything).`);
|
|
431
|
+
}
|
|
432
|
+
existing = entries.length;
|
|
433
|
+
}
|
|
434
|
+
// Inside the loom workspace `workspace:*` resolves. Elsewhere the app installs @loomwork/* from
|
|
435
|
+
// npm, or, with --loom-path, links to a local checkout.
|
|
436
|
+
const ws = findWorkspace(root);
|
|
437
|
+
let loomRoot;
|
|
438
|
+
let registryVersion;
|
|
439
|
+
if (!ws.isLoom) {
|
|
440
|
+
if (args.loomPath !== undefined) {
|
|
441
|
+
if (ws.root !== undefined) {
|
|
442
|
+
throw new Refusal(`"${target}" is a member of the pnpm workspace at ${ws.root}, which is not a loom checkout. pnpm reads \`overrides\` only from a workspace root, so a linked app cannot live there. Drop --loom-path to install @loomwork/* from npm, or scaffold outside that workspace.`);
|
|
443
|
+
}
|
|
444
|
+
loomRoot = resolveLoomPath(args.loomPath, cwd);
|
|
445
|
+
}
|
|
446
|
+
else {
|
|
447
|
+
registryVersion = releaseVersion();
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
const files = (0, scaffold_1.appFiles)(pkgName);
|
|
451
|
+
if (loomRoot !== undefined) {
|
|
452
|
+
files["package.json"] = linkPackageJson(files["package.json"], root, loomRoot);
|
|
453
|
+
}
|
|
454
|
+
else if (registryVersion !== undefined) {
|
|
455
|
+
files["package.json"] = registryPackageJson(files["package.json"], registryVersion);
|
|
456
|
+
}
|
|
457
|
+
// `--force` into an existing directory: a planted `package.json -> ~/.x` (or a linked `src/`) must not be
|
|
458
|
+
// written through. Check EVERY target first so a refusal leaves the directory untouched.
|
|
459
|
+
for (const rel of Object.keys(files))
|
|
460
|
+
assertNoLinkBelow(root, path.join(root, rel));
|
|
461
|
+
let overwritten = 0;
|
|
462
|
+
for (const [rel, content] of Object.entries(files)) {
|
|
463
|
+
const dest = path.join(root, rel);
|
|
464
|
+
if (fs.existsSync(dest))
|
|
465
|
+
overwritten++;
|
|
466
|
+
fs.mkdirSync(path.dirname(dest), { recursive: true });
|
|
467
|
+
assertNoLinkBelow(root, dest);
|
|
468
|
+
const tmp = `${dest}.${process.pid}.tmp`;
|
|
469
|
+
try {
|
|
470
|
+
fs.writeFileSync(tmp, content, { flag: "wx" });
|
|
471
|
+
fs.renameSync(tmp, dest); // replaces the entry; never follows a link at the final component
|
|
472
|
+
}
|
|
473
|
+
catch (e) {
|
|
474
|
+
fs.rmSync(tmp, { force: true });
|
|
475
|
+
throw e;
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
console.log(`Scaffolded ${Object.keys(files).length} files into ${target}/`);
|
|
479
|
+
if (args.force && existing > 0) {
|
|
480
|
+
console.log(`--force: overwrote ${overwritten} existing generated file(s); every other file in the directory was left untouched (nothing is ever deleted).`);
|
|
481
|
+
}
|
|
482
|
+
console.log(loomRoot !== undefined
|
|
483
|
+
? `Linked @loomwork/* to ${loomRoot} (link: + pnpm overrides in package.json).`
|
|
484
|
+
: registryVersion !== undefined
|
|
485
|
+
? `@loomwork/* installs from npm at ^${registryVersion}.`
|
|
486
|
+
: "Inside the loom workspace: @loomwork/* is workspace:* (run `pnpm install` from the repo root or this app).");
|
|
487
|
+
const cd = target === "." ? "" : `cd ${shellQuote(target)} && `;
|
|
488
|
+
console.log(`Next: ${cd}pnpm install && pnpm test && pnpm start`);
|
|
489
|
+
return 0;
|
|
490
|
+
}
|
|
491
|
+
catch (err) {
|
|
492
|
+
if (!(err instanceof Refusal))
|
|
493
|
+
throw err;
|
|
494
|
+
console.error(`create-loom-app: ${err.message}`);
|
|
495
|
+
return 2;
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
// Run only when invoked as a CLI (not when imported by tests).
|
|
499
|
+
// `require.main === module`, not a filename check: `npm create @loomwork/loom-app` and any global
|
|
500
|
+
// install invoke this through a symlink named `create-loom-app`, where argv[1] never ends
|
|
501
|
+
// in "index.js" — the scaffolder would exit 0 having created nothing.
|
|
502
|
+
if (require.main === module) {
|
|
503
|
+
process.exitCode = run(process.argv.slice(2), process.cwd());
|
|
504
|
+
}
|
|
505
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,50 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@loomwork/create-loom-app",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "Scaffold a minimal Loom app wired via defineConfig — config, tools, steps, a flow, middleware, and an eval",
|
|
5
|
+
"bin": {
|
|
6
|
+
"create-loom-app": "./dist/index.js"
|
|
7
|
+
},
|
|
8
|
+
"main": "./dist/index.js",
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"dependencies": {
|
|
11
|
+
"@loomwork/scaffold": "^0.1.1"
|
|
12
|
+
},
|
|
13
|
+
"devDependencies": {
|
|
14
|
+
"@types/node": "^22.0.0",
|
|
15
|
+
"typescript": "^5.6.3",
|
|
16
|
+
"vitest": "^2.1.8"
|
|
17
|
+
},
|
|
18
|
+
"license": "Apache-2.0",
|
|
19
|
+
"repository": {
|
|
20
|
+
"type": "git",
|
|
21
|
+
"url": "git+https://github.com/chhetrisushil/loom.git",
|
|
22
|
+
"directory": "tools/create-loom-app"
|
|
23
|
+
},
|
|
24
|
+
"files": [
|
|
25
|
+
"dist",
|
|
26
|
+
"src",
|
|
27
|
+
"!src/**/*.test.ts",
|
|
28
|
+
"!src/**/*.test.tsx",
|
|
29
|
+
"!src/**/__tests__",
|
|
30
|
+
"!src/**/__fixtures__",
|
|
31
|
+
"!src/**/__snapshots__",
|
|
32
|
+
"!src/**/__golden__",
|
|
33
|
+
"LICENSE",
|
|
34
|
+
"NOTICE"
|
|
35
|
+
],
|
|
36
|
+
"publishConfig": {
|
|
37
|
+
"access": "public",
|
|
38
|
+
"tag": "next"
|
|
39
|
+
},
|
|
40
|
+
"engines": {
|
|
41
|
+
"node": ">=20.0.0"
|
|
42
|
+
},
|
|
43
|
+
"scripts": {
|
|
44
|
+
"build": "tsc --build",
|
|
45
|
+
"dev": "tsc --build --watch",
|
|
46
|
+
"test": "vitest run",
|
|
47
|
+
"clean": "rm -rf dist tsconfig.tsbuildinfo",
|
|
48
|
+
"typecheck:tests": "tsc -p tsconfig.test.json"
|
|
49
|
+
}
|
|
6
50
|
}
|