@noego/stitch 1.0.1 → 1.0.2

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 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||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 d(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 c(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 p(r){const e=Object.keys(r).sort();return c(e,r)}function a(r){return new s().mergeContent(r)}function y(r){const e=r.map((t,o)=>({content:t,name:`content-${o}`}));return a(e)}exports.YamlMerger=s;exports.stitchFromContent=a;exports.stitchFromOrderedViteImports=c;exports.stitchFromRawContent=y;exports.stitchFromSortedViteImports=p;exports.stitchFromViteImports=d;
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)return t;if(Array.isArray(t)&&Array.isArray(e))return[...e,...t];if(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
@@ -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: source replaces target completely\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 source is not an object, 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 { 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,EAcT,GAVIA,GAAW,MAKX,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,CChEA,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"}
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: 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 { 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,EAIL,GAAAA,GAAW,KACN,OAAAC,EAIT,GAAI,MAAM,QAAQA,CAAM,GAAK,MAAM,QAAQD,CAAM,EAC/C,MAAO,CAAC,GAAGA,EAAQ,GAAGC,CAAM,EAS9B,GALI,OAAOA,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
@@ -3,74 +3,78 @@ class s {
3
3
  /**
4
4
  * Merge multiple YAML content strings in order
5
5
  */
6
- mergeContent(e) {
7
- let t = {};
8
- for (const r of e) {
9
- let n;
6
+ mergeContent(t) {
7
+ let n = {};
8
+ for (const r of t) {
9
+ let e;
10
10
  try {
11
- n = m.load(r.content);
11
+ e = m.load(r.content);
12
12
  } catch (i) {
13
13
  const a = r.name || "unknown content";
14
14
  throw new Error(`Invalid YAML in ${a}: ${i instanceof Error ? i.message : String(i)}`);
15
15
  }
16
- n !== null && typeof n == "object" && (t = this.deepMerge(t, n));
16
+ e !== null && typeof e == "object" && (n = this.deepMerge(n, e));
17
17
  }
18
- return t;
18
+ return n;
19
19
  }
20
20
  /**
21
21
  * Deep merge two objects
22
22
  * Rules:
23
23
  * - Objects: merge properties, source overrides target
24
- * - Arrays: source replaces target completely
24
+ * - Arrays: concatenate (target first, then source)
25
25
  * - Primitives: source overrides target
26
26
  */
27
- deepMerge(e, t) {
28
- if (t == null)
29
- return e;
30
- if (e == null || typeof t != "object" || Array.isArray(t) || typeof e != "object" || Array.isArray(e))
27
+ deepMerge(t, n) {
28
+ if (n == null)
31
29
  return t;
32
- const r = { ...e };
33
- for (const n in t)
34
- t.hasOwnProperty(n) && (n in r ? r[n] = this.deepMerge(r[n], t[n]) : r[n] = t[n]);
30
+ if (t == null)
31
+ return n;
32
+ if (Array.isArray(n) && Array.isArray(t))
33
+ return [...t, ...n];
34
+ if (typeof n != "object" || Array.isArray(n) || typeof t != "object" || Array.isArray(t))
35
+ return n;
36
+ const r = { ...t };
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]);
35
39
  return r;
36
40
  }
37
41
  }
38
42
  async function l(o) {
39
- const e = await Promise.all(
40
- Object.entries(o).map(async ([r, n]) => ({
41
- content: (await n()).default,
43
+ const t = await Promise.all(
44
+ Object.entries(o).map(async ([r, e]) => ({
45
+ content: (await e()).default,
42
46
  name: r
43
47
  }))
44
48
  );
45
- return new s().mergeContent(e);
49
+ return new s().mergeContent(t);
46
50
  }
47
- async function c(o, e) {
48
- const t = await Promise.all(
49
- o.map(async (n) => {
50
- const i = e[n];
51
+ async function c(o, t) {
52
+ const n = await Promise.all(
53
+ o.map(async (e) => {
54
+ const i = t[e];
51
55
  if (!i)
52
- throw new Error(`Import not found for path: ${n}`);
56
+ throw new Error(`Import not found for path: ${e}`);
53
57
  return {
54
58
  content: (await i()).default,
55
- name: n
59
+ name: e
56
60
  };
57
61
  })
58
62
  );
59
- return new s().mergeContent(t);
63
+ return new s().mergeContent(n);
60
64
  }
61
65
  async function y(o) {
62
- const e = Object.keys(o).sort();
63
- return c(e, o);
66
+ const t = Object.keys(o).sort();
67
+ return c(t, o);
64
68
  }
65
69
  function f(o) {
66
70
  return new s().mergeContent(o);
67
71
  }
68
72
  function p(o) {
69
- const e = o.map((t, r) => ({
70
- content: t,
73
+ const t = o.map((n, r) => ({
74
+ content: n,
71
75
  name: `content-${r}`
72
76
  }));
73
- return f(e);
77
+ return f(t);
74
78
  }
75
79
  export {
76
80
  s as YamlMerger,
@@ -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: source replaces target completely\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 source is not an object, 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 { 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;AAcT,QAVIA,KAAW,QAKX,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;AChEA,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;"}
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: 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 { 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;AAIL,QAAAA,KAAW;AACN,aAAAC;AAIT,QAAI,MAAM,QAAQA,CAAM,KAAK,MAAM,QAAQD,CAAM;AAC/C,aAAO,CAAC,GAAGA,GAAQ,GAAGC,CAAM;AAS9B,QALI,OAAOA,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;"}
@@ -1 +1 @@
1
- {"version":3,"file":"StitchEngine.d.ts","sourceRoot":"","sources":["../../src/core/StitchEngine.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE7G,qBAAa,YAAY;IACvB,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,UAAU,CAAoB;IACtC,OAAO,CAAC,SAAS,CAAmB;IAEpC;;OAEG;IACG,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,YAAY,CAAC;IA4DlF;;OAEG;IACH,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,YAAY;IA4DvE;;OAEG;IACG,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAqD1E;;OAEG;IACH,gBAAgB,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,OAAO,GAAE,IAAI,CAAC,YAAY,EAAE,OAAO,CAAM,GAAG,YAAY;IA+ClG;;OAEG;IACH,OAAO,CAAC,oBAAoB;IA6B5B;;OAEG;IACH,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,YAAY;CA0D/C"}
1
+ {"version":3,"file":"StitchEngine.d.ts","sourceRoot":"","sources":["../../src/core/StitchEngine.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE7G,qBAAa,YAAY;IACvB,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,UAAU,CAAoB;IACtC,OAAO,CAAC,SAAS,CAAmB;IAEpC;;OAEG;IACG,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,YAAY,CAAC;IA4DlF;;OAEG;IACH,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,YAAY;IA4DvE;;OAEG;IACG,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAqD1E;;OAEG;IACH,gBAAgB,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,OAAO,GAAE,IAAI,CAAC,YAAY,EAAE,OAAO,CAAM,GAAG,YAAY;IA+ClG;;OAEG;IACH,OAAO,CAAC,oBAAoB;IA8B5B;;OAEG;IACH,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,YAAY;CA0D/C"}
@@ -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: source replaces target completely
24
+ * - Arrays: concatenate (target first, then source)
25
25
  * - Primitives: source overrides target
26
26
  */
27
27
  deepMerge(target: any, source: any): any;
@@ -1 +1 @@
1
- {"version":3,"file":"YamlMerger.d.ts","sourceRoot":"","sources":["../../src/core/YamlMerger.ts"],"names":[],"mappings":"AAGA,qBAAa,UAAU;IACrB;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,GAAG;IAyBpC;;OAEG;IACH,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,GAAG;IAqBtE;;OAEG;IACH,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,GAAG;IAwCrE;;;;;;OAMG;IACH,SAAS,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,GAAG,GAAG;CAoCzC"}
1
+ {"version":3,"file":"YamlMerger.d.ts","sourceRoot":"","sources":["../../src/core/YamlMerger.ts"],"names":[],"mappings":"AAGA,qBAAa,UAAU;IACrB;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,GAAG;IAyBpC;;OAEG;IACH,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,GAAG;IAqBtE;;OAEG;IACH,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,GAAG;IAwCrE;;;;;;OAMG;IACH,SAAS,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,GAAG,GAAG;CAyCzC"}
@@ -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: source replaces target completely
13
+ * - Arrays: concatenate (target first, then source)
14
14
  * - Primitives: source overrides target
15
15
  */
16
16
  deepMerge(target: any, source: any): any;
@@ -1 +1 @@
1
- {"version":3,"file":"YamlMergerBrowser.d.ts","sourceRoot":"","sources":["../../src/core/YamlMergerBrowser.ts"],"names":[],"mappings":"AAEA,qBAAa,UAAU;IACrB;;OAEG;IACH,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,GAAG;IAqBtE;;;;;;OAMG;IACH,SAAS,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,GAAG,GAAG;CAoCzC"}
1
+ {"version":3,"file":"YamlMergerBrowser.d.ts","sourceRoot":"","sources":["../../src/core/YamlMergerBrowser.ts"],"names":[],"mappings":"AAEA,qBAAa,UAAU;IACrB;;OAEG;IACH,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,GAAG;IAqBtE;;;;;;OAMG;IACH,SAAS,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,GAAG,GAAG;CAyCzC"}
@@ -1 +1 @@
1
- {"version":3,"file":"StitchEngine.d.ts","sourceRoot":"","sources":["../../src/core/StitchEngine.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE7G,qBAAa,YAAY;IACvB,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,UAAU,CAAoB;IACtC,OAAO,CAAC,SAAS,CAAmB;IAEpC;;OAEG;IACG,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,YAAY,CAAC;IA4DlF;;OAEG;IACH,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,YAAY;IA4DvE;;OAEG;IACG,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAqD1E;;OAEG;IACH,gBAAgB,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,OAAO,GAAE,IAAI,CAAC,YAAY,EAAE,OAAO,CAAM,GAAG,YAAY;IA+ClG;;OAEG;IACH,OAAO,CAAC,oBAAoB;IA6B5B;;OAEG;IACH,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,YAAY;CA0D/C"}
1
+ {"version":3,"file":"StitchEngine.d.ts","sourceRoot":"","sources":["../../src/core/StitchEngine.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE7G,qBAAa,YAAY;IACvB,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,UAAU,CAAoB;IACtC,OAAO,CAAC,SAAS,CAAmB;IAEpC;;OAEG;IACG,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,YAAY,CAAC;IA4DlF;;OAEG;IACH,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,YAAY;IA4DvE;;OAEG;IACG,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAqD1E;;OAEG;IACH,gBAAgB,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,OAAO,GAAE,IAAI,CAAC,YAAY,EAAE,OAAO,CAAM,GAAG,YAAY;IA+ClG;;OAEG;IACH,OAAO,CAAC,oBAAoB;IA8B5B;;OAEG;IACH,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,YAAY;CA0D/C"}
@@ -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: source replaces target completely
24
+ * - Arrays: concatenate (target first, then source)
25
25
  * - Primitives: source overrides target
26
26
  */
27
27
  deepMerge(target: any, source: any): any;
@@ -1 +1 @@
1
- {"version":3,"file":"YamlMerger.d.ts","sourceRoot":"","sources":["../../src/core/YamlMerger.ts"],"names":[],"mappings":"AAGA,qBAAa,UAAU;IACrB;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,GAAG;IAyBpC;;OAEG;IACH,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,GAAG;IAqBtE;;OAEG;IACH,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,GAAG;IAwCrE;;;;;;OAMG;IACH,SAAS,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,GAAG,GAAG;CAoCzC"}
1
+ {"version":3,"file":"YamlMerger.d.ts","sourceRoot":"","sources":["../../src/core/YamlMerger.ts"],"names":[],"mappings":"AAGA,qBAAa,UAAU;IACrB;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,GAAG;IAyBpC;;OAEG;IACH,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,GAAG;IAqBtE;;OAEG;IACH,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,GAAG;IAwCrE;;;;;;OAMG;IACH,SAAS,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,GAAG,GAAG;CAyCzC"}
@@ -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: source replaces target completely
13
+ * - Arrays: concatenate (target first, then source)
14
14
  * - Primitives: source overrides target
15
15
  */
16
16
  deepMerge(target: any, source: any): any;
@@ -1 +1 @@
1
- {"version":3,"file":"YamlMergerBrowser.d.ts","sourceRoot":"","sources":["../../src/core/YamlMergerBrowser.ts"],"names":[],"mappings":"AAEA,qBAAa,UAAU;IACrB;;OAEG;IACH,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,GAAG;IAqBtE;;;;;;OAMG;IACH,SAAS,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,GAAG,GAAG;CAoCzC"}
1
+ {"version":3,"file":"YamlMergerBrowser.d.ts","sourceRoot":"","sources":["../../src/core/YamlMergerBrowser.ts"],"names":[],"mappings":"AAEA,qBAAa,UAAU;IACrB;;OAEG;IACH,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,GAAG;IAqBtE;;;;;;OAMG;IACH,SAAS,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,GAAG,GAAG;CAyCzC"}
@@ -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: source replaces target completely
165
+ * - Arrays: concatenate (target first, then source)
166
166
  * - Primitives: source overrides target
167
167
  */
168
168
  deepMerge(target, source) {
@@ -172,6 +172,9 @@ class YamlMerger {
172
172
  if (target === null || target === void 0) {
173
173
  return source;
174
174
  }
175
+ if (Array.isArray(source) && Array.isArray(target)) {
176
+ return [...target, ...source];
177
+ }
175
178
  if (typeof source !== "object" || Array.isArray(source)) {
176
179
  return source;
177
180
  }
@@ -445,9 +448,9 @@ class StitchEngine {
445
448
  resolveFilePathsSync(patterns, baseDir) {
446
449
  const resolvedFiles = [];
447
450
  for (const pattern of patterns) {
448
- const fullPattern = path__namespace.resolve(baseDir, pattern);
449
451
  if (pattern.includes("*") || pattern.includes("?") || pattern.includes("[")) {
450
- const matches = glob.globSync(fullPattern, {
452
+ const matches = glob.globSync(pattern, {
453
+ cwd: baseDir,
451
454
  absolute: true,
452
455
  nodir: true
453
456
  });
@@ -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: source replaces target completely\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 source is not an object, 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 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 = globSync(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 * 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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMO,MAAM,aAAa;AAAA;AAAA;AAAA;AAAA,EAIxB,YAAY,YAAkC;AAC5C,QAAI,CAACA,cAAG,WAAW,UAAU,GAAG;AAC9B,YAAM,IAAI,MAAM,0BAA0B,UAAU,EAAE;AAAA,IAAA;AAGxD,UAAM,gBAAgBA,cAAG,aAAa,YAAY,MAAM;AAClD,UAAA,SAASC,gBAAK,KAAK,aAAa;AAEtC,QAAI,CAAC,UAAU,OAAO,WAAW,UAAU;AACzC,YAAM,IAAI,MAAM,wBAAwB,UAAU,EAAE;AAAA,IAAA;AAGlD,QAAA,CAAC,OAAO,UAAU,CAAC,MAAM,QAAQ,OAAO,MAAM,GAAG;AACnD,YAAM,IAAI,MAAM,8CAA8C,UAAU,EAAE;AAAA,IAAA;AAGrE,WAAA;AAAA,MACL,QAAQ,OAAO;AAAA,IACjB;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAMF,MAAM,iBAAiB,UAAoB,SAAoC;AAC7E,UAAM,gBAA0B,CAAC;AAEjC,eAAW,WAAW,UAAU;AAC9B,YAAM,cAAcC,gBAAK,QAAQ,SAAS,OAAO;AAG7C,UAAA,QAAQ,SAAS,GAAG,KAAK,QAAQ,SAAS,GAAG,KAAK,QAAQ,SAAS,GAAG,GAAG;AACrE,cAAA,UAAU,MAAMC,KAAA,KAAK,aAAa;AAAA,UACtC,UAAU;AAAA,UACV,OAAO;AAAA,QAAA,CACR;AAED,gBAAQ,KAAK;AACC,sBAAA,KAAK,GAAG,OAAO;AAAA,MAAA,OACxB;AAEL,cAAM,WAAWD,gBAAK,QAAQ,SAAS,OAAO;AAC1C,YAAAF,cAAG,WAAW,QAAQ,GAAG;AAC3B,wBAAc,KAAK,QAAQ;AAAA,QAAA,OACtB;AACL,gBAAM,IAAI,MAAM,mBAAmB,OAAO,iBAAiB,QAAQ,GAAG;AAAA,QAAA;AAAA,MACxE;AAAA,IACF;AAGK,WAAA;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAMT,aAAa,YAA4B;AACvC,WAAOE,gBAAK,QAAQA,gBAAK,QAAQ,UAAU,CAAC;AAAA,EAAA;AAEhD;AClEO,MAAM,WAAW;AAAA;AAAA;AAAA;AAAA,EAItB,WAAW,WAA0B;AACnC,QAAI,SAAS,CAAC;AAEd,eAAW,YAAY,WAAW;AAChC,UAAI,CAACF,cAAG,WAAW,QAAQ,GAAG;AAC5B,cAAM,IAAI,MAAM,mBAAmB,QAAQ,EAAE;AAAA,MAAA;AAG/C,YAAM,UAAUA,cAAG,aAAa,UAAU,MAAM;AAC5C,UAAA;AAEA,UAAA;AACc,wBAAAC,gBAAK,KAAK,OAAO;AAAA,eAC1B,OAAO;AACd,cAAM,IAAI,MAAM,wBAAwB,QAAQ,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAAA,MAAA;AAG/G,UAAI,kBAAkB,QAAQ,OAAO,kBAAkB,UAAU;AACtD,iBAAA,KAAK,UAAU,QAAQ,aAAa;AAAA,MAAA;AAAA,IAC/C;AAGK,WAAA;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAMT,aAAa,UAA0D;AACrE,QAAI,SAAS,CAAC;AAEd,eAAW,QAAQ,UAAU;AACvB,UAAA;AAEA,UAAA;AACc,wBAAAA,gBAAK,KAAK,KAAK,OAAO;AAAA,eAC/B,OAAO;AACR,cAAA,OAAO,KAAK,QAAQ;AAC1B,cAAM,IAAI,MAAM,mBAAmB,IAAI,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAAA,MAAA;AAGtG,UAAI,kBAAkB,QAAQ,OAAO,kBAAkB,UAAU;AACtD,iBAAA,KAAK,UAAU,QAAQ,aAAa;AAAA,MAAA;AAAA,IAC/C;AAGK,WAAA;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAMT,MAAM,OAAgE;AACpE,QAAI,SAAS,CAAC;AAEd,eAAW,QAAQ,OAAO;AACpB,UAAA;AACA,UAAA;AAEA,UAAA,OAAO,SAAS,UAAU;AAE5B,YAAI,CAACD,cAAG,WAAW,IAAI,GAAG;AACxB,gBAAM,IAAI,MAAM,mBAAmB,IAAI,EAAE;AAAA,QAAA;AAG3C,cAAM,UAAUA,cAAG,aAAa,MAAM,MAAM;AAC/B,qBAAA;AAET,YAAA;AACc,0BAAAC,gBAAK,KAAK,OAAO;AAAA,iBAC1B,OAAO;AACd,gBAAM,IAAI,MAAM,wBAAwB,IAAI,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAAA,QAAA;AAAA,MAC3G,OACK;AAEL,qBAAa,KAAK,QAAQ;AAEtB,YAAA;AACc,0BAAAA,gBAAK,KAAK,KAAK,OAAO;AAAA,iBAC/B,OAAO;AACd,gBAAM,IAAI,MAAM,mBAAmB,UAAU,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAAA,QAAA;AAAA,MAC5G;AAGF,UAAI,kBAAkB,QAAQ,OAAO,kBAAkB,UAAU;AACtD,iBAAA,KAAK,UAAU,QAAQ,aAAa;AAAA,MAAA;AAAA,IAC/C;AAGK,WAAA;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUT,UAAU,QAAa,QAAkB;AAEnC,QAAA,WAAW,QAAQ,WAAW,QAAW;AACpC,aAAA;AAAA,IAAA;AAIL,QAAA,WAAW,QAAQ,WAAW,QAAW;AACpC,aAAA;AAAA,IAAA;AAIT,QAAI,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,GAAG;AAChD,aAAA;AAAA,IAAA;AAIT,QAAI,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,GAAG;AAChD,aAAA;AAAA,IAAA;AAIH,UAAA,SAAS,EAAE,GAAG,OAAO;AAE3B,eAAW,OAAO,QAAQ;AACpB,UAAA,OAAO,eAAe,GAAG,GAAG;AAC9B,YAAI,OAAO,QAAQ;AACV,iBAAA,GAAG,IAAI,KAAK,UAAU,OAAO,GAAG,GAAG,OAAO,GAAG,CAAC;AAAA,QAAA,OAChD;AACE,iBAAA,GAAG,IAAI,OAAO,GAAG;AAAA,QAAA;AAAA,MAC1B;AAAA,IACF;AAGK,WAAA;AAAA,EAAA;AAEX;ACxIO,MAAM,UAAU;AAAA,EAGrB,cAAc;AAFN;AAGN,SAAK,MAAM,IAAI,IAAI,EAAE,WAAW,MAAM;AACtC,eAAW,KAAK,GAAG;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAMrB,mBAAmB,YAAsC;AACnD,QAAA;AACFA,sBAAK,KAAK,UAAU;AACb,aAAA,EAAE,OAAO,KAAK;AAAA,aACd,OAAO;AACP,aAAA;AAAA,QACL,OAAO;AAAA,QACP,QAAQ,CAAC,wBAAwB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAAA,MAC3F;AAAA,IAAA;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMF,gBAAgB,aAAkB,YAAuC;AACvE,QAAI,YAAY;AACP,aAAA,KAAK,sBAAsB,aAAa,UAAU;AAAA,IAAA;AAI3D,UAAM,SAAmB,CAAC;AAE1B,QAAI,CAAC,eAAe,OAAO,gBAAgB,UAAU;AACnD,aAAO,KAAK,2BAA2B;AAAA,IAAA,OAClC;AACD,UAAA,CAAC,YAAY,SAAS;AACxB,eAAO,KAAK,kCAAkC;AAAA,MAAA;AAE5C,UAAA,CAAC,YAAY,MAAM;AACrB,eAAO,KAAK,+BAA+B;AAAA,MAAA;AAAA,IAC7C;AAGK,WAAA;AAAA,MACL,OAAO,OAAO,WAAW;AAAA,MACzB,QAAQ,OAAO,SAAS,IAAI,SAAS;AAAA,IACvC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAMM,sBAAsB,SAAc,YAAsC;;AAChF,QAAI,CAACD,cAAG,WAAW,UAAU,GAAG;AACvB,aAAA;AAAA,QACL,OAAO;AAAA,QACP,QAAQ,CAAC,0BAA0B,UAAU,EAAE;AAAA,MACjD;AAAA,IAAA;AAGE,QAAA;AACA,QAAA;AACF,YAAM,gBAAgBA,cAAG,aAAa,YAAY,MAAM;AAC/C,eAAA,KAAK,MAAM,aAAa;AAAA,aAC1B,OAAO;AACP,aAAA;AAAA,QACL,OAAO;AAAA,QACP,QAAQ,CAAC,wBAAwB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAAA,MAC3F;AAAA,IAAA;AAGF,UAAM,WAAW,KAAK,IAAI,QAAQ,MAAM;AAClC,UAAA,QAAQ,SAAS,OAAO;AAE9B,QAAI,OAAO;AACF,aAAA,EAAE,OAAO,KAAK;AAAA,IAAA;AAGjB,UAAA,WAAS,cAAS,WAAT,mBAAiB;AAAA,MAAI,SAClC,GAAG,IAAI,gBAAgB,MAAM,KAAK,IAAI,OAAO;AAAA,UAC1C,CAAC,0BAA0B;AAEzB,WAAA;AAAA,MACL,OAAO;AAAA,MACP;AAAA,IACF;AAAA,EAAA;AAEJ;ACrFO,MAAM,aAAa;AAAA,EAAnB;AACG,wCAAe,IAAI,aAAa;AAChC,sCAAa,IAAI,WAAW;AAC5B,qCAAY,IAAI,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA,EAKlC,MAAM,MAAM,YAAoB,UAAwB,IAA2B;;AAC7E,QAAA;AAEF,YAAM,SAAS,KAAK,aAAa,YAAY,UAAU;AACvD,YAAM,UAAU,KAAK,aAAa,aAAa,UAAU;AAGzD,YAAM,YAAY,MAAM,KAAK,aAAa,iBAAiB,OAAO,QAAQ,OAAO;AAGjF,YAAM,gBAAgB,KAAK,WAAW,WAAW,SAAS;AAG1D,UAAI,QAAQ,UAAU;AACpB,cAAM,mBAAmB,OAAO,QAAQ,aAAa,WACjD,KAAK,UAAU,gBAAgB,eAAe,QAAQ,QAAQ,IAC9D,KAAK,UAAU,gBAAgB,aAAa;AAE5C,YAAA,CAAC,iBAAiB,OAAO;AACpB,iBAAA;AAAA,YACL,SAAS;AAAA,YACT,OAAO,uBAAsB,sBAAiB,WAAjB,mBAAyB,KAAK,KAAK;AAAA,UAClE;AAAA,QAAA;AAAA,MACF;AAII,YAAA,SAAS,QAAQ,UAAU;AAC7B,UAAA,aAAa,WAAW,SACxB,KAAK,UAAU,eAAe,MAAM,CAAC,IACrCC,gBAAK,KAAK,aAAa;AAG3B,UAAI,QAAQ,QAAQ;AAEZ,cAAA,UAAU,WAAW,SACvB,gIACA;AAEJ,cAAM,cAAc,UAAU;AAC9BD,sBAAG,cAAc,QAAQ,QAAQ,aAAa,MAAM;AAC7C,eAAA;AAAA,UACL,SAAS;AAAA,UACT,SAAS,yBAAyB,QAAQ,MAAM;AAAA,QAClD;AAAA,MAAA,OACK;AACE,eAAA;AAAA,UACL,SAAS;AAAA,UACT,MAAM;AAAA,QACR;AAAA,MAAA;AAAA,aAGK,OAAO;AACP,aAAA;AAAA,QACL,SAAS;AAAA,QACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC9D;AAAA,IAAA;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMF,UAAU,YAAoB,UAAwB,IAAkB;;AAClE,QAAA;AAEF,YAAM,SAAS,KAAK,aAAa,YAAY,UAAU;AACvD,YAAM,UAAU,KAAK,aAAa,aAAa,UAAU;AAGzD,YAAM,YAAY,KAAK,qBAAqB,OAAO,QAAQ,OAAO;AAGlE,YAAM,gBAAgB,KAAK,WAAW,WAAW,SAAS;AAG1D,UAAI,QAAQ,UAAU;AACpB,cAAM,mBAAmB,OAAO,QAAQ,aAAa,WACjD,KAAK,UAAU,gBAAgB,eAAe,QAAQ,QAAQ,IAC9D,KAAK,UAAU,gBAAgB,aAAa;AAE5C,YAAA,CAAC,iBAAiB,OAAO;AACpB,iBAAA;AAAA,YACL,SAAS;AAAA,YACT,OAAO,uBAAsB,sBAAiB,WAAjB,mBAAyB,KAAK,KAAK;AAAA,UAClE;AAAA,QAAA;AAAA,MACF;AAII,YAAA,SAAS,QAAQ,UAAU;AAC7B,UAAA,aAAa,WAAW,SACxB,KAAK,UAAU,eAAe,MAAM,CAAC,IACrCC,gBAAK,KAAK,aAAa;AAG3B,UAAI,QAAQ,QAAQ;AAEZ,cAAA,UAAU,WAAW,SACvB,gIACA;AAEJ,cAAM,cAAc,UAAU;AAC9BD,sBAAG,cAAc,QAAQ,QAAQ,aAAa,MAAM;AAC7C,eAAA;AAAA,UACL,SAAS;AAAA,UACT,SAAS,yBAAyB,QAAQ,MAAM;AAAA,QAClD;AAAA,MAAA,OACK;AACE,eAAA;AAAA,UACL,SAAS;AAAA,UACT,MAAM;AAAA,QACR;AAAA,MAAA;AAAA,aAGK,OAAO;AACP,aAAA;AAAA,QACL,SAAS;AAAA,QACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC9D;AAAA,IAAA;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMF,MAAM,MAAM,YAAoB,UAAwB,IAAmB;AACjE,YAAA,IAAI,YAAY,UAAU,iBAAiB;AAGnD,UAAM,gBAAgB,MAAM,KAAK,MAAM,YAAY,OAAO;AAC1D,QAAI,cAAc,SAAS;AACrB,UAAA,CAAC,QAAQ,OAAO;AAClB,gBAAQ,IAAI,yBAAyB;AAAA,MAAA;AAAA,IACvC,OACK;AACL,cAAQ,MAAM,yBAAyB,cAAc,KAAK,EAAE;AAAA,IAAA;AAI9D,UAAM,SAAS,KAAK,aAAa,YAAY,UAAU;AACvD,UAAM,UAAU,KAAK,aAAa,aAAa,UAAU;AACzD,UAAM,YAAY,MAAM,KAAK,aAAa,iBAAiB,OAAO,QAAQ,OAAO;AAGjF,UAAM,aAAa,CAAC,YAAY,GAAG,SAAS;AAEtC,UAAA,UAAUI,oBAAS,MAAM,YAAY;AAAA,MACzC,YAAY;AAAA,MACZ,eAAe;AAAA,IAAA,CAChB;AAEO,YAAA,GAAG,UAAU,OAAOF,UAAS;AAC/B,UAAA,CAAC,QAAQ,OAAO;AACV,gBAAA,IAAI,iBAAiBA,KAAI,EAAE;AAAA,MAAA;AAGrC,YAAM,SAAS,MAAM,KAAK,MAAM,YAAY,OAAO;AACnD,UAAI,OAAO,SAAS;AACd,YAAA,CAAC,QAAQ,OAAO;AAClB,kBAAQ,IAAI,mBAAmB;AAAA,QAAA;AAAA,MACjC,OACK;AACL,gBAAQ,MAAM,mBAAmB,OAAO,KAAK,EAAE;AAAA,MAAA;AAAA,IACjD,CACD;AAEO,YAAA,GAAG,SAAS,CAAC,UAAU;AACrB,cAAA,MAAM,kBAAkB,KAAK,EAAE;AAAA,IAAA,CACxC;AAGO,YAAA,GAAG,UAAU,MAAM;AACzB,cAAQ,IAAI,uBAAuB;AACnC,cAAQ,MAAM;AACd,cAAQ,KAAK,CAAC;AAAA,IAAA,CACf;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAMH,iBAAiB,UAAyB,UAAuC,IAAkB;;AAC7F,QAAA;AAEF,YAAM,gBAAgB,KAAK,WAAW,aAAa,QAAQ;AAG3D,UAAI,QAAQ,UAAU;AACpB,cAAM,mBAAmB,OAAO,QAAQ,aAAa,WACjD,KAAK,UAAU,gBAAgB,eAAe,QAAQ,QAAQ,IAC9D,KAAK,UAAU,gBAAgB,aAAa;AAE5C,YAAA,CAAC,iBAAiB,OAAO;AACpB,iBAAA;AAAA,YACL,SAAS;AAAA,YACT,OAAO,uBAAsB,sBAAiB,WAAjB,mBAAyB,KAAK,KAAK;AAAA,UAClE;AAAA,QAAA;AAAA,MACF;AAII,YAAA,SAAS,QAAQ,UAAU;AAC3B,YAAA,aAAa,WAAW,SAC1B,KAAK,UAAU,eAAe,MAAM,CAAC,IACrCD,gBAAK,KAAK,aAAa;AAG3B,UAAI,QAAQ,QAAQ;AAClBD,sBAAG,cAAc,QAAQ,QAAQ,YAAY,MAAM;AAC5C,eAAA;AAAA,UACL,SAAS;AAAA,UACT,SAAS,yBAAyB,QAAQ,MAAM;AAAA,QAClD;AAAA,MAAA,OACK;AACE,eAAA;AAAA,UACL,SAAS;AAAA,UACT,MAAM;AAAA,QACR;AAAA,MAAA;AAAA,aAGK,OAAO;AACP,aAAA;AAAA,QACL,SAAS;AAAA,QACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC9D;AAAA,IAAA;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMM,qBAAqB,UAAoB,SAA2B;AAC1E,UAAM,gBAA0B,CAAC;AAEjC,eAAW,WAAW,UAAU;AAC9B,YAAM,cAAcE,gBAAK,QAAQ,SAAS,OAAO;AAG7C,UAAA,QAAQ,SAAS,GAAG,KAAK,QAAQ,SAAS,GAAG,KAAK,QAAQ,SAAS,GAAG,GAAG;AACrE,cAAA,UAAUG,cAAS,aAAa;AAAA,UACpC,UAAU;AAAA,UACV,OAAO;AAAA,QAAA,CACR;AAED,gBAAQ,KAAK;AACC,sBAAA,KAAK,GAAG,OAAO;AAAA,MAAA,OACxB;AAEL,cAAM,WAAWH,gBAAK,QAAQ,SAAS,OAAO;AAC1C,YAAAF,cAAG,WAAW,QAAQ,GAAG;AAC3B,wBAAc,KAAK,QAAQ;AAAA,QAAA,OACtB;AACL,gBAAM,IAAI,MAAM,mBAAmB,OAAO,iBAAiB,QAAQ,GAAG;AAAA,QAAA;AAAA,MACxE;AAAA,IACF;AAGK,WAAA;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAMT,QAAQ,SAAuC;AACzC,QAAA;AACF,YAAM,EAAE,YAAY,SAAS,mBAAuB,IAAA;AAG9C,YAAA,qBAAqBA,cAAG,WAAW,UAAU,IACjDE,gBAAK,QAAQ,UAAU,IACvB;AAGI,YAAA,eAAe,sBACnBA,gBAAK,KAAK,QAAQ,IAAI,GAAG,WAAW,eAAe;AAG/C,YAAA,YAAYA,gBAAK,QAAQ,YAAY;AAC3C,UAAI,CAACF,cAAG,WAAW,SAAS,GAAG;AAC7BA,sBAAG,UAAU,WAAW,EAAE,WAAW,MAAM;AAAA,MAAA;AAI7C,UAAI,WAAgB,CAAC;AACjB,UAAAA,cAAG,WAAW,YAAY,GAAG;AAC3B,YAAA;AACF,gBAAM,kBAAkBA,cAAG,aAAa,cAAc,MAAM;AACjD,qBAAA,KAAK,MAAM,eAAe;AAAA,iBAC9B,OAAO;AACd,gBAAM,IAAI,MAAM,yCAAyC,YAAY,EAAE;AAAA,QAAA;AAAA,MACzE;AAIE,UAAA,CAAC,SAAS,cAAc,GAAG;AACpB,iBAAA,cAAc,IAAI,CAAC;AAAA,MAAA;AAIxB,YAAA,gBAAgB,QAAQ,IAAI;AAClC,YAAM,qBAAqBE,gBAAK,SAAS,eAAe,kBAAkB;AAGjE,eAAA,cAAc,EAAE,kBAAkB,IAAI;AAG/C,YAAM,eAAe,KAAK,UAAU,UAAU,MAAM,CAAC;AAClDF,oBAAA,cAAc,cAAc,cAAc,MAAM;AAE5C,aAAA;AAAA,QACL,SAAS;AAAA,QACT,SAAS;AAAA,EAA6D,QAAQ,KAAK,IAAI,CAAC;AAAA,kBAAsB,kBAAkB;AAAA,MAClI;AAAA,aAEO,OAAO;AACP,aAAA;AAAA,QACL,SAAS;AAAA,QACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC9D;AAAA,IAAA;AAAA,EACF;AAEJ;AClVO,MAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM1B,OAAO,MAAM,MAAqE;;AAExE,UAAA,OAAO,QAAQ,QAAQ;AAQ7B,QAAI,aAAa;AAGjB,SAAI,UAAK,CAAC,MAAN,mBAAS,SAAS,SAAS;AACd,mBAAA;AAAA,IAAA,WAGR,KAAK,CAAC,KAAK,sBAAsB,KAAK,KAAK,CAAC,CAAC,GAAG;AACxC,mBAAA;AAAA,IAGR,WAAA,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,SAAS,KAAK,CAAC,EAAE,YAAa,CAAA,GAAG;AAC/C,mBAAA;AAAA,IAAA;AAIjB,UAAM,MAAM,SAAS,KAAK,MAAM,UAAU,GAAG;AAAA,MACzC,OAAO;AAAA,QACH,GAAG;AAAA,QACH,GAAG;AAAA,QACH,GAAG;AAAA,QACH,GAAG;AAAA,QACH,GAAG;AAAA,QACH,GAAG;AAAA,QACH,GAAG;AAAA,MACP;AAAA,MACA,SAAS,CAAC,QAAQ,WAAW,OAAO;AAAA,IAAA,CACvC;AAED,UAAM,EAAE,GAAG,UAAU,GAAG,MAAU,IAAA;AAE3B,WAAA;AAAA,MACH;AAAA,MACA;AAAA,IACJ;AAAA,EAAA;AAER;AC3CO,MAAM,SAAS;AAAA,EACpB,OAAO,OAAO,YAA0B;AAChC,UAAA,SAAS,IAAIM,aAAa;AAChC,WAAO,OAAO,MAAM,QAAQ,SAAS,eAAe,OAAO;AAAA,EAC7D;AAAA,EAEA,WAAW,CAAC,YAA0B;AAC9B,UAAA,SAAS,IAAIA,aAAa;AAChC,WAAO,OAAO,UAAU,QAAQ,SAAS,eAAe,OAAO;AAAA,EACjE;AAAA,EAEA,kBAAkB,CAAC,UAAyB,UAAuC,OAAO;AAClF,UAAA,SAAS,IAAIA,aAAa;AACzB,WAAA,OAAO,iBAAiB,UAAU,OAAO;AAAA,EAClD;AAAA,EAEA,OAAO,OAAO,YAA0B;AAChC,UAAA,SAAS,IAAIA,aAAa;AAChC,WAAO,OAAO,MAAM,QAAQ,SAAS,eAAe,OAAO;AAAA,EAC7D;AAAA,EAEA,SAAS,CAAC,YAA4B;AAC9B,UAAA,SAAS,IAAIA,aAAa;AACzB,WAAA,OAAO,QAAQ,OAAO;AAAA,EAAA;AAEjC;;;;;;;"}
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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"}
@@ -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: source replaces target completely
143
+ * - Arrays: concatenate (target first, then source)
144
144
  * - Primitives: source overrides target
145
145
  */
146
146
  deepMerge(target, source) {
@@ -150,6 +150,9 @@ class YamlMerger {
150
150
  if (target === null || target === void 0) {
151
151
  return source;
152
152
  }
153
+ if (Array.isArray(source) && Array.isArray(target)) {
154
+ return [...target, ...source];
155
+ }
153
156
  if (typeof source !== "object" || Array.isArray(source)) {
154
157
  return source;
155
158
  }
@@ -423,9 +426,9 @@ class StitchEngine {
423
426
  resolveFilePathsSync(patterns, baseDir) {
424
427
  const resolvedFiles = [];
425
428
  for (const pattern of patterns) {
426
- const fullPattern = path.resolve(baseDir, pattern);
427
429
  if (pattern.includes("*") || pattern.includes("?") || pattern.includes("[")) {
428
- const matches = globSync(fullPattern, {
430
+ const matches = globSync(pattern, {
431
+ cwd: baseDir,
429
432
  absolute: true,
430
433
  nodir: true
431
434
  });
@@ -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: source replaces target completely\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 source is not an object, 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 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 = globSync(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 * 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: 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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@noego/stitch",
3
- "version": "1.0.1",
3
+ "version": "1.0.2",
4
4
  "description": "",
5
5
  "license": "ISC",
6
6
  "author": "",