@noego/stitch 1.0.3 → 1.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/dist/client.cjs +1 -1
- package/dist/client.cjs.map +1 -1
- package/dist/client.mjs +28 -32
- package/dist/client.mjs.map +1 -1
- package/dist/core/YamlMerger.d.ts +1 -1
- package/dist/core/YamlMergerBrowser.d.ts +1 -1
- package/dist-ssr/core/YamlMerger.d.ts +1 -1
- package/dist-ssr/core/YamlMergerBrowser.d.ts +1 -1
- package/dist-ssr/server.cjs +2 -2
- package/dist-ssr/server.cjs.map +1 -1
- package/dist-ssr/server.js +2 -2
- package/dist-ssr/server.js.map +1 -1
- package/package.json +2 -1
package/dist/client.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const l=require("js-yaml");function f(r){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(r){for(const t in r)if(t!=="default"){const o=Object.getOwnPropertyDescriptor(r,t);Object.defineProperty(e,t,o.get?o:{enumerable:!0,get:()=>r[t]})}}return e.default=r,Object.freeze(e)}const u=f(l);class s{mergeContent(e){let t={};for(const o of e){let n;try{n=u.load(o.content)}catch(i){const m=o.name||"unknown content";throw new Error(`Invalid YAML in ${m}: ${i instanceof Error?i.message:String(i)}`)}n!==null&&typeof n=="object"&&(t=this.deepMerge(t,n))}return t}deepMerge(e,t){if(t==null)return e;if(e==null
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const l=require("js-yaml");function f(r){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(r){for(const t in r)if(t!=="default"){const o=Object.getOwnPropertyDescriptor(r,t);Object.defineProperty(e,t,o.get?o:{enumerable:!0,get:()=>r[t]})}}return e.default=r,Object.freeze(e)}const u=f(l);class s{mergeContent(e){let t={};for(const o of e){let n;try{n=u.load(o.content)}catch(i){const m=o.name||"unknown content";throw new Error(`Invalid YAML in ${m}: ${i instanceof Error?i.message:String(i)}`)}n!==null&&typeof n=="object"&&(t=this.deepMerge(t,n))}return t}deepMerge(e,t){if(t==null)return e;if(e==null||Array.isArray(t)&&Array.isArray(e)||typeof t!="object"||Array.isArray(t)||typeof e!="object"||Array.isArray(e))return t;const o={...e};for(const n in t)t.hasOwnProperty(n)&&(n in o?o[n]=this.deepMerge(o[n],t[n]):o[n]=t[n]);return o}}async function y(r){const e=await Promise.all(Object.entries(r).map(async([o,n])=>({content:(await n()).default,name:o})));return new s().mergeContent(e)}async function a(r,e){const t=await Promise.all(r.map(async n=>{const i=e[n];if(!i)throw new Error(`Import not found for path: ${n}`);return{content:(await i()).default,name:n}}));return new s().mergeContent(t)}async function d(r){const e=Object.keys(r).sort();return a(e,r)}function c(r){return new s().mergeContent(r)}function p(r){const e=r.map((t,o)=>({content:t,name:`content-${o}`}));return c(e)}exports.YamlMerger=s;exports.stitchFromContent=c;exports.stitchFromOrderedViteImports=a;exports.stitchFromRawContent=p;exports.stitchFromSortedViteImports=d;exports.stitchFromViteImports=y;
|
|
2
2
|
//# sourceMappingURL=client.cjs.map
|
package/dist/client.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.cjs","sources":["../src/core/YamlMergerBrowser.ts","../src/core/ViteHelper.ts"],"sourcesContent":["import * as yaml from 'js-yaml';\n\nexport class YamlMerger {\n /**\n * Merge multiple YAML content strings in order\n */\n mergeContent(contents: Array<{ content: string; name?: string }>): any {\n let result = {};\n\n for (const item of contents) {\n let parsedContent: any;\n\n try {\n parsedContent = yaml.load(item.content);\n } catch (error) {\n const name = item.name || 'unknown content';\n throw new Error(`Invalid YAML in ${name}: ${error instanceof Error ? error.message : String(error)}`);\n }\n\n if (parsedContent !== null && typeof parsedContent === 'object') {\n result = this.deepMerge(result, parsedContent);\n }\n }\n\n return result;\n }\n\n /**\n * Deep merge two objects\n * Rules:\n * - Objects: merge properties, source overrides target\n * - Arrays:
|
|
1
|
+
{"version":3,"file":"client.cjs","sources":["../src/core/YamlMergerBrowser.ts","../src/core/ViteHelper.ts"],"sourcesContent":["import * as yaml from 'js-yaml';\n\nexport class YamlMerger {\n /**\n * Merge multiple YAML content strings in order\n */\n mergeContent(contents: Array<{ content: string; name?: string }>): any {\n let result = {};\n\n for (const item of contents) {\n let parsedContent: any;\n\n try {\n parsedContent = yaml.load(item.content);\n } catch (error) {\n const name = item.name || 'unknown content';\n throw new Error(`Invalid YAML in ${name}: ${error instanceof Error ? error.message : String(error)}`);\n }\n\n if (parsedContent !== null && typeof parsedContent === 'object') {\n result = this.deepMerge(result, parsedContent);\n }\n }\n\n return result;\n }\n\n /**\n * Deep merge two objects\n * Rules:\n * - Objects: merge properties, source overrides target\n * - Arrays: source replaces target\n * - Primitives: source overrides target\n */\n deepMerge(target: any, source: any): any {\n // If source is null/undefined, return target\n if (source === null || source === undefined) {\n return target;\n }\n\n // If target is null/undefined, return source\n if (target === null || target === undefined) {\n return source;\n }\n\n // If both are arrays, the later content replaces the earlier content\n if (Array.isArray(source) && Array.isArray(target)) {\n return source;\n }\n\n // If source is not an object (or is an array but target isn't), it replaces target\n if (typeof source !== 'object' || Array.isArray(source)) {\n return source;\n }\n\n // If target is not an object, source replaces it\n if (typeof target !== 'object' || Array.isArray(target)) {\n return source;\n }\n\n // Both are objects, merge them\n const result = { ...target };\n\n for (const key in source) {\n if (source.hasOwnProperty(key)) {\n if (key in result) {\n result[key] = this.deepMerge(result[key], source[key]);\n } else {\n result[key] = source[key];\n }\n }\n }\n\n return result;\n }\n}\n","import { YamlMerger } from './YamlMergerBrowser';\n\n/**\n * Helper function for Vite environments\n * Works with import.meta.glob() to merge YAML files\n */\nexport async function stitchFromViteImports(\n imports: Record<string, () => Promise<{ default: string }>>\n): Promise<any> {\n const contents = await Promise.all(\n Object.entries(imports).map(async ([path, importFn]) => ({\n content: (await importFn()).default,\n name: path\n }))\n );\n \n const merger = new YamlMerger();\n return merger.mergeContent(contents);\n}\n\n/**\n * Helper function for ordered Vite imports\n * Ensures files are merged in a specific order based on the array\n */\nexport async function stitchFromOrderedViteImports(\n orderedPaths: string[],\n imports: Record<string, () => Promise<{ default: string }>>\n): Promise<any> {\n const contents = await Promise.all(\n orderedPaths.map(async (path) => {\n const importFn = imports[path];\n if (!importFn) {\n throw new Error(`Import not found for path: ${path}`);\n }\n return {\n content: (await importFn()).default,\n name: path\n };\n })\n );\n \n const merger = new YamlMerger();\n return merger.mergeContent(contents);\n}\n\n/**\n * Helper function for glob pattern imports with sorting\n * Useful when you want alphabetical ordering of files\n */\nexport async function stitchFromSortedViteImports(\n imports: Record<string, () => Promise<{ default: string }>>\n): Promise<any> {\n const sortedPaths = Object.keys(imports).sort();\n return stitchFromOrderedViteImports(sortedPaths, imports);\n}\n\n/**\n * Direct content merging for when you already have the YAML strings\n */\nexport function stitchFromContent(\n contents: Array<{ content: string; name?: string }>\n): any {\n const merger = new YamlMerger();\n return merger.mergeContent(contents);\n}\n\n/**\n * Convenience function for merging raw YAML strings without names\n */\nexport function stitchFromRawContent(yamlStrings: string[]): any {\n const contents = yamlStrings.map((content, index) => ({\n content,\n name: `content-${index}`\n }));\n \n return stitchFromContent(contents);\n}"],"names":["YamlMerger","contents","result","item","parsedContent","yaml","error","name","target","source","key","stitchFromViteImports","imports","path","importFn","stitchFromOrderedViteImports","orderedPaths","stitchFromSortedViteImports","sortedPaths","stitchFromContent","stitchFromRawContent","yamlStrings","content","index"],"mappings":"qYAEO,MAAMA,CAAW,CAItB,aAAaC,EAA0D,CACrE,IAAIC,EAAS,CAAC,EAEd,UAAWC,KAAQF,EAAU,CACvB,IAAAG,EAEA,GAAA,CACcA,EAAAC,EAAK,KAAKF,EAAK,OAAO,QAC/BG,EAAO,CACR,MAAAC,EAAOJ,EAAK,MAAQ,kBAC1B,MAAM,IAAI,MAAM,mBAAmBI,CAAI,KAAKD,aAAiB,MAAQA,EAAM,QAAU,OAAOA,CAAK,CAAC,EAAE,CAAA,CAGlGF,IAAkB,MAAQ,OAAOA,GAAkB,WAC5CF,EAAA,KAAK,UAAUA,EAAQE,CAAa,EAC/C,CAGK,OAAAF,CAAA,CAUT,UAAUM,EAAaC,EAAkB,CAEnC,GAAAA,GAAW,KACN,OAAAD,EAmBT,GAfIA,GAAW,MAKX,MAAM,QAAQC,CAAM,GAAK,MAAM,QAAQD,CAAM,GAK7C,OAAOC,GAAW,UAAY,MAAM,QAAQA,CAAM,GAKlD,OAAOD,GAAW,UAAY,MAAM,QAAQA,CAAM,EAC7C,OAAAC,EAIH,MAAAP,EAAS,CAAE,GAAGM,CAAO,EAE3B,UAAWE,KAAOD,EACZA,EAAO,eAAeC,CAAG,IACvBA,KAAOR,EACFA,EAAAQ,CAAG,EAAI,KAAK,UAAUR,EAAOQ,CAAG,EAAGD,EAAOC,CAAG,CAAC,EAE9CR,EAAAQ,CAAG,EAAID,EAAOC,CAAG,GAKvB,OAAAR,CAAA,CAEX,CCrEA,eAAsBS,EACpBC,EACc,CACR,MAAAX,EAAW,MAAM,QAAQ,IAC7B,OAAO,QAAQW,CAAO,EAAE,IAAI,MAAO,CAACC,EAAMC,CAAQ,KAAO,CACvD,SAAU,MAAMA,EAAA,GAAY,QAC5B,KAAMD,CAAA,EACN,CACJ,EAGO,OADQ,IAAIb,EAAW,EAChB,aAAaC,CAAQ,CACrC,CAMsB,eAAAc,EACpBC,EACAJ,EACc,CACR,MAAAX,EAAW,MAAM,QAAQ,IAC7Be,EAAa,IAAI,MAAOH,GAAS,CACzB,MAAAC,EAAWF,EAAQC,CAAI,EAC7B,GAAI,CAACC,EACH,MAAM,IAAI,MAAM,8BAA8BD,CAAI,EAAE,EAE/C,MAAA,CACL,SAAU,MAAMC,EAAA,GAAY,QAC5B,KAAMD,CACR,CACD,CAAA,CACH,EAGO,OADQ,IAAIb,EAAW,EAChB,aAAaC,CAAQ,CACrC,CAMA,eAAsBgB,EACpBL,EACc,CACd,MAAMM,EAAc,OAAO,KAAKN,CAAO,EAAE,KAAK,EACvC,OAAAG,EAA6BG,EAAaN,CAAO,CAC1D,CAKO,SAASO,EACdlB,EACK,CAEE,OADQ,IAAID,EAAW,EAChB,aAAaC,CAAQ,CACrC,CAKO,SAASmB,EAAqBC,EAA4B,CAC/D,MAAMpB,EAAWoB,EAAY,IAAI,CAACC,EAASC,KAAW,CACpD,QAAAD,EACA,KAAM,WAAWC,CAAK,EAAA,EACtB,EAEF,OAAOJ,EAAkBlB,CAAQ,CACnC"}
|
package/dist/client.mjs
CHANGED
|
@@ -1,57 +1,53 @@
|
|
|
1
1
|
import * as m from "js-yaml";
|
|
2
|
-
class
|
|
2
|
+
class a {
|
|
3
3
|
/**
|
|
4
4
|
* Merge multiple YAML content strings in order
|
|
5
5
|
*/
|
|
6
|
-
mergeContent(
|
|
7
|
-
let
|
|
8
|
-
for (const r of
|
|
6
|
+
mergeContent(n) {
|
|
7
|
+
let t = {};
|
|
8
|
+
for (const r of n) {
|
|
9
9
|
let e;
|
|
10
10
|
try {
|
|
11
11
|
e = m.load(r.content);
|
|
12
12
|
} catch (i) {
|
|
13
|
-
const
|
|
14
|
-
throw new Error(`Invalid YAML in ${
|
|
13
|
+
const s = r.name || "unknown content";
|
|
14
|
+
throw new Error(`Invalid YAML in ${s}: ${i instanceof Error ? i.message : String(i)}`);
|
|
15
15
|
}
|
|
16
|
-
e !== null && typeof e == "object" && (
|
|
16
|
+
e !== null && typeof e == "object" && (t = this.deepMerge(t, e));
|
|
17
17
|
}
|
|
18
|
-
return
|
|
18
|
+
return t;
|
|
19
19
|
}
|
|
20
20
|
/**
|
|
21
21
|
* Deep merge two objects
|
|
22
22
|
* Rules:
|
|
23
23
|
* - Objects: merge properties, source overrides target
|
|
24
|
-
* - Arrays:
|
|
24
|
+
* - Arrays: source replaces target
|
|
25
25
|
* - Primitives: source overrides target
|
|
26
26
|
*/
|
|
27
|
-
deepMerge(
|
|
28
|
-
if (n == null)
|
|
29
|
-
return t;
|
|
27
|
+
deepMerge(n, t) {
|
|
30
28
|
if (t == null)
|
|
31
29
|
return n;
|
|
32
|
-
if (Array.isArray(
|
|
33
|
-
return
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
for (const e in n)
|
|
38
|
-
n.hasOwnProperty(e) && (e in r ? r[e] = this.deepMerge(r[e], n[e]) : r[e] = n[e]);
|
|
30
|
+
if (n == null || Array.isArray(t) && Array.isArray(n) || typeof t != "object" || Array.isArray(t) || typeof n != "object" || Array.isArray(n))
|
|
31
|
+
return t;
|
|
32
|
+
const r = { ...n };
|
|
33
|
+
for (const e in t)
|
|
34
|
+
t.hasOwnProperty(e) && (e in r ? r[e] = this.deepMerge(r[e], t[e]) : r[e] = t[e]);
|
|
39
35
|
return r;
|
|
40
36
|
}
|
|
41
37
|
}
|
|
42
38
|
async function l(o) {
|
|
43
|
-
const
|
|
39
|
+
const n = await Promise.all(
|
|
44
40
|
Object.entries(o).map(async ([r, e]) => ({
|
|
45
41
|
content: (await e()).default,
|
|
46
42
|
name: r
|
|
47
43
|
}))
|
|
48
44
|
);
|
|
49
|
-
return new
|
|
45
|
+
return new a().mergeContent(n);
|
|
50
46
|
}
|
|
51
|
-
async function c(o,
|
|
52
|
-
const
|
|
47
|
+
async function c(o, n) {
|
|
48
|
+
const t = await Promise.all(
|
|
53
49
|
o.map(async (e) => {
|
|
54
|
-
const i =
|
|
50
|
+
const i = n[e];
|
|
55
51
|
if (!i)
|
|
56
52
|
throw new Error(`Import not found for path: ${e}`);
|
|
57
53
|
return {
|
|
@@ -60,24 +56,24 @@ async function c(o, t) {
|
|
|
60
56
|
};
|
|
61
57
|
})
|
|
62
58
|
);
|
|
63
|
-
return new
|
|
59
|
+
return new a().mergeContent(t);
|
|
64
60
|
}
|
|
65
61
|
async function y(o) {
|
|
66
|
-
const
|
|
67
|
-
return c(
|
|
62
|
+
const n = Object.keys(o).sort();
|
|
63
|
+
return c(n, o);
|
|
68
64
|
}
|
|
69
65
|
function f(o) {
|
|
70
|
-
return new
|
|
66
|
+
return new a().mergeContent(o);
|
|
71
67
|
}
|
|
72
68
|
function p(o) {
|
|
73
|
-
const
|
|
74
|
-
content:
|
|
69
|
+
const n = o.map((t, r) => ({
|
|
70
|
+
content: t,
|
|
75
71
|
name: `content-${r}`
|
|
76
72
|
}));
|
|
77
|
-
return f(
|
|
73
|
+
return f(n);
|
|
78
74
|
}
|
|
79
75
|
export {
|
|
80
|
-
|
|
76
|
+
a as YamlMerger,
|
|
81
77
|
f as stitchFromContent,
|
|
82
78
|
c as stitchFromOrderedViteImports,
|
|
83
79
|
p as stitchFromRawContent,
|
package/dist/client.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.mjs","sources":["../src/core/YamlMergerBrowser.ts","../src/core/ViteHelper.ts"],"sourcesContent":["import * as yaml from 'js-yaml';\n\nexport class YamlMerger {\n /**\n * Merge multiple YAML content strings in order\n */\n mergeContent(contents: Array<{ content: string; name?: string }>): any {\n let result = {};\n\n for (const item of contents) {\n let parsedContent: any;\n\n try {\n parsedContent = yaml.load(item.content);\n } catch (error) {\n const name = item.name || 'unknown content';\n throw new Error(`Invalid YAML in ${name}: ${error instanceof Error ? error.message : String(error)}`);\n }\n\n if (parsedContent !== null && typeof parsedContent === 'object') {\n result = this.deepMerge(result, parsedContent);\n }\n }\n\n return result;\n }\n\n /**\n * Deep merge two objects\n * Rules:\n * - Objects: merge properties, source overrides target\n * - Arrays:
|
|
1
|
+
{"version":3,"file":"client.mjs","sources":["../src/core/YamlMergerBrowser.ts","../src/core/ViteHelper.ts"],"sourcesContent":["import * as yaml from 'js-yaml';\n\nexport class YamlMerger {\n /**\n * Merge multiple YAML content strings in order\n */\n mergeContent(contents: Array<{ content: string; name?: string }>): any {\n let result = {};\n\n for (const item of contents) {\n let parsedContent: any;\n\n try {\n parsedContent = yaml.load(item.content);\n } catch (error) {\n const name = item.name || 'unknown content';\n throw new Error(`Invalid YAML in ${name}: ${error instanceof Error ? error.message : String(error)}`);\n }\n\n if (parsedContent !== null && typeof parsedContent === 'object') {\n result = this.deepMerge(result, parsedContent);\n }\n }\n\n return result;\n }\n\n /**\n * Deep merge two objects\n * Rules:\n * - Objects: merge properties, source overrides target\n * - Arrays: source replaces target\n * - Primitives: source overrides target\n */\n deepMerge(target: any, source: any): any {\n // If source is null/undefined, return target\n if (source === null || source === undefined) {\n return target;\n }\n\n // If target is null/undefined, return source\n if (target === null || target === undefined) {\n return source;\n }\n\n // If both are arrays, the later content replaces the earlier content\n if (Array.isArray(source) && Array.isArray(target)) {\n return source;\n }\n\n // If source is not an object (or is an array but target isn't), it replaces target\n if (typeof source !== 'object' || Array.isArray(source)) {\n return source;\n }\n\n // If target is not an object, source replaces it\n if (typeof target !== 'object' || Array.isArray(target)) {\n return source;\n }\n\n // Both are objects, merge them\n const result = { ...target };\n\n for (const key in source) {\n if (source.hasOwnProperty(key)) {\n if (key in result) {\n result[key] = this.deepMerge(result[key], source[key]);\n } else {\n result[key] = source[key];\n }\n }\n }\n\n return result;\n }\n}\n","import { YamlMerger } from './YamlMergerBrowser';\n\n/**\n * Helper function for Vite environments\n * Works with import.meta.glob() to merge YAML files\n */\nexport async function stitchFromViteImports(\n imports: Record<string, () => Promise<{ default: string }>>\n): Promise<any> {\n const contents = await Promise.all(\n Object.entries(imports).map(async ([path, importFn]) => ({\n content: (await importFn()).default,\n name: path\n }))\n );\n \n const merger = new YamlMerger();\n return merger.mergeContent(contents);\n}\n\n/**\n * Helper function for ordered Vite imports\n * Ensures files are merged in a specific order based on the array\n */\nexport async function stitchFromOrderedViteImports(\n orderedPaths: string[],\n imports: Record<string, () => Promise<{ default: string }>>\n): Promise<any> {\n const contents = await Promise.all(\n orderedPaths.map(async (path) => {\n const importFn = imports[path];\n if (!importFn) {\n throw new Error(`Import not found for path: ${path}`);\n }\n return {\n content: (await importFn()).default,\n name: path\n };\n })\n );\n \n const merger = new YamlMerger();\n return merger.mergeContent(contents);\n}\n\n/**\n * Helper function for glob pattern imports with sorting\n * Useful when you want alphabetical ordering of files\n */\nexport async function stitchFromSortedViteImports(\n imports: Record<string, () => Promise<{ default: string }>>\n): Promise<any> {\n const sortedPaths = Object.keys(imports).sort();\n return stitchFromOrderedViteImports(sortedPaths, imports);\n}\n\n/**\n * Direct content merging for when you already have the YAML strings\n */\nexport function stitchFromContent(\n contents: Array<{ content: string; name?: string }>\n): any {\n const merger = new YamlMerger();\n return merger.mergeContent(contents);\n}\n\n/**\n * Convenience function for merging raw YAML strings without names\n */\nexport function stitchFromRawContent(yamlStrings: string[]): any {\n const contents = yamlStrings.map((content, index) => ({\n content,\n name: `content-${index}`\n }));\n \n return stitchFromContent(contents);\n}"],"names":["YamlMerger","contents","result","item","parsedContent","yaml","error","name","target","source","key","stitchFromViteImports","imports","path","importFn","stitchFromOrderedViteImports","orderedPaths","stitchFromSortedViteImports","sortedPaths","stitchFromContent","stitchFromRawContent","yamlStrings","content","index"],"mappings":";AAEO,MAAMA,EAAW;AAAA;AAAA;AAAA;AAAA,EAItB,aAAaC,GAA0D;AACrE,QAAIC,IAAS,CAAC;AAEd,eAAWC,KAAQF,GAAU;AACvB,UAAAG;AAEA,UAAA;AACc,QAAAA,IAAAC,EAAK,KAAKF,EAAK,OAAO;AAAA,eAC/BG,GAAO;AACR,cAAAC,IAAOJ,EAAK,QAAQ;AAC1B,cAAM,IAAI,MAAM,mBAAmBI,CAAI,KAAKD,aAAiB,QAAQA,EAAM,UAAU,OAAOA,CAAK,CAAC,EAAE;AAAA,MAAA;AAGtG,MAAIF,MAAkB,QAAQ,OAAOA,KAAkB,aAC5CF,IAAA,KAAK,UAAUA,GAAQE,CAAa;AAAA,IAC/C;AAGK,WAAAF;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUT,UAAUM,GAAaC,GAAkB;AAEnC,QAAAA,KAAW;AACN,aAAAD;AAmBT,QAfIA,KAAW,QAKX,MAAM,QAAQC,CAAM,KAAK,MAAM,QAAQD,CAAM,KAK7C,OAAOC,KAAW,YAAY,MAAM,QAAQA,CAAM,KAKlD,OAAOD,KAAW,YAAY,MAAM,QAAQA,CAAM;AAC7C,aAAAC;AAIH,UAAAP,IAAS,EAAE,GAAGM,EAAO;AAE3B,eAAWE,KAAOD;AACZ,MAAAA,EAAO,eAAeC,CAAG,MACvBA,KAAOR,IACFA,EAAAQ,CAAG,IAAI,KAAK,UAAUR,EAAOQ,CAAG,GAAGD,EAAOC,CAAG,CAAC,IAE9CR,EAAAQ,CAAG,IAAID,EAAOC,CAAG;AAKvB,WAAAR;AAAA,EAAA;AAEX;ACrEA,eAAsBS,EACpBC,GACc;AACR,QAAAX,IAAW,MAAM,QAAQ;AAAA,IAC7B,OAAO,QAAQW,CAAO,EAAE,IAAI,OAAO,CAACC,GAAMC,CAAQ,OAAO;AAAA,MACvD,UAAU,MAAMA,EAAA,GAAY;AAAA,MAC5B,MAAMD;AAAA,IAAA,EACN;AAAA,EACJ;AAGO,SADQ,IAAIb,EAAW,EAChB,aAAaC,CAAQ;AACrC;AAMsB,eAAAc,EACpBC,GACAJ,GACc;AACR,QAAAX,IAAW,MAAM,QAAQ;AAAA,IAC7Be,EAAa,IAAI,OAAOH,MAAS;AACzB,YAAAC,IAAWF,EAAQC,CAAI;AAC7B,UAAI,CAACC;AACH,cAAM,IAAI,MAAM,8BAA8BD,CAAI,EAAE;AAE/C,aAAA;AAAA,QACL,UAAU,MAAMC,EAAA,GAAY;AAAA,QAC5B,MAAMD;AAAA,MACR;AAAA,IACD,CAAA;AAAA,EACH;AAGO,SADQ,IAAIb,EAAW,EAChB,aAAaC,CAAQ;AACrC;AAMA,eAAsBgB,EACpBL,GACc;AACd,QAAMM,IAAc,OAAO,KAAKN,CAAO,EAAE,KAAK;AACvC,SAAAG,EAA6BG,GAAaN,CAAO;AAC1D;AAKO,SAASO,EACdlB,GACK;AAEE,SADQ,IAAID,EAAW,EAChB,aAAaC,CAAQ;AACrC;AAKO,SAASmB,EAAqBC,GAA4B;AAC/D,QAAMpB,IAAWoB,EAAY,IAAI,CAACC,GAASC,OAAW;AAAA,IACpD,SAAAD;AAAA,IACA,MAAM,WAAWC,CAAK;AAAA,EAAA,EACtB;AAEF,SAAOJ,EAAkBlB,CAAQ;AACnC;"}
|
|
@@ -21,7 +21,7 @@ export declare class YamlMerger {
|
|
|
21
21
|
* Deep merge two objects
|
|
22
22
|
* Rules:
|
|
23
23
|
* - Objects: merge properties, source overrides target
|
|
24
|
-
* - Arrays:
|
|
24
|
+
* - Arrays: source replaces target
|
|
25
25
|
* - Primitives: source overrides target
|
|
26
26
|
*/
|
|
27
27
|
deepMerge(target: any, source: any): any;
|
|
@@ -10,7 +10,7 @@ export declare class YamlMerger {
|
|
|
10
10
|
* Deep merge two objects
|
|
11
11
|
* Rules:
|
|
12
12
|
* - Objects: merge properties, source overrides target
|
|
13
|
-
* - Arrays:
|
|
13
|
+
* - Arrays: source replaces target
|
|
14
14
|
* - Primitives: source overrides target
|
|
15
15
|
*/
|
|
16
16
|
deepMerge(target: any, source: any): any;
|
|
@@ -21,7 +21,7 @@ export declare class YamlMerger {
|
|
|
21
21
|
* Deep merge two objects
|
|
22
22
|
* Rules:
|
|
23
23
|
* - Objects: merge properties, source overrides target
|
|
24
|
-
* - Arrays:
|
|
24
|
+
* - Arrays: source replaces target
|
|
25
25
|
* - Primitives: source overrides target
|
|
26
26
|
*/
|
|
27
27
|
deepMerge(target: any, source: any): any;
|
|
@@ -10,7 +10,7 @@ export declare class YamlMerger {
|
|
|
10
10
|
* Deep merge two objects
|
|
11
11
|
* Rules:
|
|
12
12
|
* - Objects: merge properties, source overrides target
|
|
13
|
-
* - Arrays:
|
|
13
|
+
* - Arrays: source replaces target
|
|
14
14
|
* - Primitives: source overrides target
|
|
15
15
|
*/
|
|
16
16
|
deepMerge(target: any, source: any): any;
|
package/dist-ssr/server.cjs
CHANGED
|
@@ -162,7 +162,7 @@ class YamlMerger {
|
|
|
162
162
|
* Deep merge two objects
|
|
163
163
|
* Rules:
|
|
164
164
|
* - Objects: merge properties, source overrides target
|
|
165
|
-
* - Arrays:
|
|
165
|
+
* - Arrays: source replaces target
|
|
166
166
|
* - Primitives: source overrides target
|
|
167
167
|
*/
|
|
168
168
|
deepMerge(target, source) {
|
|
@@ -173,7 +173,7 @@ class YamlMerger {
|
|
|
173
173
|
return source;
|
|
174
174
|
}
|
|
175
175
|
if (Array.isArray(source) && Array.isArray(target)) {
|
|
176
|
-
return
|
|
176
|
+
return source;
|
|
177
177
|
}
|
|
178
178
|
if (typeof source !== "object" || Array.isArray(source)) {
|
|
179
179
|
return source;
|
package/dist-ssr/server.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.cjs","sources":["../src/core/ConfigParser.ts","../src/core/YamlMerger.ts","../src/core/Validator.ts","../src/core/StitchEngine.ts","../src/cli/StitchCLI.ts","../src/index.ts"],"sourcesContent":["import * as fs from 'fs';\nimport * as path from 'path';\nimport * as yaml from 'js-yaml';\nimport { glob } from 'glob';\nimport { StitchConfig } from '../types/StitchTypes';\n\nexport class ConfigParser {\n /**\n * Parse a stitch.yaml configuration file\n */\n parseConfig(configPath: string): StitchConfig {\n if (!fs.existsSync(configPath)) {\n throw new Error(`Config file not found: ${configPath}`);\n }\n\n const configContent = fs.readFileSync(configPath, 'utf8');\n const config = yaml.load(configContent) as any;\n\n if (!config || typeof config !== 'object') {\n throw new Error(`Invalid config file: ${configPath}`);\n }\n\n if (!config.stitch || !Array.isArray(config.stitch)) {\n throw new Error(`Config file must contain a 'stitch' array: ${configPath}`);\n }\n\n return {\n stitch: config.stitch\n };\n }\n\n /**\n * Resolve file paths and expand globs relative to the config file directory\n */\n async resolveFilePaths(patterns: string[], baseDir: string): Promise<string[]> {\n const resolvedFiles: string[] = [];\n\n for (const pattern of patterns) {\n const fullPattern = path.resolve(baseDir, pattern);\n \n // Check if it's a glob pattern\n if (pattern.includes('*') || pattern.includes('?') || pattern.includes('[')) {\n const matches = await glob(fullPattern, { \n absolute: true,\n nodir: true \n });\n // Sort alphabetically for consistent ordering\n matches.sort();\n resolvedFiles.push(...matches);\n } else {\n // Regular file path\n const fullPath = path.resolve(baseDir, pattern);\n if (fs.existsSync(fullPath)) {\n resolvedFiles.push(fullPath);\n } else {\n throw new Error(`File not found: ${pattern} (resolved to ${fullPath})`);\n }\n }\n }\n\n return resolvedFiles;\n }\n\n /**\n * Get the directory containing the config file\n */\n getConfigDir(configPath: string): string {\n return path.dirname(path.resolve(configPath));\n }\n}","import * as fs from 'fs';\nimport * as yaml from 'js-yaml';\n\nexport class YamlMerger {\n /**\n * Merge multiple YAML files in order\n */\n mergeFiles(filePaths: string[]): any {\n let result = {};\n\n for (const filePath of filePaths) {\n if (!fs.existsSync(filePath)) {\n throw new Error(`File not found: ${filePath}`);\n }\n\n const content = fs.readFileSync(filePath, 'utf8');\n let parsedContent: any;\n\n try {\n parsedContent = yaml.load(content);\n } catch (error) {\n throw new Error(`Invalid YAML in file ${filePath}: ${error instanceof Error ? error.message : String(error)}`);\n }\n\n if (parsedContent !== null && typeof parsedContent === 'object') {\n result = this.deepMerge(result, parsedContent);\n }\n }\n\n return result;\n }\n\n /**\n * Merge multiple YAML content strings in order\n */\n mergeContent(contents: Array<{ content: string; name?: string }>): any {\n let result = {};\n\n for (const item of contents) {\n let parsedContent: any;\n\n try {\n parsedContent = yaml.load(item.content);\n } catch (error) {\n const name = item.name || 'unknown content';\n throw new Error(`Invalid YAML in ${name}: ${error instanceof Error ? error.message : String(error)}`);\n }\n\n if (parsedContent !== null && typeof parsedContent === 'object') {\n result = this.deepMerge(result, parsedContent);\n }\n }\n\n return result;\n }\n\n /**\n * Merge mixed items (files and content) in order\n */\n merge(items: Array<string | { content: string; name?: string }>): any {\n let result = {};\n\n for (const item of items) {\n let parsedContent: any;\n let identifier: string;\n\n if (typeof item === 'string') {\n // File path\n if (!fs.existsSync(item)) {\n throw new Error(`File not found: ${item}`);\n }\n\n const content = fs.readFileSync(item, 'utf8');\n identifier = item;\n\n try {\n parsedContent = yaml.load(content);\n } catch (error) {\n throw new Error(`Invalid YAML in file ${item}: ${error instanceof Error ? error.message : String(error)}`);\n }\n } else {\n // Content object\n identifier = item.name || 'unknown content';\n\n try {\n parsedContent = yaml.load(item.content);\n } catch (error) {\n throw new Error(`Invalid YAML in ${identifier}: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n if (parsedContent !== null && typeof parsedContent === 'object') {\n result = this.deepMerge(result, parsedContent);\n }\n }\n\n return result;\n }\n\n /**\n * Deep merge two objects\n * Rules:\n * - Objects: merge properties, source overrides target\n * - Arrays: concatenate (target first, then source)\n * - Primitives: source overrides target\n */\n deepMerge(target: any, source: any): any {\n // If source is null/undefined, return target\n if (source === null || source === undefined) {\n return target;\n }\n\n // If target is null/undefined, return source\n if (target === null || target === undefined) {\n return source;\n }\n\n // If both are arrays, concatenate them\n if (Array.isArray(source) && Array.isArray(target)) {\n return [...target, ...source];\n }\n\n // If source is not an object (or is an array but target isn't), it replaces target\n if (typeof source !== 'object' || Array.isArray(source)) {\n return source;\n }\n\n // If target is not an object, source replaces it\n if (typeof target !== 'object' || Array.isArray(target)) {\n return source;\n }\n\n // Both are objects, merge them\n const result = { ...target };\n\n for (const key in source) {\n if (source.hasOwnProperty(key)) {\n if (key in result) {\n result[key] = this.deepMerge(result[key], source[key]);\n } else {\n result[key] = source[key];\n }\n }\n }\n\n return result;\n }\n}","import * as fs from 'fs';\nimport * as yaml from 'js-yaml';\nimport Ajv from 'ajv';\nimport addFormats from 'ajv-formats';\nimport { ValidationResult } from '../types/StitchTypes';\n\nexport class Validator {\n private ajv: Ajv;\n\n constructor() {\n this.ajv = new Ajv({ allErrors: true });\n addFormats(this.ajv);\n }\n\n /**\n * Validate YAML syntax\n */\n validateYamlSyntax(yamlString: string): ValidationResult {\n try {\n yaml.load(yamlString);\n return { valid: true };\n } catch (error) {\n return {\n valid: false,\n errors: [`Invalid YAML syntax: ${error instanceof Error ? error.message : String(error)}`]\n };\n }\n }\n\n /**\n * Validate against OpenAPI schema\n */\n validateOpenAPI(yamlContent: any, schemaPath?: string): ValidationResult {\n if (schemaPath) {\n return this.validateAgainstSchema(yamlContent, schemaPath);\n }\n\n // Basic OpenAPI structure validation\n const errors: string[] = [];\n\n if (!yamlContent || typeof yamlContent !== 'object') {\n errors.push('Content must be an object');\n } else {\n if (!yamlContent.openapi) {\n errors.push('Missing required \"openapi\" field');\n }\n if (!yamlContent.info) {\n errors.push('Missing required \"info\" field');\n }\n }\n\n return {\n valid: errors.length === 0,\n errors: errors.length > 0 ? errors : undefined\n };\n }\n\n /**\n * Validate against a JSON schema file\n */\n private validateAgainstSchema(content: any, schemaPath: string): ValidationResult {\n if (!fs.existsSync(schemaPath)) {\n return {\n valid: false,\n errors: [`Schema file not found: ${schemaPath}`]\n };\n }\n\n let schema: any;\n try {\n const schemaContent = fs.readFileSync(schemaPath, 'utf8');\n schema = JSON.parse(schemaContent);\n } catch (error) {\n return {\n valid: false,\n errors: [`Invalid schema file: ${error instanceof Error ? error.message : String(error)}`]\n };\n }\n\n const validate = this.ajv.compile(schema);\n const valid = validate(content);\n\n if (valid) {\n return { valid: true };\n }\n\n const errors = validate.errors?.map(err => \n `${err.instancePath || 'root'}: ${err.message}`\n ) || ['Unknown validation error'];\n\n return {\n valid: false,\n errors\n };\n }\n}","import * as yaml from 'js-yaml';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as chokidar from 'chokidar';\nimport { globSync } from 'glob';\nimport { ConfigParser } from './ConfigParser';\nimport { YamlMerger } from './YamlMerger';\nimport { Validator } from './Validator';\nimport { BuildOptions, WatchOptions, StitchResult, ContentItem, InstallOptions } from '../types/StitchTypes';\n\nexport class StitchEngine {\n private configParser = new ConfigParser();\n private yamlMerger = new YamlMerger();\n private validator = new Validator();\n\n /**\n * Build from a stitch configuration file (async)\n */\n async build(configPath: string, options: BuildOptions = {}): Promise<StitchResult> {\n try {\n // 1. Parse stitch.yaml config\n const config = this.configParser.parseConfig(configPath);\n const baseDir = this.configParser.getConfigDir(configPath);\n\n // 2. Expand globs to actual file paths\n const filePaths = await this.configParser.resolveFilePaths(config.stitch, baseDir);\n\n // 3. Load and merge YAML files\n const mergedContent = this.yamlMerger.mergeFiles(filePaths);\n\n // 4. Validate if requested\n if (options.validate) {\n const validationResult = typeof options.validate === 'string' \n ? this.validator.validateOpenAPI(mergedContent, options.validate)\n : this.validator.validateOpenAPI(mergedContent);\n\n if (!validationResult.valid) {\n return {\n success: false,\n error: `Validation failed: ${validationResult.errors?.join(', ')}`\n };\n }\n }\n\n // 5. Format output\n const format = options.format || 'yaml';\n let outputData = format === 'json' \n ? JSON.stringify(mergedContent, null, 2)\n : yaml.dump(mergedContent);\n\n // 6. Write to file or return data\n if (options.output) {\n // Add warning header for generated files\n const warning = format === 'json' \n ? '// THIS FILE IS AUTO-GENERATED by Stitch. DO NOT EDIT directly.\\n// Edit the source files and run stitch build instead.\\n\\n'\n : '# THIS FILE IS AUTO-GENERATED by Stitch. DO NOT EDIT directly.\\n# Edit the source files and run stitch build instead.\\n\\n';\n \n const finalOutput = warning + outputData;\n fs.writeFileSync(options.output, finalOutput, 'utf8');\n return {\n success: true,\n message: `Built successfully to ${options.output}`\n };\n } else {\n return {\n success: true,\n data: outputData\n };\n }\n\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n /**\n * Build from a stitch configuration file (sync)\n */\n buildSync(configPath: string, options: BuildOptions = {}): StitchResult {\n try {\n // 1. Parse stitch.yaml config\n const config = this.configParser.parseConfig(configPath);\n const baseDir = this.configParser.getConfigDir(configPath);\n\n // 2. Expand globs to actual file paths (sync version)\n const filePaths = this.resolveFilePathsSync(config.stitch, baseDir);\n\n // 3. Load and merge YAML files\n const mergedContent = this.yamlMerger.mergeFiles(filePaths);\n\n // 4. Validate if requested\n if (options.validate) {\n const validationResult = typeof options.validate === 'string' \n ? this.validator.validateOpenAPI(mergedContent, options.validate)\n : this.validator.validateOpenAPI(mergedContent);\n\n if (!validationResult.valid) {\n return {\n success: false,\n error: `Validation failed: ${validationResult.errors?.join(', ')}`\n };\n }\n }\n\n // 5. Format output\n const format = options.format || 'yaml';\n let outputData = format === 'json' \n ? JSON.stringify(mergedContent, null, 2)\n : yaml.dump(mergedContent);\n\n // 6. Write to file or return data\n if (options.output) {\n // Add warning header for generated files\n const warning = format === 'json' \n ? '// THIS FILE IS AUTO-GENERATED by Stitch. DO NOT EDIT directly.\\n// Edit the source files and run stitch build instead.\\n\\n'\n : '# THIS FILE IS AUTO-GENERATED by Stitch. DO NOT EDIT directly.\\n# Edit the source files and run stitch build instead.\\n\\n';\n \n const finalOutput = warning + outputData;\n fs.writeFileSync(options.output, finalOutput, 'utf8');\n return {\n success: true,\n message: `Built successfully to ${options.output}`\n };\n } else {\n return {\n success: true,\n data: outputData\n };\n }\n\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n /**\n * Watch mode - rebuild when files change\n */\n async watch(configPath: string, options: WatchOptions = {}): Promise<void> {\n console.log(`Watching ${configPath} for changes...`);\n\n // Initial build\n const initialResult = await this.build(configPath, options);\n if (initialResult.success) {\n if (!options.quiet) {\n console.log('Initial build completed');\n }\n } else {\n console.error(`Initial build failed: ${initialResult.error}`);\n }\n\n // Set up file watching\n const config = this.configParser.parseConfig(configPath);\n const baseDir = this.configParser.getConfigDir(configPath);\n const filePaths = await this.configParser.resolveFilePaths(config.stitch, baseDir);\n\n // Watch the config file and all source files\n const watchPaths = [configPath, ...filePaths];\n \n const watcher = chokidar.watch(watchPaths, {\n persistent: true,\n ignoreInitial: true\n });\n\n watcher.on('change', async (path) => {\n if (!options.quiet) {\n console.log(`File changed: ${path}`);\n }\n \n const result = await this.build(configPath, options);\n if (result.success) {\n if (!options.quiet) {\n console.log('Rebuild completed');\n }\n } else {\n console.error(`Rebuild failed: ${result.error}`);\n }\n });\n\n watcher.on('error', (error) => {\n console.error(`Watcher error: ${error}`);\n });\n\n // Keep the process alive\n process.on('SIGINT', () => {\n console.log('\\nStopping watcher...');\n watcher.close();\n process.exit(0);\n });\n }\n\n /**\n * Build from content directly (no file system access)\n */\n buildFromContent(contents: ContentItem[], options: Omit<BuildOptions, 'input'> = {}): StitchResult {\n try {\n // 1. Merge content directly\n const mergedContent = this.yamlMerger.mergeContent(contents);\n\n // 2. Validate if requested\n if (options.validate) {\n const validationResult = typeof options.validate === 'string' \n ? this.validator.validateOpenAPI(mergedContent, options.validate)\n : this.validator.validateOpenAPI(mergedContent);\n\n if (!validationResult.valid) {\n return {\n success: false,\n error: `Validation failed: ${validationResult.errors?.join(', ')}`\n };\n }\n }\n\n // 3. Format output\n const format = options.format || 'yaml';\n const outputData = format === 'json' \n ? JSON.stringify(mergedContent, null, 2)\n : yaml.dump(mergedContent);\n\n // 4. Write to file or return data\n if (options.output) {\n fs.writeFileSync(options.output, outputData, 'utf8');\n return {\n success: true,\n message: `Built successfully to ${options.output}`\n };\n } else {\n return {\n success: true,\n data: outputData\n };\n }\n\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n /**\n * Synchronous version of file path resolution for buildSync\n */\n private resolveFilePathsSync(patterns: string[], baseDir: string): string[] {\n const resolvedFiles: string[] = [];\n\n for (const pattern of patterns) {\n \n \n // Check if it's a glob pattern\n if (pattern.includes('*') || pattern.includes('?') || pattern.includes('[')) {\n const matches = globSync(pattern, {\n cwd: baseDir, \n absolute: true,\n nodir: true \n });\n // Sort alphabetically for consistent ordering\n matches.sort();\n resolvedFiles.push(...matches);\n } else {\n // Regular file path\n const fullPath = path.resolve(baseDir, pattern);\n if (fs.existsSync(fullPath)) {\n resolvedFiles.push(fullPath);\n } else {\n throw new Error(`File not found: ${pattern} (resolved to ${fullPath})`);\n }\n }\n }\n\n return resolvedFiles;\n }\n\n /**\n * Install JSON schema for VSCode YAML validation\n */\n install(options: InstallOptions): StitchResult {\n try {\n const { schemaPath, targets, vscodeSettingsPath } = options;\n\n // Resolve schema path to absolute\n const absoluteSchemaPath = fs.existsSync(schemaPath) ? \n path.resolve(schemaPath) : \n schemaPath;\n\n // Determine VSCode settings path\n const settingsPath = vscodeSettingsPath || \n path.join(process.cwd(), '.vscode', 'settings.json');\n\n // Ensure .vscode directory exists\n const vscodeDir = path.dirname(settingsPath);\n if (!fs.existsSync(vscodeDir)) {\n fs.mkdirSync(vscodeDir, { recursive: true });\n }\n\n // Read existing settings or create new\n let settings: any = {};\n if (fs.existsSync(settingsPath)) {\n try {\n const settingsContent = fs.readFileSync(settingsPath, 'utf8');\n settings = JSON.parse(settingsContent);\n } catch (error) {\n throw new Error(`Invalid JSON in VSCode settings file: ${settingsPath}`);\n }\n }\n\n // Initialize yaml.schemas if it doesn't exist\n if (!settings['yaml.schemas']) {\n settings['yaml.schemas'] = {};\n }\n\n // Convert absolute schema path to relative from workspace root\n const workspaceRoot = process.cwd();\n const relativeSchemaPath = path.relative(workspaceRoot, absoluteSchemaPath);\n\n // Add or update schema mapping\n settings['yaml.schemas'][relativeSchemaPath] = targets;\n\n // Write updated settings\n const settingsJson = JSON.stringify(settings, null, 2);\n fs.writeFileSync(settingsPath, settingsJson, 'utf8');\n\n return {\n success: true,\n message: `Schema installed successfully. VSCode will now validate:\\n${targets.join('\\n')} \\nagainst schema: ${relativeSchemaPath}`\n };\n\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n}","import minimist from \"minimist\";\n\nexport class StitchCLIFactory {\n /**\n * Parse command line arguments into commands and flags\n * @param argv Optional array of command line arguments. If not provided, process.argv will be used.\n * @returns Object containing parsed commands and flags\n */\n static setup(argv?: string[]): { commands: string[], flags: Record<string, any> } {\n // Use provided args or default to process.argv\n const args = argv || process.argv;\n \n // Determine where to start slicing the arguments\n // We need to handle different invocation patterns:\n // 1. node script.js command => skip 'node' and 'script.js' \n // 2. ./cli.js command => skip './cli.js'\n // 3. stitch command => skip 'stitch' (likely a symlink to the script)\n // 4. command arg1 arg2 => don't skip anything (direct command invocation)\n let startIndex = 0;\n \n // Check for node\n if (args[0]?.includes('node')) {\n startIndex = 2; // Skip 'node' and script name\n }\n // Check for script file extensions\n else if (args[0] && /\\.(js|ts|mjs|cjs)$/i.test(args[0])) {\n startIndex = 1; // Skip just the script name\n }\n // Check for command name that might be a symlink to this script\n else if (args[0] && ['stitch'].includes(args[0].toLowerCase())) {\n startIndex = 1; // Skip the command name\n }\n \n // Parse the arguments\n const cli = minimist(args.slice(startIndex), {\n alias: {\n c: 'config',\n h: 'help',\n v: 'version',\n o: 'output',\n f: 'format',\n q: 'quiet',\n t: 'target'\n },\n boolean: ['help', 'version', 'quiet']\n });\n\n const { _: commands, ...flags } = cli;\n\n return {\n commands,\n flags\n };\n }\n}","export { StitchEngine } from './core/StitchEngine';\nexport { ConfigParser } from './core/ConfigParser';\nexport { YamlMerger } from './core/YamlMerger';\nexport { Validator } from './core/Validator';\nexport { StitchCLIFactory } from './cli/StitchCLI';\nexport * from './types/StitchTypes';\n\n// Convenience functions for programmatic API\nimport { StitchEngine } from './core/StitchEngine';\nimport { BuildOptions, WatchOptions, ContentItem, InstallOptions } from './types/StitchTypes';\n\nexport const stitch = {\n build: async (options: BuildOptions) => {\n const engine = new StitchEngine();\n return engine.build(options.input || 'stitch.yaml', options);\n },\n \n buildSync: (options: BuildOptions) => {\n const engine = new StitchEngine();\n return engine.buildSync(options.input || 'stitch.yaml', options);\n },\n \n buildFromContent: (contents: ContentItem[], options: Omit<BuildOptions, 'input'> = {}) => {\n const engine = new StitchEngine();\n return engine.buildFromContent(contents, options);\n },\n \n watch: async (options: WatchOptions) => {\n const engine = new StitchEngine();\n return engine.watch(options.input || 'stitch.yaml', options);\n },\n \n install: (options: InstallOptions) => {\n const engine = new StitchEngine();\n return engine.install(options);\n }\n};"],"names":["fs","yaml","path","glob","chokidar","globSync","StitchEngine"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"server.cjs","sources":["../src/core/ConfigParser.ts","../src/core/YamlMerger.ts","../src/core/Validator.ts","../src/core/StitchEngine.ts","../src/cli/StitchCLI.ts","../src/index.ts"],"sourcesContent":["import * as fs from 'fs';\nimport * as path from 'path';\nimport * as yaml from 'js-yaml';\nimport { glob } from 'glob';\nimport { StitchConfig } from '../types/StitchTypes';\n\nexport class ConfigParser {\n /**\n * Parse a stitch.yaml configuration file\n */\n parseConfig(configPath: string): StitchConfig {\n if (!fs.existsSync(configPath)) {\n throw new Error(`Config file not found: ${configPath}`);\n }\n\n const configContent = fs.readFileSync(configPath, 'utf8');\n const config = yaml.load(configContent) as any;\n\n if (!config || typeof config !== 'object') {\n throw new Error(`Invalid config file: ${configPath}`);\n }\n\n if (!config.stitch || !Array.isArray(config.stitch)) {\n throw new Error(`Config file must contain a 'stitch' array: ${configPath}`);\n }\n\n return {\n stitch: config.stitch\n };\n }\n\n /**\n * Resolve file paths and expand globs relative to the config file directory\n */\n async resolveFilePaths(patterns: string[], baseDir: string): Promise<string[]> {\n const resolvedFiles: string[] = [];\n\n for (const pattern of patterns) {\n const fullPattern = path.resolve(baseDir, pattern);\n \n // Check if it's a glob pattern\n if (pattern.includes('*') || pattern.includes('?') || pattern.includes('[')) {\n const matches = await glob(fullPattern, { \n absolute: true,\n nodir: true \n });\n // Sort alphabetically for consistent ordering\n matches.sort();\n resolvedFiles.push(...matches);\n } else {\n // Regular file path\n const fullPath = path.resolve(baseDir, pattern);\n if (fs.existsSync(fullPath)) {\n resolvedFiles.push(fullPath);\n } else {\n throw new Error(`File not found: ${pattern} (resolved to ${fullPath})`);\n }\n }\n }\n\n return resolvedFiles;\n }\n\n /**\n * Get the directory containing the config file\n */\n getConfigDir(configPath: string): string {\n return path.dirname(path.resolve(configPath));\n }\n}","import * as fs from 'fs';\nimport * as yaml from 'js-yaml';\n\nexport class YamlMerger {\n /**\n * Merge multiple YAML files in order\n */\n mergeFiles(filePaths: string[]): any {\n let result = {};\n\n for (const filePath of filePaths) {\n if (!fs.existsSync(filePath)) {\n throw new Error(`File not found: ${filePath}`);\n }\n\n const content = fs.readFileSync(filePath, 'utf8');\n let parsedContent: any;\n\n try {\n parsedContent = yaml.load(content);\n } catch (error) {\n throw new Error(`Invalid YAML in file ${filePath}: ${error instanceof Error ? error.message : String(error)}`);\n }\n\n if (parsedContent !== null && typeof parsedContent === 'object') {\n result = this.deepMerge(result, parsedContent);\n }\n }\n\n return result;\n }\n\n /**\n * Merge multiple YAML content strings in order\n */\n mergeContent(contents: Array<{ content: string; name?: string }>): any {\n let result = {};\n\n for (const item of contents) {\n let parsedContent: any;\n\n try {\n parsedContent = yaml.load(item.content);\n } catch (error) {\n const name = item.name || 'unknown content';\n throw new Error(`Invalid YAML in ${name}: ${error instanceof Error ? error.message : String(error)}`);\n }\n\n if (parsedContent !== null && typeof parsedContent === 'object') {\n result = this.deepMerge(result, parsedContent);\n }\n }\n\n return result;\n }\n\n /**\n * Merge mixed items (files and content) in order\n */\n merge(items: Array<string | { content: string; name?: string }>): any {\n let result = {};\n\n for (const item of items) {\n let parsedContent: any;\n let identifier: string;\n\n if (typeof item === 'string') {\n // File path\n if (!fs.existsSync(item)) {\n throw new Error(`File not found: ${item}`);\n }\n\n const content = fs.readFileSync(item, 'utf8');\n identifier = item;\n\n try {\n parsedContent = yaml.load(content);\n } catch (error) {\n throw new Error(`Invalid YAML in file ${item}: ${error instanceof Error ? error.message : String(error)}`);\n }\n } else {\n // Content object\n identifier = item.name || 'unknown content';\n\n try {\n parsedContent = yaml.load(item.content);\n } catch (error) {\n throw new Error(`Invalid YAML in ${identifier}: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n if (parsedContent !== null && typeof parsedContent === 'object') {\n result = this.deepMerge(result, parsedContent);\n }\n }\n\n return result;\n }\n\n /**\n * Deep merge two objects\n * Rules:\n * - Objects: merge properties, source overrides target\n * - Arrays: source replaces target\n * - Primitives: source overrides target\n */\n deepMerge(target: any, source: any): any {\n // If source is null/undefined, return target\n if (source === null || source === undefined) {\n return target;\n }\n\n // If target is null/undefined, return source\n if (target === null || target === undefined) {\n return source;\n }\n\n // If both are arrays, the later file replaces the earlier file\n if (Array.isArray(source) && Array.isArray(target)) {\n return source;\n }\n\n // If source is not an object (or is an array but target isn't), it replaces target\n if (typeof source !== 'object' || Array.isArray(source)) {\n return source;\n }\n\n // If target is not an object, source replaces it\n if (typeof target !== 'object' || Array.isArray(target)) {\n return source;\n }\n\n // Both are objects, merge them\n const result = { ...target };\n\n for (const key in source) {\n if (source.hasOwnProperty(key)) {\n if (key in result) {\n result[key] = this.deepMerge(result[key], source[key]);\n } else {\n result[key] = source[key];\n }\n }\n }\n\n return result;\n }\n}\n","import * as fs from 'fs';\nimport * as yaml from 'js-yaml';\nimport Ajv from 'ajv';\nimport addFormats from 'ajv-formats';\nimport { ValidationResult } from '../types/StitchTypes';\n\nexport class Validator {\n private ajv: Ajv;\n\n constructor() {\n this.ajv = new Ajv({ allErrors: true });\n addFormats(this.ajv);\n }\n\n /**\n * Validate YAML syntax\n */\n validateYamlSyntax(yamlString: string): ValidationResult {\n try {\n yaml.load(yamlString);\n return { valid: true };\n } catch (error) {\n return {\n valid: false,\n errors: [`Invalid YAML syntax: ${error instanceof Error ? error.message : String(error)}`]\n };\n }\n }\n\n /**\n * Validate against OpenAPI schema\n */\n validateOpenAPI(yamlContent: any, schemaPath?: string): ValidationResult {\n if (schemaPath) {\n return this.validateAgainstSchema(yamlContent, schemaPath);\n }\n\n // Basic OpenAPI structure validation\n const errors: string[] = [];\n\n if (!yamlContent || typeof yamlContent !== 'object') {\n errors.push('Content must be an object');\n } else {\n if (!yamlContent.openapi) {\n errors.push('Missing required \"openapi\" field');\n }\n if (!yamlContent.info) {\n errors.push('Missing required \"info\" field');\n }\n }\n\n return {\n valid: errors.length === 0,\n errors: errors.length > 0 ? errors : undefined\n };\n }\n\n /**\n * Validate against a JSON schema file\n */\n private validateAgainstSchema(content: any, schemaPath: string): ValidationResult {\n if (!fs.existsSync(schemaPath)) {\n return {\n valid: false,\n errors: [`Schema file not found: ${schemaPath}`]\n };\n }\n\n let schema: any;\n try {\n const schemaContent = fs.readFileSync(schemaPath, 'utf8');\n schema = JSON.parse(schemaContent);\n } catch (error) {\n return {\n valid: false,\n errors: [`Invalid schema file: ${error instanceof Error ? error.message : String(error)}`]\n };\n }\n\n const validate = this.ajv.compile(schema);\n const valid = validate(content);\n\n if (valid) {\n return { valid: true };\n }\n\n const errors = validate.errors?.map(err => \n `${err.instancePath || 'root'}: ${err.message}`\n ) || ['Unknown validation error'];\n\n return {\n valid: false,\n errors\n };\n }\n}","import * as yaml from 'js-yaml';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as chokidar from 'chokidar';\nimport { globSync } from 'glob';\nimport { ConfigParser } from './ConfigParser';\nimport { YamlMerger } from './YamlMerger';\nimport { Validator } from './Validator';\nimport { BuildOptions, WatchOptions, StitchResult, ContentItem, InstallOptions } from '../types/StitchTypes';\n\nexport class StitchEngine {\n private configParser = new ConfigParser();\n private yamlMerger = new YamlMerger();\n private validator = new Validator();\n\n /**\n * Build from a stitch configuration file (async)\n */\n async build(configPath: string, options: BuildOptions = {}): Promise<StitchResult> {\n try {\n // 1. Parse stitch.yaml config\n const config = this.configParser.parseConfig(configPath);\n const baseDir = this.configParser.getConfigDir(configPath);\n\n // 2. Expand globs to actual file paths\n const filePaths = await this.configParser.resolveFilePaths(config.stitch, baseDir);\n\n // 3. Load and merge YAML files\n const mergedContent = this.yamlMerger.mergeFiles(filePaths);\n\n // 4. Validate if requested\n if (options.validate) {\n const validationResult = typeof options.validate === 'string' \n ? this.validator.validateOpenAPI(mergedContent, options.validate)\n : this.validator.validateOpenAPI(mergedContent);\n\n if (!validationResult.valid) {\n return {\n success: false,\n error: `Validation failed: ${validationResult.errors?.join(', ')}`\n };\n }\n }\n\n // 5. Format output\n const format = options.format || 'yaml';\n let outputData = format === 'json' \n ? JSON.stringify(mergedContent, null, 2)\n : yaml.dump(mergedContent);\n\n // 6. Write to file or return data\n if (options.output) {\n // Add warning header for generated files\n const warning = format === 'json' \n ? '// THIS FILE IS AUTO-GENERATED by Stitch. DO NOT EDIT directly.\\n// Edit the source files and run stitch build instead.\\n\\n'\n : '# THIS FILE IS AUTO-GENERATED by Stitch. DO NOT EDIT directly.\\n# Edit the source files and run stitch build instead.\\n\\n';\n \n const finalOutput = warning + outputData;\n fs.writeFileSync(options.output, finalOutput, 'utf8');\n return {\n success: true,\n message: `Built successfully to ${options.output}`\n };\n } else {\n return {\n success: true,\n data: outputData\n };\n }\n\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n /**\n * Build from a stitch configuration file (sync)\n */\n buildSync(configPath: string, options: BuildOptions = {}): StitchResult {\n try {\n // 1. Parse stitch.yaml config\n const config = this.configParser.parseConfig(configPath);\n const baseDir = this.configParser.getConfigDir(configPath);\n\n // 2. Expand globs to actual file paths (sync version)\n const filePaths = this.resolveFilePathsSync(config.stitch, baseDir);\n\n // 3. Load and merge YAML files\n const mergedContent = this.yamlMerger.mergeFiles(filePaths);\n\n // 4. Validate if requested\n if (options.validate) {\n const validationResult = typeof options.validate === 'string' \n ? this.validator.validateOpenAPI(mergedContent, options.validate)\n : this.validator.validateOpenAPI(mergedContent);\n\n if (!validationResult.valid) {\n return {\n success: false,\n error: `Validation failed: ${validationResult.errors?.join(', ')}`\n };\n }\n }\n\n // 5. Format output\n const format = options.format || 'yaml';\n let outputData = format === 'json' \n ? JSON.stringify(mergedContent, null, 2)\n : yaml.dump(mergedContent);\n\n // 6. Write to file or return data\n if (options.output) {\n // Add warning header for generated files\n const warning = format === 'json' \n ? '// THIS FILE IS AUTO-GENERATED by Stitch. DO NOT EDIT directly.\\n// Edit the source files and run stitch build instead.\\n\\n'\n : '# THIS FILE IS AUTO-GENERATED by Stitch. DO NOT EDIT directly.\\n# Edit the source files and run stitch build instead.\\n\\n';\n \n const finalOutput = warning + outputData;\n fs.writeFileSync(options.output, finalOutput, 'utf8');\n return {\n success: true,\n message: `Built successfully to ${options.output}`\n };\n } else {\n return {\n success: true,\n data: outputData\n };\n }\n\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n /**\n * Watch mode - rebuild when files change\n */\n async watch(configPath: string, options: WatchOptions = {}): Promise<void> {\n console.log(`Watching ${configPath} for changes...`);\n\n // Initial build\n const initialResult = await this.build(configPath, options);\n if (initialResult.success) {\n if (!options.quiet) {\n console.log('Initial build completed');\n }\n } else {\n console.error(`Initial build failed: ${initialResult.error}`);\n }\n\n // Set up file watching\n const config = this.configParser.parseConfig(configPath);\n const baseDir = this.configParser.getConfigDir(configPath);\n const filePaths = await this.configParser.resolveFilePaths(config.stitch, baseDir);\n\n // Watch the config file and all source files\n const watchPaths = [configPath, ...filePaths];\n \n const watcher = chokidar.watch(watchPaths, {\n persistent: true,\n ignoreInitial: true\n });\n\n watcher.on('change', async (path) => {\n if (!options.quiet) {\n console.log(`File changed: ${path}`);\n }\n \n const result = await this.build(configPath, options);\n if (result.success) {\n if (!options.quiet) {\n console.log('Rebuild completed');\n }\n } else {\n console.error(`Rebuild failed: ${result.error}`);\n }\n });\n\n watcher.on('error', (error) => {\n console.error(`Watcher error: ${error}`);\n });\n\n // Keep the process alive\n process.on('SIGINT', () => {\n console.log('\\nStopping watcher...');\n watcher.close();\n process.exit(0);\n });\n }\n\n /**\n * Build from content directly (no file system access)\n */\n buildFromContent(contents: ContentItem[], options: Omit<BuildOptions, 'input'> = {}): StitchResult {\n try {\n // 1. Merge content directly\n const mergedContent = this.yamlMerger.mergeContent(contents);\n\n // 2. Validate if requested\n if (options.validate) {\n const validationResult = typeof options.validate === 'string' \n ? this.validator.validateOpenAPI(mergedContent, options.validate)\n : this.validator.validateOpenAPI(mergedContent);\n\n if (!validationResult.valid) {\n return {\n success: false,\n error: `Validation failed: ${validationResult.errors?.join(', ')}`\n };\n }\n }\n\n // 3. Format output\n const format = options.format || 'yaml';\n const outputData = format === 'json' \n ? JSON.stringify(mergedContent, null, 2)\n : yaml.dump(mergedContent);\n\n // 4. Write to file or return data\n if (options.output) {\n fs.writeFileSync(options.output, outputData, 'utf8');\n return {\n success: true,\n message: `Built successfully to ${options.output}`\n };\n } else {\n return {\n success: true,\n data: outputData\n };\n }\n\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n /**\n * Synchronous version of file path resolution for buildSync\n */\n private resolveFilePathsSync(patterns: string[], baseDir: string): string[] {\n const resolvedFiles: string[] = [];\n\n for (const pattern of patterns) {\n \n \n // Check if it's a glob pattern\n if (pattern.includes('*') || pattern.includes('?') || pattern.includes('[')) {\n const matches = globSync(pattern, {\n cwd: baseDir, \n absolute: true,\n nodir: true \n });\n // Sort alphabetically for consistent ordering\n matches.sort();\n resolvedFiles.push(...matches);\n } else {\n // Regular file path\n const fullPath = path.resolve(baseDir, pattern);\n if (fs.existsSync(fullPath)) {\n resolvedFiles.push(fullPath);\n } else {\n throw new Error(`File not found: ${pattern} (resolved to ${fullPath})`);\n }\n }\n }\n\n return resolvedFiles;\n }\n\n /**\n * Install JSON schema for VSCode YAML validation\n */\n install(options: InstallOptions): StitchResult {\n try {\n const { schemaPath, targets, vscodeSettingsPath } = options;\n\n // Resolve schema path to absolute\n const absoluteSchemaPath = fs.existsSync(schemaPath) ? \n path.resolve(schemaPath) : \n schemaPath;\n\n // Determine VSCode settings path\n const settingsPath = vscodeSettingsPath || \n path.join(process.cwd(), '.vscode', 'settings.json');\n\n // Ensure .vscode directory exists\n const vscodeDir = path.dirname(settingsPath);\n if (!fs.existsSync(vscodeDir)) {\n fs.mkdirSync(vscodeDir, { recursive: true });\n }\n\n // Read existing settings or create new\n let settings: any = {};\n if (fs.existsSync(settingsPath)) {\n try {\n const settingsContent = fs.readFileSync(settingsPath, 'utf8');\n settings = JSON.parse(settingsContent);\n } catch (error) {\n throw new Error(`Invalid JSON in VSCode settings file: ${settingsPath}`);\n }\n }\n\n // Initialize yaml.schemas if it doesn't exist\n if (!settings['yaml.schemas']) {\n settings['yaml.schemas'] = {};\n }\n\n // Convert absolute schema path to relative from workspace root\n const workspaceRoot = process.cwd();\n const relativeSchemaPath = path.relative(workspaceRoot, absoluteSchemaPath);\n\n // Add or update schema mapping\n settings['yaml.schemas'][relativeSchemaPath] = targets;\n\n // Write updated settings\n const settingsJson = JSON.stringify(settings, null, 2);\n fs.writeFileSync(settingsPath, settingsJson, 'utf8');\n\n return {\n success: true,\n message: `Schema installed successfully. VSCode will now validate:\\n${targets.join('\\n')} \\nagainst schema: ${relativeSchemaPath}`\n };\n\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n}","import minimist from \"minimist\";\n\nexport class StitchCLIFactory {\n /**\n * Parse command line arguments into commands and flags\n * @param argv Optional array of command line arguments. If not provided, process.argv will be used.\n * @returns Object containing parsed commands and flags\n */\n static setup(argv?: string[]): { commands: string[], flags: Record<string, any> } {\n // Use provided args or default to process.argv\n const args = argv || process.argv;\n \n // Determine where to start slicing the arguments\n // We need to handle different invocation patterns:\n // 1. node script.js command => skip 'node' and 'script.js' \n // 2. ./cli.js command => skip './cli.js'\n // 3. stitch command => skip 'stitch' (likely a symlink to the script)\n // 4. command arg1 arg2 => don't skip anything (direct command invocation)\n let startIndex = 0;\n \n // Check for node\n if (args[0]?.includes('node')) {\n startIndex = 2; // Skip 'node' and script name\n }\n // Check for script file extensions\n else if (args[0] && /\\.(js|ts|mjs|cjs)$/i.test(args[0])) {\n startIndex = 1; // Skip just the script name\n }\n // Check for command name that might be a symlink to this script\n else if (args[0] && ['stitch'].includes(args[0].toLowerCase())) {\n startIndex = 1; // Skip the command name\n }\n \n // Parse the arguments\n const cli = minimist(args.slice(startIndex), {\n alias: {\n c: 'config',\n h: 'help',\n v: 'version',\n o: 'output',\n f: 'format',\n q: 'quiet',\n t: 'target'\n },\n boolean: ['help', 'version', 'quiet']\n });\n\n const { _: commands, ...flags } = cli;\n\n return {\n commands,\n flags\n };\n }\n}","export { StitchEngine } from './core/StitchEngine';\nexport { ConfigParser } from './core/ConfigParser';\nexport { YamlMerger } from './core/YamlMerger';\nexport { Validator } from './core/Validator';\nexport { StitchCLIFactory } from './cli/StitchCLI';\nexport * from './types/StitchTypes';\n\n// Convenience functions for programmatic API\nimport { StitchEngine } from './core/StitchEngine';\nimport { BuildOptions, WatchOptions, ContentItem, InstallOptions } from './types/StitchTypes';\n\nexport const stitch = {\n build: async (options: BuildOptions) => {\n const engine = new StitchEngine();\n return engine.build(options.input || 'stitch.yaml', options);\n },\n \n buildSync: (options: BuildOptions) => {\n const engine = new StitchEngine();\n return engine.buildSync(options.input || 'stitch.yaml', options);\n },\n \n buildFromContent: (contents: ContentItem[], options: Omit<BuildOptions, 'input'> = {}) => {\n const engine = new StitchEngine();\n return engine.buildFromContent(contents, options);\n },\n \n watch: async (options: WatchOptions) => {\n const engine = new StitchEngine();\n return engine.watch(options.input || 'stitch.yaml', options);\n },\n \n install: (options: InstallOptions) => {\n const engine = new StitchEngine();\n return engine.install(options);\n }\n};"],"names":["fs","yaml","path","glob","chokidar","globSync","StitchEngine"],"mappings":"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"}
|
package/dist-ssr/server.js
CHANGED
|
@@ -140,7 +140,7 @@ class YamlMerger {
|
|
|
140
140
|
* Deep merge two objects
|
|
141
141
|
* Rules:
|
|
142
142
|
* - Objects: merge properties, source overrides target
|
|
143
|
-
* - Arrays:
|
|
143
|
+
* - Arrays: source replaces target
|
|
144
144
|
* - Primitives: source overrides target
|
|
145
145
|
*/
|
|
146
146
|
deepMerge(target, source) {
|
|
@@ -151,7 +151,7 @@ class YamlMerger {
|
|
|
151
151
|
return source;
|
|
152
152
|
}
|
|
153
153
|
if (Array.isArray(source) && Array.isArray(target)) {
|
|
154
|
-
return
|
|
154
|
+
return source;
|
|
155
155
|
}
|
|
156
156
|
if (typeof source !== "object" || Array.isArray(source)) {
|
|
157
157
|
return source;
|
package/dist-ssr/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sources":["../src/core/ConfigParser.ts","../src/core/YamlMerger.ts","../src/core/Validator.ts","../src/core/StitchEngine.ts","../src/cli/StitchCLI.ts","../src/index.ts"],"sourcesContent":["import * as fs from 'fs';\nimport * as path from 'path';\nimport * as yaml from 'js-yaml';\nimport { glob } from 'glob';\nimport { StitchConfig } from '../types/StitchTypes';\n\nexport class ConfigParser {\n /**\n * Parse a stitch.yaml configuration file\n */\n parseConfig(configPath: string): StitchConfig {\n if (!fs.existsSync(configPath)) {\n throw new Error(`Config file not found: ${configPath}`);\n }\n\n const configContent = fs.readFileSync(configPath, 'utf8');\n const config = yaml.load(configContent) as any;\n\n if (!config || typeof config !== 'object') {\n throw new Error(`Invalid config file: ${configPath}`);\n }\n\n if (!config.stitch || !Array.isArray(config.stitch)) {\n throw new Error(`Config file must contain a 'stitch' array: ${configPath}`);\n }\n\n return {\n stitch: config.stitch\n };\n }\n\n /**\n * Resolve file paths and expand globs relative to the config file directory\n */\n async resolveFilePaths(patterns: string[], baseDir: string): Promise<string[]> {\n const resolvedFiles: string[] = [];\n\n for (const pattern of patterns) {\n const fullPattern = path.resolve(baseDir, pattern);\n \n // Check if it's a glob pattern\n if (pattern.includes('*') || pattern.includes('?') || pattern.includes('[')) {\n const matches = await glob(fullPattern, { \n absolute: true,\n nodir: true \n });\n // Sort alphabetically for consistent ordering\n matches.sort();\n resolvedFiles.push(...matches);\n } else {\n // Regular file path\n const fullPath = path.resolve(baseDir, pattern);\n if (fs.existsSync(fullPath)) {\n resolvedFiles.push(fullPath);\n } else {\n throw new Error(`File not found: ${pattern} (resolved to ${fullPath})`);\n }\n }\n }\n\n return resolvedFiles;\n }\n\n /**\n * Get the directory containing the config file\n */\n getConfigDir(configPath: string): string {\n return path.dirname(path.resolve(configPath));\n }\n}","import * as fs from 'fs';\nimport * as yaml from 'js-yaml';\n\nexport class YamlMerger {\n /**\n * Merge multiple YAML files in order\n */\n mergeFiles(filePaths: string[]): any {\n let result = {};\n\n for (const filePath of filePaths) {\n if (!fs.existsSync(filePath)) {\n throw new Error(`File not found: ${filePath}`);\n }\n\n const content = fs.readFileSync(filePath, 'utf8');\n let parsedContent: any;\n\n try {\n parsedContent = yaml.load(content);\n } catch (error) {\n throw new Error(`Invalid YAML in file ${filePath}: ${error instanceof Error ? error.message : String(error)}`);\n }\n\n if (parsedContent !== null && typeof parsedContent === 'object') {\n result = this.deepMerge(result, parsedContent);\n }\n }\n\n return result;\n }\n\n /**\n * Merge multiple YAML content strings in order\n */\n mergeContent(contents: Array<{ content: string; name?: string }>): any {\n let result = {};\n\n for (const item of contents) {\n let parsedContent: any;\n\n try {\n parsedContent = yaml.load(item.content);\n } catch (error) {\n const name = item.name || 'unknown content';\n throw new Error(`Invalid YAML in ${name}: ${error instanceof Error ? error.message : String(error)}`);\n }\n\n if (parsedContent !== null && typeof parsedContent === 'object') {\n result = this.deepMerge(result, parsedContent);\n }\n }\n\n return result;\n }\n\n /**\n * Merge mixed items (files and content) in order\n */\n merge(items: Array<string | { content: string; name?: string }>): any {\n let result = {};\n\n for (const item of items) {\n let parsedContent: any;\n let identifier: string;\n\n if (typeof item === 'string') {\n // File path\n if (!fs.existsSync(item)) {\n throw new Error(`File not found: ${item}`);\n }\n\n const content = fs.readFileSync(item, 'utf8');\n identifier = item;\n\n try {\n parsedContent = yaml.load(content);\n } catch (error) {\n throw new Error(`Invalid YAML in file ${item}: ${error instanceof Error ? error.message : String(error)}`);\n }\n } else {\n // Content object\n identifier = item.name || 'unknown content';\n\n try {\n parsedContent = yaml.load(item.content);\n } catch (error) {\n throw new Error(`Invalid YAML in ${identifier}: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n if (parsedContent !== null && typeof parsedContent === 'object') {\n result = this.deepMerge(result, parsedContent);\n }\n }\n\n return result;\n }\n\n /**\n * Deep merge two objects\n * Rules:\n * - Objects: merge properties, source overrides target\n * - Arrays: concatenate (target first, then source)\n * - Primitives: source overrides target\n */\n deepMerge(target: any, source: any): any {\n // If source is null/undefined, return target\n if (source === null || source === undefined) {\n return target;\n }\n\n // If target is null/undefined, return source\n if (target === null || target === undefined) {\n return source;\n }\n\n // If both are arrays, concatenate them\n if (Array.isArray(source) && Array.isArray(target)) {\n return [...target, ...source];\n }\n\n // If source is not an object (or is an array but target isn't), it replaces target\n if (typeof source !== 'object' || Array.isArray(source)) {\n return source;\n }\n\n // If target is not an object, source replaces it\n if (typeof target !== 'object' || Array.isArray(target)) {\n return source;\n }\n\n // Both are objects, merge them\n const result = { ...target };\n\n for (const key in source) {\n if (source.hasOwnProperty(key)) {\n if (key in result) {\n result[key] = this.deepMerge(result[key], source[key]);\n } else {\n result[key] = source[key];\n }\n }\n }\n\n return result;\n }\n}","import * as fs from 'fs';\nimport * as yaml from 'js-yaml';\nimport Ajv from 'ajv';\nimport addFormats from 'ajv-formats';\nimport { ValidationResult } from '../types/StitchTypes';\n\nexport class Validator {\n private ajv: Ajv;\n\n constructor() {\n this.ajv = new Ajv({ allErrors: true });\n addFormats(this.ajv);\n }\n\n /**\n * Validate YAML syntax\n */\n validateYamlSyntax(yamlString: string): ValidationResult {\n try {\n yaml.load(yamlString);\n return { valid: true };\n } catch (error) {\n return {\n valid: false,\n errors: [`Invalid YAML syntax: ${error instanceof Error ? error.message : String(error)}`]\n };\n }\n }\n\n /**\n * Validate against OpenAPI schema\n */\n validateOpenAPI(yamlContent: any, schemaPath?: string): ValidationResult {\n if (schemaPath) {\n return this.validateAgainstSchema(yamlContent, schemaPath);\n }\n\n // Basic OpenAPI structure validation\n const errors: string[] = [];\n\n if (!yamlContent || typeof yamlContent !== 'object') {\n errors.push('Content must be an object');\n } else {\n if (!yamlContent.openapi) {\n errors.push('Missing required \"openapi\" field');\n }\n if (!yamlContent.info) {\n errors.push('Missing required \"info\" field');\n }\n }\n\n return {\n valid: errors.length === 0,\n errors: errors.length > 0 ? errors : undefined\n };\n }\n\n /**\n * Validate against a JSON schema file\n */\n private validateAgainstSchema(content: any, schemaPath: string): ValidationResult {\n if (!fs.existsSync(schemaPath)) {\n return {\n valid: false,\n errors: [`Schema file not found: ${schemaPath}`]\n };\n }\n\n let schema: any;\n try {\n const schemaContent = fs.readFileSync(schemaPath, 'utf8');\n schema = JSON.parse(schemaContent);\n } catch (error) {\n return {\n valid: false,\n errors: [`Invalid schema file: ${error instanceof Error ? error.message : String(error)}`]\n };\n }\n\n const validate = this.ajv.compile(schema);\n const valid = validate(content);\n\n if (valid) {\n return { valid: true };\n }\n\n const errors = validate.errors?.map(err => \n `${err.instancePath || 'root'}: ${err.message}`\n ) || ['Unknown validation error'];\n\n return {\n valid: false,\n errors\n };\n }\n}","import * as yaml from 'js-yaml';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as chokidar from 'chokidar';\nimport { globSync } from 'glob';\nimport { ConfigParser } from './ConfigParser';\nimport { YamlMerger } from './YamlMerger';\nimport { Validator } from './Validator';\nimport { BuildOptions, WatchOptions, StitchResult, ContentItem, InstallOptions } from '../types/StitchTypes';\n\nexport class StitchEngine {\n private configParser = new ConfigParser();\n private yamlMerger = new YamlMerger();\n private validator = new Validator();\n\n /**\n * Build from a stitch configuration file (async)\n */\n async build(configPath: string, options: BuildOptions = {}): Promise<StitchResult> {\n try {\n // 1. Parse stitch.yaml config\n const config = this.configParser.parseConfig(configPath);\n const baseDir = this.configParser.getConfigDir(configPath);\n\n // 2. Expand globs to actual file paths\n const filePaths = await this.configParser.resolveFilePaths(config.stitch, baseDir);\n\n // 3. Load and merge YAML files\n const mergedContent = this.yamlMerger.mergeFiles(filePaths);\n\n // 4. Validate if requested\n if (options.validate) {\n const validationResult = typeof options.validate === 'string' \n ? this.validator.validateOpenAPI(mergedContent, options.validate)\n : this.validator.validateOpenAPI(mergedContent);\n\n if (!validationResult.valid) {\n return {\n success: false,\n error: `Validation failed: ${validationResult.errors?.join(', ')}`\n };\n }\n }\n\n // 5. Format output\n const format = options.format || 'yaml';\n let outputData = format === 'json' \n ? JSON.stringify(mergedContent, null, 2)\n : yaml.dump(mergedContent);\n\n // 6. Write to file or return data\n if (options.output) {\n // Add warning header for generated files\n const warning = format === 'json' \n ? '// THIS FILE IS AUTO-GENERATED by Stitch. DO NOT EDIT directly.\\n// Edit the source files and run stitch build instead.\\n\\n'\n : '# THIS FILE IS AUTO-GENERATED by Stitch. DO NOT EDIT directly.\\n# Edit the source files and run stitch build instead.\\n\\n';\n \n const finalOutput = warning + outputData;\n fs.writeFileSync(options.output, finalOutput, 'utf8');\n return {\n success: true,\n message: `Built successfully to ${options.output}`\n };\n } else {\n return {\n success: true,\n data: outputData\n };\n }\n\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n /**\n * Build from a stitch configuration file (sync)\n */\n buildSync(configPath: string, options: BuildOptions = {}): StitchResult {\n try {\n // 1. Parse stitch.yaml config\n const config = this.configParser.parseConfig(configPath);\n const baseDir = this.configParser.getConfigDir(configPath);\n\n // 2. Expand globs to actual file paths (sync version)\n const filePaths = this.resolveFilePathsSync(config.stitch, baseDir);\n\n // 3. Load and merge YAML files\n const mergedContent = this.yamlMerger.mergeFiles(filePaths);\n\n // 4. Validate if requested\n if (options.validate) {\n const validationResult = typeof options.validate === 'string' \n ? this.validator.validateOpenAPI(mergedContent, options.validate)\n : this.validator.validateOpenAPI(mergedContent);\n\n if (!validationResult.valid) {\n return {\n success: false,\n error: `Validation failed: ${validationResult.errors?.join(', ')}`\n };\n }\n }\n\n // 5. Format output\n const format = options.format || 'yaml';\n let outputData = format === 'json' \n ? JSON.stringify(mergedContent, null, 2)\n : yaml.dump(mergedContent);\n\n // 6. Write to file or return data\n if (options.output) {\n // Add warning header for generated files\n const warning = format === 'json' \n ? '// THIS FILE IS AUTO-GENERATED by Stitch. DO NOT EDIT directly.\\n// Edit the source files and run stitch build instead.\\n\\n'\n : '# THIS FILE IS AUTO-GENERATED by Stitch. DO NOT EDIT directly.\\n# Edit the source files and run stitch build instead.\\n\\n';\n \n const finalOutput = warning + outputData;\n fs.writeFileSync(options.output, finalOutput, 'utf8');\n return {\n success: true,\n message: `Built successfully to ${options.output}`\n };\n } else {\n return {\n success: true,\n data: outputData\n };\n }\n\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n /**\n * Watch mode - rebuild when files change\n */\n async watch(configPath: string, options: WatchOptions = {}): Promise<void> {\n console.log(`Watching ${configPath} for changes...`);\n\n // Initial build\n const initialResult = await this.build(configPath, options);\n if (initialResult.success) {\n if (!options.quiet) {\n console.log('Initial build completed');\n }\n } else {\n console.error(`Initial build failed: ${initialResult.error}`);\n }\n\n // Set up file watching\n const config = this.configParser.parseConfig(configPath);\n const baseDir = this.configParser.getConfigDir(configPath);\n const filePaths = await this.configParser.resolveFilePaths(config.stitch, baseDir);\n\n // Watch the config file and all source files\n const watchPaths = [configPath, ...filePaths];\n \n const watcher = chokidar.watch(watchPaths, {\n persistent: true,\n ignoreInitial: true\n });\n\n watcher.on('change', async (path) => {\n if (!options.quiet) {\n console.log(`File changed: ${path}`);\n }\n \n const result = await this.build(configPath, options);\n if (result.success) {\n if (!options.quiet) {\n console.log('Rebuild completed');\n }\n } else {\n console.error(`Rebuild failed: ${result.error}`);\n }\n });\n\n watcher.on('error', (error) => {\n console.error(`Watcher error: ${error}`);\n });\n\n // Keep the process alive\n process.on('SIGINT', () => {\n console.log('\\nStopping watcher...');\n watcher.close();\n process.exit(0);\n });\n }\n\n /**\n * Build from content directly (no file system access)\n */\n buildFromContent(contents: ContentItem[], options: Omit<BuildOptions, 'input'> = {}): StitchResult {\n try {\n // 1. Merge content directly\n const mergedContent = this.yamlMerger.mergeContent(contents);\n\n // 2. Validate if requested\n if (options.validate) {\n const validationResult = typeof options.validate === 'string' \n ? this.validator.validateOpenAPI(mergedContent, options.validate)\n : this.validator.validateOpenAPI(mergedContent);\n\n if (!validationResult.valid) {\n return {\n success: false,\n error: `Validation failed: ${validationResult.errors?.join(', ')}`\n };\n }\n }\n\n // 3. Format output\n const format = options.format || 'yaml';\n const outputData = format === 'json' \n ? JSON.stringify(mergedContent, null, 2)\n : yaml.dump(mergedContent);\n\n // 4. Write to file or return data\n if (options.output) {\n fs.writeFileSync(options.output, outputData, 'utf8');\n return {\n success: true,\n message: `Built successfully to ${options.output}`\n };\n } else {\n return {\n success: true,\n data: outputData\n };\n }\n\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n /**\n * Synchronous version of file path resolution for buildSync\n */\n private resolveFilePathsSync(patterns: string[], baseDir: string): string[] {\n const resolvedFiles: string[] = [];\n\n for (const pattern of patterns) {\n \n \n // Check if it's a glob pattern\n if (pattern.includes('*') || pattern.includes('?') || pattern.includes('[')) {\n const matches = globSync(pattern, {\n cwd: baseDir, \n absolute: true,\n nodir: true \n });\n // Sort alphabetically for consistent ordering\n matches.sort();\n resolvedFiles.push(...matches);\n } else {\n // Regular file path\n const fullPath = path.resolve(baseDir, pattern);\n if (fs.existsSync(fullPath)) {\n resolvedFiles.push(fullPath);\n } else {\n throw new Error(`File not found: ${pattern} (resolved to ${fullPath})`);\n }\n }\n }\n\n return resolvedFiles;\n }\n\n /**\n * Install JSON schema for VSCode YAML validation\n */\n install(options: InstallOptions): StitchResult {\n try {\n const { schemaPath, targets, vscodeSettingsPath } = options;\n\n // Resolve schema path to absolute\n const absoluteSchemaPath = fs.existsSync(schemaPath) ? \n path.resolve(schemaPath) : \n schemaPath;\n\n // Determine VSCode settings path\n const settingsPath = vscodeSettingsPath || \n path.join(process.cwd(), '.vscode', 'settings.json');\n\n // Ensure .vscode directory exists\n const vscodeDir = path.dirname(settingsPath);\n if (!fs.existsSync(vscodeDir)) {\n fs.mkdirSync(vscodeDir, { recursive: true });\n }\n\n // Read existing settings or create new\n let settings: any = {};\n if (fs.existsSync(settingsPath)) {\n try {\n const settingsContent = fs.readFileSync(settingsPath, 'utf8');\n settings = JSON.parse(settingsContent);\n } catch (error) {\n throw new Error(`Invalid JSON in VSCode settings file: ${settingsPath}`);\n }\n }\n\n // Initialize yaml.schemas if it doesn't exist\n if (!settings['yaml.schemas']) {\n settings['yaml.schemas'] = {};\n }\n\n // Convert absolute schema path to relative from workspace root\n const workspaceRoot = process.cwd();\n const relativeSchemaPath = path.relative(workspaceRoot, absoluteSchemaPath);\n\n // Add or update schema mapping\n settings['yaml.schemas'][relativeSchemaPath] = targets;\n\n // Write updated settings\n const settingsJson = JSON.stringify(settings, null, 2);\n fs.writeFileSync(settingsPath, settingsJson, 'utf8');\n\n return {\n success: true,\n message: `Schema installed successfully. VSCode will now validate:\\n${targets.join('\\n')} \\nagainst schema: ${relativeSchemaPath}`\n };\n\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n}","import minimist from \"minimist\";\n\nexport class StitchCLIFactory {\n /**\n * Parse command line arguments into commands and flags\n * @param argv Optional array of command line arguments. If not provided, process.argv will be used.\n * @returns Object containing parsed commands and flags\n */\n static setup(argv?: string[]): { commands: string[], flags: Record<string, any> } {\n // Use provided args or default to process.argv\n const args = argv || process.argv;\n \n // Determine where to start slicing the arguments\n // We need to handle different invocation patterns:\n // 1. node script.js command => skip 'node' and 'script.js' \n // 2. ./cli.js command => skip './cli.js'\n // 3. stitch command => skip 'stitch' (likely a symlink to the script)\n // 4. command arg1 arg2 => don't skip anything (direct command invocation)\n let startIndex = 0;\n \n // Check for node\n if (args[0]?.includes('node')) {\n startIndex = 2; // Skip 'node' and script name\n }\n // Check for script file extensions\n else if (args[0] && /\\.(js|ts|mjs|cjs)$/i.test(args[0])) {\n startIndex = 1; // Skip just the script name\n }\n // Check for command name that might be a symlink to this script\n else if (args[0] && ['stitch'].includes(args[0].toLowerCase())) {\n startIndex = 1; // Skip the command name\n }\n \n // Parse the arguments\n const cli = minimist(args.slice(startIndex), {\n alias: {\n c: 'config',\n h: 'help',\n v: 'version',\n o: 'output',\n f: 'format',\n q: 'quiet',\n t: 'target'\n },\n boolean: ['help', 'version', 'quiet']\n });\n\n const { _: commands, ...flags } = cli;\n\n return {\n commands,\n flags\n };\n }\n}","export { StitchEngine } from './core/StitchEngine';\nexport { ConfigParser } from './core/ConfigParser';\nexport { YamlMerger } from './core/YamlMerger';\nexport { Validator } from './core/Validator';\nexport { StitchCLIFactory } from './cli/StitchCLI';\nexport * from './types/StitchTypes';\n\n// Convenience functions for programmatic API\nimport { StitchEngine } from './core/StitchEngine';\nimport { BuildOptions, WatchOptions, ContentItem, InstallOptions } from './types/StitchTypes';\n\nexport const stitch = {\n build: async (options: BuildOptions) => {\n const engine = new StitchEngine();\n return engine.build(options.input || 'stitch.yaml', options);\n },\n \n buildSync: (options: BuildOptions) => {\n const engine = new StitchEngine();\n return engine.buildSync(options.input || 'stitch.yaml', options);\n },\n \n buildFromContent: (contents: ContentItem[], options: Omit<BuildOptions, 'input'> = {}) => {\n const engine = new StitchEngine();\n return engine.buildFromContent(contents, options);\n },\n \n watch: async (options: WatchOptions) => {\n const engine = new StitchEngine();\n return engine.watch(options.input || 'stitch.yaml', options);\n },\n \n install: (options: InstallOptions) => {\n const engine = new StitchEngine();\n return engine.install(options);\n }\n};"],"names":["path","StitchEngine"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"server.js","sources":["../src/core/ConfigParser.ts","../src/core/YamlMerger.ts","../src/core/Validator.ts","../src/core/StitchEngine.ts","../src/cli/StitchCLI.ts","../src/index.ts"],"sourcesContent":["import * as fs from 'fs';\nimport * as path from 'path';\nimport * as yaml from 'js-yaml';\nimport { glob } from 'glob';\nimport { StitchConfig } from '../types/StitchTypes';\n\nexport class ConfigParser {\n /**\n * Parse a stitch.yaml configuration file\n */\n parseConfig(configPath: string): StitchConfig {\n if (!fs.existsSync(configPath)) {\n throw new Error(`Config file not found: ${configPath}`);\n }\n\n const configContent = fs.readFileSync(configPath, 'utf8');\n const config = yaml.load(configContent) as any;\n\n if (!config || typeof config !== 'object') {\n throw new Error(`Invalid config file: ${configPath}`);\n }\n\n if (!config.stitch || !Array.isArray(config.stitch)) {\n throw new Error(`Config file must contain a 'stitch' array: ${configPath}`);\n }\n\n return {\n stitch: config.stitch\n };\n }\n\n /**\n * Resolve file paths and expand globs relative to the config file directory\n */\n async resolveFilePaths(patterns: string[], baseDir: string): Promise<string[]> {\n const resolvedFiles: string[] = [];\n\n for (const pattern of patterns) {\n const fullPattern = path.resolve(baseDir, pattern);\n \n // Check if it's a glob pattern\n if (pattern.includes('*') || pattern.includes('?') || pattern.includes('[')) {\n const matches = await glob(fullPattern, { \n absolute: true,\n nodir: true \n });\n // Sort alphabetically for consistent ordering\n matches.sort();\n resolvedFiles.push(...matches);\n } else {\n // Regular file path\n const fullPath = path.resolve(baseDir, pattern);\n if (fs.existsSync(fullPath)) {\n resolvedFiles.push(fullPath);\n } else {\n throw new Error(`File not found: ${pattern} (resolved to ${fullPath})`);\n }\n }\n }\n\n return resolvedFiles;\n }\n\n /**\n * Get the directory containing the config file\n */\n getConfigDir(configPath: string): string {\n return path.dirname(path.resolve(configPath));\n }\n}","import * as fs from 'fs';\nimport * as yaml from 'js-yaml';\n\nexport class YamlMerger {\n /**\n * Merge multiple YAML files in order\n */\n mergeFiles(filePaths: string[]): any {\n let result = {};\n\n for (const filePath of filePaths) {\n if (!fs.existsSync(filePath)) {\n throw new Error(`File not found: ${filePath}`);\n }\n\n const content = fs.readFileSync(filePath, 'utf8');\n let parsedContent: any;\n\n try {\n parsedContent = yaml.load(content);\n } catch (error) {\n throw new Error(`Invalid YAML in file ${filePath}: ${error instanceof Error ? error.message : String(error)}`);\n }\n\n if (parsedContent !== null && typeof parsedContent === 'object') {\n result = this.deepMerge(result, parsedContent);\n }\n }\n\n return result;\n }\n\n /**\n * Merge multiple YAML content strings in order\n */\n mergeContent(contents: Array<{ content: string; name?: string }>): any {\n let result = {};\n\n for (const item of contents) {\n let parsedContent: any;\n\n try {\n parsedContent = yaml.load(item.content);\n } catch (error) {\n const name = item.name || 'unknown content';\n throw new Error(`Invalid YAML in ${name}: ${error instanceof Error ? error.message : String(error)}`);\n }\n\n if (parsedContent !== null && typeof parsedContent === 'object') {\n result = this.deepMerge(result, parsedContent);\n }\n }\n\n return result;\n }\n\n /**\n * Merge mixed items (files and content) in order\n */\n merge(items: Array<string | { content: string; name?: string }>): any {\n let result = {};\n\n for (const item of items) {\n let parsedContent: any;\n let identifier: string;\n\n if (typeof item === 'string') {\n // File path\n if (!fs.existsSync(item)) {\n throw new Error(`File not found: ${item}`);\n }\n\n const content = fs.readFileSync(item, 'utf8');\n identifier = item;\n\n try {\n parsedContent = yaml.load(content);\n } catch (error) {\n throw new Error(`Invalid YAML in file ${item}: ${error instanceof Error ? error.message : String(error)}`);\n }\n } else {\n // Content object\n identifier = item.name || 'unknown content';\n\n try {\n parsedContent = yaml.load(item.content);\n } catch (error) {\n throw new Error(`Invalid YAML in ${identifier}: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n if (parsedContent !== null && typeof parsedContent === 'object') {\n result = this.deepMerge(result, parsedContent);\n }\n }\n\n return result;\n }\n\n /**\n * Deep merge two objects\n * Rules:\n * - Objects: merge properties, source overrides target\n * - Arrays: source replaces target\n * - Primitives: source overrides target\n */\n deepMerge(target: any, source: any): any {\n // If source is null/undefined, return target\n if (source === null || source === undefined) {\n return target;\n }\n\n // If target is null/undefined, return source\n if (target === null || target === undefined) {\n return source;\n }\n\n // If both are arrays, the later file replaces the earlier file\n if (Array.isArray(source) && Array.isArray(target)) {\n return source;\n }\n\n // If source is not an object (or is an array but target isn't), it replaces target\n if (typeof source !== 'object' || Array.isArray(source)) {\n return source;\n }\n\n // If target is not an object, source replaces it\n if (typeof target !== 'object' || Array.isArray(target)) {\n return source;\n }\n\n // Both are objects, merge them\n const result = { ...target };\n\n for (const key in source) {\n if (source.hasOwnProperty(key)) {\n if (key in result) {\n result[key] = this.deepMerge(result[key], source[key]);\n } else {\n result[key] = source[key];\n }\n }\n }\n\n return result;\n }\n}\n","import * as fs from 'fs';\nimport * as yaml from 'js-yaml';\nimport Ajv from 'ajv';\nimport addFormats from 'ajv-formats';\nimport { ValidationResult } from '../types/StitchTypes';\n\nexport class Validator {\n private ajv: Ajv;\n\n constructor() {\n this.ajv = new Ajv({ allErrors: true });\n addFormats(this.ajv);\n }\n\n /**\n * Validate YAML syntax\n */\n validateYamlSyntax(yamlString: string): ValidationResult {\n try {\n yaml.load(yamlString);\n return { valid: true };\n } catch (error) {\n return {\n valid: false,\n errors: [`Invalid YAML syntax: ${error instanceof Error ? error.message : String(error)}`]\n };\n }\n }\n\n /**\n * Validate against OpenAPI schema\n */\n validateOpenAPI(yamlContent: any, schemaPath?: string): ValidationResult {\n if (schemaPath) {\n return this.validateAgainstSchema(yamlContent, schemaPath);\n }\n\n // Basic OpenAPI structure validation\n const errors: string[] = [];\n\n if (!yamlContent || typeof yamlContent !== 'object') {\n errors.push('Content must be an object');\n } else {\n if (!yamlContent.openapi) {\n errors.push('Missing required \"openapi\" field');\n }\n if (!yamlContent.info) {\n errors.push('Missing required \"info\" field');\n }\n }\n\n return {\n valid: errors.length === 0,\n errors: errors.length > 0 ? errors : undefined\n };\n }\n\n /**\n * Validate against a JSON schema file\n */\n private validateAgainstSchema(content: any, schemaPath: string): ValidationResult {\n if (!fs.existsSync(schemaPath)) {\n return {\n valid: false,\n errors: [`Schema file not found: ${schemaPath}`]\n };\n }\n\n let schema: any;\n try {\n const schemaContent = fs.readFileSync(schemaPath, 'utf8');\n schema = JSON.parse(schemaContent);\n } catch (error) {\n return {\n valid: false,\n errors: [`Invalid schema file: ${error instanceof Error ? error.message : String(error)}`]\n };\n }\n\n const validate = this.ajv.compile(schema);\n const valid = validate(content);\n\n if (valid) {\n return { valid: true };\n }\n\n const errors = validate.errors?.map(err => \n `${err.instancePath || 'root'}: ${err.message}`\n ) || ['Unknown validation error'];\n\n return {\n valid: false,\n errors\n };\n }\n}","import * as yaml from 'js-yaml';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as chokidar from 'chokidar';\nimport { globSync } from 'glob';\nimport { ConfigParser } from './ConfigParser';\nimport { YamlMerger } from './YamlMerger';\nimport { Validator } from './Validator';\nimport { BuildOptions, WatchOptions, StitchResult, ContentItem, InstallOptions } from '../types/StitchTypes';\n\nexport class StitchEngine {\n private configParser = new ConfigParser();\n private yamlMerger = new YamlMerger();\n private validator = new Validator();\n\n /**\n * Build from a stitch configuration file (async)\n */\n async build(configPath: string, options: BuildOptions = {}): Promise<StitchResult> {\n try {\n // 1. Parse stitch.yaml config\n const config = this.configParser.parseConfig(configPath);\n const baseDir = this.configParser.getConfigDir(configPath);\n\n // 2. Expand globs to actual file paths\n const filePaths = await this.configParser.resolveFilePaths(config.stitch, baseDir);\n\n // 3. Load and merge YAML files\n const mergedContent = this.yamlMerger.mergeFiles(filePaths);\n\n // 4. Validate if requested\n if (options.validate) {\n const validationResult = typeof options.validate === 'string' \n ? this.validator.validateOpenAPI(mergedContent, options.validate)\n : this.validator.validateOpenAPI(mergedContent);\n\n if (!validationResult.valid) {\n return {\n success: false,\n error: `Validation failed: ${validationResult.errors?.join(', ')}`\n };\n }\n }\n\n // 5. Format output\n const format = options.format || 'yaml';\n let outputData = format === 'json' \n ? JSON.stringify(mergedContent, null, 2)\n : yaml.dump(mergedContent);\n\n // 6. Write to file or return data\n if (options.output) {\n // Add warning header for generated files\n const warning = format === 'json' \n ? '// THIS FILE IS AUTO-GENERATED by Stitch. DO NOT EDIT directly.\\n// Edit the source files and run stitch build instead.\\n\\n'\n : '# THIS FILE IS AUTO-GENERATED by Stitch. DO NOT EDIT directly.\\n# Edit the source files and run stitch build instead.\\n\\n';\n \n const finalOutput = warning + outputData;\n fs.writeFileSync(options.output, finalOutput, 'utf8');\n return {\n success: true,\n message: `Built successfully to ${options.output}`\n };\n } else {\n return {\n success: true,\n data: outputData\n };\n }\n\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n /**\n * Build from a stitch configuration file (sync)\n */\n buildSync(configPath: string, options: BuildOptions = {}): StitchResult {\n try {\n // 1. Parse stitch.yaml config\n const config = this.configParser.parseConfig(configPath);\n const baseDir = this.configParser.getConfigDir(configPath);\n\n // 2. Expand globs to actual file paths (sync version)\n const filePaths = this.resolveFilePathsSync(config.stitch, baseDir);\n\n // 3. Load and merge YAML files\n const mergedContent = this.yamlMerger.mergeFiles(filePaths);\n\n // 4. Validate if requested\n if (options.validate) {\n const validationResult = typeof options.validate === 'string' \n ? this.validator.validateOpenAPI(mergedContent, options.validate)\n : this.validator.validateOpenAPI(mergedContent);\n\n if (!validationResult.valid) {\n return {\n success: false,\n error: `Validation failed: ${validationResult.errors?.join(', ')}`\n };\n }\n }\n\n // 5. Format output\n const format = options.format || 'yaml';\n let outputData = format === 'json' \n ? JSON.stringify(mergedContent, null, 2)\n : yaml.dump(mergedContent);\n\n // 6. Write to file or return data\n if (options.output) {\n // Add warning header for generated files\n const warning = format === 'json' \n ? '// THIS FILE IS AUTO-GENERATED by Stitch. DO NOT EDIT directly.\\n// Edit the source files and run stitch build instead.\\n\\n'\n : '# THIS FILE IS AUTO-GENERATED by Stitch. DO NOT EDIT directly.\\n# Edit the source files and run stitch build instead.\\n\\n';\n \n const finalOutput = warning + outputData;\n fs.writeFileSync(options.output, finalOutput, 'utf8');\n return {\n success: true,\n message: `Built successfully to ${options.output}`\n };\n } else {\n return {\n success: true,\n data: outputData\n };\n }\n\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n /**\n * Watch mode - rebuild when files change\n */\n async watch(configPath: string, options: WatchOptions = {}): Promise<void> {\n console.log(`Watching ${configPath} for changes...`);\n\n // Initial build\n const initialResult = await this.build(configPath, options);\n if (initialResult.success) {\n if (!options.quiet) {\n console.log('Initial build completed');\n }\n } else {\n console.error(`Initial build failed: ${initialResult.error}`);\n }\n\n // Set up file watching\n const config = this.configParser.parseConfig(configPath);\n const baseDir = this.configParser.getConfigDir(configPath);\n const filePaths = await this.configParser.resolveFilePaths(config.stitch, baseDir);\n\n // Watch the config file and all source files\n const watchPaths = [configPath, ...filePaths];\n \n const watcher = chokidar.watch(watchPaths, {\n persistent: true,\n ignoreInitial: true\n });\n\n watcher.on('change', async (path) => {\n if (!options.quiet) {\n console.log(`File changed: ${path}`);\n }\n \n const result = await this.build(configPath, options);\n if (result.success) {\n if (!options.quiet) {\n console.log('Rebuild completed');\n }\n } else {\n console.error(`Rebuild failed: ${result.error}`);\n }\n });\n\n watcher.on('error', (error) => {\n console.error(`Watcher error: ${error}`);\n });\n\n // Keep the process alive\n process.on('SIGINT', () => {\n console.log('\\nStopping watcher...');\n watcher.close();\n process.exit(0);\n });\n }\n\n /**\n * Build from content directly (no file system access)\n */\n buildFromContent(contents: ContentItem[], options: Omit<BuildOptions, 'input'> = {}): StitchResult {\n try {\n // 1. Merge content directly\n const mergedContent = this.yamlMerger.mergeContent(contents);\n\n // 2. Validate if requested\n if (options.validate) {\n const validationResult = typeof options.validate === 'string' \n ? this.validator.validateOpenAPI(mergedContent, options.validate)\n : this.validator.validateOpenAPI(mergedContent);\n\n if (!validationResult.valid) {\n return {\n success: false,\n error: `Validation failed: ${validationResult.errors?.join(', ')}`\n };\n }\n }\n\n // 3. Format output\n const format = options.format || 'yaml';\n const outputData = format === 'json' \n ? JSON.stringify(mergedContent, null, 2)\n : yaml.dump(mergedContent);\n\n // 4. Write to file or return data\n if (options.output) {\n fs.writeFileSync(options.output, outputData, 'utf8');\n return {\n success: true,\n message: `Built successfully to ${options.output}`\n };\n } else {\n return {\n success: true,\n data: outputData\n };\n }\n\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n /**\n * Synchronous version of file path resolution for buildSync\n */\n private resolveFilePathsSync(patterns: string[], baseDir: string): string[] {\n const resolvedFiles: string[] = [];\n\n for (const pattern of patterns) {\n \n \n // Check if it's a glob pattern\n if (pattern.includes('*') || pattern.includes('?') || pattern.includes('[')) {\n const matches = globSync(pattern, {\n cwd: baseDir, \n absolute: true,\n nodir: true \n });\n // Sort alphabetically for consistent ordering\n matches.sort();\n resolvedFiles.push(...matches);\n } else {\n // Regular file path\n const fullPath = path.resolve(baseDir, pattern);\n if (fs.existsSync(fullPath)) {\n resolvedFiles.push(fullPath);\n } else {\n throw new Error(`File not found: ${pattern} (resolved to ${fullPath})`);\n }\n }\n }\n\n return resolvedFiles;\n }\n\n /**\n * Install JSON schema for VSCode YAML validation\n */\n install(options: InstallOptions): StitchResult {\n try {\n const { schemaPath, targets, vscodeSettingsPath } = options;\n\n // Resolve schema path to absolute\n const absoluteSchemaPath = fs.existsSync(schemaPath) ? \n path.resolve(schemaPath) : \n schemaPath;\n\n // Determine VSCode settings path\n const settingsPath = vscodeSettingsPath || \n path.join(process.cwd(), '.vscode', 'settings.json');\n\n // Ensure .vscode directory exists\n const vscodeDir = path.dirname(settingsPath);\n if (!fs.existsSync(vscodeDir)) {\n fs.mkdirSync(vscodeDir, { recursive: true });\n }\n\n // Read existing settings or create new\n let settings: any = {};\n if (fs.existsSync(settingsPath)) {\n try {\n const settingsContent = fs.readFileSync(settingsPath, 'utf8');\n settings = JSON.parse(settingsContent);\n } catch (error) {\n throw new Error(`Invalid JSON in VSCode settings file: ${settingsPath}`);\n }\n }\n\n // Initialize yaml.schemas if it doesn't exist\n if (!settings['yaml.schemas']) {\n settings['yaml.schemas'] = {};\n }\n\n // Convert absolute schema path to relative from workspace root\n const workspaceRoot = process.cwd();\n const relativeSchemaPath = path.relative(workspaceRoot, absoluteSchemaPath);\n\n // Add or update schema mapping\n settings['yaml.schemas'][relativeSchemaPath] = targets;\n\n // Write updated settings\n const settingsJson = JSON.stringify(settings, null, 2);\n fs.writeFileSync(settingsPath, settingsJson, 'utf8');\n\n return {\n success: true,\n message: `Schema installed successfully. VSCode will now validate:\\n${targets.join('\\n')} \\nagainst schema: ${relativeSchemaPath}`\n };\n\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n}","import minimist from \"minimist\";\n\nexport class StitchCLIFactory {\n /**\n * Parse command line arguments into commands and flags\n * @param argv Optional array of command line arguments. If not provided, process.argv will be used.\n * @returns Object containing parsed commands and flags\n */\n static setup(argv?: string[]): { commands: string[], flags: Record<string, any> } {\n // Use provided args or default to process.argv\n const args = argv || process.argv;\n \n // Determine where to start slicing the arguments\n // We need to handle different invocation patterns:\n // 1. node script.js command => skip 'node' and 'script.js' \n // 2. ./cli.js command => skip './cli.js'\n // 3. stitch command => skip 'stitch' (likely a symlink to the script)\n // 4. command arg1 arg2 => don't skip anything (direct command invocation)\n let startIndex = 0;\n \n // Check for node\n if (args[0]?.includes('node')) {\n startIndex = 2; // Skip 'node' and script name\n }\n // Check for script file extensions\n else if (args[0] && /\\.(js|ts|mjs|cjs)$/i.test(args[0])) {\n startIndex = 1; // Skip just the script name\n }\n // Check for command name that might be a symlink to this script\n else if (args[0] && ['stitch'].includes(args[0].toLowerCase())) {\n startIndex = 1; // Skip the command name\n }\n \n // Parse the arguments\n const cli = minimist(args.slice(startIndex), {\n alias: {\n c: 'config',\n h: 'help',\n v: 'version',\n o: 'output',\n f: 'format',\n q: 'quiet',\n t: 'target'\n },\n boolean: ['help', 'version', 'quiet']\n });\n\n const { _: commands, ...flags } = cli;\n\n return {\n commands,\n flags\n };\n }\n}","export { StitchEngine } from './core/StitchEngine';\nexport { ConfigParser } from './core/ConfigParser';\nexport { YamlMerger } from './core/YamlMerger';\nexport { Validator } from './core/Validator';\nexport { StitchCLIFactory } from './cli/StitchCLI';\nexport * from './types/StitchTypes';\n\n// Convenience functions for programmatic API\nimport { StitchEngine } from './core/StitchEngine';\nimport { BuildOptions, WatchOptions, ContentItem, InstallOptions } from './types/StitchTypes';\n\nexport const stitch = {\n build: async (options: BuildOptions) => {\n const engine = new StitchEngine();\n return engine.build(options.input || 'stitch.yaml', options);\n },\n \n buildSync: (options: BuildOptions) => {\n const engine = new StitchEngine();\n return engine.buildSync(options.input || 'stitch.yaml', options);\n },\n \n buildFromContent: (contents: ContentItem[], options: Omit<BuildOptions, 'input'> = {}) => {\n const engine = new StitchEngine();\n return engine.buildFromContent(contents, options);\n },\n \n watch: async (options: WatchOptions) => {\n const engine = new StitchEngine();\n return engine.watch(options.input || 'stitch.yaml', options);\n },\n \n install: (options: InstallOptions) => {\n const engine = new StitchEngine();\n return engine.install(options);\n }\n};"],"names":["path","StitchEngine"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@noego/stitch",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "",
|
|
5
5
|
"license": "ISC",
|
|
6
6
|
"author": "",
|
|
@@ -42,6 +42,7 @@
|
|
|
42
42
|
},
|
|
43
43
|
"types": "./dist-ssr/server.d.ts",
|
|
44
44
|
"dependencies": {
|
|
45
|
+
"@noego/proper": "^0.3.0",
|
|
45
46
|
"ajv": "^8.17.1",
|
|
46
47
|
"ajv-formats": "^3.0.1",
|
|
47
48
|
"chokidar": "^3.5.3",
|