basecampjs 0.0.12 → 0.0.14
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/dist/build/assets.d.ts +36 -0
- package/dist/build/assets.d.ts.map +1 -0
- package/dist/build/assets.js +272 -0
- package/dist/build/assets.js.map +1 -0
- package/dist/build/data.d.ts +6 -0
- package/dist/build/data.d.ts.map +1 -0
- package/dist/build/data.js +33 -0
- package/dist/build/data.js.map +1 -0
- package/dist/build/pages.d.ts +19 -0
- package/dist/build/pages.d.ts.map +1 -0
- package/dist/build/pages.js +110 -0
- package/dist/build/pages.js.map +1 -0
- package/dist/build/pipeline.d.ts +6 -0
- package/dist/build/pipeline.d.ts.map +1 -0
- package/dist/build/pipeline.js +98 -0
- package/dist/build/pipeline.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +140 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +11 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +60 -0
- package/dist/config.js.map +1 -0
- package/dist/dev/server.d.ts +6 -0
- package/dist/dev/server.d.ts.map +1 -0
- package/dist/dev/server.js +64 -0
- package/dist/dev/server.js.map +1 -0
- package/dist/dev/watcher.d.ts +5 -0
- package/dist/dev/watcher.d.ts.map +1 -0
- package/dist/dev/watcher.js +49 -0
- package/dist/dev/watcher.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/render/engines.d.ts +30 -0
- package/dist/render/engines.d.ts.map +1 -0
- package/dist/render/engines.js +102 -0
- package/dist/render/engines.js.map +1 -0
- package/dist/scaffolding.d.ts +25 -0
- package/dist/scaffolding.d.ts.map +1 -0
- package/dist/scaffolding.js +596 -0
- package/dist/scaffolding.js.map +1 -0
- package/dist/types.d.ts +91 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/fs.d.ts +29 -0
- package/dist/utils/fs.d.ts.map +1 -0
- package/dist/utils/fs.js +104 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/logger.d.ts +9 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +21 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/paths.d.ts +17 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +55 -0
- package/dist/utils/paths.js.map +1 -0
- package/package.json +36 -6
- package/src/build/assets.ts +314 -0
- package/src/build/data.ts +32 -0
- package/src/build/pages.ts +143 -0
- package/src/build/pipeline.ts +111 -0
- package/src/cli.ts +155 -0
- package/src/config.ts +61 -0
- package/src/dev/server.ts +66 -0
- package/src/dev/watcher.ts +52 -0
- package/src/index.ts +45 -0
- package/src/render/engines.ts +139 -0
- package/src/scaffolding.ts +656 -0
- package/src/types.ts +110 -0
- package/src/utils/fs.ts +109 -0
- package/src/utils/logger.ts +27 -0
- package/src/utils/paths.ts +56 -0
- package/index.js +0 -1516
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core type definitions for BasecampJS
|
|
3
|
+
*/
|
|
4
|
+
export interface CompressionSettings {
|
|
5
|
+
quality: number;
|
|
6
|
+
formats: string[];
|
|
7
|
+
inputFormats: string[];
|
|
8
|
+
preserveOriginal: boolean;
|
|
9
|
+
}
|
|
10
|
+
export interface Integrations {
|
|
11
|
+
nunjucks: boolean;
|
|
12
|
+
liquid: boolean;
|
|
13
|
+
mustache: boolean;
|
|
14
|
+
vue: boolean;
|
|
15
|
+
alpine: boolean;
|
|
16
|
+
}
|
|
17
|
+
export interface ConfigHooks {
|
|
18
|
+
nunjucksEnv?: (env: unknown) => void;
|
|
19
|
+
liquidEnv?: (env: unknown) => void;
|
|
20
|
+
}
|
|
21
|
+
export interface CampsiteConfig {
|
|
22
|
+
siteName: string;
|
|
23
|
+
siteUrl: string;
|
|
24
|
+
srcDir: string;
|
|
25
|
+
outDir: string;
|
|
26
|
+
templateEngine: 'nunjucks' | 'liquid' | 'mustache' | string;
|
|
27
|
+
frontmatter: boolean;
|
|
28
|
+
minifyCSS: boolean;
|
|
29
|
+
minifyHTML: boolean;
|
|
30
|
+
cacheBustAssets: boolean;
|
|
31
|
+
excludeFiles: string[];
|
|
32
|
+
compressPhotos: boolean;
|
|
33
|
+
compressionSettings: CompressionSettings;
|
|
34
|
+
port: number;
|
|
35
|
+
integrations: Integrations;
|
|
36
|
+
hooks?: ConfigHooks;
|
|
37
|
+
}
|
|
38
|
+
export interface PageFrontmatter {
|
|
39
|
+
layout?: string;
|
|
40
|
+
title?: string;
|
|
41
|
+
date?: string;
|
|
42
|
+
author?: string;
|
|
43
|
+
markdown?: boolean;
|
|
44
|
+
[key: string]: unknown;
|
|
45
|
+
}
|
|
46
|
+
export interface PageContext {
|
|
47
|
+
site: {
|
|
48
|
+
name: string;
|
|
49
|
+
config: CampsiteConfig;
|
|
50
|
+
};
|
|
51
|
+
page: PageFrontmatter & {
|
|
52
|
+
content: string;
|
|
53
|
+
source: string;
|
|
54
|
+
path: string;
|
|
55
|
+
};
|
|
56
|
+
collections: Collections;
|
|
57
|
+
isActive: (url: string) => boolean;
|
|
58
|
+
[key: string]: unknown;
|
|
59
|
+
}
|
|
60
|
+
export interface RenderOptions {
|
|
61
|
+
pagesDir: string;
|
|
62
|
+
layoutsDir: string;
|
|
63
|
+
outDir: string;
|
|
64
|
+
env: unknown;
|
|
65
|
+
liquidEnv: unknown;
|
|
66
|
+
config: CampsiteConfig;
|
|
67
|
+
data: Collections;
|
|
68
|
+
partialsDir: string;
|
|
69
|
+
}
|
|
70
|
+
export type Collections = Record<string, unknown[]>;
|
|
71
|
+
export interface BuildOptions {
|
|
72
|
+
skipImageCompression?: boolean;
|
|
73
|
+
devMode?: boolean;
|
|
74
|
+
}
|
|
75
|
+
export interface ProcessedImage {
|
|
76
|
+
path: string;
|
|
77
|
+
format: string;
|
|
78
|
+
size: number;
|
|
79
|
+
}
|
|
80
|
+
export interface AssetMap {
|
|
81
|
+
[originalPath: string]: string;
|
|
82
|
+
}
|
|
83
|
+
export interface SitemapUrl {
|
|
84
|
+
loc: string;
|
|
85
|
+
lastmod: string;
|
|
86
|
+
}
|
|
87
|
+
export interface MakeContentResult {
|
|
88
|
+
success: boolean;
|
|
89
|
+
skipped: boolean;
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ensure a directory exists (creates recursively if needed)
|
|
3
|
+
*/
|
|
4
|
+
export declare function ensureDir(dir: string): Promise<void>;
|
|
5
|
+
/**
|
|
6
|
+
* Clean (remove and recreate) a directory
|
|
7
|
+
*/
|
|
8
|
+
export declare function cleanDir(dir: string): Promise<void>;
|
|
9
|
+
/**
|
|
10
|
+
* Recursively walk a directory and return all file paths
|
|
11
|
+
*/
|
|
12
|
+
export declare function walkFiles(dir: string): Promise<string[]>;
|
|
13
|
+
/**
|
|
14
|
+
* Get file extension in lowercase
|
|
15
|
+
*/
|
|
16
|
+
export declare function getExt(filePath: string): string;
|
|
17
|
+
/**
|
|
18
|
+
* Check if a file should be excluded based on patterns
|
|
19
|
+
*/
|
|
20
|
+
export declare function shouldExcludeFile(filePath: string, excludePatterns: string[] | undefined): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Copy public directory to output, respecting exclusions
|
|
23
|
+
*/
|
|
24
|
+
export declare function copyPublic(publicDir: string, outDir: string, excludePatterns?: string[]): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Format bytes to human-readable string
|
|
27
|
+
*/
|
|
28
|
+
export declare function formatBytes(bytes: number): string;
|
|
29
|
+
//# sourceMappingURL=fs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../../src/utils/fs.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE1D;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGzD;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAc9D;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,OAAO,CA0BlG;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBjH;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMjD"}
|
package/dist/utils/fs.js
ADDED
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { existsSync } from "fs";
|
|
2
|
+
import { cp, mkdir, readdir, rm } from "fs/promises";
|
|
3
|
+
import { basename, dirname, extname, join, relative } from "path";
|
|
4
|
+
import { kolor } from "./logger.js";
|
|
5
|
+
/**
|
|
6
|
+
* Ensure a directory exists (creates recursively if needed)
|
|
7
|
+
*/
|
|
8
|
+
export async function ensureDir(dir) {
|
|
9
|
+
await mkdir(dir, { recursive: true });
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Clean (remove and recreate) a directory
|
|
13
|
+
*/
|
|
14
|
+
export async function cleanDir(dir) {
|
|
15
|
+
await rm(dir, { recursive: true, force: true });
|
|
16
|
+
await mkdir(dir, { recursive: true });
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Recursively walk a directory and return all file paths
|
|
20
|
+
*/
|
|
21
|
+
export async function walkFiles(dir) {
|
|
22
|
+
const results = [];
|
|
23
|
+
if (!existsSync(dir))
|
|
24
|
+
return results;
|
|
25
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
26
|
+
for (const entry of entries) {
|
|
27
|
+
if (entry.name.startsWith("."))
|
|
28
|
+
continue;
|
|
29
|
+
const full = join(dir, entry.name);
|
|
30
|
+
if (entry.isDirectory()) {
|
|
31
|
+
results.push(...await walkFiles(full));
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
results.push(full);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return results;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Get file extension in lowercase
|
|
41
|
+
*/
|
|
42
|
+
export function getExt(filePath) {
|
|
43
|
+
return extname(filePath).toLowerCase();
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Check if a file should be excluded based on patterns
|
|
47
|
+
*/
|
|
48
|
+
export function shouldExcludeFile(filePath, excludePatterns) {
|
|
49
|
+
if (!excludePatterns || excludePatterns.length === 0)
|
|
50
|
+
return false;
|
|
51
|
+
const fileName = basename(filePath).toLowerCase();
|
|
52
|
+
const ext = getExt(filePath);
|
|
53
|
+
return excludePatterns.some(pattern => {
|
|
54
|
+
const normalized = pattern.toLowerCase();
|
|
55
|
+
// Support extension patterns like '.pdf' or 'pdf'
|
|
56
|
+
if (normalized.startsWith('.')) {
|
|
57
|
+
return ext === normalized;
|
|
58
|
+
}
|
|
59
|
+
if (normalized.startsWith('*.')) {
|
|
60
|
+
return ext === normalized.slice(1);
|
|
61
|
+
}
|
|
62
|
+
// Support exact filename matches
|
|
63
|
+
if (fileName === normalized) {
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
// Support glob-like patterns with wildcards
|
|
67
|
+
if (normalized.includes('*')) {
|
|
68
|
+
const regex = new RegExp('^' + normalized.replace(/\*/g, '.*').replace(/\?/g, '.') + '$');
|
|
69
|
+
return regex.test(fileName);
|
|
70
|
+
}
|
|
71
|
+
return false;
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Copy public directory to output, respecting exclusions
|
|
76
|
+
*/
|
|
77
|
+
export async function copyPublic(publicDir, outDir, excludePatterns = []) {
|
|
78
|
+
if (!existsSync(publicDir))
|
|
79
|
+
return;
|
|
80
|
+
const files = await walkFiles(publicDir);
|
|
81
|
+
for (const file of files) {
|
|
82
|
+
const rel = relative(publicDir, file);
|
|
83
|
+
// Skip excluded files
|
|
84
|
+
if (shouldExcludeFile(file, excludePatterns)) {
|
|
85
|
+
console.log(kolor.dim(`Skipping excluded file: ${rel}`));
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
const destPath = join(outDir, rel);
|
|
89
|
+
await ensureDir(dirname(destPath));
|
|
90
|
+
await cp(file, destPath);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Format bytes to human-readable string
|
|
95
|
+
*/
|
|
96
|
+
export function formatBytes(bytes) {
|
|
97
|
+
if (bytes === 0)
|
|
98
|
+
return "0 B";
|
|
99
|
+
const k = 1024;
|
|
100
|
+
const sizes = ["B", "KB", "MB", "GB"];
|
|
101
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
102
|
+
return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + " " + sizes[i];
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=fs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs.js","sourceRoot":"","sources":["../../src/utils/fs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import * as kolor from "kolorist";
|
|
2
|
+
export { kolor };
|
|
3
|
+
export declare function logError(message: string): void;
|
|
4
|
+
export declare function logWarning(message: string): void;
|
|
5
|
+
export declare function logSuccess(message: string): void;
|
|
6
|
+
export declare function logInfo(message: string): void;
|
|
7
|
+
export declare function logDim(message: string): void;
|
|
8
|
+
export declare function logBold(message: string): void;
|
|
9
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,UAAU,CAAC;AAElC,OAAO,EAAE,KAAK,EAAE,CAAC;AAEjB,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE9C;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEhD;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEhD;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE7C;AAED,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE5C;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE7C"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import * as kolor from "kolorist";
|
|
2
|
+
export { kolor };
|
|
3
|
+
export function logError(message) {
|
|
4
|
+
console.error(kolor.red(message));
|
|
5
|
+
}
|
|
6
|
+
export function logWarning(message) {
|
|
7
|
+
console.log(kolor.yellow(message));
|
|
8
|
+
}
|
|
9
|
+
export function logSuccess(message) {
|
|
10
|
+
console.log(kolor.green(message));
|
|
11
|
+
}
|
|
12
|
+
export function logInfo(message) {
|
|
13
|
+
console.log(kolor.cyan(message));
|
|
14
|
+
}
|
|
15
|
+
export function logDim(message) {
|
|
16
|
+
console.log(kolor.dim(message));
|
|
17
|
+
}
|
|
18
|
+
export function logBold(message) {
|
|
19
|
+
console.log(kolor.bold(message));
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,UAAU,CAAC;AAElC,OAAO,EAAE,KAAK,EAAE,CAAC;AAEjB,MAAM,UAAU,QAAQ,CAAC,OAAe;IACtC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAAe;IACxC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAAe;IACxC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,OAAe;IACrC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,OAAe;IACpC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,OAAe;IACrC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Convert output-relative path to URL path
|
|
3
|
+
*/
|
|
4
|
+
export declare function toUrlPath(outRel: string): string;
|
|
5
|
+
/**
|
|
6
|
+
* Normalize a URL for comparison (strips trailing slashes, .html extension)
|
|
7
|
+
*/
|
|
8
|
+
export declare function normalizeUrl(url: string | undefined | null): string;
|
|
9
|
+
/**
|
|
10
|
+
* Slugify text for use in URLs
|
|
11
|
+
*/
|
|
12
|
+
export declare function slugify(text: string): string;
|
|
13
|
+
/**
|
|
14
|
+
* Format a date to ISO date string (YYYY-MM-DD)
|
|
15
|
+
*/
|
|
16
|
+
export declare function formatDate(date: Date): string;
|
|
17
|
+
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/utils/paths.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAYhD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAgBnE;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAO5C;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAE7C"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Convert output-relative path to URL path
|
|
3
|
+
*/
|
|
4
|
+
export function toUrlPath(outRel) {
|
|
5
|
+
const normalized = outRel.replace(/\\/g, "/");
|
|
6
|
+
let path = `/${normalized}`;
|
|
7
|
+
// Remove trailing index.html for directory-style URLs
|
|
8
|
+
if (path.endsWith("index.html")) {
|
|
9
|
+
path = path.slice(0, -"index.html".length);
|
|
10
|
+
}
|
|
11
|
+
// Strip trailing slash except for root
|
|
12
|
+
if (path !== "/" && path.endsWith("/")) {
|
|
13
|
+
path = path.slice(0, -1);
|
|
14
|
+
}
|
|
15
|
+
return path || "/";
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Normalize a URL for comparison (strips trailing slashes, .html extension)
|
|
19
|
+
*/
|
|
20
|
+
export function normalizeUrl(url) {
|
|
21
|
+
if (!url)
|
|
22
|
+
return "/";
|
|
23
|
+
let normalized = url.trim();
|
|
24
|
+
// Remove trailing slashes except for root
|
|
25
|
+
if (normalized !== "/" && normalized.endsWith("/")) {
|
|
26
|
+
normalized = normalized.slice(0, -1);
|
|
27
|
+
}
|
|
28
|
+
// Add leading slash if missing
|
|
29
|
+
if (!normalized.startsWith("/")) {
|
|
30
|
+
normalized = "/" + normalized;
|
|
31
|
+
}
|
|
32
|
+
// Strip .html extension for comparison (so /about and /about.html match)
|
|
33
|
+
if (normalized !== "/" && normalized.endsWith(".html")) {
|
|
34
|
+
normalized = normalized.slice(0, -5);
|
|
35
|
+
}
|
|
36
|
+
return normalized;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Slugify text for use in URLs
|
|
40
|
+
*/
|
|
41
|
+
export function slugify(text) {
|
|
42
|
+
return text
|
|
43
|
+
.toLowerCase()
|
|
44
|
+
.trim()
|
|
45
|
+
.replace(/[^\w\s-]/g, "")
|
|
46
|
+
.replace(/[\s_-]+/g, "-")
|
|
47
|
+
.replace(/^-+|-+$/g, "");
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Format a date to ISO date string (YYYY-MM-DD)
|
|
51
|
+
*/
|
|
52
|
+
export function formatDate(date) {
|
|
53
|
+
return date.toISOString().split("T")[0];
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/utils/paths.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,MAAc;IACtC,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC9C,IAAI,IAAI,GAAG,IAAI,UAAU,EAAE,CAAC;IAC5B,sDAAsD;IACtD,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QAChC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAC7C,CAAC;IACD,uCAAuC;IACvC,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACvC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,IAAI,IAAI,GAAG,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,GAA8B;IACzD,IAAI,CAAC,GAAG;QAAE,OAAO,GAAG,CAAC;IACrB,IAAI,UAAU,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC5B,0CAA0C;IAC1C,IAAI,UAAU,KAAK,GAAG,IAAI,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACnD,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC;IACD,+BAA+B;IAC/B,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAChC,UAAU,GAAG,GAAG,GAAG,UAAU,CAAC;IAChC,CAAC;IACD,yEAAyE;IACzE,IAAI,UAAU,KAAK,GAAG,IAAI,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACvD,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,OAAO,IAAI;SACR,WAAW,EAAE;SACb,IAAI,EAAE;SACN,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;SACxB,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC;SACxB,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,IAAU;IACnC,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1C,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,21 +1,40 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "basecampjs",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.14",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "BasecampJS engine for CampsiteJS static site generator.",
|
|
6
6
|
"bin": {
|
|
7
|
-
"camper": "./index.js",
|
|
8
|
-
"campsite": "./index.js"
|
|
7
|
+
"camper": "./dist/index.js",
|
|
8
|
+
"campsite": "./dist/index.js"
|
|
9
9
|
},
|
|
10
10
|
"license": "MIT",
|
|
11
|
+
"main": "./dist/index.js",
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
11
13
|
"exports": {
|
|
12
|
-
".":
|
|
14
|
+
".": {
|
|
15
|
+
"types": "./dist/index.d.ts",
|
|
16
|
+
"import": "./dist/index.js"
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
"files": [
|
|
20
|
+
"dist",
|
|
21
|
+
"src"
|
|
22
|
+
],
|
|
23
|
+
"scripts": {
|
|
24
|
+
"build": "tsc",
|
|
25
|
+
"build:watch": "tsc --watch",
|
|
26
|
+
"dev": "node dist/index.js dev",
|
|
27
|
+
"prepublishOnly": "npm run build",
|
|
28
|
+
"typecheck": "tsc --noEmit",
|
|
29
|
+
"test": "vitest run",
|
|
30
|
+
"test:watch": "vitest --watch",
|
|
31
|
+
"test:coverage": "vitest run --coverage"
|
|
13
32
|
},
|
|
14
33
|
"dependencies": {
|
|
15
|
-
"csso": "^5.0.5",
|
|
16
|
-
"html-minifier-terser": "^7.2.0",
|
|
17
34
|
"chokidar": "^3.6.0",
|
|
35
|
+
"csso": "^5.0.5",
|
|
18
36
|
"gray-matter": "^4.0.3",
|
|
37
|
+
"html-minifier-terser": "^7.2.0",
|
|
19
38
|
"kolorist": "^1.8.0",
|
|
20
39
|
"liquidjs": "^10.12.0",
|
|
21
40
|
"markdown-it": "^14.1.0",
|
|
@@ -25,5 +44,16 @@
|
|
|
25
44
|
},
|
|
26
45
|
"engines": {
|
|
27
46
|
"node": ">=18"
|
|
47
|
+
},
|
|
48
|
+
"devDependencies": {
|
|
49
|
+
"@types/csso": "^5.0.4",
|
|
50
|
+
"@types/html-minifier-terser": "^7.0.2",
|
|
51
|
+
"@types/markdown-it": "^14.1.2",
|
|
52
|
+
"@types/mustache": "^4.2.6",
|
|
53
|
+
"@types/node": "^25.2.0",
|
|
54
|
+
"@types/nunjucks": "^3.2.6",
|
|
55
|
+
"@vitest/coverage-v8": "^4.0.18",
|
|
56
|
+
"typescript": "^5.9.3",
|
|
57
|
+
"vitest": "^4.0.18"
|
|
28
58
|
}
|
|
29
59
|
}
|