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.
Files changed (77) hide show
  1. package/dist/build/assets.d.ts +36 -0
  2. package/dist/build/assets.d.ts.map +1 -0
  3. package/dist/build/assets.js +272 -0
  4. package/dist/build/assets.js.map +1 -0
  5. package/dist/build/data.d.ts +6 -0
  6. package/dist/build/data.d.ts.map +1 -0
  7. package/dist/build/data.js +33 -0
  8. package/dist/build/data.js.map +1 -0
  9. package/dist/build/pages.d.ts +19 -0
  10. package/dist/build/pages.d.ts.map +1 -0
  11. package/dist/build/pages.js +110 -0
  12. package/dist/build/pages.js.map +1 -0
  13. package/dist/build/pipeline.d.ts +6 -0
  14. package/dist/build/pipeline.d.ts.map +1 -0
  15. package/dist/build/pipeline.js +98 -0
  16. package/dist/build/pipeline.js.map +1 -0
  17. package/dist/cli.d.ts +3 -0
  18. package/dist/cli.d.ts.map +1 -0
  19. package/dist/cli.js +140 -0
  20. package/dist/cli.js.map +1 -0
  21. package/dist/config.d.ts +11 -0
  22. package/dist/config.d.ts.map +1 -0
  23. package/dist/config.js +60 -0
  24. package/dist/config.js.map +1 -0
  25. package/dist/dev/server.d.ts +6 -0
  26. package/dist/dev/server.d.ts.map +1 -0
  27. package/dist/dev/server.js +64 -0
  28. package/dist/dev/server.js.map +1 -0
  29. package/dist/dev/watcher.d.ts +5 -0
  30. package/dist/dev/watcher.d.ts.map +1 -0
  31. package/dist/dev/watcher.js +49 -0
  32. package/dist/dev/watcher.js.map +1 -0
  33. package/dist/index.d.ts +17 -0
  34. package/dist/index.d.ts.map +1 -0
  35. package/dist/index.js +25 -0
  36. package/dist/index.js.map +1 -0
  37. package/dist/render/engines.d.ts +30 -0
  38. package/dist/render/engines.d.ts.map +1 -0
  39. package/dist/render/engines.js +102 -0
  40. package/dist/render/engines.js.map +1 -0
  41. package/dist/scaffolding.d.ts +25 -0
  42. package/dist/scaffolding.d.ts.map +1 -0
  43. package/dist/scaffolding.js +596 -0
  44. package/dist/scaffolding.js.map +1 -0
  45. package/dist/types.d.ts +91 -0
  46. package/dist/types.d.ts.map +1 -0
  47. package/dist/types.js +5 -0
  48. package/dist/types.js.map +1 -0
  49. package/dist/utils/fs.d.ts +29 -0
  50. package/dist/utils/fs.d.ts.map +1 -0
  51. package/dist/utils/fs.js +104 -0
  52. package/dist/utils/fs.js.map +1 -0
  53. package/dist/utils/logger.d.ts +9 -0
  54. package/dist/utils/logger.d.ts.map +1 -0
  55. package/dist/utils/logger.js +21 -0
  56. package/dist/utils/logger.js.map +1 -0
  57. package/dist/utils/paths.d.ts +17 -0
  58. package/dist/utils/paths.d.ts.map +1 -0
  59. package/dist/utils/paths.js +55 -0
  60. package/dist/utils/paths.js.map +1 -0
  61. package/package.json +36 -6
  62. package/src/build/assets.ts +314 -0
  63. package/src/build/data.ts +32 -0
  64. package/src/build/pages.ts +143 -0
  65. package/src/build/pipeline.ts +111 -0
  66. package/src/cli.ts +155 -0
  67. package/src/config.ts +61 -0
  68. package/src/dev/server.ts +66 -0
  69. package/src/dev/watcher.ts +52 -0
  70. package/src/index.ts +45 -0
  71. package/src/render/engines.ts +139 -0
  72. package/src/scaffolding.ts +656 -0
  73. package/src/types.ts +110 -0
  74. package/src/utils/fs.ts +109 -0
  75. package/src/utils/logger.ts +27 -0
  76. package/src/utils/paths.ts +56 -0
  77. package/index.js +0 -1516
@@ -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,5 @@
1
+ /**
2
+ * Core type definitions for BasecampJS
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -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"}
@@ -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.12",
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
- ".": "./index.js"
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
  }