create-gitcms 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 +49 -0
- package/dist/args.d.ts +14 -0
- package/dist/args.d.ts.map +1 -0
- package/dist/args.js +119 -0
- package/dist/args.js.map +1 -0
- package/dist/cli.d.ts +4 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +529 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/content-detection.d.ts +2 -0
- package/dist/core/content-detection.d.ts.map +1 -0
- package/dist/core/content-detection.js +2 -0
- package/dist/core/content-detection.js.map +1 -0
- package/dist/core/filesystem.d.ts +11 -0
- package/dist/core/filesystem.d.ts.map +1 -0
- package/dist/core/filesystem.js +93 -0
- package/dist/core/filesystem.js.map +1 -0
- package/dist/core/framework-detection.d.ts +17 -0
- package/dist/core/framework-detection.d.ts.map +1 -0
- package/dist/core/framework-detection.js +60 -0
- package/dist/core/framework-detection.js.map +1 -0
- package/dist/core/frontmatter-inference.d.ts +2 -0
- package/dist/core/frontmatter-inference.d.ts.map +1 -0
- package/dist/core/frontmatter-inference.js +2 -0
- package/dist/core/frontmatter-inference.js.map +1 -0
- package/dist/core/git.d.ts +4 -0
- package/dist/core/git.d.ts.map +1 -0
- package/dist/core/git.js +45 -0
- package/dist/core/git.js.map +1 -0
- package/dist/core/gitcms-config.d.ts +153 -0
- package/dist/core/gitcms-config.d.ts.map +1 -0
- package/dist/core/gitcms-config.js +436 -0
- package/dist/core/gitcms-config.js.map +1 -0
- package/dist/core/mode-resolution.d.ts +22 -0
- package/dist/core/mode-resolution.d.ts.map +1 -0
- package/dist/core/mode-resolution.js +136 -0
- package/dist/core/mode-resolution.js.map +1 -0
- package/dist/core/paths.d.ts +6 -0
- package/dist/core/paths.d.ts.map +1 -0
- package/dist/core/paths.js +19 -0
- package/dist/core/paths.js.map +1 -0
- package/dist/core/planner.d.ts +8 -0
- package/dist/core/planner.d.ts.map +1 -0
- package/dist/core/planner.js +295 -0
- package/dist/core/planner.js.map +1 -0
- package/dist/core/site-roots.d.ts +5 -0
- package/dist/core/site-roots.d.ts.map +1 -0
- package/dist/core/site-roots.js +32 -0
- package/dist/core/site-roots.js.map +1 -0
- package/dist/core/sitemap-discovery.d.ts +2 -0
- package/dist/core/sitemap-discovery.d.ts.map +1 -0
- package/dist/core/sitemap-discovery.js +2 -0
- package/dist/core/sitemap-discovery.js.map +1 -0
- package/dist/core/vendor/content-detection.d.ts +51 -0
- package/dist/core/vendor/content-detection.d.ts.map +1 -0
- package/dist/core/vendor/content-detection.js +462 -0
- package/dist/core/vendor/content-detection.js.map +1 -0
- package/dist/core/vendor/frontmatter-inference.d.ts +5 -0
- package/dist/core/vendor/frontmatter-inference.d.ts.map +1 -0
- package/dist/core/vendor/frontmatter-inference.js +234 -0
- package/dist/core/vendor/frontmatter-inference.js.map +1 -0
- package/dist/core/vendor/paths.d.ts +3 -0
- package/dist/core/vendor/paths.d.ts.map +1 -0
- package/dist/core/vendor/paths.js +23 -0
- package/dist/core/vendor/paths.js.map +1 -0
- package/dist/core/vendor/sitemap.d.ts +10 -0
- package/dist/core/vendor/sitemap.d.ts.map +1 -0
- package/dist/core/vendor/sitemap.js +162 -0
- package/dist/core/vendor/sitemap.js.map +1 -0
- package/dist/core/writer.d.ts +4 -0
- package/dist/core/writer.d.ts.map +1 -0
- package/dist/core/writer.js +45 -0
- package/dist/core/writer.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts.d.ts +12 -0
- package/dist/prompts.d.ts.map +1 -0
- package/dist/prompts.js +41 -0
- package/dist/prompts.js.map +1 -0
- package/dist/types.d.ts +74 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
// Vendored from @gitcms/onboarding-core to keep create-gitcms publishable
|
|
2
|
+
// as a single package on npm.
|
|
3
|
+
const URL_REGEX = /^https?:\/\//i;
|
|
4
|
+
const ISO_DATE_REGEX = /^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?(Z|[+-]\d{2}:\d{2})?)?$/;
|
|
5
|
+
const IMAGE_REGEX = /\.(jpg|jpeg|png|gif|webp|svg)$/i;
|
|
6
|
+
const RICHTEXT_FIELD_NAMES = new Set([
|
|
7
|
+
'description',
|
|
8
|
+
'summary',
|
|
9
|
+
'excerpt',
|
|
10
|
+
'content',
|
|
11
|
+
'body',
|
|
12
|
+
'bio',
|
|
13
|
+
'about',
|
|
14
|
+
'overview',
|
|
15
|
+
'intro',
|
|
16
|
+
'introduction',
|
|
17
|
+
'notes',
|
|
18
|
+
'details',
|
|
19
|
+
]);
|
|
20
|
+
const DATE_FIELD_NAMES = new Set([
|
|
21
|
+
'date',
|
|
22
|
+
'datetime',
|
|
23
|
+
'created',
|
|
24
|
+
'createdat',
|
|
25
|
+
'created_at',
|
|
26
|
+
'updated',
|
|
27
|
+
'updatedat',
|
|
28
|
+
'updated_at',
|
|
29
|
+
'modified',
|
|
30
|
+
'modifiedat',
|
|
31
|
+
'modified_at',
|
|
32
|
+
'published',
|
|
33
|
+
'publishedat',
|
|
34
|
+
'published_at',
|
|
35
|
+
'publishdate',
|
|
36
|
+
'publish_date',
|
|
37
|
+
'startdate',
|
|
38
|
+
'start_date',
|
|
39
|
+
'enddate',
|
|
40
|
+
'end_date',
|
|
41
|
+
'duedate',
|
|
42
|
+
'due_date',
|
|
43
|
+
'timestamp',
|
|
44
|
+
]);
|
|
45
|
+
const IMAGE_FIELD_NAMES = new Set([
|
|
46
|
+
'image',
|
|
47
|
+
'img',
|
|
48
|
+
'photo',
|
|
49
|
+
'picture',
|
|
50
|
+
'avatar',
|
|
51
|
+
'icon',
|
|
52
|
+
'logo',
|
|
53
|
+
'thumbnail',
|
|
54
|
+
'thumb',
|
|
55
|
+
'banner',
|
|
56
|
+
'cover',
|
|
57
|
+
'coverimage',
|
|
58
|
+
'cover_image',
|
|
59
|
+
'featuredimage',
|
|
60
|
+
'featured_image',
|
|
61
|
+
'heroimage',
|
|
62
|
+
'hero_image',
|
|
63
|
+
'profileimage',
|
|
64
|
+
'profile_image',
|
|
65
|
+
'profilepic',
|
|
66
|
+
'profile_pic',
|
|
67
|
+
'profilepicture',
|
|
68
|
+
'profile_picture',
|
|
69
|
+
'poster',
|
|
70
|
+
'backdrop',
|
|
71
|
+
'background',
|
|
72
|
+
'backgroundimage',
|
|
73
|
+
'background_image',
|
|
74
|
+
'ogimage',
|
|
75
|
+
'og_image',
|
|
76
|
+
'socialimage',
|
|
77
|
+
'social_image',
|
|
78
|
+
'previewimage',
|
|
79
|
+
'preview_image',
|
|
80
|
+
]);
|
|
81
|
+
function isValidDate(date) {
|
|
82
|
+
return !Number.isNaN(date.getTime());
|
|
83
|
+
}
|
|
84
|
+
function isDateTimeString(value) {
|
|
85
|
+
if (ISO_DATE_REGEX.test(value)) {
|
|
86
|
+
return true;
|
|
87
|
+
}
|
|
88
|
+
const parsed = new Date(value);
|
|
89
|
+
if (isValidDate(parsed)) {
|
|
90
|
+
if (value.length >= 8 && /\d/.test(value) && /[-/]/.test(value)) {
|
|
91
|
+
return true;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
export function inferFieldType(value, fieldName) {
|
|
97
|
+
if (fieldName) {
|
|
98
|
+
const normalizedName = fieldName.toLowerCase().replace(/[-_\s]/g, '');
|
|
99
|
+
if (RICHTEXT_FIELD_NAMES.has(normalizedName) && typeof value === 'string') {
|
|
100
|
+
return 'richtext';
|
|
101
|
+
}
|
|
102
|
+
if (DATE_FIELD_NAMES.has(normalizedName)
|
|
103
|
+
&& (value instanceof Date || (typeof value === 'string' && value.length > 0))) {
|
|
104
|
+
return 'datetime';
|
|
105
|
+
}
|
|
106
|
+
if (IMAGE_FIELD_NAMES.has(normalizedName) && typeof value === 'string') {
|
|
107
|
+
return 'image';
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
if (typeof value === 'boolean')
|
|
111
|
+
return 'boolean';
|
|
112
|
+
if (typeof value === 'number')
|
|
113
|
+
return 'number';
|
|
114
|
+
if (value instanceof Date && isValidDate(value)) {
|
|
115
|
+
return 'datetime';
|
|
116
|
+
}
|
|
117
|
+
if (typeof value === 'string') {
|
|
118
|
+
if (value.includes('\n') || value.length >= 100)
|
|
119
|
+
return 'richtext';
|
|
120
|
+
if (URL_REGEX.test(value))
|
|
121
|
+
return 'url';
|
|
122
|
+
if (isDateTimeString(value))
|
|
123
|
+
return 'datetime';
|
|
124
|
+
if (IMAGE_REGEX.test(value))
|
|
125
|
+
return 'image';
|
|
126
|
+
return 'text';
|
|
127
|
+
}
|
|
128
|
+
if (Array.isArray(value)) {
|
|
129
|
+
if (value.every((item) => typeof item === 'string')) {
|
|
130
|
+
return 'multiselect';
|
|
131
|
+
}
|
|
132
|
+
return 'list';
|
|
133
|
+
}
|
|
134
|
+
if (isRecord(value)) {
|
|
135
|
+
return 'json';
|
|
136
|
+
}
|
|
137
|
+
return 'text';
|
|
138
|
+
}
|
|
139
|
+
export function humanizeFieldName(name) {
|
|
140
|
+
return name
|
|
141
|
+
.replace(/[-_]/g, ' ')
|
|
142
|
+
.replace(/([a-z])([A-Z])/g, '$1 $2')
|
|
143
|
+
.replace(/^\w/, (char) => char.toUpperCase());
|
|
144
|
+
}
|
|
145
|
+
export function inferSchemaFromFrontmatter(frontmatter) {
|
|
146
|
+
const entries = Object.entries(frontmatter);
|
|
147
|
+
const titleEntry = entries.find(([name]) => {
|
|
148
|
+
const lower = name.toLowerCase();
|
|
149
|
+
return lower === 'title' || lower === 'name' || lower === 'heading';
|
|
150
|
+
});
|
|
151
|
+
const titleName = titleEntry?.[0];
|
|
152
|
+
const otherEntries = entries.filter(([name]) => name !== titleName);
|
|
153
|
+
const fields = [];
|
|
154
|
+
if (titleEntry) {
|
|
155
|
+
fields.push({
|
|
156
|
+
type: 'title',
|
|
157
|
+
name: titleEntry[0],
|
|
158
|
+
label: humanizeFieldName(titleEntry[0]),
|
|
159
|
+
required: false,
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
for (const [name, value] of otherEntries) {
|
|
163
|
+
const inferredType = inferFieldType(value, name);
|
|
164
|
+
const baseField = {
|
|
165
|
+
name,
|
|
166
|
+
label: humanizeFieldName(name),
|
|
167
|
+
required: false,
|
|
168
|
+
};
|
|
169
|
+
if (inferredType === 'text') {
|
|
170
|
+
fields.push({ ...baseField, type: 'text' });
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
if (inferredType === 'richtext') {
|
|
174
|
+
fields.push({ ...baseField, type: 'richtext' });
|
|
175
|
+
continue;
|
|
176
|
+
}
|
|
177
|
+
if (inferredType === 'number') {
|
|
178
|
+
fields.push({ ...baseField, type: 'number' });
|
|
179
|
+
continue;
|
|
180
|
+
}
|
|
181
|
+
if (inferredType === 'boolean') {
|
|
182
|
+
fields.push({
|
|
183
|
+
...baseField,
|
|
184
|
+
type: 'boolean',
|
|
185
|
+
default: Boolean(value),
|
|
186
|
+
});
|
|
187
|
+
continue;
|
|
188
|
+
}
|
|
189
|
+
if (inferredType === 'datetime') {
|
|
190
|
+
fields.push({ ...baseField, type: 'datetime' });
|
|
191
|
+
continue;
|
|
192
|
+
}
|
|
193
|
+
if (inferredType === 'url') {
|
|
194
|
+
fields.push({ ...baseField, type: 'url' });
|
|
195
|
+
continue;
|
|
196
|
+
}
|
|
197
|
+
if (inferredType === 'image') {
|
|
198
|
+
fields.push({ ...baseField, type: 'image' });
|
|
199
|
+
continue;
|
|
200
|
+
}
|
|
201
|
+
if (inferredType === 'multiselect') {
|
|
202
|
+
const options = [];
|
|
203
|
+
if (Array.isArray(value)) {
|
|
204
|
+
for (const item of value) {
|
|
205
|
+
if (typeof item === 'string') {
|
|
206
|
+
options.push(item);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
fields.push({
|
|
211
|
+
...baseField,
|
|
212
|
+
type: 'multiselect',
|
|
213
|
+
options,
|
|
214
|
+
allowCustom: true,
|
|
215
|
+
color: 'blue',
|
|
216
|
+
});
|
|
217
|
+
continue;
|
|
218
|
+
}
|
|
219
|
+
if (inferredType === 'json') {
|
|
220
|
+
fields.push({ ...baseField, type: 'json' });
|
|
221
|
+
continue;
|
|
222
|
+
}
|
|
223
|
+
if (inferredType === 'list') {
|
|
224
|
+
fields.push({ ...baseField, type: 'list' });
|
|
225
|
+
continue;
|
|
226
|
+
}
|
|
227
|
+
fields.push({ ...baseField, type: 'text' });
|
|
228
|
+
}
|
|
229
|
+
return fields;
|
|
230
|
+
}
|
|
231
|
+
function isRecord(value) {
|
|
232
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
233
|
+
}
|
|
234
|
+
//# sourceMappingURL=frontmatter-inference.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frontmatter-inference.js","sourceRoot":"","sources":["../../../src/core/vendor/frontmatter-inference.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../../src/core/vendor/paths.ts"],"names":[],"mappings":"AAGA,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,UAExC;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,UAuB9C"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// Vendored from @gitcms/onboarding-core to keep create-gitcms publishable
|
|
2
|
+
// as a single package on npm.
|
|
3
|
+
export function toPosixPath(value) {
|
|
4
|
+
return value.replace(/\\/g, '/');
|
|
5
|
+
}
|
|
6
|
+
export function normalizeSiteRoot(value) {
|
|
7
|
+
const trimmed = toPosixPath(value).trim();
|
|
8
|
+
if (!trimmed || trimmed === '.' || trimmed === '/') {
|
|
9
|
+
return '';
|
|
10
|
+
}
|
|
11
|
+
const stripped = trimmed.replace(/^\/+/g, '').replace(/\/+$/g, '');
|
|
12
|
+
if (!stripped || stripped === '.') {
|
|
13
|
+
return '';
|
|
14
|
+
}
|
|
15
|
+
const segments = stripped.split('/').filter(Boolean);
|
|
16
|
+
for (const segment of segments) {
|
|
17
|
+
if (segment === '.' || segment === '..') {
|
|
18
|
+
throw new Error(`Invalid site root "${value}". Relative path segments are not allowed.`);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return segments.join('/');
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../src/core/vendor/paths.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,8BAA8B;AAE9B,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;AAClC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAA;IAEzC,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,GAAG,IAAI,OAAO,KAAK,GAAG,EAAE,CAAC;QACnD,OAAO,EAAE,CAAA;IACX,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;IAClE,IAAI,CAAC,QAAQ,IAAI,QAAQ,KAAK,GAAG,EAAE,CAAC;QAClC,OAAO,EAAE,CAAA;IACX,CAAC;IAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IAEpD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,OAAO,KAAK,GAAG,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CACb,sBAAsB,KAAK,4CAA4C,CACxE,CAAA;QACH,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAC3B,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface SitemapPage {
|
|
2
|
+
loc: string;
|
|
3
|
+
lastmod?: string;
|
|
4
|
+
}
|
|
5
|
+
export declare function normalizeWebsiteUrlForDiscovery(websiteUrl: string): string | null;
|
|
6
|
+
export declare function fetchAndParseSitemap(sitemapUrl: string, depth?: number): Promise<Array<SitemapPage>>;
|
|
7
|
+
export declare function discoverSitemapUrl(websiteUrl: string): Promise<string | null>;
|
|
8
|
+
export declare function toRelativePath(loc: string, websiteUrl: string): string;
|
|
9
|
+
export declare function deriveDisplayName(path: string): string;
|
|
10
|
+
//# sourceMappingURL=sitemap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sitemap.d.ts","sourceRoot":"","sources":["../../../src/core/vendor/sitemap.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAoCD,wBAAgB,+BAA+B,CAAC,UAAU,EAAE,MAAM,iBAYjE;AAuBD,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,MAAM,EAClB,KAAK,SAAI,GACR,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAe7B;AAaD,wBAAsB,kBAAkB,CAAC,UAAU,EAAE,MAAM,0BAuC1D;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,UAS7D;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,UAU7C"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
// Vendored from @gitcms/onboarding-core to keep create-gitcms publishable
|
|
2
|
+
// as a single package on npm.
|
|
3
|
+
const FETCH_TIMEOUT_MS = 10_000;
|
|
4
|
+
const MAX_RECURSION_DEPTH = 2;
|
|
5
|
+
const MAX_URLS = 1000;
|
|
6
|
+
function parseUrlsetEntries(xml) {
|
|
7
|
+
const pages = [];
|
|
8
|
+
const urlPattern = /<url>([\s\S]*?)<\/url>/g;
|
|
9
|
+
let match;
|
|
10
|
+
while ((match = urlPattern.exec(xml)) !== null) {
|
|
11
|
+
const block = match[1] ?? '';
|
|
12
|
+
const loc = block.match(/<loc>([\s\S]*?)<\/loc>/)?.[1]?.trim();
|
|
13
|
+
if (!loc)
|
|
14
|
+
continue;
|
|
15
|
+
const lastmod = block.match(/<lastmod>([\s\S]*?)<\/lastmod>/)?.[1]?.trim();
|
|
16
|
+
pages.push({ loc, lastmod: lastmod || undefined });
|
|
17
|
+
}
|
|
18
|
+
return pages;
|
|
19
|
+
}
|
|
20
|
+
function isSitemapIndex(xml) {
|
|
21
|
+
return /<sitemapindex[\s>]/i.test(xml);
|
|
22
|
+
}
|
|
23
|
+
function parseChildSitemapLocs(xml) {
|
|
24
|
+
const locs = [];
|
|
25
|
+
const pattern = /<sitemap>([\s\S]*?)<\/sitemap>/g;
|
|
26
|
+
let match;
|
|
27
|
+
while ((match = pattern.exec(xml)) !== null) {
|
|
28
|
+
const block = match[1] ?? '';
|
|
29
|
+
const loc = block.match(/<loc>([\s\S]*?)<\/loc>/)?.[1]?.trim();
|
|
30
|
+
if (loc)
|
|
31
|
+
locs.push(loc);
|
|
32
|
+
}
|
|
33
|
+
return locs;
|
|
34
|
+
}
|
|
35
|
+
function hasProtocol(value) {
|
|
36
|
+
return /^[a-zA-Z][a-zA-Z\d+.-]*:\/\//.test(value);
|
|
37
|
+
}
|
|
38
|
+
export function normalizeWebsiteUrlForDiscovery(websiteUrl) {
|
|
39
|
+
const trimmed = websiteUrl.trim();
|
|
40
|
+
if (!trimmed)
|
|
41
|
+
return null;
|
|
42
|
+
const withProtocol = hasProtocol(trimmed) ? trimmed : `https://${trimmed}`;
|
|
43
|
+
try {
|
|
44
|
+
const parsed = new URL(withProtocol);
|
|
45
|
+
return parsed.toString().replace(/\/+$/, '');
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
async function fetchWithTimeout(url) {
|
|
52
|
+
const controller = new AbortController();
|
|
53
|
+
const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);
|
|
54
|
+
try {
|
|
55
|
+
return await fetch(url, {
|
|
56
|
+
signal: controller.signal,
|
|
57
|
+
headers: { 'User-Agent': 'GitCMS-SitemapBot/1.0' },
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
finally {
|
|
61
|
+
clearTimeout(timer);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
async function fetchXml(url) {
|
|
65
|
+
const response = await fetchWithTimeout(url);
|
|
66
|
+
if (!response.ok)
|
|
67
|
+
return null;
|
|
68
|
+
const text = await response.text();
|
|
69
|
+
if (!text.includes('<'))
|
|
70
|
+
return null;
|
|
71
|
+
return text;
|
|
72
|
+
}
|
|
73
|
+
export async function fetchAndParseSitemap(sitemapUrl, depth = 0) {
|
|
74
|
+
if (depth > MAX_RECURSION_DEPTH)
|
|
75
|
+
return [];
|
|
76
|
+
const xml = await fetchXml(sitemapUrl);
|
|
77
|
+
if (!xml)
|
|
78
|
+
return [];
|
|
79
|
+
if (isSitemapIndex(xml)) {
|
|
80
|
+
const childLocs = parseChildSitemapLocs(xml);
|
|
81
|
+
const childResults = await Promise.all(childLocs.map((loc) => fetchAndParseSitemap(loc, depth + 1)));
|
|
82
|
+
return childResults.flat().slice(0, MAX_URLS);
|
|
83
|
+
}
|
|
84
|
+
return parseUrlsetEntries(xml).slice(0, MAX_URLS);
|
|
85
|
+
}
|
|
86
|
+
function parseSitemapDirectivesFromRobotsTxt(robotsTxt) {
|
|
87
|
+
const lines = robotsTxt.split('\n');
|
|
88
|
+
const sitemapUrls = [];
|
|
89
|
+
for (const line of lines) {
|
|
90
|
+
const match = /^\s*sitemap:\s*(.+)/i.exec(line);
|
|
91
|
+
const url = match?.[1]?.trim();
|
|
92
|
+
if (url)
|
|
93
|
+
sitemapUrls.push(url);
|
|
94
|
+
}
|
|
95
|
+
return sitemapUrls;
|
|
96
|
+
}
|
|
97
|
+
export async function discoverSitemapUrl(websiteUrl) {
|
|
98
|
+
const normalizedWebsite = normalizeWebsiteUrlForDiscovery(websiteUrl);
|
|
99
|
+
if (!normalizedWebsite)
|
|
100
|
+
return null;
|
|
101
|
+
try {
|
|
102
|
+
const robotsResponse = await fetchWithTimeout(`${normalizedWebsite}/robots.txt`);
|
|
103
|
+
if (robotsResponse.ok) {
|
|
104
|
+
const robotsTxt = await robotsResponse.text();
|
|
105
|
+
const declared = parseSitemapDirectivesFromRobotsTxt(robotsTxt);
|
|
106
|
+
for (const candidate of declared) {
|
|
107
|
+
try {
|
|
108
|
+
const xml = await fetchXml(candidate);
|
|
109
|
+
if (xml)
|
|
110
|
+
return candidate;
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
// Continue to fallbacks.
|
|
120
|
+
}
|
|
121
|
+
const commonPaths = [
|
|
122
|
+
'/sitemap.xml',
|
|
123
|
+
'/sitemap-index.xml',
|
|
124
|
+
'/sitemap_index.xml',
|
|
125
|
+
];
|
|
126
|
+
for (const commonPath of commonPaths) {
|
|
127
|
+
const candidate = `${normalizedWebsite}${commonPath}`;
|
|
128
|
+
try {
|
|
129
|
+
const xml = await fetchXml(candidate);
|
|
130
|
+
if (xml)
|
|
131
|
+
return candidate;
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
export function toRelativePath(loc, websiteUrl) {
|
|
140
|
+
try {
|
|
141
|
+
const parsed = new URL(loc);
|
|
142
|
+
const base = new URL(websiteUrl);
|
|
143
|
+
if (parsed.hostname !== base.hostname)
|
|
144
|
+
return loc;
|
|
145
|
+
return parsed.pathname;
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
return loc;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
export function deriveDisplayName(path) {
|
|
152
|
+
const clean = path.replace(/^\/+|\/+$/g, '');
|
|
153
|
+
if (!clean)
|
|
154
|
+
return '/';
|
|
155
|
+
const last = clean.split('/').pop() ?? clean;
|
|
156
|
+
return last
|
|
157
|
+
.replace(/[-_]+/g, ' ')
|
|
158
|
+
.replace(/\.\w+$/, '')
|
|
159
|
+
.replace(/\b\w/g, (c) => c.toUpperCase())
|
|
160
|
+
.trim();
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=sitemap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sitemap.js","sourceRoot":"","sources":["../../../src/core/vendor/sitemap.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { InitPlan, WriteOptions, WriteResult } from '../types.js';
|
|
2
|
+
export declare function findExistingConfigPaths(plan: InitPlan): Promise<string[]>;
|
|
3
|
+
export declare function writePlanToDisk(plan: InitPlan, options: WriteOptions): Promise<WriteResult[]>;
|
|
4
|
+
//# sourceMappingURL=writer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"writer.d.ts","sourceRoot":"","sources":["../../src/core/writer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAkBtE,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,QAAQ,qBAa3D;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,0BA4B1E"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { serializeConfigToGitcmsMd } from './gitcms-config.js';
|
|
3
|
+
import { pathExists, writeFileUtf8 } from './filesystem.js';
|
|
4
|
+
function assertPathWithinRepo(repoRoot, absolutePath, configPath) {
|
|
5
|
+
const relativeToRepo = path.relative(repoRoot, absolutePath);
|
|
6
|
+
const escapesRepo = relativeToRepo.startsWith('..') || path.isAbsolute(relativeToRepo);
|
|
7
|
+
if (escapesRepo) {
|
|
8
|
+
throw new Error(`Refusing to write outside repository root: ${configPath}`);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export async function findExistingConfigPaths(plan) {
|
|
12
|
+
const existing = [];
|
|
13
|
+
for (const site of plan.sites) {
|
|
14
|
+
const absolutePath = path.resolve(plan.repoRoot, site.configPath);
|
|
15
|
+
assertPathWithinRepo(plan.repoRoot, absolutePath, site.configPath);
|
|
16
|
+
const exists = await pathExists(absolutePath);
|
|
17
|
+
if (exists) {
|
|
18
|
+
existing.push(site.configPath);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return existing;
|
|
22
|
+
}
|
|
23
|
+
export async function writePlanToDisk(plan, options) {
|
|
24
|
+
const results = [];
|
|
25
|
+
for (const site of plan.sites) {
|
|
26
|
+
const absolutePath = path.resolve(plan.repoRoot, site.configPath);
|
|
27
|
+
assertPathWithinRepo(plan.repoRoot, absolutePath, site.configPath);
|
|
28
|
+
const exists = await pathExists(absolutePath);
|
|
29
|
+
if (exists && !options.force) {
|
|
30
|
+
throw new Error(`Config already exists at ${site.configPath}. Use --force to overwrite.`);
|
|
31
|
+
}
|
|
32
|
+
if (!options.dryRun) {
|
|
33
|
+
const content = serializeConfigToGitcmsMd(site.config);
|
|
34
|
+
await writeFileUtf8(absolutePath, content);
|
|
35
|
+
}
|
|
36
|
+
results.push({
|
|
37
|
+
configPath: site.configPath,
|
|
38
|
+
absolutePath,
|
|
39
|
+
written: !options.dryRun,
|
|
40
|
+
overwritten: exists,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
return results;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=writer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"writer.js","sourceRoot":"","sources":["../../src/core/writer.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAA;AAE9D,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAE3D,SAAS,oBAAoB,CAC3B,QAAgB,EAChB,YAAoB,EACpB,UAAkB;IAElB,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAA;IAE5D,MAAM,WAAW,GAAG,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,CAAA;IACtF,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CACb,8CAA8C,UAAU,EAAE,CAC3D,CAAA;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,IAAc;IAC1D,MAAM,QAAQ,GAAkB,EAAE,CAAA;IAElC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAC9B,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,CAAA;QACjE,oBAAoB,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,EAAE,IAAI,CAAC,UAAU,CAAC,CAAA;QAClE,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,YAAY,CAAC,CAAA;QAC7C,IAAI,MAAM,EAAE,CAAC;YACX,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QAChC,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAc,EAAE,OAAqB;IACzE,MAAM,OAAO,GAAuB,EAAE,CAAA;IAEtC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAC9B,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,CAAA;QACjE,oBAAoB,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,EAAE,IAAI,CAAC,UAAU,CAAC,CAAA;QAClE,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,YAAY,CAAC,CAAA;QAE7C,IAAI,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CACb,4BAA4B,IAAI,CAAC,UAAU,6BAA6B,CACzE,CAAA;QACH,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACpB,MAAM,OAAO,GAAG,yBAAyB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YACtD,MAAM,aAAa,CAAC,YAAY,EAAE,OAAO,CAAC,CAAA;QAC5C,CAAC;QAED,OAAO,CAAC,IAAI,CAAC;YACX,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,YAAY;YACZ,OAAO,EAAE,CAAC,OAAO,CAAC,MAAM;YACxB,WAAW,EAAE,MAAM;SACpB,CAAC,CAAA;IACJ,CAAC;IAED,OAAO,OAAO,CAAA;AAChB,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAC9B,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAA;AACnE,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAC9B,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAA;AACnE,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface Prompter {
|
|
2
|
+
askText: (question: string, defaultValue?: string) => Promise<string>;
|
|
3
|
+
askYesNo: (question: string, defaultYes?: boolean) => Promise<boolean>;
|
|
4
|
+
close: () => void;
|
|
5
|
+
}
|
|
6
|
+
export declare function isInteractiveTerminal(): boolean;
|
|
7
|
+
export declare function createPrompter(): {
|
|
8
|
+
askText: (question: string, defaultValue?: string) => Promise<string>;
|
|
9
|
+
askYesNo: (question: string, defaultYes?: boolean) => Promise<boolean>;
|
|
10
|
+
close: () => void;
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=prompts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;IACrE,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;IACtE,KAAK,EAAE,MAAM,IAAI,CAAA;CAClB;AAED,wBAAgB,qBAAqB,YAEpC;AAED,wBAAgB,cAAc;wBAMK,MAAM,iBAAiB,MAAM;yBAY5B,MAAM;;EAqBzC"}
|
package/dist/prompts.js
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import readline from 'node:readline/promises';
|
|
2
|
+
import { stdin, stdout } from 'node:process';
|
|
3
|
+
export function isInteractiveTerminal() {
|
|
4
|
+
return Boolean(stdin.isTTY && stdout.isTTY);
|
|
5
|
+
}
|
|
6
|
+
export function createPrompter() {
|
|
7
|
+
const rl = readline.createInterface({
|
|
8
|
+
input: stdin,
|
|
9
|
+
output: stdout,
|
|
10
|
+
});
|
|
11
|
+
async function askText(question, defaultValue) {
|
|
12
|
+
const suffix = defaultValue !== undefined ? ` (${defaultValue})` : '';
|
|
13
|
+
const answer = await rl.question(`? ${question}${suffix}: `);
|
|
14
|
+
const trimmed = answer.trim();
|
|
15
|
+
if (!trimmed && defaultValue !== undefined) {
|
|
16
|
+
return defaultValue;
|
|
17
|
+
}
|
|
18
|
+
return trimmed;
|
|
19
|
+
}
|
|
20
|
+
async function askYesNo(question, defaultYes = true) {
|
|
21
|
+
const hint = defaultYes ? '[Y/n]' : '[y/N]';
|
|
22
|
+
while (true) {
|
|
23
|
+
const answer = (await rl.question(`? ${question} ${hint}: `)).trim().toLowerCase();
|
|
24
|
+
if (!answer)
|
|
25
|
+
return defaultYes;
|
|
26
|
+
if (answer === 'y' || answer === 'yes')
|
|
27
|
+
return true;
|
|
28
|
+
if (answer === 'n' || answer === 'no')
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
function close() {
|
|
33
|
+
rl.close();
|
|
34
|
+
}
|
|
35
|
+
return {
|
|
36
|
+
askText,
|
|
37
|
+
askYesNo,
|
|
38
|
+
close,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,wBAAwB,CAAA;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAQ5C,MAAM,UAAU,qBAAqB;IACnC,OAAO,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,CAAA;AAC7C,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE,KAAK;QACZ,MAAM,EAAE,MAAM;KACf,CAAC,CAAA;IAEF,KAAK,UAAU,OAAO,CAAC,QAAgB,EAAE,YAAqB;QAC5D,MAAM,MAAM,GAAG,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,YAAY,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;QACrE,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,QAAQ,GAAG,MAAM,IAAI,CAAC,CAAA;QAE5D,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAA;QAC7B,IAAI,CAAC,OAAO,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YAC3C,OAAO,YAAY,CAAA;QACrB,CAAC;QAED,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,KAAK,UAAU,QAAQ,CAAC,QAAgB,EAAE,UAAU,GAAG,IAAI;QACzD,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAA;QAE3C,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,QAAQ,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;YAElF,IAAI,CAAC,MAAM;gBAAE,OAAO,UAAU,CAAA;YAC9B,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,KAAK;gBAAE,OAAO,IAAI,CAAA;YACnD,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,IAAI;gBAAE,OAAO,KAAK,CAAA;QACrD,CAAC;IACH,CAAC;IAED,SAAS,KAAK;QACZ,EAAE,CAAC,KAAK,EAAE,CAAA;IACZ,CAAC;IAED,OAAO;QACL,OAAO;QACP,QAAQ;QACR,KAAK;KACa,CAAA;AACtB,CAAC"}
|