@byline/cli 3.21.0 → 4.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 +29 -3
- package/dist/cli.js +5 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +1 -0
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +10 -14
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/setup-checks.d.ts +9 -0
- package/dist/commands/setup-checks.d.ts.map +1 -1
- package/dist/commands/setup-checks.js +43 -18
- package/dist/commands/setup-checks.js.map +1 -1
- package/dist/commands/setup.js +1 -1
- package/dist/commands/setup.js.map +1 -1
- package/dist/context.d.ts +2 -0
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +6 -0
- package/dist/context.js.map +1 -1
- package/dist/lib/dependency-version.d.ts +12 -0
- package/dist/lib/dependency-version.d.ts.map +1 -0
- package/dist/lib/dependency-version.js +101 -0
- package/dist/lib/dependency-version.js.map +1 -0
- package/dist/lib/planned-writes.d.ts +8 -0
- package/dist/lib/planned-writes.d.ts.map +1 -0
- package/dist/lib/planned-writes.js +177 -0
- package/dist/lib/planned-writes.js.map +1 -0
- package/dist/lib/planned-writes.test.d.ts +2 -0
- package/dist/lib/planned-writes.test.d.ts.map +1 -0
- package/dist/lib/planned-writes.test.js +113 -0
- package/dist/lib/planned-writes.test.js.map +1 -0
- package/dist/lib/release-policy.d.ts +12 -0
- package/dist/lib/release-policy.d.ts.map +1 -0
- package/dist/lib/release-policy.js +20 -0
- package/dist/lib/release-policy.js.map +1 -0
- package/dist/lib/release-policy.test.d.ts +2 -0
- package/dist/lib/release-policy.test.d.ts.map +1 -0
- package/dist/lib/release-policy.test.js +36 -0
- package/dist/lib/release-policy.test.js.map +1 -0
- package/dist/lib/route-config.d.ts +40 -0
- package/dist/lib/route-config.d.ts.map +1 -0
- package/dist/lib/route-config.js +322 -0
- package/dist/lib/route-config.js.map +1 -0
- package/dist/lib/static-config.d.ts +20 -0
- package/dist/lib/static-config.d.ts.map +1 -0
- package/dist/lib/static-config.js +444 -0
- package/dist/lib/static-config.js.map +1 -0
- package/dist/lib/static-config.test.d.ts +2 -0
- package/dist/lib/static-config.test.d.ts.map +1 -0
- package/dist/lib/static-config.test.js +105 -0
- package/dist/lib/static-config.test.js.map +1 -0
- package/dist/lib/template-hook-boundary.test.node.d.ts +2 -0
- package/dist/lib/template-hook-boundary.test.node.d.ts.map +1 -0
- package/dist/lib/template-hook-boundary.test.node.js +30 -0
- package/dist/lib/template-hook-boundary.test.node.js.map +1 -0
- package/dist/lib/template-path.d.ts +5 -0
- package/dist/lib/template-path.d.ts.map +1 -0
- package/dist/lib/template-path.js +9 -0
- package/dist/lib/template-path.js.map +1 -0
- package/dist/lib/workspace-root.d.ts +28 -0
- package/dist/lib/workspace-root.d.ts.map +1 -0
- package/dist/lib/workspace-root.js +205 -0
- package/dist/lib/workspace-root.js.map +1 -0
- package/dist/manifest/deps.d.ts +1 -1
- package/dist/manifest/deps.d.ts.map +1 -1
- package/dist/manifest/deps.js +24 -8
- package/dist/manifest/deps.js.map +1 -1
- package/dist/phases/deps.d.ts +14 -1
- package/dist/phases/deps.d.ts.map +1 -1
- package/dist/phases/deps.js +312 -137
- package/dist/phases/deps.js.map +1 -1
- package/dist/phases/deps.test.d.ts +2 -0
- package/dist/phases/deps.test.d.ts.map +1 -0
- package/dist/phases/deps.test.js +343 -0
- package/dist/phases/deps.test.js.map +1 -0
- package/dist/phases/preflight.d.ts.map +1 -1
- package/dist/phases/preflight.js +59 -11
- package/dist/phases/preflight.js.map +1 -1
- package/dist/phases/prompts.d.ts +2 -0
- package/dist/phases/prompts.d.ts.map +1 -1
- package/dist/phases/prompts.js +51 -2
- package/dist/phases/prompts.js.map +1 -1
- package/dist/phases/routes-ui.test.d.ts +2 -0
- package/dist/phases/routes-ui.test.d.ts.map +1 -0
- package/dist/phases/routes-ui.test.js +766 -0
- package/dist/phases/routes-ui.test.js.map +1 -0
- package/dist/phases/routes.d.ts +4 -1
- package/dist/phases/routes.d.ts.map +1 -1
- package/dist/phases/routes.js +610 -122
- package/dist/phases/routes.js.map +1 -1
- package/dist/phases/scaffold-smoke.test.d.ts +2 -0
- package/dist/phases/scaffold-smoke.test.d.ts.map +1 -0
- package/dist/phases/scaffold-smoke.test.js +175 -0
- package/dist/phases/scaffold-smoke.test.js.map +1 -0
- package/dist/phases/scaffold.d.ts +3 -2
- package/dist/phases/scaffold.d.ts.map +1 -1
- package/dist/phases/scaffold.js +268 -91
- package/dist/phases/scaffold.js.map +1 -1
- package/dist/phases/scaffold.test.js +171 -22
- package/dist/phases/scaffold.test.js.map +1 -1
- package/dist/phases/ui.d.ts +4 -1
- package/dist/phases/ui.d.ts.map +1 -1
- package/dist/phases/ui.js +51 -59
- package/dist/phases/ui.js.map +1 -1
- package/dist/phases/wire/index.d.ts.map +1 -1
- package/dist/phases/wire/index.js +10 -6
- package/dist/phases/wire/index.js.map +1 -1
- package/dist/phases/wire/shared.d.ts +4 -1
- package/dist/phases/wire/shared.d.ts.map +1 -1
- package/dist/phases/wire/vite-config.d.ts.map +1 -1
- package/dist/phases/wire/vite-config.js +69 -20
- package/dist/phases/wire/vite-config.js.map +1 -1
- package/dist/phases/wire/vite-config.test.d.ts +2 -0
- package/dist/phases/wire/vite-config.test.d.ts.map +1 -0
- package/dist/phases/wire/vite-config.test.js +97 -0
- package/dist/phases/wire/vite-config.test.js.map +1 -0
- package/dist/prompts.d.ts +1 -0
- package/dist/prompts.d.ts.map +1 -1
- package/dist/prompts.js +7 -2
- package/dist/prompts.js.map +1 -1
- package/dist/runner.js +1 -1
- package/dist/runner.js.map +1 -1
- package/dist/templates/byline/collection-types.contract.ts +26 -1
- package/dist/templates/byline/collections/index.ts +1 -1
- package/dist/templates/byline/collections/server-hooks.ts +7 -0
- package/dist/templates/byline/generated/collection-types.ts +14 -6
- package/dist/templates/byline/routes.ts +7 -6
- package/dist/templates/byline/server.config.ts +10 -1
- package/dist/templates/byline-examples/admin.config.ts +7 -12
- package/dist/templates/byline-examples/blocks/photo-block.ts +3 -2
- package/dist/templates/byline-examples/collection-types.contract.ts +26 -1
- package/dist/templates/byline-examples/collections/docs/hooks.ts +23 -13
- package/dist/templates/byline-examples/collections/docs/schema.ts +2 -11
- package/dist/templates/byline-examples/collections/index.ts +1 -1
- package/dist/templates/byline-examples/collections/media/components/media-list-view.tsx +11 -6
- package/dist/templates/byline-examples/collections/media/schema.ts +3 -0
- package/dist/templates/byline-examples/collections/news/schema.ts +4 -3
- package/dist/templates/byline-examples/collections/server-hooks.ts +8 -0
- package/dist/templates/byline-examples/fields/ai-text.ts +1 -1
- package/dist/templates/byline-examples/fields/ai-textarea.ts +1 -1
- package/dist/templates/byline-examples/fields/lexical-richtext-ai.tsx +3 -3
- package/dist/templates/byline-examples/generated/collection-types.ts +138 -130
- package/dist/templates/byline-examples/routes.ts +7 -6
- package/dist/templates/byline-examples/scripts/backfill-version-locales.ts +1 -1
- package/dist/templates/byline-examples/scripts/import-docs.ts +10 -11
- package/dist/templates/byline-examples/scripts/lib/mdast-to-lexical.test.node.ts +93 -233
- package/dist/templates/byline-examples/scripts/lib/mdast-to-lexical.ts +2 -2
- package/dist/templates/byline-examples/scripts/lib/strip-leading-h1.test.node.ts +0 -4
- package/dist/templates/byline-examples/scripts/re-anchor.ts +3 -3
- package/dist/templates/byline-examples/scripts/regenerate-media-operation.ts +112 -0
- package/dist/templates/byline-examples/scripts/regenerate-media.ts +129 -92
- package/dist/templates/byline-examples/server.config.ts +14 -6
- package/dist/templates/host/vite.config.ts +2 -0
- package/dist/templates/routes/_byline/route.lazy.tsx +1 -2
- package/dist/templates/routes/_byline/route.tsx +1 -1
- package/dist/templates/ui-byline/blocks/photo-block/index.tsx +18 -22
- package/dist/templates/ui-byline/blocks/richtext-block/index.tsx +1 -1
- package/dist/templates/ui-byline/components/admonition/index.tsx +11 -8
- package/dist/templates/ui-byline/components/code/code.tsx +6 -4
- package/dist/templates/ui-byline/components/link/lang-link.tsx +4 -8
- package/dist/templates/ui-byline/components/link/link-field.tsx +3 -2
- package/dist/templates/ui-byline/components/link/link-lexical.tsx +9 -8
- package/dist/templates/ui-byline/render-blocks.tsx +38 -34
- package/dist/templates/ui-byline/types/content.ts +25 -0
- package/dist/templates/ui-byline/types/i18n.ts +4 -8
- package/dist/test-helpers.d.ts +5 -0
- package/dist/test-helpers.d.ts.map +1 -0
- package/dist/test-helpers.js +52 -0
- package/dist/test-helpers.js.map +1 -0
- package/dist/types.d.ts +21 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/ui-template-contract.test.d.ts +2 -0
- package/dist/ui-template-contract.test.d.ts.map +1 -0
- package/dist/ui-template-contract.test.js +150 -0
- package/dist/ui-template-contract.test.js.map +1 -0
- package/dist/workspace-root.test.d.ts +2 -0
- package/dist/workspace-root.test.d.ts.map +1 -0
- package/dist/workspace-root.test.js +311 -0
- package/dist/workspace-root.test.js.map +1 -0
- package/package.json +9 -1
- package/dist/templates/byline/client.server.ts +0 -32
- package/dist/templates/byline-examples/client.server.ts +0 -32
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { FileWrite } from '../types.js';
|
|
2
|
+
export interface ApplyWritesResult {
|
|
3
|
+
written: string[];
|
|
4
|
+
conflicts: string[];
|
|
5
|
+
}
|
|
6
|
+
/** Apply exactly the writes shown in a plan, unless a target changed after planning. */
|
|
7
|
+
export declare function applyPlannedWrites(writes: readonly FileWrite[]): ApplyWritesResult;
|
|
8
|
+
//# sourceMappingURL=planned-writes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planned-writes.d.ts","sourceRoot":"","sources":["../../src/lib/planned-writes.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAE5C,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,SAAS,EAAE,MAAM,EAAE,CAAA;CACpB;AAED,wFAAwF;AACxF,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,SAAS,EAAE,GAAG,iBAAiB,CAoGlF"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { existsSync, lstatSync, mkdirSync, mkdtempSync, readFileSync, rmdirSync, rmSync, writeFileSync, } from 'node:fs';
|
|
2
|
+
import { tmpdir } from 'node:os';
|
|
3
|
+
import { dirname, isAbsolute, join, relative, resolve, sep } from 'node:path';
|
|
4
|
+
/** Apply exactly the writes shown in a plan, unless a target changed after planning. */
|
|
5
|
+
export function applyPlannedWrites(writes) {
|
|
6
|
+
const conflicts = [];
|
|
7
|
+
const normalizedPaths = writes.map((write) => resolve(write.path));
|
|
8
|
+
for (let index = 0; index < normalizedPaths.length; index++) {
|
|
9
|
+
const path = normalizedPaths[index];
|
|
10
|
+
if (!path)
|
|
11
|
+
continue;
|
|
12
|
+
for (let otherIndex = index + 1; otherIndex < normalizedPaths.length; otherIndex++) {
|
|
13
|
+
const other = normalizedPaths[otherIndex];
|
|
14
|
+
if (!other)
|
|
15
|
+
continue;
|
|
16
|
+
if (path === other || isDescendant(path, other) || isDescendant(other, path)) {
|
|
17
|
+
conflicts.push(path, other);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
for (const write of writes) {
|
|
22
|
+
const invalidParent = firstInvalidParent(write.path);
|
|
23
|
+
if (invalidParent) {
|
|
24
|
+
conflicts.push(invalidParent);
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
const target = lstatIfPresent(write.path);
|
|
28
|
+
const exists = target !== undefined;
|
|
29
|
+
if (target && !target.isFile()) {
|
|
30
|
+
conflicts.push(write.path);
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
const current = exists ? readFileSync(write.path, 'utf8') : undefined;
|
|
34
|
+
if (write.mode === 'delete' && !exists) {
|
|
35
|
+
conflicts.push(write.path);
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
if (write.mode === 'create' && exists) {
|
|
39
|
+
conflicts.push(write.path);
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
if (write.before !== undefined && current !== write.before) {
|
|
43
|
+
conflicts.push(write.path);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// Never partially apply a stale plan: validate every snapshot first.
|
|
47
|
+
if (conflicts.length > 0)
|
|
48
|
+
return { written: [], conflicts: [...new Set(conflicts)] };
|
|
49
|
+
const stageRoot = mkdtempSync(join(tmpdir(), 'byline-planned-writes-'));
|
|
50
|
+
const staged = new Map();
|
|
51
|
+
try {
|
|
52
|
+
for (const [index, write] of writes.entries()) {
|
|
53
|
+
if (write.mode === 'delete')
|
|
54
|
+
continue;
|
|
55
|
+
const path = join(stageRoot, String(index));
|
|
56
|
+
writeFileSync(path, write.contents, 'utf8');
|
|
57
|
+
staged.set(write, path);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
rmSync(stageRoot, { recursive: true, force: true });
|
|
62
|
+
return { written: [], conflicts: writes.map((write) => write.path) };
|
|
63
|
+
}
|
|
64
|
+
const written = [];
|
|
65
|
+
const applied = [];
|
|
66
|
+
const createdDirectories = new Set();
|
|
67
|
+
let failedPath;
|
|
68
|
+
try {
|
|
69
|
+
for (const write of writes) {
|
|
70
|
+
failedPath = write.path;
|
|
71
|
+
const invalidParent = firstInvalidParent(write.path);
|
|
72
|
+
if (invalidParent)
|
|
73
|
+
throw new Error(`invalid parent ${invalidParent}`);
|
|
74
|
+
const target = lstatIfPresent(write.path);
|
|
75
|
+
if (target && !target.isFile())
|
|
76
|
+
throw new Error(`non-file target ${write.path}`);
|
|
77
|
+
if (write.mode === 'create' && target)
|
|
78
|
+
throw new Error(`existing target ${write.path}`);
|
|
79
|
+
if (write.mode === 'delete' && !target)
|
|
80
|
+
throw new Error(`missing target ${write.path}`);
|
|
81
|
+
const before = target ? readFileSync(write.path, 'utf8') : undefined;
|
|
82
|
+
if (write.before !== undefined && before !== write.before) {
|
|
83
|
+
throw new Error(`stale target ${write.path}`);
|
|
84
|
+
}
|
|
85
|
+
applied.push({ path: write.path, before });
|
|
86
|
+
if (write.mode === 'delete') {
|
|
87
|
+
rmSync(write.path);
|
|
88
|
+
written.push(write.path);
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
createParentDirectories(write.path, createdDirectories);
|
|
92
|
+
const stagePath = staged.get(write);
|
|
93
|
+
if (!stagePath)
|
|
94
|
+
throw new Error(`missing staged contents for ${write.path}`);
|
|
95
|
+
const contents = readFileSync(stagePath, 'utf8');
|
|
96
|
+
if (write.mode === 'create')
|
|
97
|
+
writeFileSync(write.path, contents, { encoding: 'utf8', flag: 'wx' });
|
|
98
|
+
else
|
|
99
|
+
writeFileSync(write.path, contents, 'utf8');
|
|
100
|
+
written.push(write.path);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
rollbackAppliedWrites(applied);
|
|
105
|
+
removeCreatedDirectories(createdDirectories);
|
|
106
|
+
return { written: [], conflicts: failedPath ? [failedPath] : writes.map((write) => write.path) };
|
|
107
|
+
}
|
|
108
|
+
finally {
|
|
109
|
+
rmSync(stageRoot, { recursive: true, force: true });
|
|
110
|
+
}
|
|
111
|
+
return { written, conflicts };
|
|
112
|
+
}
|
|
113
|
+
function lstatIfPresent(path) {
|
|
114
|
+
try {
|
|
115
|
+
return lstatSync(path);
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
const code = error.code;
|
|
119
|
+
if (code === 'ENOENT' || code === 'ENOTDIR')
|
|
120
|
+
return undefined;
|
|
121
|
+
throw error;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
function isDescendant(parent, candidate) {
|
|
125
|
+
const rel = relative(parent, candidate);
|
|
126
|
+
return rel !== '' && rel !== '..' && !rel.startsWith(`..${sep}`) && !isAbsolute(rel);
|
|
127
|
+
}
|
|
128
|
+
function firstInvalidParent(path) {
|
|
129
|
+
let parent = dirname(resolve(path));
|
|
130
|
+
while (true) {
|
|
131
|
+
const target = lstatIfPresent(parent);
|
|
132
|
+
if (target)
|
|
133
|
+
return target.isDirectory() ? undefined : parent;
|
|
134
|
+
const next = dirname(parent);
|
|
135
|
+
if (next === parent)
|
|
136
|
+
return parent;
|
|
137
|
+
parent = next;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
function createParentDirectories(path, created) {
|
|
141
|
+
const missing = [];
|
|
142
|
+
let parent = dirname(resolve(path));
|
|
143
|
+
while (!existsSync(parent)) {
|
|
144
|
+
missing.push(parent);
|
|
145
|
+
parent = dirname(parent);
|
|
146
|
+
}
|
|
147
|
+
for (const directory of missing.reverse()) {
|
|
148
|
+
mkdirSync(directory);
|
|
149
|
+
created.add(directory);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
function rollbackAppliedWrites(applied) {
|
|
153
|
+
for (const entry of [...applied].reverse()) {
|
|
154
|
+
try {
|
|
155
|
+
if (entry.before === undefined)
|
|
156
|
+
rmSync(entry.path, { force: true });
|
|
157
|
+
else {
|
|
158
|
+
mkdirSync(dirname(entry.path), { recursive: true });
|
|
159
|
+
writeFileSync(entry.path, entry.before, 'utf8');
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
// Continue restoring independent paths after a rollback failure.
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
function removeCreatedDirectories(directories) {
|
|
168
|
+
for (const directory of [...directories].sort((left, right) => right.length - left.length)) {
|
|
169
|
+
try {
|
|
170
|
+
rmdirSync(directory);
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
// Keep non-empty directories, including any that another process used.
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=planned-writes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planned-writes.js","sourceRoot":"","sources":["../../src/lib/planned-writes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planned-writes.test.d.ts","sourceRoot":"","sources":["../../src/lib/planned-writes.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { existsSync, lstatSync, mkdirSync, readFileSync, rmSync, symlinkSync, writeFileSync, } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { afterEach, describe, expect, it } from 'vitest';
|
|
4
|
+
import { createTestContext } from '../test-helpers.js';
|
|
5
|
+
import { applyPlannedWrites } from './planned-writes.js';
|
|
6
|
+
const contexts = [];
|
|
7
|
+
afterEach(() => {
|
|
8
|
+
for (const ctx of contexts.splice(0))
|
|
9
|
+
rmSync(ctx.cwd, { recursive: true, force: true });
|
|
10
|
+
});
|
|
11
|
+
describe('planned writes', () => {
|
|
12
|
+
it('applies no writes when an intermediate parent is a file', () => {
|
|
13
|
+
const ctx = createTestContext();
|
|
14
|
+
contexts.push(ctx);
|
|
15
|
+
const blocker = ctx.resolve('generated/blocked');
|
|
16
|
+
mkdirSync(ctx.resolve('generated'), { recursive: true });
|
|
17
|
+
writeFileSync(blocker, 'user-owned');
|
|
18
|
+
const first = ctx.resolve('generated/first.ts');
|
|
19
|
+
const result = applyPlannedWrites([
|
|
20
|
+
{ path: first, contents: 'first', mode: 'create' },
|
|
21
|
+
{ path: join(blocker, 'second.ts'), contents: 'second', mode: 'create' },
|
|
22
|
+
]);
|
|
23
|
+
expect(result.written).toEqual([]);
|
|
24
|
+
expect(result.conflicts).toContain(blocker);
|
|
25
|
+
expect(existsSync(first)).toBe(false);
|
|
26
|
+
expect(readFileSync(blocker, 'utf8')).toBe('user-owned');
|
|
27
|
+
});
|
|
28
|
+
it('rejects colliding planned file and descendant paths before writing', () => {
|
|
29
|
+
const ctx = createTestContext();
|
|
30
|
+
contexts.push(ctx);
|
|
31
|
+
const parent = ctx.resolve('generated/route');
|
|
32
|
+
const result = applyPlannedWrites([
|
|
33
|
+
{ path: parent, contents: 'file', mode: 'create' },
|
|
34
|
+
{ path: join(parent, 'child.ts'), contents: 'child', mode: 'create' },
|
|
35
|
+
]);
|
|
36
|
+
expect(result.written).toEqual([]);
|
|
37
|
+
expect(existsSync(parent)).toBe(false);
|
|
38
|
+
});
|
|
39
|
+
it('does not follow an intermediate symlink outside the planned tree', () => {
|
|
40
|
+
const ctx = createTestContext();
|
|
41
|
+
contexts.push(ctx);
|
|
42
|
+
const outside = ctx.resolve('outside');
|
|
43
|
+
const linked = ctx.resolve('generated/link');
|
|
44
|
+
mkdirSync(outside);
|
|
45
|
+
mkdirSync(ctx.resolve('generated'));
|
|
46
|
+
symlinkSync(outside, linked);
|
|
47
|
+
const result = applyPlannedWrites([
|
|
48
|
+
{ path: join(linked, 'escaped.ts'), contents: 'escaped', mode: 'create' },
|
|
49
|
+
]);
|
|
50
|
+
expect(result.written).toEqual([]);
|
|
51
|
+
expect(result.conflicts).toContain(linked);
|
|
52
|
+
expect(existsSync(join(outside, 'escaped.ts'))).toBe(false);
|
|
53
|
+
});
|
|
54
|
+
it('rejects a dangling symlink at a final target before applying any writes', () => {
|
|
55
|
+
const ctx = createTestContext();
|
|
56
|
+
contexts.push(ctx);
|
|
57
|
+
const outside = ctx.resolve('outside');
|
|
58
|
+
const target = ctx.resolve('generated/linked.ts');
|
|
59
|
+
const escaped = join(outside, 'escaped.ts');
|
|
60
|
+
mkdirSync(outside);
|
|
61
|
+
mkdirSync(ctx.resolve('generated'));
|
|
62
|
+
symlinkSync(escaped, target);
|
|
63
|
+
const first = ctx.resolve('generated/first.ts');
|
|
64
|
+
const result = applyPlannedWrites([
|
|
65
|
+
{ path: first, contents: 'first', mode: 'create' },
|
|
66
|
+
{ path: target, contents: 'escaped', mode: 'create' },
|
|
67
|
+
]);
|
|
68
|
+
expect(result.written).toEqual([]);
|
|
69
|
+
expect(result.conflicts).toContain(target);
|
|
70
|
+
expect(existsSync(first)).toBe(false);
|
|
71
|
+
expect(existsSync(escaped)).toBe(false);
|
|
72
|
+
expect(lstatSync(target).isSymbolicLink()).toBe(true);
|
|
73
|
+
});
|
|
74
|
+
it('rolls back applied patches and creates when a target changes after preflight', () => {
|
|
75
|
+
const ctx = createTestContext();
|
|
76
|
+
contexts.push(ctx);
|
|
77
|
+
const patched = ctx.resolve('generated/existing.ts');
|
|
78
|
+
const createdDirectory = ctx.resolve('generated/nested');
|
|
79
|
+
const created = join(createdDirectory, 'created.ts');
|
|
80
|
+
const stale = ctx.resolve('generated/stale.ts');
|
|
81
|
+
mkdirSync(ctx.resolve('generated'));
|
|
82
|
+
writeFileSync(patched, 'original');
|
|
83
|
+
writeFileSync(stale, 'expected');
|
|
84
|
+
let observedPriorWrites = false;
|
|
85
|
+
const staleWrite = {
|
|
86
|
+
// Change this target only once the apply loop has made both earlier writes visible.
|
|
87
|
+
get path() {
|
|
88
|
+
if (!observedPriorWrites &&
|
|
89
|
+
readFileSync(patched, 'utf8') === 'patched' &&
|
|
90
|
+
existsSync(created)) {
|
|
91
|
+
observedPriorWrites = true;
|
|
92
|
+
writeFileSync(stale, 'changed-after-preflight');
|
|
93
|
+
}
|
|
94
|
+
return stale;
|
|
95
|
+
},
|
|
96
|
+
before: 'expected',
|
|
97
|
+
contents: 'replacement',
|
|
98
|
+
mode: 'patch',
|
|
99
|
+
};
|
|
100
|
+
const result = applyPlannedWrites([
|
|
101
|
+
{ path: patched, before: 'original', contents: 'patched', mode: 'patch' },
|
|
102
|
+
{ path: created, contents: 'created', mode: 'create' },
|
|
103
|
+
staleWrite,
|
|
104
|
+
]);
|
|
105
|
+
expect(result).toEqual({ written: [], conflicts: [stale] });
|
|
106
|
+
expect(observedPriorWrites).toBe(true);
|
|
107
|
+
expect(readFileSync(patched, 'utf8')).toBe('original');
|
|
108
|
+
expect(existsSync(created)).toBe(false);
|
|
109
|
+
expect(existsSync(createdDirectory)).toBe(false);
|
|
110
|
+
expect(readFileSync(stale, 'utf8')).toBe('changed-after-preflight');
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
//# sourceMappingURL=planned-writes.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planned-writes.test.js","sourceRoot":"","sources":["../../src/lib/planned-writes.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface BylineReleasePolicy {
|
|
2
|
+
dependencyRange: string;
|
|
3
|
+
supportedRange: string;
|
|
4
|
+
displayFloor: string;
|
|
5
|
+
}
|
|
6
|
+
/** Derive every CLI package-compatibility value from one release version. */
|
|
7
|
+
export declare function deriveBylineReleasePolicy(cliVersion: string): BylineReleasePolicy;
|
|
8
|
+
/** Version of the installed CLI package; Changesets updates this at release time. */
|
|
9
|
+
export declare const CLI_PACKAGE_VERSION: string;
|
|
10
|
+
/** Active compatibility policy for this exact CLI artifact. */
|
|
11
|
+
export declare const BYLINE_RELEASE_POLICY: BylineReleasePolicy;
|
|
12
|
+
//# sourceMappingURL=release-policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"release-policy.d.ts","sourceRoot":"","sources":["../../src/lib/release-policy.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,mBAAmB;IAClC,eAAe,EAAE,MAAM,CAAA;IACvB,cAAc,EAAE,MAAM,CAAA;IACtB,YAAY,EAAE,MAAM,CAAA;CACrB;AAED,6EAA6E;AAC7E,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,MAAM,GAAG,mBAAmB,CAWjF;AAID,qFAAqF;AACrF,eAAO,MAAM,mBAAmB,QAAiE,CAAA;AAEjG,+DAA+D;AAC/D,eAAO,MAAM,qBAAqB,qBAAiD,CAAA"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { createRequire } from 'node:module';
|
|
2
|
+
import { parse } from 'semver';
|
|
3
|
+
/** Derive every CLI package-compatibility value from one release version. */
|
|
4
|
+
export function deriveBylineReleasePolicy(cliVersion) {
|
|
5
|
+
const parsed = parse(cliVersion);
|
|
6
|
+
if (!parsed) {
|
|
7
|
+
throw new Error(`Invalid @byline/cli package version: ${cliVersion}`);
|
|
8
|
+
}
|
|
9
|
+
return {
|
|
10
|
+
dependencyRange: `^${parsed.version}`,
|
|
11
|
+
supportedRange: `>=${parsed.version} <${parsed.major + 1}.0.0-0`,
|
|
12
|
+
displayFloor: `${parsed.major}.${parsed.minor}.x+`,
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
const require = createRequire(import.meta.url);
|
|
16
|
+
/** Version of the installed CLI package; Changesets updates this at release time. */
|
|
17
|
+
export const CLI_PACKAGE_VERSION = require('../../package.json').version;
|
|
18
|
+
/** Active compatibility policy for this exact CLI artifact. */
|
|
19
|
+
export const BYLINE_RELEASE_POLICY = deriveBylineReleasePolicy(CLI_PACKAGE_VERSION);
|
|
20
|
+
//# sourceMappingURL=release-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"release-policy.js","sourceRoot":"","sources":["../../src/lib/release-policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAE3C,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAQ9B,6EAA6E;AAC7E,MAAM,UAAU,yBAAyB,CAAC,UAAkB;IAC1D,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,CAAC,CAAA;IAChC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,wCAAwC,UAAU,EAAE,CAAC,CAAA;IACvE,CAAC;IAED,OAAO;QACL,eAAe,EAAE,IAAI,MAAM,CAAC,OAAO,EAAE;QACrC,cAAc,EAAE,KAAK,MAAM,CAAC,OAAO,KAAK,MAAM,CAAC,KAAK,GAAG,CAAC,QAAQ;QAChE,YAAY,EAAE,GAAG,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,KAAK;KACnD,CAAA;AACH,CAAC;AAED,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAA;AAE9C,qFAAqF;AACrF,MAAM,CAAC,MAAM,mBAAmB,GAAI,OAAO,CAAC,oBAAoB,CAAyB,CAAC,OAAO,CAAA;AAEjG,+DAA+D;AAC/D,MAAM,CAAC,MAAM,qBAAqB,GAAG,yBAAyB,CAAC,mBAAmB,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"release-policy.test.d.ts","sourceRoot":"","sources":["../../src/lib/release-policy.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { deriveBylineReleasePolicy } from './release-policy.js';
|
|
3
|
+
describe('deriveBylineReleasePolicy', () => {
|
|
4
|
+
it.each([
|
|
5
|
+
[
|
|
6
|
+
'3.21.0',
|
|
7
|
+
{
|
|
8
|
+
dependencyRange: '^3.21.0',
|
|
9
|
+
supportedRange: '>=3.21.0 <4.0.0-0',
|
|
10
|
+
displayFloor: '3.21.x+',
|
|
11
|
+
},
|
|
12
|
+
],
|
|
13
|
+
[
|
|
14
|
+
'4.0.0',
|
|
15
|
+
{
|
|
16
|
+
dependencyRange: '^4.0.0',
|
|
17
|
+
supportedRange: '>=4.0.0 <5.0.0-0',
|
|
18
|
+
displayFloor: '4.0.x+',
|
|
19
|
+
},
|
|
20
|
+
],
|
|
21
|
+
[
|
|
22
|
+
'5.2.1',
|
|
23
|
+
{
|
|
24
|
+
dependencyRange: '^5.2.1',
|
|
25
|
+
supportedRange: '>=5.2.1 <6.0.0-0',
|
|
26
|
+
displayFloor: '5.2.x+',
|
|
27
|
+
},
|
|
28
|
+
],
|
|
29
|
+
])('derives the lockstep policy for %s', (version, expected) => {
|
|
30
|
+
expect(deriveBylineReleasePolicy(version)).toEqual(expected);
|
|
31
|
+
});
|
|
32
|
+
it('rejects an invalid package version', () => {
|
|
33
|
+
expect(() => deriveBylineReleasePolicy('next')).toThrow('Invalid @byline/cli package version');
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
//# sourceMappingURL=release-policy.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"release-policy.test.js","sourceRoot":"","sources":["../../src/lib/release-policy.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAE7C,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAA;AAE/D,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,EAAE,CAAC,IAAI,CAAC;QACN;YACE,QAAQ;YACR;gBACE,eAAe,EAAE,SAAS;gBAC1B,cAAc,EAAE,mBAAmB;gBACnC,YAAY,EAAE,SAAS;aACxB;SACF;QACD;YACE,OAAO;YACP;gBACE,eAAe,EAAE,QAAQ;gBACzB,cAAc,EAAE,kBAAkB;gBAClC,YAAY,EAAE,QAAQ;aACvB;SACF;QACD;YACE,OAAO;YACP;gBACE,eAAe,EAAE,QAAQ;gBACzB,cAAc,EAAE,kBAAkB;gBAClC,YAAY,EAAE,QAAQ;aACvB;SACF;KACF,CAAC,CAAC,oCAAoC,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE;QAC7D,MAAM,CAAC,yBAAyB,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC9D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,CAAC,GAAG,EAAE,CAAC,yBAAyB,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAA;IAChG,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { type StaticResult } from './static-config.js';
|
|
2
|
+
import type { Context } from '../context.js';
|
|
3
|
+
export declare const DEFAULT_ADMIN_PATH = "/admin";
|
|
4
|
+
export declare const DEFAULT_SIGN_IN_PATH = "/sign-in";
|
|
5
|
+
export declare const PREVIOUS_RELEASE_ROUTES_SOURCE = "/**\n * This Source Code is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n *\n * Copyright (c) Infonomic Company Limited\n */\n\n/**\n * URL segments for admin and (future) public API routes. Defaults of\n * `/admin` and `/api` are applied automatically by `resolveRoutes()` \u2014\n * keys only need to be set here when overriding either default.\n */\n\nimport type { RoutesConfig } from '@byline/core'\n\nexport const routes: Partial<RoutesConfig> = {\n admin: '/admin',\n api: '/api',\n}\n\n/**\n * Fallback used by both server and admin entry points when no\n * `VITE_SERVER_URL` env var is set. Each entry resolves the env var\n * itself (Vite's `import.meta.env` on the client, Node's `process.env`\n * on the server) and falls back to this literal.\n */\nexport const DEFAULT_SERVER_URL = 'http://localhost:5173/'\n";
|
|
6
|
+
export interface ValidatedRoutePaths {
|
|
7
|
+
adminPath: string;
|
|
8
|
+
adminSegments: string[];
|
|
9
|
+
apiPath: string;
|
|
10
|
+
apiSegments: string[];
|
|
11
|
+
signInPath: string;
|
|
12
|
+
signInSegments: string[];
|
|
13
|
+
}
|
|
14
|
+
export interface GeneratedRoutesSource {
|
|
15
|
+
adminPath: string;
|
|
16
|
+
apiPath: string;
|
|
17
|
+
signInPath: string;
|
|
18
|
+
}
|
|
19
|
+
export interface StaticRouteConfig {
|
|
20
|
+
admin: string;
|
|
21
|
+
api: string;
|
|
22
|
+
signIn: string;
|
|
23
|
+
}
|
|
24
|
+
type ValidationResult = {
|
|
25
|
+
ok: true;
|
|
26
|
+
value: ValidatedRoutePaths;
|
|
27
|
+
} | {
|
|
28
|
+
ok: false;
|
|
29
|
+
error: string;
|
|
30
|
+
};
|
|
31
|
+
export declare function validateRoutePaths(ctx: Context, adminInput?: string, signInInput?: string, apiInput?: string): ValidationResult;
|
|
32
|
+
/** Recognize only generated routes.ts sources with route literals as the sole variation. */
|
|
33
|
+
export declare function recognizeGeneratedRoutesSource(source: string, canonical: string): GeneratedRoutesSource | null;
|
|
34
|
+
export declare function readStaticRoutesSource(source: string): StaticResult<StaticRouteConfig>;
|
|
35
|
+
export declare function routesSourceAligned(source: string, ctx: Context, expected: ValidatedRoutePaths): boolean;
|
|
36
|
+
export declare function renderGeneratedRoutesSource(canonical: string, adminPath: string, apiPath: string, signInPath: string): string;
|
|
37
|
+
export declare function validateCanonicalRoutesSource(source: string): StaticResult<StaticRouteConfig>;
|
|
38
|
+
export declare function canonicalRoutesTemplatePath(ctx: Context): string;
|
|
39
|
+
export {};
|
|
40
|
+
//# sourceMappingURL=route-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route-config.d.ts","sourceRoot":"","sources":["../../src/lib/route-config.ts"],"names":[],"mappings":"AAGA,OAAO,EAIL,KAAK,YAAY,EAClB,MAAM,oBAAoB,CAAA;AAE3B,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAE5C,eAAO,MAAM,kBAAkB,WAAW,CAAA;AAC1C,eAAO,MAAM,oBAAoB,aAAa,CAAA;AAK9C,eAAO,MAAM,8BAA8B,i8BA4B1C,CAAA;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,MAAM,EAAE,CAAA;IACvB,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,UAAU,EAAE,MAAM,CAAA;IAClB,cAAc,EAAE,MAAM,EAAE,CAAA;CACzB;AAED,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;CACf;AAED,KAAK,gBAAgB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,mBAAmB,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAE/F,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,OAAO,EACZ,UAAU,SAAqB,EAC/B,WAAW,SAAuB,EAClC,QAAQ,CAAC,EAAE,MAAM,GAChB,gBAAgB,CAmGlB;AAED,4FAA4F;AAC5F,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,qBAAqB,GAAG,IAAI,CA6B9B;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,CAAC,iBAAiB,CAAC,CAgBtF;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,OAAO,EACZ,QAAQ,EAAE,mBAAmB,GAC5B,OAAO,CAeT;AAED,wBAAgB,2BAA2B,CACzC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,GACjB,MAAM,CAKR;AAED,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,CAAC,iBAAiB,CAAC,CAyB7F;AAED,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAGhE"}
|