@noego/stitch 1.0.0 → 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":"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"}
1
+ {"version":3,"file":"server.cjs","sources":["../src/core/ConfigParser.ts","../src/core/YamlMerger.ts","../src/core/Validator.ts","../src/core/StitchEngine.ts","../src/cli/StitchCLI.ts","../src/index.ts"],"sourcesContent":["import * as fs from 'fs';\nimport * as path from 'path';\nimport * as yaml from 'js-yaml';\nimport { glob } from 'glob';\nimport { StitchConfig } from '../types/StitchTypes';\n\nexport class ConfigParser {\n /**\n * Parse a stitch.yaml configuration file\n */\n parseConfig(configPath: string): StitchConfig {\n if (!fs.existsSync(configPath)) {\n throw new Error(`Config file not found: ${configPath}`);\n }\n\n const configContent = fs.readFileSync(configPath, 'utf8');\n const config = yaml.load(configContent) as any;\n\n if (!config || typeof config !== 'object') {\n throw new Error(`Invalid config file: ${configPath}`);\n }\n\n if (!config.stitch || !Array.isArray(config.stitch)) {\n throw new Error(`Config file must contain a 'stitch' array: ${configPath}`);\n }\n\n return {\n stitch: config.stitch\n };\n }\n\n /**\n * Resolve file paths and expand globs relative to the config file directory\n */\n async resolveFilePaths(patterns: string[], baseDir: string): Promise<string[]> {\n const resolvedFiles: string[] = [];\n\n for (const pattern of patterns) {\n const fullPattern = path.resolve(baseDir, pattern);\n \n // Check if it's a glob pattern\n if (pattern.includes('*') || pattern.includes('?') || pattern.includes('[')) {\n const matches = await glob(fullPattern, { \n absolute: true,\n nodir: true \n });\n // Sort alphabetically for consistent ordering\n matches.sort();\n resolvedFiles.push(...matches);\n } else {\n // Regular file path\n const fullPath = path.resolve(baseDir, pattern);\n if (fs.existsSync(fullPath)) {\n resolvedFiles.push(fullPath);\n } else {\n throw new Error(`File not found: ${pattern} (resolved to ${fullPath})`);\n }\n }\n }\n\n return resolvedFiles;\n }\n\n /**\n * Get the directory containing the config file\n */\n getConfigDir(configPath: string): string {\n return path.dirname(path.resolve(configPath));\n }\n}","import * as fs from 'fs';\nimport * as yaml from 'js-yaml';\n\nexport class YamlMerger {\n /**\n * Merge multiple YAML files in order\n */\n mergeFiles(filePaths: string[]): any {\n let result = {};\n\n for (const filePath of filePaths) {\n if (!fs.existsSync(filePath)) {\n throw new Error(`File not found: ${filePath}`);\n }\n\n const content = fs.readFileSync(filePath, 'utf8');\n let parsedContent: any;\n\n try {\n parsedContent = yaml.load(content);\n } catch (error) {\n throw new Error(`Invalid YAML in file ${filePath}: ${error instanceof Error ? error.message : String(error)}`);\n }\n\n if (parsedContent !== null && typeof parsedContent === 'object') {\n result = this.deepMerge(result, parsedContent);\n }\n }\n\n return result;\n }\n\n /**\n * Merge multiple YAML content strings in order\n */\n mergeContent(contents: Array<{ content: string; name?: string }>): any {\n let result = {};\n\n for (const item of contents) {\n let parsedContent: any;\n\n try {\n parsedContent = yaml.load(item.content);\n } catch (error) {\n const name = item.name || 'unknown content';\n throw new Error(`Invalid YAML in ${name}: ${error instanceof Error ? error.message : String(error)}`);\n }\n\n if (parsedContent !== null && typeof parsedContent === 'object') {\n result = this.deepMerge(result, parsedContent);\n }\n }\n\n return result;\n }\n\n /**\n * Merge mixed items (files and content) in order\n */\n merge(items: Array<string | { content: string; name?: string }>): any {\n let result = {};\n\n for (const item of items) {\n let parsedContent: any;\n let identifier: string;\n\n if (typeof item === 'string') {\n // File path\n if (!fs.existsSync(item)) {\n throw new Error(`File not found: ${item}`);\n }\n\n const content = fs.readFileSync(item, 'utf8');\n identifier = item;\n\n try {\n parsedContent = yaml.load(content);\n } catch (error) {\n throw new Error(`Invalid YAML in file ${item}: ${error instanceof Error ? error.message : String(error)}`);\n }\n } else {\n // Content object\n identifier = item.name || 'unknown content';\n\n try {\n parsedContent = yaml.load(item.content);\n } catch (error) {\n throw new Error(`Invalid YAML in ${identifier}: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n if (parsedContent !== null && typeof parsedContent === 'object') {\n result = this.deepMerge(result, parsedContent);\n }\n }\n\n return result;\n }\n\n /**\n * Deep merge two objects\n * Rules:\n * - Objects: merge properties, source overrides target\n * - Arrays: 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":";;;;;;;;;;;AAMO,MAAM,aAAa;AAAA;AAAA;AAAA;AAAA,EAIxB,YAAY,YAAkC;AAC5C,QAAI,CAAC,GAAG,WAAW,UAAU,GAAG;AAC9B,YAAM,IAAI,MAAM,0BAA0B,UAAU,EAAE;AAAA,IAAA;AAGxD,UAAM,gBAAgB,GAAG,aAAa,YAAY,MAAM;AAClD,UAAA,SAAS,KAAK,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,cAAc,KAAK,QAAQ,SAAS,OAAO;AAG7C,UAAA,QAAQ,SAAS,GAAG,KAAK,QAAQ,SAAS,GAAG,KAAK,QAAQ,SAAS,GAAG,GAAG;AACrE,cAAA,UAAU,MAAM,KAAK,aAAa;AAAA,UACtC,UAAU;AAAA,UACV,OAAO;AAAA,QAAA,CACR;AAED,gBAAQ,KAAK;AACC,sBAAA,KAAK,GAAG,OAAO;AAAA,MAAA,OACxB;AAEL,cAAM,WAAW,KAAK,QAAQ,SAAS,OAAO;AAC1C,YAAA,GAAG,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,WAAO,KAAK,QAAQ,KAAK,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,CAAC,GAAG,WAAW,QAAQ,GAAG;AAC5B,cAAM,IAAI,MAAM,mBAAmB,QAAQ,EAAE;AAAA,MAAA;AAG/C,YAAM,UAAU,GAAG,aAAa,UAAU,MAAM;AAC5C,UAAA;AAEA,UAAA;AACc,wBAAA,KAAK,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,wBAAA,KAAK,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,CAAC,GAAG,WAAW,IAAI,GAAG;AACxB,gBAAM,IAAI,MAAM,mBAAmB,IAAI,EAAE;AAAA,QAAA;AAG3C,cAAM,UAAU,GAAG,aAAa,MAAM,MAAM;AAC/B,qBAAA;AAET,YAAA;AACc,0BAAA,KAAK,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,0BAAA,KAAK,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;AACF,WAAK,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,CAAC,GAAG,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,gBAAgB,GAAG,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,IACrC,KAAK,KAAK,aAAa;AAG3B,UAAI,QAAQ,QAAQ;AAEZ,cAAA,UAAU,WAAW,SACvB,gIACA;AAEJ,cAAM,cAAc,UAAU;AAC9B,WAAG,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,IACrC,KAAK,KAAK,aAAa;AAG3B,UAAI,QAAQ,QAAQ;AAEZ,cAAA,UAAU,WAAW,SACvB,gIACA;AAEJ,cAAM,cAAc,UAAU;AAC9B,WAAG,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,UAAU,SAAS,MAAM,YAAY;AAAA,MACzC,YAAY;AAAA,MACZ,eAAe;AAAA,IAAA,CAChB;AAEO,YAAA,GAAG,UAAU,OAAOA,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,IACrC,KAAK,KAAK,aAAa;AAG3B,UAAI,QAAQ,QAAQ;AAClB,WAAG,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,cAAc,KAAK,QAAQ,SAAS,OAAO;AAG7C,UAAA,QAAQ,SAAS,GAAG,KAAK,QAAQ,SAAS,GAAG,KAAK,QAAQ,SAAS,GAAG,GAAG;AACrE,cAAA,UAAU,SAAS,aAAa;AAAA,UACpC,UAAU;AAAA,UACV,OAAO;AAAA,QAAA,CACR;AAED,gBAAQ,KAAK;AACC,sBAAA,KAAK,GAAG,OAAO;AAAA,MAAA,OACxB;AAEL,cAAM,WAAW,KAAK,QAAQ,SAAS,OAAO;AAC1C,YAAA,GAAG,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,qBAAqB,GAAG,WAAW,UAAU,IACjD,KAAK,QAAQ,UAAU,IACvB;AAGI,YAAA,eAAe,sBACnB,KAAK,KAAK,QAAQ,IAAI,GAAG,WAAW,eAAe;AAG/C,YAAA,YAAY,KAAK,QAAQ,YAAY;AAC3C,UAAI,CAAC,GAAG,WAAW,SAAS,GAAG;AAC7B,WAAG,UAAU,WAAW,EAAE,WAAW,MAAM;AAAA,MAAA;AAI7C,UAAI,WAAgB,CAAC;AACjB,UAAA,GAAG,WAAW,YAAY,GAAG;AAC3B,YAAA;AACF,gBAAM,kBAAkB,GAAG,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,qBAAqB,KAAK,SAAS,eAAe,kBAAkB;AAGjE,eAAA,cAAc,EAAE,kBAAkB,IAAI;AAG/C,YAAM,eAAe,KAAK,UAAU,UAAU,MAAM,CAAC;AAClD,SAAA,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,IAAIC,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.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.0",
3
+ "version": "1.0.2",
4
4
  "description": "",
5
5
  "license": "ISC",
6
6
  "author": "",
package/readme.md CHANGED
@@ -2,6 +2,113 @@
2
2
 
3
3
  Stitch merges multiple YAML files into a single, validated artifact. It’s ideal for modular OpenAPI specs and other structured YAML, with CLI, Node, and browser support — plus VSCode schema integration for real‑time validation.
4
4
 
5
+ > Note: OpenAPI is used throughout as a familiar example, but Stitch is schema‑agnostic and works with any YAML configuration.
6
+
7
+ ## Core Features
8
+
9
+ - Deterministic ordering: Globs expand to files sorted alphabetically; the order in `stitch.yaml` decides precedence (later wins).
10
+ - Deep merge for objects: Keys are joined recursively; later files override earlier values for the same key.
11
+ - Arrays replace, not concatenate: When a key maps to an array, the array from the later file fully replaces the earlier one.
12
+ - Flexible validation: Lightweight OpenAPI shape checks or full JSON Schema validation via AJV.
13
+ - Multi-environment: Same engine for CLI/Node, plus browser helpers for Vite.
14
+ - Watch + output: Rebuild on changes; write YAML/JSON to file with a generated-file header.
15
+
16
+ ### How merging works (keys and arrays)
17
+
18
+ Given two files merged in order: `base.yaml`, then `override.yaml`.
19
+
20
+ Objects (keys are joined, later overrides):
21
+
22
+ ```yaml
23
+ # base.yaml
24
+ info:
25
+ title: My API
26
+ version: 1.0.0
27
+ contact:
28
+ name: Team A
29
+
30
+ # override.yaml
31
+ info:
32
+ version: 1.1.0
33
+ contact:
34
+ email: team@example.com
35
+ ```
36
+
37
+ Result:
38
+
39
+ ```yaml
40
+ info:
41
+ title: My API # from base
42
+ version: 1.1.0 # overridden by override
43
+ contact:
44
+ name: Team A # preserved from base
45
+ email: team@example.com
46
+ ```
47
+
48
+ Arrays (later replaces earlier, no concat):
49
+
50
+ ```yaml
51
+ # base.yaml
52
+ servers:
53
+ - url: https://api.example.com
54
+ - url: https://staging.example.com
55
+
56
+ # override.yaml
57
+ servers:
58
+ - url: http://localhost:3000
59
+ ```
60
+
61
+ Result:
62
+
63
+ ```yaml
64
+ servers:
65
+ - url: http://localhost:3000
66
+ ```
67
+
68
+ Primitives (later replaces earlier):
69
+
70
+ ```yaml
71
+ # base.yaml
72
+ openapi: 3.0.3
73
+
74
+ # override.yaml
75
+ openapi: 3.1.0
76
+ ```
77
+
78
+ Result: `openapi: 3.1.0`
79
+
80
+ ### Works With Any YAML
81
+
82
+ - Schema‑agnostic: Stitch performs generic YAML deep merges; it is not tied to OpenAPI.
83
+ - Validation choices: For non‑OpenAPI configs, either skip `--validate` or provide your own JSON Schema path.
84
+
85
+ ## Config File (stitch.yaml)
86
+
87
+ Stitch expects a YAML config whose top-level key is `stitch`, an array of file paths and/or glob patterns. Paths are resolved relative to the config file’s directory. Files are merged in the order listed; glob matches are sorted alphabetically.
88
+
89
+ Minimal example:
90
+
91
+ ```yaml
92
+ # stitch.yaml
93
+ stitch:
94
+ - openapi/base.yaml
95
+ - openapi/components/**/*.yaml
96
+ - openapi/paths/**/*.yaml
97
+ - overrides/*.yaml
98
+ ```
99
+
100
+ Notes
101
+ - Required key: `stitch` must be an array.
102
+ - Relative base: paths/globs are resolved relative to the config file location.
103
+ - Ordering: list order decides precedence; later files override earlier ones.
104
+ - Globs: `*`, `**`, `?`, and character classes are supported.
105
+ - JSON is fine too: JSON is a subset of YAML, so a `.json` config with the same shape works.
106
+ - OpenAPI is just an example here: use any YAML file layout and names for your domain.
107
+
108
+ Using a different config file
109
+ - CLI: pass the config file as a positional argument, e.g. `stitch build my-config.yaml` or `stitch watch my-config.yaml`.
110
+ - Programmatic: `stitch.build({ input: 'my-config.yaml', ... })` or `engine.build('my-config.yaml', ...)`.
111
+
5
112
  ## Why Stitch
6
113
 
7
114
  - Modularize YAML: Keep specs split across files and folders without losing clarity.
@@ -102,8 +209,8 @@ const result = stitchFromContent([
102
209
 
103
210
  ## Validation
104
211
 
105
- - Basic: `--validate` enables lightweight OpenAPI shape checks (`openapi`, `info`).
106
- - JSON Schema: `--validate schemas/schema.json` enables full AJV validation against your schema.
212
+ - Basic: `--validate` enables lightweight OpenAPI shape checks (`openapi`, `info`). If your content is not OpenAPI, skip this flag.
213
+ - JSON Schema: `--validate schemas/schema.json` enables full AJV validation against your schema (works for any YAML domain).
107
214
 
108
215
  ## VSCode Integration
109
216
 
@@ -124,9 +231,7 @@ Manual configuration example (`.vscode/settings.json`):
124
231
  }
125
232
  ```
126
233
 
127
- Alternative paths
128
- - "@noego/forge/schema.json" – Package export (if supported by VSCode)
129
- - "node_modules/@noego/forge/schema.json" – Direct node_modules path (most reliable)
234
+
130
235
 
131
236
  ## Example Project Structure
132
237
 
@@ -156,4 +261,3 @@ stitch install @noego/dinner/schema.json --target "**/*.yaml"
156
261
  ## License
157
262
 
158
263
  MIT
159
-