@gtkx/config 2.0.0-beta.1 → 2.0.0-beta.11
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/README.md +11 -166
- package/dist/config-dependencies.d.ts +11 -0
- package/dist/config-dependencies.d.ts.map +1 -0
- package/dist/config-dependencies.js +84 -0
- package/dist/config-dependencies.js.map +1 -0
- package/dist/config-error.d.ts +2 -2
- package/dist/config-error.d.ts.map +1 -1
- package/dist/config-error.js +6 -3
- package/dist/config-error.js.map +1 -1
- package/dist/config-reloader.d.ts +8 -0
- package/dist/config-reloader.d.ts.map +1 -0
- package/dist/config-reloader.js +38 -0
- package/dist/config-reloader.js.map +1 -0
- package/dist/config-source.d.ts +7 -0
- package/dist/config-source.d.ts.map +1 -0
- package/dist/config-source.js +17 -0
- package/dist/config-source.js.map +1 -0
- package/dist/config.d.ts +42 -38
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +21 -15
- package/dist/config.js.map +1 -1
- package/dist/deploy.d.ts +28 -22
- package/dist/deploy.d.ts.map +1 -1
- package/dist/deploy.js +29 -5
- package/dist/deploy.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/internal.d.ts +6 -1
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +6 -1
- package/dist/internal.js.map +1 -1
- package/dist/loader.d.ts +2 -2
- package/dist/loader.d.ts.map +1 -1
- package/dist/loader.js +66 -15
- package/dist/loader.js.map +1 -1
- package/dist/node-version.d.ts +5 -0
- package/dist/node-version.d.ts.map +1 -0
- package/dist/node-version.js +13 -0
- package/dist/node-version.js.map +1 -0
- package/dist/static-dependencies.d.ts +3 -0
- package/dist/static-dependencies.d.ts.map +1 -0
- package/dist/static-dependencies.js +350 -0
- package/dist/static-dependencies.js.map +1 -0
- package/dist/virtual.d.ts.map +1 -1
- package/dist/virtual.js +0 -2
- package/dist/virtual.js.map +1 -1
- package/dist/vite-plugin.d.ts.map +1 -1
- package/dist/vite-plugin.js +14 -5
- package/dist/vite-plugin.js.map +1 -1
- package/dist/vite-root.d.ts +9 -0
- package/dist/vite-root.d.ts.map +1 -0
- package/dist/vite-root.js +3 -0
- package/dist/vite-root.js.map +1 -0
- package/package.json +23 -6
- package/src/config-dependencies.ts +116 -0
- package/src/config-error.ts +9 -4
- package/src/config-reloader.ts +54 -0
- package/src/config-source.ts +25 -0
- package/src/config.ts +27 -19
- package/src/deploy.ts +61 -8
- package/src/index.ts +1 -0
- package/src/internal.ts +6 -0
- package/src/loader.ts +92 -28
- package/src/node-version.ts +17 -0
- package/src/static-dependencies.ts +464 -0
- package/src/virtual.ts +0 -2
- package/src/vite-plugin.ts +16 -8
- package/src/vite-root.ts +8 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"static-dependencies.js","sourceRoot":"","sources":["../src/static-dependencies.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAClF,OAAO,EAAE,UAAU,EAAa,MAAM,MAAM,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AACvF,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,MAAM,iBAAiB,GAAwB,IAAI,GAAG,CAAC;IACnD,MAAM;IACN,MAAM;IACN,KAAK;IACL,MAAM;IACN,MAAM;IACN,KAAK;CACR,CAAC,CAAC;AACH,MAAM,qBAAqB,GAAG;IAC1B,KAAK;IACL,KAAK;IACL,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,MAAM;IACN,OAAO;CACV,CAAC;AACF,MAAM,oBAAoB,GAAuC;IAC7D,MAAM,EAAE,CAAC,MAAM,CAAC;IAChB,KAAK,EAAE,CAAC,KAAK,CAAC;IACd,MAAM,EAAE,CAAC,MAAM,CAAC;IAChB,MAAM,EAAE,CAAC,MAAM,CAAC;CACnB,CAAC;AACF,MAAM,YAAY,GAA0D;IACxE,OAAO,EAAE,SAAS;IAClB,QAAQ,EAAE,UAAU;IACpB,QAAQ,EAAE,UAAU;IACpB,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,SAAS;IAClB,MAAM,EAAE,SAAS;CACpB,CAAC;AAKF,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAoC,EAAE,CAClE,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAEzE,MAAM,aAAa,GAAG,CAAC,IAAY,EAA2C,EAAE;IAC5E,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IAE9C,OAAO;QACH,YAAY;QACZ,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,YAAqB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KAClF,CAAC;AACN,CAAC,CAAC;AAEF,SAAS,iBAAiB,CAAC,KAAuB;IAC9C,IAAI,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IAED,IAAI,KAAK,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CACtC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,OAAO,KAAK,CAAC,kBAAkB,CAAC,KAAK,CAAC;QAClC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC;QACzE,CAAC,CAAC,EAAE,CAAC;AACb,CAAC;AAED,MAAM,eAAe,GAAG,CAAC,QAA8B,EAAE,IAAY,EAAW,EAAE,CAC9E,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC;IAChE,CAAC,KAAK,CAAC,eAAe,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC;AAEzE,SAAS,qBAAqB,CAC1B,QAAyE;IAEzE,OAAO,KAAK,CAAC,gBAAgB,CAAC,QAAQ,CAAC;QACnC,eAAe,CAAC,QAAQ,EAAE,QAAQ,CAAC;QACnC,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC;QAClC,CAAC,CAAC,iBAAiB,CAAC,QAAQ,CAAC,KAAK,CAAC;QACnC,CAAC,CAAC,EAAE,CAAC;AACb,CAAC;AAED,MAAM,cAAc,GAAG,CAAC,KAAuB,EAAY,EAAE,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;AAEvF,MAAM,iBAAiB,GAAG,CAAC,QAA8B,EAAW,EAAE,CAClE,eAAe,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;AAIzC,MAAM,WAAW,GAAG,CAAC,IAAY,EAA4B,EAAE;IAC3D,IAAI,CAAC;QACD,OAAO,SAAS,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE;YACzC,GAAG,EAAE,IAAI;YACT,OAAO,EAAE,KAAK;YACd,UAAU,EAAE,KAAK;YACjB,QAAQ,EAAE,IAAI;YACd,UAAU,EAAE,EAAE,0BAA0B,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,CAAC,IAAI,CAAC,EAAE;YAC9E,UAAU,EAAE,aAAa;SAC5B,CAAC,IAAI,SAAS,CAAC;IACpB,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,SAAS,CAAC;IACrB,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,CAAC,OAAoB,EAAE,MAA8C,EAAQ,EAAE;IAC7F,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,IAA0B,EAAmC,EAAE,CAClF,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAC5F,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IACnB,CAAC,CAAC,SAAS,CAAC;AAEpB,MAAM,kBAAkB,GAAG,CAAC,WAA4C,EAAmC,EAAE;IACzG,MAAM,EAAE,eAAe,EAAE,GAAG,WAAW,CAAC;IAExC,OAAO,KAAK,CAAC,2BAA2B,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;AACvG,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,QAA8B,EAAY,EAAE,CACjE,iBAAiB,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC;IAC7D,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC;IAChC,CAAC,CAAC,EAAE,CAAC;AAEb,MAAM,oBAAoB,GAAG,CAAC,GAAiB,EAAiB,EAAE;IAC9D,MAAM,OAAO,GAAgB,IAAI,GAAG,EAAE,CAAC;IACvC,MAAM,QAAQ,GAAgB,IAAI,GAAG,EAAE,CAAC;IAExC,QAAQ,CAAC,GAAG,EAAE;QACV,cAAc,EAAE,CAAC,QAAQ,EAAE,EAAE;YACzB,SAAS,CAAC,OAAO,EAAE,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QACrD,CAAC;QACD,oBAAoB,EAAE,CAAC,QAAQ,EAAE,EAAE;YAC/B,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7C,CAAC;QACD,sBAAsB,EAAE,CAAC,QAAQ,EAAE,EAAE;YACjC,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7C,CAAC;QACD,iBAAiB,EAAE,CAAC,QAAQ,EAAE,EAAE;YAC5B,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7C,CAAC;QACD,gBAAgB,EAAE,CAAC,QAAQ,EAAE,EAAE;YAC3B,MAAM,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC;YACjC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAC3E,CAAC;QACD,cAAc,EAAE,CAAC,QAAQ,EAAE,EAAE;YACzB,KAAK,MAAM,MAAM,IAAI,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBAClD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBACpB,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACzB,CAAC;QACL,CAAC;QACD,yBAAyB,EAAE,CAAC,QAAQ,EAAE,EAAE;YACpC,SAAS,CAAC,OAAO,EAAE,kBAAkB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QAC1D,CAAC;KACJ,CAAC,CAAC;IAEH,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC;AAC1D,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,IAAY,EAAiB,EAAE;IAClD,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAE9B,OAAO,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;AACrF,CAAC,CAAC;AAEF,SAAS,oBAAoB,CAAC,KAAc;IACxC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,CAAC;IACnB,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/D,CAAC;IAED,OAAO,oBAAoB,CAAC,KAAK,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,oBAAoB,GAAG,CAAC,KAAc,EAAY,EAAE;IACtD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAC9C,OAAO,EAAE,CAAC;IACd,CAAC;IAED,OAAO,QAAQ,IAAI,KAAK,CAAC,CAAC,CAAC,oBAAoB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACvE,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,CAAC,KAAc,EAAY,EAAE;IACtD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAC9C,OAAO,EAAE,CAAC;IACd,CAAC;IAED,OAAO,SAAS,IAAI,KAAK,CAAC,CAAC,CAAC,oBAAoB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACzE,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,IAAY,EAAY,EAAE;IAC3C,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IAEzD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,EAAE,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACD,OAAO,oBAAoB,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IACpE,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,EAAE,CAAC;IACd,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,CAAC,IAAY,EAAY,EAAE;IACnD,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IAE9C,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,qBAAqB,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,GAAG,IAAI,GAAG,SAAS,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAE9C,OAAO,CAAC,oBAAoB,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,GAAG,IAAI,GAAG,SAAS,EAAE,CAAC,CAAC;AAC7F,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,MAAc,EAAE,UAAkB,EAAY,EAAE;IACtE,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAElC,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,MAAM,EAAE,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC;IACpD,CAAC;IAED,OAAO;QACH,MAAM;QACN,GAAG,mBAAmB,CAAC,MAAM,CAAC;QAC9B,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC;QACxB,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,SAAS,EAAE,CAAC,CAAC;KACjF,CAAC;AACN,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,MAAc,EAAE,QAAgB,EAAsB,EAAE;IAC/E,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAEhD,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;IAED,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/C,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,OAAO,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC;AAC7C,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,CAAC,MAAc,EAAE,QAAgB,EAAE,UAAkB,EAAY,EAAE;IAC5F,MAAM,MAAM,GAAG,iBAAiB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAEnD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,EAAE,CAAC;IACd,CAAC;IAED,OAAO,gBAAgB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;AAChD,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,CAAC,QAAgB,EAAsB,EAAE;IAChE,IAAI,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAClC,IAAI,QAAQ,GAAG,EAAE,CAAC;IAElB,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;QAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;QAElD,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACxB,OAAO,SAAS,CAAC;QACrB,CAAC;QAED,QAAQ,GAAG,SAAS,CAAC;QACrB,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IACnC,CAAC;IAED,OAAO,SAAS,CAAC;AACrB,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,CAAC,QAAgB,EAA8B,EAAE;IACxE,MAAM,IAAI,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAE1C,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACrB,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,IAAI,CAAC;QACD,MAAM,QAAQ,GAAG,SAAS,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QAEvD,OAAO,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC;YACnD,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE;YAC1D,CAAC,CAAC,SAAS,CAAC;IACpB,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,SAAS,CAAC;IACrB,CAAC;AACL,CAAC,CAAC;AAEF,SAAS,aAAa,CAAC,KAAc;IACjC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,CAAC;IACnB,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;IACxD,CAAC;IAED,OAAO,QAAQ,CAAC,KAAK,CAAC;QAClB,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAC7D,CAAC,CAAC,EAAE,CAAC;AACb,CAAC;AAED,MAAM,kBAAkB,GAAG,CAAC,OAAe,EAAE,MAAc,EAAsB,EAAE;IAC/E,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACrB,OAAO,EAAE,CAAC;IACd,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAEtC,IAAI,QAAQ,KAAK,CAAC,CAAC,EAAE,CAAC;QAClB,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;IAE3C,OAAO,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;QACvD,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5D,CAAC,CAAC,SAAS,CAAC;AACpB,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,CAAC,MAAc,EAAE,OAAgC,EAAY,EAAE,CACxF,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE;IACjD,MAAM,KAAK,GAAG,kBAAkB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAElD,OAAO,KAAK,KAAK,SAAS;QACtB,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AAC9E,CAAC,CAAC,CAAC;AAEP,MAAM,yBAAyB,GAAG,CAAC,MAAc,EAAE,QAAgB,EAAE,UAAkB,EAAY,EAAE;IACjG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,CAAC;IACd,CAAC;IAED,MAAM,cAAc,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAEpD,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,EAAE,CAAC;IACd,CAAC;IAED,MAAM,OAAO,GAAG,oBAAoB,CAAC,MAAM,EAAE,cAAc,CAAC,OAAO,CAAC;SAC/D,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;SAC1C,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,gBAAgB,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC;IAE7F,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,OAAO,CAAC,CAAC;AAC7C,CAAC,CAAC;AAEF,MAAM,sBAAsB,GAAG,CAAC,IAAY,EAAU,EAAE,CACpD,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAE1D,MAAM,kBAAkB,GAAG,CAAC,MAAc,EAAE,QAAgB,EAAE,IAAU,EAAsB,EAAE;IAC5F,IAAI,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE;YACjC,SAAS,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC,IAAI;YACvC,GAAG,EAAE,IAAI;SACZ,CAAC,CAAC;QAEH,OAAO,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;IACzE,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,SAAS,CAAC;IACrB,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,CACvB,MAAc,EACd,QAAgB,EAChB,UAAkB,EAClB,IAAU,EACF,EAAE;IACV,MAAM,UAAU,GAAG,kBAAkB,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC9D,MAAM,mBAAmB,GAAG,yBAAyB,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;IAEpF,OAAO,UAAU,KAAK,SAAS;QAC3B,CAAC,CAAC,CAAC,GAAG,oBAAoB,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE,GAAG,mBAAmB,CAAC;QACjF,CAAC,CAAC,CAAC,UAAU,EAAE,GAAG,mBAAmB,CAAC,CAAC;AAC/C,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,CAAC,IAAY,EAAE,UAAkB,EAAE,UAAkB,EAAU,EAAE;IAC1F,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACpF,IAAI,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC;IAEhC,OAAO,SAAS,GAAG,CAAC,EAAE,CAAC;QACnB,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;QAC/B,SAAS,IAAI,CAAC,CAAC;IACnB,CAAC;IAED,OAAO,OAAO,CAAC,SAAS,EAAE,GAAG,QAAQ,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAC/F,CAAC,CAAC;AAEF,MAAM,qBAAqB,GAAG,CAC1B,MAAc,EACd,QAAgB,EAChB,UAAkB,EAClB,UAAkB,EACV,EAAE;IACV,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAEhD,MAAM,GAAG,GAAG,oBAAoB,CAAC,QAAQ,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;IACnE,MAAM,MAAM,GAAG,qBAAqB,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,CAAC;IAE7E,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;AAC5E,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,CAAC,IAAY,EAAE,UAAkB,EAAE,UAAkB,EAAY,EAAE;IAC1F,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACpG,MAAM,OAAO,GAAG,MAAM,EAAE,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,QAAQ,GAAG,MAAM,EAAE,QAAQ,IAAI,OAAO,CAAC;IAC7C,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,EAAE;QAC1B,UAAU,EAAE,qBAAqB;QACjC,OAAO,EAAE,KAAK;QACd,WAAW,EAAE,KAAK;KACrB,CAAC,CAAC;IAEH,OAAO;QACH,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,kBAAkB,CAAC,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;QAClF,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,qBAAqB,CAAC,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;KAC/F;SACI,MAAM,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,GAAG,eAAe,GAAG,EAAE,CAAC,CAAC,CAAC;AAClF,CAAC,CAAC;AAEF,MAAM,yBAAyB,GAAG,CAC9B,UAAkB,EAClB,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC,EACjC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,EACxB,EAAE;IACV,MAAM,YAAY,GAAgB,IAAI,GAAG,EAAE,CAAC;IAC5C,MAAM,OAAO,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;IAEtC,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAE3B,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACrB,MAAM;QACV,CAAC;QAED,IAAI,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,SAAS;QACb,CAAC;QAED,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACvB,OAAO,CAAC,IAAI,CAAC,GAAG,kBAAkB,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;IACtE,CAAC;IAED,OAAO,CAAC,GAAG,YAAY,CAAC,CAAC;AAC7B,CAAC,CAAC;AAEF,OAAO,EAAE,yBAAyB,EAAE,CAAC","sourcesContent":["import { parseSync, traverse, types } from \"@babel/core\";\nimport { parseJSON, parseJSON5, parseJSONC, parseTOML, parseYAML } from \"confbox\";\nimport { createJiti, type Jiti } from \"jiti\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { basename, dirname, extname, isAbsolute, join, resolve, sep } from \"node:path\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\nimport { localConfigSourcePath } from \"./config-source.ts\";\n\nconst MODULE_EXTENSIONS: ReadonlySet<string> = new Set([\n \".cjs\",\n \".cts\",\n \".js\",\n \".mjs\",\n \".mts\",\n \".ts\",\n]);\nconst RESOLVABLE_EXTENSIONS = [\n \".js\",\n \".ts\",\n \".mjs\",\n \".cjs\",\n \".mts\",\n \".cts\",\n \".json\",\n \".jsonc\",\n \".json5\",\n \".yaml\",\n \".yml\",\n \".toml\",\n];\nconst JAVASCRIPT_FALLBACKS: Readonly<Record<string, string[]>> = {\n \".cjs\": [\".cts\"],\n \".js\": [\".ts\"],\n \".jsx\": [\".tsx\"],\n \".mjs\": [\".mts\"],\n};\nconst DATA_PARSERS: Readonly<Record<string, (source: string) => unknown>> = {\n \".json\": parseJSON,\n \".json5\": parseJSON5,\n \".jsonc\": parseJSONC,\n \".toml\": parseTOML,\n \".yaml\": parseYAML,\n \".yml\": parseYAML,\n};\n\ntype PackageImports = { file: string; imports: Record<string, unknown>; root: string };\ntype ModuleSources = { all: string[]; extended: string[] };\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst parserPlugins = (path: string): (\"decorators\" | \"jsx\" | \"typescript\")[] => {\n const extension = extname(path).toLowerCase();\n\n return [\n \"decorators\",\n ...([\".cts\", \".mts\", \".ts\"].includes(extension) ? [\"typescript\" as const] : []),\n ];\n};\n\nfunction expressionSources(value: types.Expression): string[] {\n if (types.isStringLiteral(value)) {\n return [value.value];\n }\n\n if (types.isArrayExpression(value)) {\n return value.elements.flatMap((element) =>\n types.isExpression(element) ? expressionSources(element) : []);\n }\n\n return types.isObjectExpression(value)\n ? value.properties.flatMap((property) => sourcePropertySources(property))\n : [];\n}\n\nconst isNamedProperty = (property: types.ObjectProperty, name: string): boolean =>\n (types.isIdentifier(property.key) && property.key.name === name) ||\n (types.isStringLiteral(property.key) && property.key.value === name);\n\nfunction sourcePropertySources(\n property: types.ObjectMethod | types.ObjectProperty | types.SpreadElement,\n): string[] {\n return types.isObjectProperty(property) &&\n isNamedProperty(property, \"source\") &&\n types.isExpression(property.value)\n ? expressionSources(property.value)\n : [];\n}\n\nconst extendsSources = (value: types.Expression): string[] => expressionSources(value);\n\nconst isExtendsProperty = (property: types.ObjectProperty): boolean =>\n isNamedProperty(property, \"extends\");\n\ntype ParsedModule = NonNullable<ReturnType<typeof parseSync>>;\n\nconst parseModule = (path: string): ParsedModule | undefined => {\n try {\n return parseSync(readFileSync(path, \"utf8\"), {\n ast: true,\n babelrc: false,\n configFile: false,\n filename: path,\n parserOpts: { allowReturnOutsideFunction: true, plugins: parserPlugins(path) },\n sourceType: \"unambiguous\",\n }) ?? undefined;\n } catch {\n return undefined;\n }\n};\n\nconst addSource = (sources: Set<string>, source: types.StringLiteral | null | undefined): void => {\n if (source !== null && source !== undefined) {\n sources.add(source.value);\n }\n};\n\nconst requireSource = (call: types.CallExpression): types.StringLiteral | undefined =>\n types.isIdentifier(call.callee, { name: \"require\" }) && types.isStringLiteral(call.arguments[0])\n ? call.arguments[0]\n : undefined;\n\nconst importEqualsSource = (declaration: types.TSImportEqualsDeclaration): types.StringLiteral | undefined => {\n const { moduleReference } = declaration;\n\n return types.isTSExternalModuleReference(moduleReference) ? moduleReference.expression : undefined;\n};\n\nconst propertySources = (property: types.ObjectProperty): string[] =>\n isExtendsProperty(property) && types.isExpression(property.value)\n ? extendsSources(property.value)\n : [];\n\nconst collectModuleSources = (ast: ParsedModule): ModuleSources => {\n const sources: Set<string> = new Set();\n const extended: Set<string> = new Set();\n\n traverse(ast, {\n CallExpression: (nodePath) => {\n addSource(sources, requireSource(nodePath.node));\n },\n ExportAllDeclaration: (nodePath) => {\n addSource(sources, nodePath.node.source);\n },\n ExportNamedDeclaration: (nodePath) => {\n addSource(sources, nodePath.node.source);\n },\n ImportDeclaration: (nodePath) => {\n addSource(sources, nodePath.node.source);\n },\n ImportExpression: (nodePath) => {\n const { source } = nodePath.node;\n addSource(sources, types.isStringLiteral(source) ? source : undefined);\n },\n ObjectProperty: (nodePath) => {\n for (const source of propertySources(nodePath.node)) {\n sources.add(source);\n extended.add(source);\n }\n },\n TSImportEqualsDeclaration: (nodePath) => {\n addSource(sources, importEqualsSource(nodePath.node));\n },\n });\n\n return { all: [...sources], extended: [...extended] };\n};\n\nconst moduleSources = (path: string): ModuleSources => {\n const ast = parseModule(path);\n\n return ast === undefined ? { all: [], extended: [] } : collectModuleSources(ast);\n};\n\nfunction parsedExtendsSources(value: unknown): string[] {\n if (typeof value === \"string\") {\n return [value];\n }\n\n if (Array.isArray(value)) {\n return value.flatMap((item) => parsedExtendsSources(item));\n }\n\n return objectExtendsSources(value);\n}\n\nconst objectExtendsSources = (value: unknown): string[] => {\n if (typeof value !== \"object\" || value === null) {\n return [];\n }\n\n return \"source\" in value ? parsedExtendsSources(value.source) : [];\n};\n\nconst configExtendsSources = (value: unknown): string[] => {\n if (typeof value !== \"object\" || value === null) {\n return [];\n }\n\n return \"extends\" in value ? parsedExtendsSources(value.extends) : [];\n};\n\nconst dataSources = (path: string): string[] => {\n const parser = DATA_PARSERS[extname(path).toLowerCase()];\n\n if (parser === undefined) {\n return [];\n }\n\n try {\n return configExtendsSources(parser(readFileSync(path, \"utf8\")));\n } catch {\n return [];\n }\n};\n\nconst extensionCandidates = (path: string): string[] => {\n const extension = extname(path).toLowerCase();\n\n if (extension.length === 0) {\n return RESOLVABLE_EXTENSIONS.map((candidate) => `${path}${candidate}`);\n }\n\n const stem = path.slice(0, -extension.length);\n\n return (JAVASCRIPT_FALLBACKS[extension] ?? []).map((candidate) => `${stem}${candidate}`);\n};\n\nconst targetCandidates = (target: string, configName: string): string[] => {\n const extension = extname(target);\n\n if (extension.length > 0) {\n return [target, ...extensionCandidates(target)];\n }\n\n return [\n target,\n ...extensionCandidates(target),\n join(target, configName),\n ...RESOLVABLE_EXTENSIONS.map((candidate) => join(target, `index${candidate}`)),\n ];\n};\n\nconst localSourceTarget = (source: string, importer: string): string | undefined => {\n const clean = source.split(/[?#]/u, 1)[0] ?? \"\";\n\n if (clean.startsWith(\"file:\")) {\n return fileURLToPath(clean);\n }\n\n if (!isAbsolute(clean) && !clean.startsWith(\".\")) {\n return undefined;\n }\n\n return resolve(dirname(importer), clean);\n};\n\nconst unresolvedCandidates = (source: string, importer: string, configName: string): string[] => {\n const target = localSourceTarget(source, importer);\n\n if (target === undefined) {\n return [];\n }\n\n return targetCandidates(target, configName);\n};\n\nconst nearestPackageFile = (importer: string): string | undefined => {\n let directory = dirname(importer);\n let previous = \"\";\n\n while (directory !== previous) {\n const candidate = join(directory, \"package.json\");\n\n if (existsSync(candidate)) {\n return candidate;\n }\n\n previous = directory;\n directory = dirname(directory);\n }\n\n return undefined;\n};\n\nconst readPackageImports = (importer: string): PackageImports | undefined => {\n const file = nearestPackageFile(importer);\n\n if (file === undefined) {\n return undefined;\n }\n\n try {\n const manifest = parseJSON(readFileSync(file, \"utf8\"));\n\n return isRecord(manifest) && isRecord(manifest.imports)\n ? { file, imports: manifest.imports, root: dirname(file) }\n : undefined;\n } catch {\n return undefined;\n }\n};\n\nfunction stringTargets(value: unknown): string[] {\n if (typeof value === \"string\") {\n return [value];\n }\n\n if (Array.isArray(value)) {\n return value.flatMap((item) => stringTargets(item));\n }\n\n return isRecord(value)\n ? Object.values(value).flatMap((item) => stringTargets(item))\n : [];\n}\n\nconst importPatternMatch = (pattern: string, source: string): string | undefined => {\n if (pattern === source) {\n return \"\";\n }\n\n const wildcard = pattern.indexOf(\"*\");\n\n if (wildcard === -1) {\n return undefined;\n }\n\n const prefix = pattern.slice(0, wildcard);\n const suffix = pattern.slice(wildcard + 1);\n\n return source.startsWith(prefix) && source.endsWith(suffix)\n ? source.slice(prefix.length, source.length - suffix.length)\n : undefined;\n};\n\nconst packageImportTargets = (source: string, imports: Record<string, unknown>): string[] =>\n Object.entries(imports).flatMap(([pattern, value]) => {\n const match = importPatternMatch(pattern, source);\n\n return match === undefined\n ? []\n : stringTargets(value).map((target) => target.split(\"*\").join(match));\n });\n\nconst packageImportDependencies = (source: string, importer: string, configName: string): string[] => {\n if (!source.startsWith(\"#\")) {\n return [];\n }\n\n const packageImports = readPackageImports(importer);\n\n if (packageImports === undefined) {\n return [];\n }\n\n const targets = packageImportTargets(source, packageImports.imports)\n .filter((target) => target.startsWith(\".\"))\n .flatMap((target) => targetCandidates(resolve(packageImports.root, target), configName));\n\n return [packageImports.file, ...targets];\n};\n\nconst normalizedResolvedPath = (path: string): string =>\n path.startsWith(\"file:\") ? fileURLToPath(path) : path;\n\nconst resolvedSourcePath = (source: string, importer: string, jiti: Jiti): string | undefined => {\n try {\n const path = jiti.esmResolve(source, {\n parentURL: pathToFileURL(importer).href,\n try: true,\n });\n\n return path === undefined ? undefined : normalizedResolvedPath(path);\n } catch {\n return undefined;\n }\n};\n\nconst sourceDependencies = (\n source: string,\n importer: string,\n configName: string,\n jiti: Jiti,\n): string[] => {\n const dependency = resolvedSourcePath(source, importer, jiti);\n const packageDependencies = packageImportDependencies(source, importer, configName);\n\n return dependency === undefined\n ? [...unresolvedCandidates(source, importer, configName), ...packageDependencies]\n : [dependency, ...packageDependencies];\n};\n\nconst configLayerDirectory = (path: string, configName: string, configRoot: string): string => {\n const segments = configName.split(/[\\\\/]/u).filter((segment) => segment.length > 0);\n let directory = resolve(path);\n let remaining = segments.length;\n\n while (remaining > 0) {\n directory = dirname(directory);\n remaining -= 1;\n }\n\n return resolve(directory, ...segments) === resolve(path) ? directory : resolve(configRoot);\n};\n\nconst c12SourceDependencies = (\n source: string,\n importer: string,\n configName: string,\n configRoot: string,\n): string[] => {\n const clean = source.split(/[?#]/u, 1)[0] ?? \"\";\n\n const cwd = configLayerDirectory(importer, configName, configRoot);\n const target = localConfigSourcePath(clean, { cwd, configFile: configName });\n\n return target === undefined ? [] : targetCandidates(target, configName);\n};\n\nconst directDependencies = (path: string, configName: string, configRoot: string): string[] => {\n const module = MODULE_EXTENSIONS.has(extname(path).toLowerCase()) ? moduleSources(path) : undefined;\n const sources = module?.all ?? dataSources(path);\n const extended = module?.extended ?? sources;\n const jiti = createJiti(path, {\n extensions: RESOLVABLE_EXTENSIONS,\n fsCache: false,\n moduleCache: false,\n });\n\n return [\n ...sources.flatMap((source) => sourceDependencies(source, path, configName, jiti)),\n ...extended.flatMap((source) => c12SourceDependencies(source, path, configName, configRoot)),\n ]\n .filter((dependency) => !dependency.includes(`${sep}node_modules${sep}`));\n};\n\nconst resolveConfigDependencies = (\n configFile: string,\n configName = basename(configFile),\n configRoot = dirname(configFile),\n): string[] => {\n const dependencies: Set<string> = new Set();\n const pending = [resolve(configFile)];\n\n while (pending.length > 0) {\n const path = pending.pop();\n\n if (path === undefined) {\n break;\n }\n\n if (dependencies.has(path)) {\n continue;\n }\n\n dependencies.add(path);\n pending.push(...directDependencies(path, configName, configRoot));\n }\n\n return [...dependencies];\n};\n\nexport { resolveConfigDependencies };\n"]}
|
package/dist/virtual.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"virtual.d.ts","sourceRoot":"","sources":["../src/virtual.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlD,QAAA,MAAM,sBAAsB,wBAAwB,CAAC;AACrD,QAAA,MAAM,+BAA+B,0BAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"virtual.d.ts","sourceRoot":"","sources":["../src/virtual.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlD,QAAA,MAAM,sBAAsB,wBAAwB,CAAC;AACrD,QAAA,MAAM,+BAA+B,0BAAgC,CAAC;AAEtE,QAAA,MAAM,kBAAkB,GAAI,QAAQ,cAAc,KAAG,MAoBpD,CAAC;AAEF,OAAO,EAAE,sBAAsB,EAAE,+BAA+B,EAAE,kBAAkB,EAAE,CAAC"}
|
package/dist/virtual.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { resourceBasePath } from "./resource-base-path.js";
|
|
2
2
|
const GTKX_CONFIG_VIRTUAL_ID = "virtual:gtkx-config";
|
|
3
3
|
const RESOLVED_GTKX_CONFIG_VIRTUAL_ID = `\0${GTKX_CONFIG_VIRTUAL_ID}`;
|
|
4
|
-
const METADATA_SPECIFIER = "@gtkx/jsx/metadata";
|
|
5
4
|
const renderConfigModule = (config) => {
|
|
6
5
|
const lazyJson = JSON.stringify(Object.fromEntries(config.lazyElements.map((type) => [type, { isLazy: true }])));
|
|
7
6
|
const behaviorImports = config.elements === null
|
|
@@ -12,7 +11,6 @@ const renderConfigModule = (config) => {
|
|
|
12
11
|
];
|
|
13
12
|
return [
|
|
14
13
|
...behaviorImports,
|
|
15
|
-
`export * from ${JSON.stringify(METADATA_SPECIFIER)};`,
|
|
16
14
|
`export const applicationId = ${JSON.stringify(config.applicationId)};`,
|
|
17
15
|
`export const resourceBasePath = ${JSON.stringify(resourceBasePath(config.applicationId))};`,
|
|
18
16
|
`export const userEventSignals = ${JSON.stringify(config.userEventSignals)};`,
|
package/dist/virtual.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"virtual.js","sourceRoot":"","sources":["../src/virtual.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,MAAM,sBAAsB,GAAG,qBAAqB,CAAC;AACrD,MAAM,+BAA+B,GAAG,KAAK,sBAAsB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"virtual.js","sourceRoot":"","sources":["../src/virtual.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,MAAM,sBAAsB,GAAG,qBAAqB,CAAC;AACrD,MAAM,+BAA+B,GAAG,KAAK,sBAAsB,EAAE,CAAC;AAEtE,MAAM,kBAAkB,GAAG,CAAC,MAAsB,EAAU,EAAE;IAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAEjH,MAAM,eAAe,GACjB,MAAM,CAAC,QAAQ,KAAK,IAAI;QACpB,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC;YACM,6DAA6D;YAC7D,kCAAkC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG;SACvE,CAAC;IAEd,OAAO;QACH,GAAG,eAAe;QAClB,gCAAgC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG;QACvE,mCAAmC,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG;QAC5F,mCAAmC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,gBAAgB,CAAC,GAAG;QAC7E,MAAM,CAAC,QAAQ,KAAK,IAAI;YACpB,CAAC,CAAC,2BAA2B,QAAQ,GAAG;YACxC,CAAC,CAAC,mEAAmE,QAAQ,IAAI;KACxF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACjB,CAAC,CAAC;AAEF,OAAO,EAAE,sBAAsB,EAAE,+BAA+B,EAAE,kBAAkB,EAAE,CAAC","sourcesContent":["import type { ResolvedConfig } from \"./config.ts\";\nimport { resourceBasePath } from \"./resource-base-path.ts\";\n\nconst GTKX_CONFIG_VIRTUAL_ID = \"virtual:gtkx-config\";\nconst RESOLVED_GTKX_CONFIG_VIRTUAL_ID = `\\0${GTKX_CONFIG_VIRTUAL_ID}`;\n\nconst renderConfigModule = (config: ResolvedConfig): string => {\n const lazyJson = JSON.stringify(Object.fromEntries(config.lazyElements.map((type) => [type, { isLazy: true }])));\n\n const behaviorImports =\n config.elements === null\n ? []\n : [\n \"import { mergeElementConfigs } from \\\"@gtkx/react/config\\\";\",\n `import __elementBehaviors from ${JSON.stringify(config.elements)};`,\n ];\n\n return [\n ...behaviorImports,\n `export const applicationId = ${JSON.stringify(config.applicationId)};`,\n `export const resourceBasePath = ${JSON.stringify(resourceBasePath(config.applicationId))};`,\n `export const userEventSignals = ${JSON.stringify(config.userEventSignals)};`,\n config.elements === null\n ? `export const elements = ${lazyJson};`\n : `export const elements = mergeElementConfigs(__elementBehaviors, ${lazyJson});`,\n ].join(\"\\n\");\n};\n\nexport { GTKX_CONFIG_VIRTUAL_ID, RESOLVED_GTKX_CONFIG_VIRTUAL_ID, renderConfigModule };\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vite-plugin.d.ts","sourceRoot":"","sources":["../src/vite-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAC/C,OAAO,EAAE,KAAK,YAAY,EAAsB,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"vite-plugin.d.ts","sourceRoot":"","sources":["../src/vite-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAC/C,OAAO,EAAE,KAAK,YAAY,EAAsB,MAAM,aAAa,CAAC;AA0BpE;;;GAGG;AACH,QAAA,MAAM,kBAAkB,GAAI,SAAS;IACjC,mDAAmD;IACnD,IAAI,EAAE,MAAM,CAAC;IACb,0FAA0F;IAC1F,UAAU,CAAC,EAAE,YAAY,CAAC;IAC1B,gHAAgH;IAChH,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;CAChE,KAAG,MAoBH,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
|
package/dist/vite-plugin.js
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import { createConfigLoader } from "./loader.js";
|
|
2
2
|
import { GTKX_CONFIG_VIRTUAL_ID, renderConfigModule, RESOLVED_GTKX_CONFIG_VIRTUAL_ID } from "./virtual.js";
|
|
3
|
+
import { viteProjectRoot } from "./vite-root.js";
|
|
4
|
+
const VIRTUAL_ID_RE = new RegExp(`^${GTKX_CONFIG_VIRTUAL_ID}$`);
|
|
5
|
+
const RESOLVED_VIRTUAL_ID_RE = new RegExp(`^${RESOLVED_GTKX_CONFIG_VIRTUAL_ID}$`);
|
|
3
6
|
const resolveVirtualId = (id) => id === GTKX_CONFIG_VIRTUAL_ID ? RESOLVED_GTKX_CONFIG_VIRTUAL_ID : null;
|
|
4
7
|
const loadVirtualModule = async (id, loadConfig, state) => {
|
|
5
8
|
if (id !== RESOLVED_GTKX_CONFIG_VIRTUAL_ID) {
|
|
6
9
|
return undefined;
|
|
7
10
|
}
|
|
8
|
-
return renderConfigModule(await loadConfig.resolve(state.root
|
|
11
|
+
return renderConfigModule(await loadConfig.resolve(state.root));
|
|
9
12
|
};
|
|
10
13
|
/**
|
|
11
14
|
* Creates a Vite plugin serving `virtual:gtkx-config`, the module carrying the project's resolved
|
|
@@ -13,15 +16,21 @@ const loadVirtualModule = async (id, loadConfig, state) => {
|
|
|
13
16
|
*/
|
|
14
17
|
const createConfigPlugin = (options) => {
|
|
15
18
|
const loadConfig = options.loadConfig ?? createConfigLoader();
|
|
16
|
-
const state = { root:
|
|
19
|
+
const state = { root: process.cwd() };
|
|
17
20
|
return {
|
|
18
21
|
name: options.name,
|
|
19
22
|
config(config) {
|
|
20
|
-
state.root = config
|
|
23
|
+
state.root = viteProjectRoot(config);
|
|
21
24
|
return options.config?.(config);
|
|
22
25
|
},
|
|
23
|
-
resolveId:
|
|
24
|
-
|
|
26
|
+
resolveId: {
|
|
27
|
+
filter: { id: VIRTUAL_ID_RE },
|
|
28
|
+
handler: (id) => resolveVirtualId(id),
|
|
29
|
+
},
|
|
30
|
+
load: {
|
|
31
|
+
filter: { id: RESOLVED_VIRTUAL_ID_RE },
|
|
32
|
+
handler: (id) => loadVirtualModule(id, loadConfig, state),
|
|
33
|
+
},
|
|
25
34
|
};
|
|
26
35
|
};
|
|
27
36
|
export default createConfigPlugin;
|
package/dist/vite-plugin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vite-plugin.js","sourceRoot":"","sources":["../src/vite-plugin.ts"],"names":[],"mappings":"AACA,OAAO,EAAqB,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,+BAA+B,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"vite-plugin.js","sourceRoot":"","sources":["../src/vite-plugin.ts"],"names":[],"mappings":"AACA,OAAO,EAAqB,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,+BAA+B,EAAE,MAAM,cAAc,CAAC;AAC3G,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAMjD,MAAM,aAAa,GAAG,IAAI,MAAM,CAAC,IAAI,sBAAsB,GAAG,CAAC,CAAC;AAChE,MAAM,sBAAsB,GAAG,IAAI,MAAM,CAAC,IAAI,+BAA+B,GAAG,CAAC,CAAC;AAElF,MAAM,gBAAgB,GAAG,CAAC,EAAU,EAAiB,EAAE,CACnD,EAAE,KAAK,sBAAsB,CAAC,CAAC,CAAC,+BAA+B,CAAC,CAAC,CAAC,IAAI,CAAC;AAE3E,MAAM,iBAAiB,GAAG,KAAK,EAC3B,EAAU,EACV,UAAwB,EACxB,KAAkB,EACS,EAAE;IAC7B,IAAI,EAAE,KAAK,+BAA+B,EAAE,CAAC;QACzC,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,OAAO,kBAAkB,CAAC,MAAM,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;AACpE,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,kBAAkB,GAAG,CAAC,OAO3B,EAAU,EAAE;IACT,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,kBAAkB,EAAE,CAAC;IAC9D,MAAM,KAAK,GAAgB,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;IAEnD,OAAO;QACH,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,MAAM,CAAC,MAAkB;YACrB,KAAK,CAAC,IAAI,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;YAErC,OAAO,OAAO,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC;QACpC,CAAC;QACD,SAAS,EAAE;YACP,MAAM,EAAE,EAAE,EAAE,EAAE,aAAa,EAAE;YAC7B,OAAO,EAAE,CAAC,EAAU,EAAE,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC;SAChD;QACD,IAAI,EAAE;YACF,MAAM,EAAE,EAAE,EAAE,EAAE,sBAAsB,EAAE;YACtC,OAAO,EAAE,CAAC,EAAU,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,EAAE,UAAU,EAAE,KAAK,CAAC;SACpE;KACJ,CAAC;AACN,CAAC,CAAC;AAEF,eAAe,kBAAkB,CAAC","sourcesContent":["import type { Plugin, UserConfig } from \"vite\";\nimport { type ConfigLoader, createConfigLoader } from \"./loader.ts\";\nimport { GTKX_CONFIG_VIRTUAL_ID, renderConfigModule, RESOLVED_GTKX_CONFIG_VIRTUAL_ID } from \"./virtual.ts\";\nimport { viteProjectRoot } from \"./vite-root.ts\";\n\ntype PluginState = {\n root: string;\n};\n\nconst VIRTUAL_ID_RE = new RegExp(`^${GTKX_CONFIG_VIRTUAL_ID}$`);\nconst RESOLVED_VIRTUAL_ID_RE = new RegExp(`^${RESOLVED_GTKX_CONFIG_VIRTUAL_ID}$`);\n\nconst resolveVirtualId = (id: string): string | null =>\n id === GTKX_CONFIG_VIRTUAL_ID ? RESOLVED_GTKX_CONFIG_VIRTUAL_ID : null;\n\nconst loadVirtualModule = async (\n id: string,\n loadConfig: ConfigLoader,\n state: PluginState,\n): Promise<string | undefined> => {\n if (id !== RESOLVED_GTKX_CONFIG_VIRTUAL_ID) {\n return undefined;\n }\n\n return renderConfigModule(await loadConfig.resolve(state.root));\n};\n\n/**\n * Creates a Vite plugin serving `virtual:gtkx-config`, the module carrying the project's resolved\n * `gtkx.config.ts`.\n */\nconst createConfigPlugin = (options: {\n /** Name the plugin is registered under in Vite. */\n name: string;\n /** Loader the configuration is resolved through, defaulting to a fresh caching loader. */\n loadConfig?: ConfigLoader;\n /** Extra Vite configuration contributed from the plugin's `config` hook, given the user's own configuration. */\n config?: (config: UserConfig) => Omit<UserConfig, \"plugins\">;\n}): Plugin => {\n const loadConfig = options.loadConfig ?? createConfigLoader();\n const state: PluginState = { root: process.cwd() };\n\n return {\n name: options.name,\n config(config: UserConfig) {\n state.root = viteProjectRoot(config);\n\n return options.config?.(config);\n },\n resolveId: {\n filter: { id: VIRTUAL_ID_RE },\n handler: (id: string) => resolveVirtualId(id),\n },\n load: {\n filter: { id: RESOLVED_VIRTUAL_ID_RE },\n handler: (id: string) => loadVirtualModule(id, loadConfig, state),\n },\n };\n};\n\nexport default createConfigPlugin;\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vite-root.d.ts","sourceRoot":"","sources":["../src/vite-root.ts"],"names":[],"mappings":"AAAA,KAAK,UAAU,GAAG;IACd,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,IAAI,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,GAAG,SAAS,CAAC;CACpD,CAAC;AAEF,QAAA,MAAM,eAAe,GAAI,QAAQ,UAAU,KAAG,MAA2D,CAAC;AAE1G,OAAO,EAAE,eAAe,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vite-root.js","sourceRoot":"","sources":["../src/vite-root.ts"],"names":[],"mappings":"AAKA,MAAM,eAAe,GAAG,CAAC,MAAkB,EAAU,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,IAAI,MAAM,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;AAE1G,OAAO,EAAE,eAAe,EAAE,CAAC","sourcesContent":["type RootConfig = {\n root?: string | undefined;\n test?: { root?: string | undefined } | undefined;\n};\n\nconst viteProjectRoot = (config: RootConfig): string => config.test?.root ?? config.root ?? process.cwd();\n\nexport { viteProjectRoot };\n"]}
|
package/package.json
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gtkx/config",
|
|
3
|
-
"version": "2.0.0-beta.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "2.0.0-beta.11",
|
|
4
|
+
"description": "Typed application configuration for GTKX.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"gtkx",
|
|
7
7
|
"gtk",
|
|
8
8
|
"gtk4",
|
|
9
|
+
"adwaita",
|
|
10
|
+
"gnome",
|
|
9
11
|
"react",
|
|
10
12
|
"typescript",
|
|
11
13
|
"config",
|
|
@@ -56,7 +58,19 @@
|
|
|
56
58
|
"options": {
|
|
57
59
|
"cwd": ".",
|
|
58
60
|
"command": "eslint {projectRoot}"
|
|
59
|
-
}
|
|
61
|
+
},
|
|
62
|
+
"dependsOn": []
|
|
63
|
+
},
|
|
64
|
+
"build": {
|
|
65
|
+
"dependsOn": [
|
|
66
|
+
"^build"
|
|
67
|
+
]
|
|
68
|
+
},
|
|
69
|
+
"typecheck": {
|
|
70
|
+
"dependsOn": [
|
|
71
|
+
"build",
|
|
72
|
+
"^typecheck"
|
|
73
|
+
]
|
|
60
74
|
}
|
|
61
75
|
}
|
|
62
76
|
},
|
|
@@ -64,11 +78,14 @@
|
|
|
64
78
|
"node": ">=26.7.0"
|
|
65
79
|
},
|
|
66
80
|
"dependencies": {
|
|
67
|
-
"@
|
|
81
|
+
"@babel/core": "^8.0.6",
|
|
82
|
+
"@gtkx/utils": "2.0.0-beta.11",
|
|
68
83
|
"c12": "^3.3.4",
|
|
84
|
+
"confbox": "^0.3.1",
|
|
69
85
|
"defu": "^6.1.7",
|
|
70
|
-
"
|
|
71
|
-
"
|
|
86
|
+
"jiti": "^2.7.0",
|
|
87
|
+
"vite": "^8.3.0",
|
|
88
|
+
"zod": "^4.6.5"
|
|
72
89
|
},
|
|
73
90
|
"scripts": {
|
|
74
91
|
"release": "tsx ../../scripts/release-package.ts"
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { createJiti, type Jiti, type TransformOptions, type TransformResult } from "jiti";
|
|
2
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
3
|
+
import { createRequire, registerHooks } from "node:module";
|
|
4
|
+
import { extname, sep } from "node:path";
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
6
|
+
|
|
7
|
+
type CaptureState = { cacheKey: string; dependencies: Set<string>; transformer: Jiti };
|
|
8
|
+
type CapturedConfig<T> = { dependencies: string[]; value: T };
|
|
9
|
+
|
|
10
|
+
const captureStorage: AsyncLocalStorage<CaptureState> = new AsyncLocalStorage();
|
|
11
|
+
const dependenciesByValue: WeakMap<object, string[]> = new WeakMap();
|
|
12
|
+
const CACHE_BUSTED_EXTENSIONS: ReadonlySet<string> = new Set([".cjs", ".js", ".json", ".mjs"]);
|
|
13
|
+
|
|
14
|
+
const isTrackedPath = (path: string): boolean => !path.includes(`${sep}node_modules${sep}`);
|
|
15
|
+
|
|
16
|
+
const addPath = (path: string): void => {
|
|
17
|
+
if (isTrackedPath(path)) {
|
|
18
|
+
captureStorage.getStore()?.dependencies.add(path);
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
const addUrl = (url: string): void => {
|
|
23
|
+
if (url.startsWith("file:")) {
|
|
24
|
+
addPath(fileURLToPath(url));
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
const cacheBustedUrl = (url: string): string => {
|
|
29
|
+
const state = captureStorage.getStore();
|
|
30
|
+
|
|
31
|
+
if (state === undefined || !url.startsWith("file:")) {
|
|
32
|
+
return url;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const path = fileURLToPath(url);
|
|
36
|
+
|
|
37
|
+
if (!isTrackedPath(path) || !CACHE_BUSTED_EXTENSIONS.has(extname(path))) {
|
|
38
|
+
return url;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const parsed = new URL(url);
|
|
42
|
+
parsed.searchParams.set("gtkx-config-load", state.cacheKey);
|
|
43
|
+
|
|
44
|
+
return parsed.href;
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
const registerResolutionHook = (): ReturnType<typeof registerHooks> =>
|
|
48
|
+
registerHooks({
|
|
49
|
+
resolve(specifier, context, nextResolve) {
|
|
50
|
+
const result = nextResolve(specifier, context);
|
|
51
|
+
addUrl(result.url);
|
|
52
|
+
|
|
53
|
+
return { ...result, url: cacheBustedUrl(result.url) };
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
const clearNativeModuleCache = (dependencies: Iterable<string>): void => {
|
|
58
|
+
const cache = createRequire(import.meta.url).cache;
|
|
59
|
+
|
|
60
|
+
for (const path of dependencies) {
|
|
61
|
+
Reflect.deleteProperty(cache, path);
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
const transformConfigModule = (options: TransformOptions): TransformResult => {
|
|
66
|
+
const state = captureStorage.getStore();
|
|
67
|
+
|
|
68
|
+
if (state === undefined) {
|
|
69
|
+
throw new Error("Configuration transformation started outside a dependency capture");
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
if (options.filename !== undefined) {
|
|
73
|
+
addPath(options.filename);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
return { code: state.transformer.transform(options) };
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
const setConfigDependencies = (value: object, dependencies: Iterable<string>): void => {
|
|
80
|
+
const paths = [...new Set(dependencies)];
|
|
81
|
+
dependenciesByValue.set(value, paths);
|
|
82
|
+
clearNativeModuleCache(paths);
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
const configDependenciesFor = (value: unknown): string[] =>
|
|
86
|
+
typeof value === "object" && value !== null ? dependenciesByValue.get(value) ?? [] : [];
|
|
87
|
+
|
|
88
|
+
const captureConfigDependencies = async <T>(operation: () => Promise<T>): Promise<CapturedConfig<T>> => {
|
|
89
|
+
const state: CaptureState = {
|
|
90
|
+
cacheKey: process.hrtime.bigint().toString(),
|
|
91
|
+
dependencies: new Set(),
|
|
92
|
+
transformer: createJiti(import.meta.url, { fsCache: false, moduleCache: false }),
|
|
93
|
+
};
|
|
94
|
+
const hook = registerResolutionHook();
|
|
95
|
+
|
|
96
|
+
try {
|
|
97
|
+
const value = await captureStorage.run(state, operation);
|
|
98
|
+
|
|
99
|
+
return { dependencies: [...state.dependencies], value };
|
|
100
|
+
} catch (error) {
|
|
101
|
+
if (typeof error === "object" && error !== null) {
|
|
102
|
+
setConfigDependencies(error, state.dependencies);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
throw error;
|
|
106
|
+
} finally {
|
|
107
|
+
hook.deregister();
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
export {
|
|
112
|
+
captureConfigDependencies,
|
|
113
|
+
configDependenciesFor,
|
|
114
|
+
setConfigDependencies,
|
|
115
|
+
transformConfigModule,
|
|
116
|
+
};
|
package/src/config-error.ts
CHANGED
|
@@ -1,13 +1,18 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
|
|
3
|
-
const
|
|
3
|
+
const DEFAULT_CONFIG_FILE = "gtkx.config.*";
|
|
4
4
|
|
|
5
5
|
const isRecord = (value: unknown): value is Record<string, unknown> =>
|
|
6
6
|
typeof value === "object" && value !== null && !Array.isArray(value);
|
|
7
7
|
|
|
8
|
-
const
|
|
9
|
-
new Error(`${CONFIG_PREFIX} no configuration file found in ${cwd}`);
|
|
8
|
+
const configPrefix = (configFile: string): string => `${configFile}:`;
|
|
10
9
|
|
|
11
|
-
const
|
|
10
|
+
const missingConfigFileError = (cwd: string, configFile?: string): Error =>
|
|
11
|
+
new Error(configFile === undefined
|
|
12
|
+
? `${configPrefix(DEFAULT_CONFIG_FILE)} no configuration file found in ${cwd}`
|
|
13
|
+
: `${configPrefix(configFile)} no configuration file found in ${cwd}`);
|
|
14
|
+
|
|
15
|
+
const configError = (error: z.ZodError, configFile = DEFAULT_CONFIG_FILE): Error =>
|
|
16
|
+
new Error(`${configPrefix(configFile)}\n${z.prettifyError(error)}`);
|
|
12
17
|
|
|
13
18
|
export { isRecord, missingConfigFileError, configError };
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { relative, resolve } from "node:path";
|
|
2
|
+
import { configDependenciesFor } from "./config-dependencies.ts";
|
|
3
|
+
import { loadConfig, type LoadConfigOptions, type LoadedConfig } from "./loader.ts";
|
|
4
|
+
import { resolveConfigDependencies } from "./static-dependencies.ts";
|
|
5
|
+
|
|
6
|
+
type ConfigReloader = {
|
|
7
|
+
reload: () => Promise<LoadedConfig>;
|
|
8
|
+
resolvePaths: () => string[];
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
const createConfigReloader = async (
|
|
12
|
+
cwd: string,
|
|
13
|
+
options: LoadConfigOptions = {},
|
|
14
|
+
initialDependencies: string[] = [],
|
|
15
|
+
): Promise<ConfigReloader> => {
|
|
16
|
+
let selectedConfigFile: string;
|
|
17
|
+
let knownDependencies = initialDependencies;
|
|
18
|
+
|
|
19
|
+
if (options.configFile === undefined) {
|
|
20
|
+
const loaded = await loadConfig(cwd, options);
|
|
21
|
+
selectedConfigFile = loaded.configFile;
|
|
22
|
+
knownDependencies = [...knownDependencies, ...configDependenciesFor(loaded)];
|
|
23
|
+
} else {
|
|
24
|
+
selectedConfigFile = resolve(cwd, options.configFile);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const selectedConfigName = relative(cwd, selectedConfigFile);
|
|
28
|
+
const resolvePaths = (): string[] => [
|
|
29
|
+
...new Set(
|
|
30
|
+
[selectedConfigFile, ...knownDependencies]
|
|
31
|
+
.flatMap((path) => resolveConfigDependencies(path, selectedConfigName, cwd)),
|
|
32
|
+
),
|
|
33
|
+
];
|
|
34
|
+
|
|
35
|
+
return {
|
|
36
|
+
resolvePaths,
|
|
37
|
+
reload: async () => {
|
|
38
|
+
let loaded: LoadedConfig;
|
|
39
|
+
|
|
40
|
+
try {
|
|
41
|
+
loaded = await loadConfig(cwd, { ...options, configFile: selectedConfigFile });
|
|
42
|
+
} catch (error) {
|
|
43
|
+
knownDependencies = [...new Set([...knownDependencies, ...configDependenciesFor(error)])];
|
|
44
|
+
throw error;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
knownDependencies = configDependenciesFor(loaded);
|
|
48
|
+
|
|
49
|
+
return loaded;
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
export { createConfigReloader };
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { basename, extname, isAbsolute, resolve } from "node:path";
|
|
2
|
+
|
|
3
|
+
type ConfigResolutionOptions = { configFile?: string | undefined; cwd?: string | undefined };
|
|
4
|
+
|
|
5
|
+
const isLocalConfigSource = (source: string): boolean => source.startsWith(".") || isAbsolute(source);
|
|
6
|
+
|
|
7
|
+
const isDirectoryConfigSource = (source: string): boolean => {
|
|
8
|
+
const extension = extname(source);
|
|
9
|
+
|
|
10
|
+
return extension.length === 0 || extension === basename(source);
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
const localConfigSourcePath = (source: string, options: ConfigResolutionOptions): string | undefined => {
|
|
14
|
+
if (source === "." || !isLocalConfigSource(source)) {
|
|
15
|
+
return undefined;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const cwd = options.cwd ?? process.cwd();
|
|
19
|
+
|
|
20
|
+
return isDirectoryConfigSource(source)
|
|
21
|
+
? resolve(cwd, source, options.configFile ?? "gtkx.config")
|
|
22
|
+
: resolve(cwd, source);
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
export { localConfigSourcePath, type ConfigResolutionOptions };
|
package/src/config.ts
CHANGED
|
@@ -25,13 +25,11 @@ type ResolvedReactCompilerOptions = ReactCompilerOptions & {
|
|
|
25
25
|
};
|
|
26
26
|
|
|
27
27
|
/**
|
|
28
|
-
*
|
|
29
|
-
* to bind and where to find them, the GApplication id, per-element configuration, the React
|
|
30
|
-
* Compiler, codegen, and user event signal settings, and the `agents` and `mcp` blocks controlling
|
|
31
|
-
* what coding agents are given.
|
|
28
|
+
* GTKX project configuration authored in `gtkx.config.ts` and validated when loaded.
|
|
32
29
|
*/
|
|
33
30
|
type Config = z.infer<typeof configSchema>;
|
|
34
31
|
type ModuleExport = z.infer<typeof moduleExportSchema>;
|
|
32
|
+
type ElementPropsExport = z.infer<typeof elementPropsSchema>;
|
|
35
33
|
type ElementConfigEntry = z.infer<typeof elementConfigSchema>;
|
|
36
34
|
|
|
37
35
|
type McpSettings = {
|
|
@@ -58,15 +56,15 @@ type ResolvedConfig = {
|
|
|
58
56
|
|
|
59
57
|
const APPLICATION_ID_PATTERN = /^[A-Za-z_][A-Za-z0-9_-]*(\.[A-Za-z_][A-Za-z0-9_-]*)+$/;
|
|
60
58
|
const APPLICATION_ID_MAX_LENGTH = 255;
|
|
61
|
-
const
|
|
59
|
+
const IMPLICIT_LIBRARIES: Set<string> = new Set(["Adw-1", "Gtk-4.0"]);
|
|
62
60
|
/** Compilation modes `babel-plugin-react-compiler` accepts. */
|
|
63
61
|
const COMPILATION_MODES = ["infer", "syntax", "annotation", "all"] as const;
|
|
64
62
|
/** Panic thresholds `babel-plugin-react-compiler` accepts. */
|
|
65
63
|
const PANIC_THRESHOLDS = ["none", "critical_errors", "all_errors"] as const;
|
|
66
64
|
const REACT_COMPILER_TARGET = "19";
|
|
67
65
|
|
|
68
|
-
const librarySchema = girLibrary('must be of the form "Name-Version", such as "
|
|
69
|
-
.refine((library) => !
|
|
66
|
+
const librarySchema = girLibrary('must be of the form "Name-Version", such as "Adw-1"')
|
|
67
|
+
.refine((library) => !IMPLICIT_LIBRARIES.has(library), { error: "is bound implicitly; remove it" });
|
|
70
68
|
|
|
71
69
|
const librariesSchema = z
|
|
72
70
|
.array(librarySchema, { error: "must be a non-empty string array or omitted" })
|
|
@@ -80,7 +78,7 @@ const applicationIdSchema = z
|
|
|
80
78
|
|
|
81
79
|
const reactCompilerSchema = z.union([
|
|
82
80
|
z.boolean(),
|
|
83
|
-
z.
|
|
81
|
+
z.strictObject({
|
|
84
82
|
compilationMode: z.enum(COMPILATION_MODES).optional(),
|
|
85
83
|
panicThreshold: z.enum(PANIC_THRESHOLDS).optional(),
|
|
86
84
|
}),
|
|
@@ -97,7 +95,7 @@ const userEventSignalsSchema = z.record(
|
|
|
97
95
|
{ error: "must be a record of GLib type names to signal name arrays" },
|
|
98
96
|
);
|
|
99
97
|
|
|
100
|
-
const moduleExportSchema = z.
|
|
98
|
+
const moduleExportSchema = z.strictObject(
|
|
101
99
|
{
|
|
102
100
|
module: z.string({ error: "must be a module specifier" }).min(1, { error: "must be a module specifier" }),
|
|
103
101
|
export: z.string({ error: "must be an export name" }).min(1, { error: "must be an export name" }),
|
|
@@ -105,10 +103,16 @@ const moduleExportSchema = z.object(
|
|
|
105
103
|
{ error: "must be a { module, export } object" },
|
|
106
104
|
);
|
|
107
105
|
|
|
108
|
-
const
|
|
106
|
+
const elementPropsSchema = moduleExportSchema.extend({
|
|
107
|
+
composition: z.enum(["factory", "intersection"]).optional(),
|
|
108
|
+
constructOnly: z.array(z.string()).optional(),
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
const elementConfigSchema = z.strictObject({
|
|
109
112
|
component: moduleExportSchema.optional(),
|
|
110
|
-
props:
|
|
113
|
+
props: elementPropsSchema.optional(),
|
|
111
114
|
isLazy: z.boolean({ error: "must be a boolean" }).optional(),
|
|
115
|
+
acceptedChildTypes: z.array(z.string()).optional(),
|
|
112
116
|
omittedProps: z
|
|
113
117
|
.array(
|
|
114
118
|
z.string({ error: "must be a non-empty property name" }).min(1, {
|
|
@@ -119,7 +123,7 @@ const elementConfigSchema = z.object({
|
|
|
119
123
|
.optional(),
|
|
120
124
|
});
|
|
121
125
|
|
|
122
|
-
const elementsSchema = z.
|
|
126
|
+
const elementsSchema = z.strictObject({
|
|
123
127
|
behaviors: z
|
|
124
128
|
.string({ error: "must be a path to a module exporting element behaviors" })
|
|
125
129
|
.min(1, { error: "must be a path to a module exporting element behaviors" })
|
|
@@ -127,12 +131,12 @@ const elementsSchema = z.object({
|
|
|
127
131
|
config: z.record(z.string(), elementConfigSchema).optional(),
|
|
128
132
|
});
|
|
129
133
|
|
|
130
|
-
const agentsSchema = z.
|
|
134
|
+
const agentsSchema = z.strictObject({
|
|
131
135
|
rules: z.boolean({ error: "must be a boolean" }).optional(),
|
|
132
136
|
reference: z.boolean({ error: "must be a boolean" }).optional(),
|
|
133
137
|
});
|
|
134
138
|
|
|
135
|
-
const mcpSchema = z.
|
|
139
|
+
const mcpSchema = z.strictObject({
|
|
136
140
|
tools: z
|
|
137
141
|
.array(z.string({ error: "must be a tool name pattern" }).min(1, { error: "must be a tool name pattern" }), {
|
|
138
142
|
error: "must be an array of tool name patterns",
|
|
@@ -153,7 +157,7 @@ const graduatedFutureSchema = z
|
|
|
153
157
|
})
|
|
154
158
|
.strict();
|
|
155
159
|
|
|
156
|
-
const deprecationsSchema = z.
|
|
160
|
+
const deprecationsSchema = z.strictObject({
|
|
157
161
|
silence: z
|
|
158
162
|
.array(z.never({ error: "does not name a current deprecation" }), {
|
|
159
163
|
error: "must be an array of current deprecation ids",
|
|
@@ -162,7 +166,7 @@ const deprecationsSchema = z.object({
|
|
|
162
166
|
});
|
|
163
167
|
|
|
164
168
|
/** Schema every `gtkx.config.ts` is validated against, and the source of the {@link Config} type. */
|
|
165
|
-
const configSchema = z.
|
|
169
|
+
const configSchema = z.strictObject({
|
|
166
170
|
libraries: librariesSchema.optional(),
|
|
167
171
|
girPath: z.array(z.string(), { error: "must be an array of strings if provided" }).optional(),
|
|
168
172
|
applicationId: applicationIdSchema,
|
|
@@ -201,11 +205,11 @@ const resolveReactCompilerOptions = (setting: Config["reactCompiler"]): Resolved
|
|
|
201
205
|
};
|
|
202
206
|
};
|
|
203
207
|
|
|
204
|
-
const validateConfig = (config: unknown): void => {
|
|
208
|
+
const validateConfig = (config: unknown, configFile?: string): void => {
|
|
205
209
|
const result = validationSchema.safeParse(config);
|
|
206
210
|
|
|
207
211
|
if (!result.success) {
|
|
208
|
-
throw configError(result.error);
|
|
212
|
+
throw configError(result.error, configFile);
|
|
209
213
|
}
|
|
210
214
|
};
|
|
211
215
|
|
|
@@ -251,9 +255,12 @@ const elementEntryValues = <T>(
|
|
|
251
255
|
const resolveElementComponents = (elements: Config["elements"]): Record<string, ModuleExport> =>
|
|
252
256
|
elementEntryValues(elements, (entry) => entry.component);
|
|
253
257
|
|
|
254
|
-
const resolveElementProps = (elements: Config["elements"]): Record<string,
|
|
258
|
+
const resolveElementProps = (elements: Config["elements"]): Record<string, ElementPropsExport> =>
|
|
255
259
|
elementEntryValues(elements, (entry) => entry.props);
|
|
256
260
|
|
|
261
|
+
const resolveAcceptedChildTypes = (elements: Config["elements"]): Record<string, string[]> =>
|
|
262
|
+
elementEntryValues(elements, (entry) => entry.acceptedChildTypes);
|
|
263
|
+
|
|
257
264
|
const resolveOmittedProps = (elements: Config["elements"]): Record<string, string[]> =>
|
|
258
265
|
elementEntryValues(elements, (entry) => entry.omittedProps);
|
|
259
266
|
|
|
@@ -285,6 +292,7 @@ export {
|
|
|
285
292
|
resolveLazyElements,
|
|
286
293
|
resolveElementComponents,
|
|
287
294
|
resolveElementProps,
|
|
295
|
+
resolveAcceptedChildTypes,
|
|
288
296
|
resolveMcpSettings,
|
|
289
297
|
resolveOmittedProps,
|
|
290
298
|
resolveConfig,
|