@waldjs/cli 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.
Files changed (67) hide show
  1. package/LICENSE +21 -0
  2. package/bin/wald.js +34 -0
  3. package/dist/adapters.d.ts +21 -0
  4. package/dist/adapters.d.ts.map +1 -0
  5. package/dist/adapters.js +67 -0
  6. package/dist/adapters.js.map +1 -0
  7. package/dist/canopy-build.d.ts +5 -0
  8. package/dist/canopy-build.d.ts.map +1 -0
  9. package/dist/canopy-build.js +41 -0
  10. package/dist/canopy-build.js.map +1 -0
  11. package/dist/canopy-scan.d.ts +7 -0
  12. package/dist/canopy-scan.d.ts.map +1 -0
  13. package/dist/canopy-scan.js +70 -0
  14. package/dist/canopy-scan.js.map +1 -0
  15. package/dist/checker.d.ts +8 -0
  16. package/dist/checker.d.ts.map +1 -0
  17. package/dist/checker.js +175 -0
  18. package/dist/checker.js.map +1 -0
  19. package/dist/cli.d.ts +2 -0
  20. package/dist/cli.d.ts.map +1 -0
  21. package/dist/cli.js +22 -0
  22. package/dist/cli.js.map +1 -0
  23. package/dist/commands/build.d.ts +26 -0
  24. package/dist/commands/build.d.ts.map +1 -0
  25. package/dist/commands/build.js +250 -0
  26. package/dist/commands/build.js.map +1 -0
  27. package/dist/commands/check.d.ts +5 -0
  28. package/dist/commands/check.d.ts.map +1 -0
  29. package/dist/commands/check.js +46 -0
  30. package/dist/commands/check.js.map +1 -0
  31. package/dist/commands/grow.d.ts +15 -0
  32. package/dist/commands/grow.d.ts.map +1 -0
  33. package/dist/commands/grow.js +104 -0
  34. package/dist/commands/grow.js.map +1 -0
  35. package/dist/commands/plant.d.ts +9 -0
  36. package/dist/commands/plant.d.ts.map +1 -0
  37. package/dist/commands/plant.js +132 -0
  38. package/dist/commands/plant.js.map +1 -0
  39. package/dist/commands/preview.d.ts +4 -0
  40. package/dist/commands/preview.d.ts.map +1 -0
  41. package/dist/commands/preview.js +25 -0
  42. package/dist/commands/preview.js.map +1 -0
  43. package/dist/config.d.ts +11 -0
  44. package/dist/config.d.ts.map +1 -0
  45. package/dist/config.js +26 -0
  46. package/dist/config.js.map +1 -0
  47. package/dist/growing-tree.d.ts +2 -0
  48. package/dist/growing-tree.d.ts.map +1 -0
  49. package/dist/growing-tree.js +202 -0
  50. package/dist/growing-tree.js.map +1 -0
  51. package/dist/index.d.ts +5 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +3 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/router/index.d.ts +11 -0
  56. package/dist/router/index.d.ts.map +1 -0
  57. package/dist/router/index.js +66 -0
  58. package/dist/router/index.js.map +1 -0
  59. package/dist/shell.d.ts +4 -0
  60. package/dist/shell.d.ts.map +1 -0
  61. package/dist/shell.js +39 -0
  62. package/dist/shell.js.map +1 -0
  63. package/dist/vite-plugin.d.ts +3 -0
  64. package/dist/vite-plugin.d.ts.map +1 -0
  65. package/dist/vite-plugin.js +75 -0
  66. package/dist/vite-plugin.js.map +1 -0
  67. package/package.json +46 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Stefan van der Kort
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/bin/wald.js ADDED
@@ -0,0 +1,34 @@
1
+ #!/usr/bin/env node
2
+ import { execFileSync } from 'node:child_process'
3
+ import { existsSync, readdirSync, statSync } from 'node:fs'
4
+ import { dirname, join } from 'node:path'
5
+ import { fileURLToPath } from 'node:url'
6
+
7
+ const packageDir = dirname(dirname(fileURLToPath(import.meta.url)))
8
+ const srcDir = join(packageDir, 'src')
9
+ const distEntry = join(packageDir, 'dist', 'cli.js')
10
+ const tscBin = join(packageDir, 'node_modules', 'typescript', 'bin', 'tsc')
11
+
12
+ function newestMtime(dir) {
13
+ let newest = 0
14
+ for (const entry of readdirSync(dir, { withFileTypes: true })) {
15
+ const path = join(dir, entry.name)
16
+ if (entry.isDirectory()) {
17
+ newest = Math.max(newest, newestMtime(path))
18
+ } else if (entry.name.endsWith('.ts')) {
19
+ newest = Math.max(newest, statSync(path).mtimeMs)
20
+ }
21
+ }
22
+ return newest
23
+ }
24
+
25
+ function distIsStale() {
26
+ if (!existsSync(distEntry)) return true
27
+ return newestMtime(srcDir) > statSync(distEntry).mtimeMs
28
+ }
29
+
30
+ if (distIsStale()) {
31
+ execFileSync(process.execPath, [tscBin, '-p', packageDir], { stdio: 'inherit' })
32
+ }
33
+
34
+ import('../dist/cli.js')
@@ -0,0 +1,21 @@
1
+ export type WaldAdapterContext = {
2
+ rootDir: string;
3
+ outDir: string;
4
+ outDirRelative: string;
5
+ base: string;
6
+ staticRoutes: number;
7
+ dynamicRoutes: number;
8
+ dynamicPages: number;
9
+ canopyEntries: number;
10
+ };
11
+ export interface WaldAdapter {
12
+ name: string;
13
+ outDir?: string;
14
+ adapt?: (context: WaldAdapterContext) => void | Promise<void>;
15
+ }
16
+ export declare function defineAdapter<T extends WaldAdapter>(adapter: T): T;
17
+ export declare function staticAdapter(): WaldAdapter;
18
+ export declare function netlifyAdapter(): WaldAdapter;
19
+ export declare function cloudflarePagesAdapter(): WaldAdapter;
20
+ export declare function vercelAdapter(): WaldAdapter;
21
+ //# sourceMappingURL=adapters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapters.d.ts","sourceRoot":"","sources":["../src/adapters.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,kBAAkB,GAAG;IAC/B,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,cAAc,EAAE,MAAM,CAAA;IACtB,IAAI,EAAE,MAAM,CAAA;IACZ,YAAY,EAAE,MAAM,CAAA;IACpB,aAAa,EAAE,MAAM,CAAA;IACrB,YAAY,EAAE,MAAM,CAAA;IACpB,aAAa,EAAE,MAAM,CAAA;CACtB,CAAA;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,kBAAkB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAC9D;AAED,wBAAgB,aAAa,CAAC,CAAC,SAAS,WAAW,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,CAElE;AAED,wBAAgB,aAAa,IAAI,WAAW,CAE3C;AAED,wBAAgB,cAAc,IAAI,WAAW,CAiB5C;AAED,wBAAgB,sBAAsB,IAAI,WAAW,CAiBpD;AAED,wBAAgB,aAAa,IAAI,WAAW,CA8B3C"}
@@ -0,0 +1,67 @@
1
+ import { mkdirSync, writeFileSync } from 'node:fs';
2
+ import { dirname, join } from 'node:path';
3
+ export function defineAdapter(adapter) {
4
+ return adapter;
5
+ }
6
+ export function staticAdapter() {
7
+ return defineAdapter({ name: 'static' });
8
+ }
9
+ export function netlifyAdapter() {
10
+ return defineAdapter({
11
+ name: 'netlify',
12
+ adapt({ outDir }) {
13
+ writeFile(join(outDir, '_headers'), [
14
+ '/assets/*',
15
+ ' Cache-Control: public, max-age=31536000, immutable',
16
+ '',
17
+ '/*',
18
+ ' Cache-Control: public, max-age=0, must-revalidate',
19
+ '',
20
+ ].join('\n'));
21
+ },
22
+ });
23
+ }
24
+ export function cloudflarePagesAdapter() {
25
+ return defineAdapter({
26
+ name: 'cloudflare-pages',
27
+ adapt({ outDir }) {
28
+ writeFile(join(outDir, '_headers'), [
29
+ '/assets/*',
30
+ ' Cache-Control: public, max-age=31536000, immutable',
31
+ '',
32
+ '/*',
33
+ ' Cache-Control: public, max-age=0, must-revalidate',
34
+ '',
35
+ ].join('\n'));
36
+ },
37
+ });
38
+ }
39
+ export function vercelAdapter() {
40
+ return defineAdapter({
41
+ name: 'vercel',
42
+ outDir: '.vercel/output/static',
43
+ adapt({ rootDir }) {
44
+ writeFile(join(rootDir, '.vercel', 'output', 'config.json'), JSON.stringify({
45
+ version: 3,
46
+ routes: [{ handle: 'filesystem' }],
47
+ overrides: {
48
+ 'assets/**': {
49
+ headers: {
50
+ 'cache-control': 'public, max-age=31536000, immutable',
51
+ },
52
+ },
53
+ '**/*.html': {
54
+ headers: {
55
+ 'cache-control': 'public, max-age=0, must-revalidate',
56
+ },
57
+ },
58
+ },
59
+ }, null, 2) + '\n');
60
+ },
61
+ });
62
+ }
63
+ function writeFile(filePath, contents) {
64
+ mkdirSync(dirname(filePath), { recursive: true });
65
+ writeFileSync(filePath, contents);
66
+ }
67
+ //# sourceMappingURL=adapters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapters.js","sourceRoot":"","sources":["../src/adapters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAClD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAmBzC,MAAM,UAAU,aAAa,CAAwB,OAAU;IAC7D,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,aAAa,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAA;AAC1C,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,aAAa,CAAC;QACnB,IAAI,EAAE,SAAS;QACf,KAAK,CAAC,EAAE,MAAM,EAAE;YACd,SAAS,CACP,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,EACxB;gBACE,WAAW;gBACX,sDAAsD;gBACtD,EAAE;gBACF,IAAI;gBACJ,qDAAqD;gBACrD,EAAE;aACH,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAA;QACH,CAAC;KACF,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB;IACpC,OAAO,aAAa,CAAC;QACnB,IAAI,EAAE,kBAAkB;QACxB,KAAK,CAAC,EAAE,MAAM,EAAE;YACd,SAAS,CACP,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,EACxB;gBACE,WAAW;gBACX,sDAAsD;gBACtD,EAAE;gBACF,IAAI;gBACJ,qDAAqD;gBACrD,EAAE;aACH,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAA;QACH,CAAC;KACF,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,aAAa,CAAC;QACnB,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE,uBAAuB;QAC/B,KAAK,CAAC,EAAE,OAAO,EAAE;YACf,SAAS,CACP,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,CAAC,EACjD,IAAI,CAAC,SAAS,CACZ;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;gBAClC,SAAS,EAAE;oBACT,WAAW,EAAE;wBACX,OAAO,EAAE;4BACP,eAAe,EAAE,qCAAqC;yBACvD;qBACF;oBACD,WAAW,EAAE;wBACX,OAAO,EAAE;4BACP,eAAe,EAAE,oCAAoC;yBACtD;qBACF;iBACF;aACF,EACD,IAAI,EACJ,CAAC,CACF,GAAG,IAAI,CACT,CAAA;QACH,CAAC;KACF,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,QAAgB,EAAE,QAAgB;IACnD,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACjD,aAAa,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;AACnC,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { type Plugin, type UserConfig } from 'vite';
2
+ export type CanopyAssetMap = Map<string, string>;
3
+ export declare function captureCanopyAssets(assetMap: CanopyAssetMap, base: string): Plugin;
4
+ export declare function buildCanopyClient(entries: Map<string, string>, distDir: string, base: string, viteConfig: UserConfig | undefined): Promise<CanopyAssetMap>;
5
+ //# sourceMappingURL=canopy-build.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canopy-build.d.ts","sourceRoot":"","sources":["../src/canopy-build.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,MAAM,EAAE,KAAK,UAAU,EAAE,MAAM,MAAM,CAAA;AAGvE,MAAM,MAAM,cAAc,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAEhD,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAWlF;AAMD,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC5B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,UAAU,GAAG,SAAS,GACjC,OAAO,CAAC,cAAc,CAAC,CA2BzB"}
@@ -0,0 +1,41 @@
1
+ import { build, mergeConfig } from 'vite';
2
+ import { waldPlugin } from './vite-plugin.js';
3
+ export function captureCanopyAssets(assetMap, base) {
4
+ return {
5
+ name: 'wald-canopy-asset-map',
6
+ generateBundle(_options, bundle) {
7
+ for (const chunk of Object.values(bundle)) {
8
+ if (chunk.type === 'chunk' && chunk.isEntry && chunk.name) {
9
+ assetMap.set(chunk.name, joinUrl(base, chunk.fileName));
10
+ }
11
+ }
12
+ },
13
+ };
14
+ }
15
+ function joinUrl(base, fileName) {
16
+ return `${base.replace(/\/$/, '')}/${fileName}`;
17
+ }
18
+ export async function buildCanopyClient(entries, distDir, base, viteConfig) {
19
+ const assetMap = new Map();
20
+ if (entries.size === 0)
21
+ return assetMap;
22
+ const input = { 'wald-canopy': '@waldjs/canopy' };
23
+ for (const [name, file] of entries) {
24
+ input[name] = `${file}?canopy-script`;
25
+ }
26
+ await build(mergeConfig(viteConfig ?? {}, {
27
+ base,
28
+ plugins: [...waldPlugin(), captureCanopyAssets(assetMap, base)],
29
+ build: {
30
+ ssr: false,
31
+ outDir: distDir,
32
+ emptyOutDir: false,
33
+ rollupOptions: {
34
+ input,
35
+ preserveEntrySignatures: 'exports-only',
36
+ },
37
+ },
38
+ }));
39
+ return assetMap;
40
+ }
41
+ //# sourceMappingURL=canopy-build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canopy-build.js","sourceRoot":"","sources":["../src/canopy-build.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,WAAW,EAAgC,MAAM,MAAM,CAAA;AACvE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAI7C,MAAM,UAAU,mBAAmB,CAAC,QAAwB,EAAE,IAAY;IACxE,OAAO;QACL,IAAI,EAAE,uBAAuB;QAC7B,cAAc,CAAC,QAAQ,EAAE,MAAM;YAC7B,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1C,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;oBAC1D,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAA;gBACzD,CAAC;YACH,CAAC;QACH,CAAC;KACF,CAAA;AACH,CAAC;AAED,SAAS,OAAO,CAAC,IAAY,EAAE,QAAgB;IAC7C,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,QAAQ,EAAE,CAAA;AACjD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAA4B,EAC5B,OAAe,EACf,IAAY,EACZ,UAAkC;IAElC,MAAM,QAAQ,GAAmB,IAAI,GAAG,EAAE,CAAA;IAC1C,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAA;IAEvC,MAAM,KAAK,GAA2B,EAAE,aAAa,EAAE,gBAAgB,EAAE,CAAA;IACzE,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,OAAO,EAAE,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,gBAAgB,CAAA;IACvC,CAAC;IAED,MAAM,KAAK,CAAC,WAAW,CACrB,UAAU,IAAI,EAAE,EAChB;QACE,IAAI;QACJ,OAAO,EAAE,CAAC,GAAG,UAAU,EAAE,EAAE,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC/D,KAAK,EAAE;YACL,GAAG,EAAE,KAAK;YACV,MAAM,EAAE,OAAO;YACf,WAAW,EAAE,KAAK;YAClB,aAAa,EAAE;gBACb,KAAK;gBACL,uBAAuB,EAAE,cAAc;aACxC;SACF;KACK,CACT,CAAC,CAAA;IAEF,OAAO,QAAQ,CAAA;AACjB,CAAC"}
@@ -0,0 +1,7 @@
1
+ export type CanopyScanResult = {
2
+ entries: Map<string, string>;
3
+ warnings: string[];
4
+ };
5
+ export declare function scanCanopyEntries(srcDir: string): CanopyScanResult;
6
+ export declare function collectCanopyScriptContents(entries: Map<string, string>): Set<string>;
7
+ //# sourceMappingURL=canopy-scan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canopy-scan.d.ts","sourceRoot":"","sources":["../src/canopy-scan.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC5B,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB,CAAA;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB,CAqBlE;AAED,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAQrF"}
@@ -0,0 +1,70 @@
1
+ import { parse } from '@waldjs/compiler';
2
+ import { readdirSync, readFileSync } from 'node:fs';
3
+ import { dirname, join, resolve } from 'node:path';
4
+ export function scanCanopyEntries(srcDir) {
5
+ const entries = new Map();
6
+ const warnings = [];
7
+ for (const file of walkWaldFiles(srcDir)) {
8
+ const ast = parse(readFileSync(file, 'utf8'));
9
+ for (const usage of findCanopyUsages(ast.template)) {
10
+ const componentPath = resolveImportPath(ast.frontmatter.code, usage.name, file);
11
+ if (!componentPath)
12
+ continue;
13
+ const componentAst = parse(readFileSync(componentPath, 'utf8'));
14
+ if (!hasScriptBlock(componentAst.template)) {
15
+ warnings.push(`${usage.name} has no <script> block — canopy:${usage.canopy.strategy} has no effect`);
16
+ continue;
17
+ }
18
+ entries.set(usage.name.toLowerCase(), componentPath);
19
+ }
20
+ }
21
+ return { entries, warnings };
22
+ }
23
+ export function collectCanopyScriptContents(entries) {
24
+ const contents = new Set();
25
+ for (const file of entries.values()) {
26
+ const ast = parse(readFileSync(file, 'utf8'));
27
+ const scriptNode = ast.template.find((node) => node.type === 'script');
28
+ if (scriptNode)
29
+ contents.add(scriptNode.content);
30
+ }
31
+ return contents;
32
+ }
33
+ function walkWaldFiles(dir) {
34
+ const files = [];
35
+ for (const entry of readdirSync(dir, { withFileTypes: true })) {
36
+ const full = join(dir, entry.name);
37
+ if (entry.isDirectory()) {
38
+ files.push(...walkWaldFiles(full));
39
+ }
40
+ else if (entry.name.endsWith('.wald')) {
41
+ files.push(full);
42
+ }
43
+ }
44
+ return files;
45
+ }
46
+ function findCanopyUsages(nodes) {
47
+ const found = [];
48
+ for (const node of nodes) {
49
+ if (node.type === 'component') {
50
+ if (node.canopy)
51
+ found.push(node);
52
+ found.push(...findCanopyUsages(node.children));
53
+ }
54
+ else if (node.type === 'element') {
55
+ found.push(...findCanopyUsages(node.children));
56
+ }
57
+ }
58
+ return found;
59
+ }
60
+ function hasScriptBlock(nodes) {
61
+ return nodes.some(node => node.type === 'script' || (node.type === 'element' && hasScriptBlock(node.children)));
62
+ }
63
+ function resolveImportPath(frontmatterCode, componentName, fromFile) {
64
+ const re = new RegExp(`import\\s+${componentName}\\s+from\\s+['"](.+?)['"]`);
65
+ const match = frontmatterCode.match(re);
66
+ if (!match)
67
+ return undefined;
68
+ return resolve(dirname(fromFile), match[1]);
69
+ }
70
+ //# sourceMappingURL=canopy-scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canopy-scan.js","sourceRoot":"","sources":["../src/canopy-scan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export interface CheckDiagnostic {
2
+ file: string;
3
+ line: number;
4
+ column: number;
5
+ message: string;
6
+ }
7
+ export declare function checkProject(root: string): CheckDiagnostic[];
8
+ //# sourceMappingURL=checker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checker.d.ts","sourceRoot":"","sources":["../src/checker.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;CAChB;AAuBD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,EAAE,CAuC5D"}
@@ -0,0 +1,175 @@
1
+ import ts from 'typescript';
2
+ import { readFileSync, readdirSync, existsSync } from 'node:fs';
3
+ import { join, dirname } from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { compileWithMap } from '@waldjs/compiler';
6
+ // Normalize paths to forward slashes for consistent lookup on all platforms
7
+ const norm = (p) => p.replace(/\\/g, '/');
8
+ const CONTENT_SHIM = `declare module 'wald:content' {
9
+ export type Entry = {
10
+ slug: string
11
+ data: Record<string, unknown>
12
+ body: string
13
+ }
14
+ export function getCollection(name: string): Promise<Entry[]>
15
+ export function getEntry(collection: string, slug: string): Promise<Entry>
16
+ }
17
+ `;
18
+ export function checkProject(root) {
19
+ const srcDir = join(root, 'src');
20
+ const waldFiles = existsSync(srcDir) ? findFiles(srcDir, '.wald') : [];
21
+ const tsFiles = existsSync(srcDir) ? findFiles(srcDir, '.ts') : [];
22
+ const virtuals = new Map();
23
+ for (const file of waldFiles) {
24
+ const source = readFileSync(file, 'utf-8');
25
+ const { code, lineMap } = compileWithMap(source, file);
26
+ virtuals.set(norm(`${file}.ts`), { code, lineMap, original: file, originalSource: source });
27
+ }
28
+ const shimPath = norm(join(root, '__wald_content__.d.ts'));
29
+ const result = loadTsOptions(root);
30
+ const options = result.options;
31
+ const host = createVirtualHost(options, virtuals, shimPath);
32
+ const rootNames = [...virtuals.keys(), ...tsFiles.map(norm), shimPath];
33
+ const program = ts.createProgram({ rootNames, options, host });
34
+ const rootSet = new Set(rootNames.filter(f => f !== shimPath));
35
+ const diagnostics = [];
36
+ // Add tsconfig diagnostics first
37
+ diagnostics.push(...result.configDiagnostics);
38
+ for (const sf of program.getSourceFiles()) {
39
+ if (!rootSet.has(norm(sf.fileName)))
40
+ continue;
41
+ const fileDiags = [
42
+ ...program.getSyntacticDiagnostics(sf),
43
+ ...program.getSemanticDiagnostics(sf),
44
+ ];
45
+ for (const diag of fileDiags) {
46
+ if (diag.file === undefined || diag.start === undefined)
47
+ continue;
48
+ diagnostics.push(remapDiagnostic(diag, virtuals));
49
+ }
50
+ }
51
+ return diagnostics;
52
+ }
53
+ function remapDiagnostic(diag, virtuals) {
54
+ const sf = diag.file;
55
+ const { line, character } = ts.getLineAndCharacterOfPosition(sf, diag.start);
56
+ const message = ts.flattenDiagnosticMessageText(diag.messageText, '\n');
57
+ const virtual = virtuals.get(norm(sf.fileName));
58
+ if (!virtual) {
59
+ return { file: sf.fileName, line: line + 1, column: character + 1, message };
60
+ }
61
+ const originalLine = virtual.lineMap[line];
62
+ if (originalLine === null || originalLine === undefined) {
63
+ return { file: virtual.original, line: 1, column: 1, message };
64
+ }
65
+ const outputLineText = virtual.code.split('\n')[line] ?? '';
66
+ const originalLineText = virtual.originalSource.split('\n')[originalLine - 1] ?? '';
67
+ const outIndent = outputLineText.length - outputLineText.trimStart().length;
68
+ const origIndent = originalLineText.length - originalLineText.trimStart().length;
69
+ const column = Math.max(1, character + 1 - (outIndent - origIndent));
70
+ return { file: virtual.original, line: originalLine, column, message };
71
+ }
72
+ function createVirtualHost(options, virtuals, shimPath) {
73
+ const host = ts.createCompilerHost(options);
74
+ const origReadFile = host.readFile.bind(host);
75
+ host.readFile = (fileName) => {
76
+ const v = virtuals.get(norm(fileName));
77
+ if (v)
78
+ return v.code;
79
+ if (norm(fileName) === shimPath)
80
+ return CONTENT_SHIM;
81
+ return origReadFile(fileName);
82
+ };
83
+ const origFileExists = host.fileExists.bind(host);
84
+ host.fileExists = (fileName) => virtuals.has(norm(fileName)) || norm(fileName) === shimPath || origFileExists(fileName);
85
+ const origGetSourceFile = host.getSourceFile.bind(host);
86
+ host.getSourceFile = (fileName, languageVersionOrOptions, onError, shouldCreate) => {
87
+ const v = virtuals.get(norm(fileName));
88
+ if (v)
89
+ return ts.createSourceFile(fileName, v.code, languageVersionOrOptions);
90
+ if (norm(fileName) === shimPath)
91
+ return ts.createSourceFile(fileName, CONTENT_SHIM, languageVersionOrOptions);
92
+ return origGetSourceFile(fileName, languageVersionOrOptions, onError, shouldCreate);
93
+ };
94
+ return host;
95
+ }
96
+ // Locate @waldjs/runtime's type declarations by walking node_modules upward
97
+ // from this file. require.resolve is not usable here: the runtime's exports
98
+ // map has no "require" condition, so createRequire().resolve throws.
99
+ function resolveRuntimeTypes() {
100
+ let dir = dirname(fileURLToPath(import.meta.url));
101
+ while (true) {
102
+ const candidate = join(dir, 'node_modules', '@waldjs', 'runtime', 'dist', 'index.d.ts');
103
+ if (existsSync(candidate))
104
+ return candidate;
105
+ const parent = dirname(dir);
106
+ if (parent === dir)
107
+ return undefined;
108
+ dir = parent;
109
+ }
110
+ }
111
+ function loadTsOptions(root) {
112
+ const runtimeTypes = resolveRuntimeTypes();
113
+ let options;
114
+ const configDiagnostics = [];
115
+ const configPath = join(root, 'tsconfig.json');
116
+ if (existsSync(configPath)) {
117
+ const cfg = ts.readConfigFile(configPath, ts.sys.readFile);
118
+ // Surface readConfigFile errors
119
+ if (cfg.error) {
120
+ configDiagnostics.push({
121
+ file: configPath,
122
+ line: 1,
123
+ column: 1,
124
+ message: ts.flattenDiagnosticMessageText(cfg.error.messageText, '\n'),
125
+ });
126
+ }
127
+ const parsed = ts.parseJsonConfigFileContent(cfg.config ?? {}, ts.sys, root);
128
+ // Surface parseJsonConfigFileContent errors
129
+ if (parsed.errors && parsed.errors.length > 0) {
130
+ for (const err of parsed.errors) {
131
+ configDiagnostics.push({
132
+ file: configPath,
133
+ line: 1,
134
+ column: 1,
135
+ message: ts.flattenDiagnosticMessageText(err.messageText, '\n'),
136
+ });
137
+ }
138
+ }
139
+ options = parsed.options;
140
+ }
141
+ else {
142
+ options = {
143
+ strict: true,
144
+ module: ts.ModuleKind.ESNext,
145
+ target: ts.ScriptTarget.ESNext,
146
+ moduleResolution: ts.ModuleResolutionKind.Bundler,
147
+ skipLibCheck: true,
148
+ };
149
+ }
150
+ return {
151
+ options: {
152
+ ...options,
153
+ noEmit: true,
154
+ baseUrl: options.baseUrl ?? root,
155
+ ...(runtimeTypes
156
+ ? { paths: { ...options.paths, '@waldjs/runtime': [runtimeTypes] } }
157
+ : {}),
158
+ },
159
+ configDiagnostics,
160
+ };
161
+ }
162
+ function findFiles(dir, ext) {
163
+ const results = [];
164
+ for (const entry of readdirSync(dir, { withFileTypes: true })) {
165
+ if (entry.name === 'node_modules' || entry.name === 'dist')
166
+ continue;
167
+ const full = join(dir, entry.name);
168
+ if (entry.isDirectory())
169
+ results.push(...findFiles(full, ext));
170
+ else if (entry.name.endsWith(ext))
171
+ results.push(full);
172
+ }
173
+ return results;
174
+ }
175
+ //# sourceMappingURL=checker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checker.js","sourceRoot":"","sources":["../src/checker.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,22 @@
1
+ import { defineCommand, runMain } from 'citty';
2
+ import { plantCommand } from './commands/plant.js';
3
+ import { growCommand } from './commands/grow.js';
4
+ import { buildCommand } from './commands/build.js';
5
+ import { previewCommand } from './commands/preview.js';
6
+ import { checkCommand } from './commands/check.js';
7
+ const main = defineCommand({
8
+ meta: {
9
+ name: 'wald',
10
+ version: '0.1.0',
11
+ description: 'WaldJS — a content-first web framework',
12
+ },
13
+ subCommands: {
14
+ plant: plantCommand,
15
+ grow: growCommand,
16
+ build: buildCommand,
17
+ preview: previewCommand,
18
+ check: checkCommand,
19
+ },
20
+ });
21
+ runMain(main);
22
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAElD,MAAM,IAAI,GAAG,aAAa,CAAC;IACzB,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,OAAO;QAChB,WAAW,EAAE,wCAAwC;KACtD;IACD,WAAW,EAAE;QACX,KAAK,EAAE,YAAY;QACnB,IAAI,EAAE,WAAW;QACjB,KAAK,EAAE,YAAY;QACnB,OAAO,EAAE,cAAc;QACvB,KAAK,EAAE,YAAY;KACpB;CACF,CAAC,CAAA;AAEF,OAAO,CAAC,IAAI,CAAC,CAAA"}
@@ -0,0 +1,26 @@
1
+ import { type WaldConfig } from '../config.js';
2
+ export type BuildPhase = 'Scanning routes' | 'Scanning canopies' | 'Bundling canopy client' | 'Bundling SSR pages' | 'Rendering static pages' | 'Rendering dynamic pages' | 'Copying public assets' | 'Copying source assets' | 'Applying adapter';
3
+ export type BuildStats = {
4
+ staticRoutes: number;
5
+ dynamicRoutes: number;
6
+ dynamicPages: number;
7
+ warnings: string[];
8
+ canopyEntries: number;
9
+ copiedPublic: boolean;
10
+ copiedAssets: boolean;
11
+ adapterName: string;
12
+ };
13
+ type BuildReporter = {
14
+ onPhase?: (phase: BuildPhase) => void;
15
+ onWarning?: (warning: string) => void;
16
+ };
17
+ export declare function buildPages(pagesDir: string, config: Required<WaldConfig>, publicDir?: string, contentDir?: string, reporter?: BuildReporter): Promise<BuildStats>;
18
+ export declare function formatBuildSummary(stats: BuildStats, outDir: string): string[];
19
+ export declare const buildCommand: import("citty").CommandDef<{
20
+ check: {
21
+ type: "boolean";
22
+ description: string;
23
+ };
24
+ }>;
25
+ export {};
26
+ //# sourceMappingURL=build.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"AAOA,OAAO,EAAkB,KAAK,UAAU,EAAE,MAAM,cAAc,CAAA;AAM9D,MAAM,MAAM,UAAU,GAClB,iBAAiB,GACjB,mBAAmB,GACnB,wBAAwB,GACxB,oBAAoB,GACpB,wBAAwB,GACxB,yBAAyB,GACzB,uBAAuB,GACvB,uBAAuB,GACvB,kBAAkB,CAAA;AAEtB,MAAM,MAAM,UAAU,GAAG;IACvB,YAAY,EAAE,MAAM,CAAA;IACpB,aAAa,EAAE,MAAM,CAAA;IACrB,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,aAAa,EAAE,MAAM,CAAA;IACrB,YAAY,EAAE,OAAO,CAAA;IACrB,YAAY,EAAE,OAAO,CAAA;IACrB,WAAW,EAAE,MAAM,CAAA;CACpB,CAAA;AAED,KAAK,aAAa,GAAG;IACnB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAA;IACrC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;CACtC,CAAA;AAqED,wBAAsB,UAAU,CAC9B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,QAAQ,CAAC,UAAU,CAAC,EAC5B,SAAS,CAAC,EAAE,MAAM,EAClB,UAAU,CAAC,EAAE,MAAM,EACnB,QAAQ,GAAE,aAAkB,GAC3B,OAAO,CAAC,UAAU,CAAC,CAoIrB;AAMD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAS9E;AAED,eAAO,MAAM,YAAY;;;;;EAoDvB,CAAA"}