@anby/platform-sdk 0.7.2 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/vite/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/vite/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EACL,YAAY,EACZ,aAAa,EACb,SAAS,EACT,UAAU,EACV,WAAW,EACX,QAAQ,GACT,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAsB,MAAM,WAAW,CAAC;AAEnF,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AA4BxD;;;;;GAKG;AACH,SAAS,cAAc,CAAC,IAAY,EAAE,QAAkB;IACtD,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;IACzC,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAU,CAAC;IAC3C,MAAM,gBAAgB,GAA6D,EAAE,CAAC;IAEtF,qEAAqE;IACrE,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IAChD,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;YACtC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,0DAA0D;gBAC1D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;gBACjD,IAAI,KAAK,EAAE,CAAC;oBACV,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe;oBACzC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO;oBACjC,+DAA+D;oBAC/D,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;oBAC9C,MAAM,UAAU,GAAG,iBAAiB,IAAI,EAAE,CAAC;oBAC3C,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;gBAC3E,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,gCAAgC;QAClC,CAAC;IACH,CAAC;IAED,8CAA8C;IAC9C,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC1D,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;YAAE,SAAS;QAClC,SAAS,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE;YAC7B,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,oBAAoB,CAAC;gBAAE,OAAO;YAClD,wCAAwC;YACxC,IAAI,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAAE,OAAO;YAE7E,IAAI,OAAe,CAAC;YACpB,IAAI,CAAC;gBACH,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAC5C,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO;YACT,CAAC;YAED,8CAA8C;YAC9C,MAAM,kBAAkB,GAAG,iDAAiD,CAAC;YAC7E,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;gBACzD,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,uBAAuB;YACzD,CAAC;YAED,+GAA+G;YAC/G,MAAM,kBAAkB,GAAG,sFAAsF,CAAC;YAClH,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;gBACzD,gBAAgB,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,uBAAuB;YAC1E,CAAC;YAED,iDAAiD;YACjD,MAAM,iBAAiB,GAAG,0DAA0D,CAAC;YACrF,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;gBACxD,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/B,CAAC;YAED,gDAAgD;YAChD,MAAM,gBAAgB,GAAG,yDAAyD,CAAC;YACnF,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBACvD,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/B,CAAC;YAED,qDAAqD;YACrD,uEAAuE;YACvE,2DAA2D;YAC3D,MAAM,cAAc,GAAG,iEAAiE,CAAC;YACzF,KAAK,MAAM,UAAU,IAAI,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;gBAC1D,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;gBAC/B,MAAM,YAAY,GAAG,gDAAgD,CAAC;gBACtE,KAAK,MAAM,QAAQ,IAAI,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;oBACvD,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;gBAClC,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,gBAAgB;QAChB,cAAc,EAAE,CAAC,GAAG,cAAc,CAAC,CAAC,IAAI,EAAE;QAC1C,gBAAgB,EAAE,CAAC,GAAG,gBAAgB,CAAC,CAAC,IAAI,EAAE;KAC/C,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,GAAW,EAAE,QAAgC;IAC9D,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC5B,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;gBACvB,IAAI,KAAK,KAAK,cAAc,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,OAAO;oBAAE,SAAS;gBACjF,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAC5B,CAAC;iBAAM,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;gBACzB,QAAQ,CAAC,IAAI,CAAC,CAAC;YACjB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,kBAAkB;QACpB,CAAC;IACH,CAAC;AACH,CAAC;AAED,yEAAyE;AAEzE,SAAS,YAAY,CAAC,YAAoB,EAAE,IAAgB;IAC1D,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;QAAE,OAAO,KAAK,CAAC;IAE5C,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,yBAAyB;IACzB,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAC;QAClE,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACtD,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;YACxB,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC,QAAQ,IAAI,EAAE,CAAC;YAC5C,QAAQ,CAAC,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC;YACnD,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;IACH,CAAC;IAED,uBAAuB;IACvB,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;QACjF,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACpD,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;YACxB,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC,QAAQ,IAAI,EAAE,CAAC;YAC5C,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC;YAC/C,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;IACH,CAAC;IAED,yBAAyB;IACzB,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;QACnF,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACtD,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;YACxB,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC,QAAQ,IAAI,EAAE,CAAC;YAC5C,QAAQ,CAAC,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC;YACnD,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;IACH,CAAC;IAED,IAAI,OAAO,EAAE,CAAC;QACZ,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QACtE,OAAO,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;QACzE,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM;YAAE,KAAK,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,gBAAgB,CAAC,MAAM,WAAW,CAAC,CAAC;QAClG,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM;YAAE,KAAK,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,cAAc,CAAC,MAAM,SAAS,CAAC,CAAC;QAC5F,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM;YAAE,KAAK,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,gBAAgB,CAAC,MAAM,WAAW,CAAC,CAAC;QAClG,IAAI,KAAK,CAAC,MAAM;YAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,yEAAyE;AAEzE,SAAS,WAAW,CAAC,QAAkB,EAAE,QAAkB;IACzD,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,QAAQ,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;IACxE,QAAQ,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;IACrE,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClB,QAAQ,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;IAEvD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,QAAQ,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QACjD,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,QAAQ,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QACzE,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;SAAM,CAAC;QACN,QAAQ,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;IACpD,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,QAAQ,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QACjD,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,QAAQ,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QACzE,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;SAAM,CAAC;QACN,QAAQ,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;IACpD,CAAC;IAED,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACnB,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClB,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAElB,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,kBAAkB,CAAC,eAAuB;IAIjD,MAAM,GAAG,GAAG,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAwB,CAAC;IACtD,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAS,CAAC,MAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IACxF,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAS,CAAC,MAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IACxF,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;AAChC,CAAC;AAED,yEAAyE;AAEzE,MAAM,UAAU,cAAc,CAAC,OAA8B,EAAE;IAC7D,MAAM,gBAAgB,GAAG,IAAI,CAAC,YAAY,IAAI,0BAA0B,CAAC;IACzE,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,IAAI,oBAAoB,CAAC;IACzD,MAAM,gBAAgB,GACpB,IAAI,CAAC,oBAAoB,IAAI,8BAA8B,CAAC;IAC9D,MAAM,gBAAgB,GAAG,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,CAAC;IACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,KAAK,IAAI,CAAC;IAE/C,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,IAAI,gBAAgB,GAAG,EAAE,CAAC;IAC1B,IAAI,WAAW,GAAG,EAAE,CAAC;IACrB,IAAI,gBAAgB,GAAG,EAAE,CAAC;IAE1B,SAAS,WAAW;QAClB,IAAI,CAAC,QAAQ;YAAE,OAAO;QACtB,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC;YAAE,OAAO;QAC1C,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;YACpD,YAAY,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,iCAAkC,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;IAED,SAAS,aAAa;QACpB,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;YAClC,OAAO,CAAC,IAAI,CACV,qCAAqC,gBAAgB,qBAAqB,CAC3E,CAAC;YACF,OAAO;QACT,CAAC;QACD,IAAI,CAAC;YACH,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,kBAAkB,CAAC,gBAAgB,CAAC,CAAC;YACpE,MAAM,OAAO,GAAG,WAAW,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAChD,SAAS,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACrD,aAAa,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACtC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CACV,+BAAgC,GAAa,CAAC,OAAO,EAAE,CACxD,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,UAAU,wBAAwB;QACrC,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC;YAAE,OAAO;QAC1C,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC;gBACvC,YAAY,EAAE,gBAAgB;aAC/B,CAAC,CAAC;YACH,SAAS,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1D,aAAa,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACpE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CACV,+CAAgD,GAAa,CAAC,OAAO,EAAE,CACxE,CAAC;QACJ,CAAC;IACH,CAAC;IAED,SAAS,aAAa;QACpB,WAAW,EAAE,CAAC,CAAM,iCAAiC;QACrD,aAAa,EAAE,CAAC,CAAI,oCAAoC;QACxD,KAAK,wBAAwB,EAAE,CAAC,CAAC,4CAA4C;IAC/E,CAAC;IAED,OAAO;QACL,IAAI,EAAE,yBAAyB;QAE/B,cAAc,CAAC,MAAM;YACnB,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;YACnB,gBAAgB,GAAG,UAAU,CAAC,gBAAgB,CAAC;gBAC7C,CAAC,CAAC,gBAAgB;gBAClB,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;YACpC,WAAW,GAAG,UAAU,CAAC,WAAW,CAAC;gBACnC,CAAC,CAAC,WAAW;gBACb,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;YAC/B,gBAAgB,GAAG,UAAU,CAAC,gBAAgB,CAAC;gBAC7C,CAAC,CAAC,gBAAgB;gBAClB,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;QACtC,CAAC;QAED,UAAU;YACR,aAAa,EAAE,CAAC;QAClB,CAAC;QAED,eAAe,CAAC,MAAM;YACpB,+BAA+B;YAC/B,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YACrC,KAAK,MAAM,GAAG,IAAI,gBAAgB,EAAE,CAAC;gBACnC,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;gBAC1D,IAAI,UAAU,CAAC,MAAM,CAAC;oBAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACrD,CAAC;YAED,IAAI,SAAS,GAAyC,IAAI,CAAC;YAE3D,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,WAAW,EAAE,EAAE;gBAC1C,MAAM,GAAG,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;gBACjC,IAAI,GAAG,KAAK,gBAAgB,EAAE,CAAC;oBAC7B,uEAAuE;oBACvE,aAAa,EAAE,CAAC;oBAChB,KAAK,wBAAwB,EAAE,CAAC;gBAClC,CAAC;qBAAM,IAAI,WAAW,CAAC,KAAK,CAAC,oBAAoB,CAAC,EAAE,CAAC;oBACnD,+DAA+D;oBAC/D,IAAI,SAAS;wBAAE,YAAY,CAAC,SAAS,CAAC,CAAC;oBACvC,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;wBAC1B,SAAS,GAAG,IAAI,CAAC;wBACjB,aAAa,EAAE,CAAC;oBAClB,CAAC,EAAE,IAAI,CAAC,CAAC;gBACX,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@anby/platform-sdk",
3
- "version": "0.7.2",
3
+ "version": "0.9.0",
4
4
  "description": "Runtime SDK for building services and apps that plug into the Anby Platform — auth, events, config",
5
5
  "keywords": [
6
6
  "anby",
@@ -16,6 +16,7 @@ import { dirname, isAbsolute, join, resolve } from 'node:path';
16
16
  import { validateManifest, type AppManifest } from '@anby/manifest-schema';
17
17
  import { signHmac } from '../auth/index.js';
18
18
  import { schemaChecksum } from '../entities/schema.js';
19
+ import { getAppIdentity, signAppRequest } from '../entities/identity.js';
19
20
 
20
21
  export interface PublishAppOptions {
21
22
  /**
@@ -217,16 +218,7 @@ export async function publishAppFromManifest(
217
218
  }
218
219
  }
219
220
 
220
- const internalApiSecret =
221
- opts.internalApiSecret ?? process.env.INTERNAL_API_SECRET ?? '';
222
- if (!internalApiSecret) {
223
- throw new Error(
224
- 'INTERNAL_API_SECRET is not set — cannot sign publish request',
225
- );
226
- }
227
-
228
221
  const submittedBy = opts.submittedBy ?? manifest.id;
229
- const signature = signHmac(submittedBy, internalApiSecret);
230
222
 
231
223
  const body = {
232
224
  id: manifest.id,
@@ -243,14 +235,50 @@ export async function publishAppFromManifest(
243
235
  manifest,
244
236
  };
245
237
 
238
+ const bodyJson = JSON.stringify(body);
239
+
240
+ // Prefer Ed25519 app identity signing (no INTERNAL_API_SECRET needed).
241
+ // Falls back to HMAC for first-time publish (before app has an identity).
242
+ let authHeaders: Record<string, string>;
243
+ let identity: { appId: string; privateKeyPem: string } | null = null;
244
+ try {
245
+ identity = getAppIdentity();
246
+ } catch {
247
+ // Not configured — fall back to HMAC
248
+ }
249
+
250
+ if (identity && identity.appId === manifest.id) {
251
+ // Ed25519 path — re-publishing own app
252
+ const signed = signAppRequest({
253
+ identity,
254
+ tenantId: '',
255
+ body: bodyJson,
256
+ });
257
+ authHeaders = { ...signed };
258
+ } else {
259
+ // HMAC path — first-time publish or cross-app publish
260
+ const internalApiSecret =
261
+ opts.internalApiSecret ?? process.env.INTERNAL_API_SECRET ?? '';
262
+ if (!internalApiSecret) {
263
+ throw new Error(
264
+ 'INTERNAL_API_SECRET is not set and no app identity configured — cannot sign publish request. ' +
265
+ 'Run `anby login && anby init` to register the app first.',
266
+ );
267
+ }
268
+ const signature = signHmac(submittedBy, internalApiSecret);
269
+ authHeaders = {
270
+ 'x-internal-user': submittedBy,
271
+ 'x-internal-signature': signature,
272
+ };
273
+ }
274
+
246
275
  const res = await fetch(`${registryUrl}/registry/apps`, {
247
276
  method: 'POST',
248
277
  headers: {
249
278
  'Content-Type': 'application/json',
250
- 'x-internal-user': submittedBy,
251
- 'x-internal-signature': signature,
279
+ ...authHeaders,
252
280
  },
253
- body: JSON.stringify(body),
281
+ body: bodyJson,
254
282
  });
255
283
 
256
284
  if (!res.ok) {
@@ -20,7 +20,7 @@
20
20
  * - Missing / malformed tenant in claims → 401 (no 'default' bleed).
21
21
  */
22
22
 
23
- import jwt from 'jsonwebtoken';
23
+ import crypto from 'node:crypto';
24
24
  import type {
25
25
  EntityHandlerConfig,
26
26
  EntityHandlerContext,
@@ -90,18 +90,10 @@ export class RegistryPublicKeyVerifier implements TokenVerifier {
90
90
  if (!this.publicKey || !this.algo) {
91
91
  throw new Error('RegistryPublicKeyVerifier not initialized');
92
92
  }
93
- // jsonwebtoken types don't list 'EdDSA' but the library supports it
94
- // via node crypto when the public key is Ed25519. We pass the algo as
95
- // unknown to bypass the restricted union.
96
- const algorithms: jwt.Algorithm[] =
97
- this.algo === 'HS256'
98
- ? ['HS256']
99
- : (['EdDSA' as unknown as jwt.Algorithm, 'RS256']);
100
- const decoded = jwt.verify(token, this.publicKey, {
101
- algorithms,
102
- issuer: 'anby-registry',
103
- });
104
- return assertAndReturnClaims(decoded);
93
+ // Verify via Node crypto directly jsonwebtoken/jws don't support
94
+ // Ed25519 key parsing, so EdDSA tokens fail with "Unknown key type
95
+ // 'ed25519'". Node crypto.verify handles Ed25519 natively.
96
+ return verifyJwtNative(token, this.publicKey, this.algo);
105
97
  }
106
98
  }
107
99
 
@@ -113,11 +105,73 @@ export class SharedSecretVerifier implements TokenVerifier {
113
105
  constructor(private readonly secret: string) {}
114
106
 
115
107
  verify(token: string): ScopedTokenClaims {
116
- const decoded = jwt.verify(token, this.secret, {
117
- algorithms: ['HS256'],
118
- issuer: 'anby-registry',
119
- });
120
- return assertAndReturnClaims(decoded);
108
+ return verifyJwtNative(token, this.secret, 'HS256');
109
+ }
110
+ }
111
+
112
+ function verifyJwtNative(
113
+ token: string,
114
+ keyMaterial: string,
115
+ expectedAlgo: 'EdDSA' | 'RS256' | 'HS256',
116
+ ): ScopedTokenClaims {
117
+ const parts = token.split('.');
118
+ if (parts.length !== 3) throw new Error('malformed JWT');
119
+ const [h64, p64, s64] = parts;
120
+ const header = safeJsonParse(base64urlDecode(h64).toString('utf8'));
121
+ const payload = safeJsonParse(base64urlDecode(p64).toString('utf8'));
122
+ const signature = base64urlDecode(s64);
123
+ const signingInput = Buffer.from(`${h64}.${p64}`);
124
+
125
+ if (typeof header.alg !== 'string') throw new Error('missing alg');
126
+ // Only accept the algo the verifier was initialized with, to prevent
127
+ // algorithm-confusion attacks.
128
+ if (header.alg !== expectedAlgo) {
129
+ throw new Error(`algorithm mismatch: expected ${expectedAlgo}, got ${header.alg}`);
130
+ }
131
+
132
+ let ok = false;
133
+ if (header.alg === 'EdDSA') {
134
+ const pubKey = crypto.createPublicKey(keyMaterial);
135
+ ok = crypto.verify(null, signingInput, pubKey, signature);
136
+ } else if (header.alg === 'RS256') {
137
+ const pubKey = crypto.createPublicKey(keyMaterial);
138
+ ok = crypto.verify('sha256', signingInput, pubKey, signature);
139
+ } else if (header.alg === 'HS256') {
140
+ const mac = crypto
141
+ .createHmac('sha256', keyMaterial)
142
+ .update(signingInput)
143
+ .digest();
144
+ ok = signature.length === mac.length && crypto.timingSafeEqual(mac, signature);
145
+ } else {
146
+ throw new Error(`unsupported algorithm: ${header.alg}`);
147
+ }
148
+ if (!ok) throw new Error('signature verification failed');
149
+
150
+ // Standard claim checks: issuer + expiry + not-before.
151
+ const now = Math.floor(Date.now() / 1000);
152
+ if (payload.iss !== 'anby-registry') {
153
+ throw new Error('invalid issuer');
154
+ }
155
+ if (typeof payload.exp === 'number' && payload.exp < now) {
156
+ throw new Error('token expired');
157
+ }
158
+ if (typeof payload.nbf === 'number' && payload.nbf > now) {
159
+ throw new Error('token not yet valid');
160
+ }
161
+ return assertAndReturnClaims(payload);
162
+ }
163
+
164
+ function base64urlDecode(s: string): Buffer {
165
+ return Buffer.from(s, 'base64url');
166
+ }
167
+
168
+ function safeJsonParse(s: string): Record<string, unknown> {
169
+ try {
170
+ const v = JSON.parse(s);
171
+ if (!v || typeof v !== 'object') throw new Error('non-object');
172
+ return v as Record<string, unknown>;
173
+ } catch {
174
+ throw new Error('malformed JWT segment');
121
175
  }
122
176
  }
123
177
 
package/src/vite/index.ts CHANGED
@@ -1,33 +1,26 @@
1
1
  /**
2
- * @anby/platform-sdk/vite — Vite plugin for auto-codegen of Anby app types.
2
+ * @anby/platform-sdk/vite — Vite plugin for Anby app integration.
3
3
  *
4
- * PLAN-app-bootstrap-phase2 PR5.
4
+ * Two responsibilities:
5
5
  *
6
- * Drop into a consumer app's vite.config.ts:
6
+ * 1. **Auto-scan** source code to discover entity/event declarations and
7
+ * keep `anby-app.manifest.json` in sync — developer never edits
8
+ * provides/requires by hand.
7
9
  *
8
- * ```ts
9
- * import { anbyVitePlugin } from '@anby/platform-sdk/vite';
10
+ * 2. **Codegen** typed module augmentations (`.anby/types.d.ts`) so
11
+ * `publishEvent` gets compile-time type checking.
10
12
  *
11
- * export default defineConfig({
12
- * plugins: [
13
- * anbyVitePlugin(),
14
- * remix({...}),
15
- * ],
16
- * });
17
- * ```
18
- *
19
- * On every dev start (and on every change to `anby-app.manifest.json`),
20
- * the plugin reads the manifest's `provides.events` and `requires.events`
21
- * arrays and writes typed module augmentations to `.anby/types.d.ts`. The
22
- * SDK's `publishEvent` overload picks up the merged `AppProvidedEvents`
23
- * interface and gives the dev compile-time errors on unknown event names.
24
- *
25
- * The plugin imports `vite` only as a TYPE — `import type { Plugin }` is
26
- * erased at compile time, so the SDK package does NOT need to ship vite
27
- * as a runtime dependency. Apps that use this plugin already have vite.
13
+ * Runs on every dev start and on source/manifest file changes.
28
14
  */
29
- import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';
30
- import { dirname, resolve, isAbsolute } from 'node:path';
15
+ import {
16
+ readFileSync,
17
+ writeFileSync,
18
+ mkdirSync,
19
+ existsSync,
20
+ readdirSync,
21
+ statSync,
22
+ } from 'node:fs';
23
+ import { dirname, resolve, isAbsolute, join, basename, relative } from 'node:path';
31
24
  import type { Plugin } from 'vite';
32
25
  import { getInlinedManifest } from '../apps/publish.js';
33
26
 
@@ -36,24 +29,207 @@ export interface AnbyVitePluginOptions {
36
29
  manifestPath?: string;
37
30
  /** Output path for generated types relative to vite root. Default: `./.anby/types.d.ts`. */
38
31
  outFile?: string;
39
- /**
40
- * Output path for the wire-format manifest static asset, relative to
41
- * vite root. Default: `./public/_anby/manifest.json`.
42
- *
43
- * The Marketplace Submit-app form fetches this file from
44
- * `${publicUrl}/_anby/manifest.json` to publish a running app without
45
- * the operator pasting any JSON. Vite (dev) and Remix (prod) both
46
- * serve files in `public/` as static assets, so the same artifact
47
- * works in every runtime — no middleware, no Remix route file.
48
- */
32
+ /** Output path for the wire-format manifest static asset. Default: `./public/_anby/manifest.json`. */
49
33
  manifestArtifactPath?: string;
34
+ /** Source directories to scan for entity/event usage. Default: `['./app']`. */
35
+ scanDirs?: string[];
36
+ /** Disable auto-scan (only codegen from manifest). Default: false. */
37
+ disableAutoScan?: boolean;
50
38
  }
51
39
 
52
40
  interface ManifestEventsShape {
53
- provides?: { events?: string[] };
54
- requires?: { events?: string[] };
41
+ provides?: { events?: string[]; entities?: Array<string | { name: string; version: string; schema?: unknown }> };
42
+ requires?: { events?: string[]; entities?: string[] };
43
+ }
44
+
45
+ // ── Auto-scan: discover entities/events from source code ──────────────
46
+
47
+ interface ScanResult {
48
+ providesEntities: Array<{ name: string; version: string; schema: string }>;
49
+ providesEvents: string[];
50
+ requiresEntities: string[];
51
+ }
52
+
53
+ /**
54
+ * Scan source files for SDK API usage patterns:
55
+ * - getEntityClient('org.period@v1') → requires entity
56
+ * - publishEvent({ type: 'org.node.created' ... }) → provides event
57
+ * - app/schemas/*.v*.json files → provides entities
58
+ */
59
+ function scanSourceCode(root: string, scanDirs: string[]): ScanResult {
60
+ const providesEvents = new Set<string>();
61
+ const requiresEntities = new Set<string>();
62
+ const providesEntities: Array<{ name: string; version: string; schema: string }> = [];
63
+
64
+ // 1. Scan for entity schema files: app/schemas/{name}.{version}.json
65
+ const schemasDir = resolve(root, 'app/schemas');
66
+ if (existsSync(schemasDir)) {
67
+ try {
68
+ const files = readdirSync(schemasDir);
69
+ for (const file of files) {
70
+ // Match: org-period.v1.json → name=org.period, version=v1
71
+ const match = file.match(/^(.+)\.(v\d+)\.json$/);
72
+ if (match) {
73
+ const rawName = match[1]; // "org-period"
74
+ const version = match[2]; // "v1"
75
+ // Convert filename to entity name: "org-period" → "org.period"
76
+ const entityName = rawName.replace(/-/g, '.');
77
+ const schemaPath = `./app/schemas/${file}`;
78
+ providesEntities.push({ name: entityName, version, schema: schemaPath });
79
+ }
80
+ }
81
+ } catch {
82
+ // schemas dir unreadable — skip
83
+ }
84
+ }
85
+
86
+ // 2. Scan source files for API usage patterns
87
+ for (const dir of scanDirs) {
88
+ const absDir = isAbsolute(dir) ? dir : resolve(root, dir);
89
+ if (!existsSync(absDir)) continue;
90
+ walkFiles(absDir, (filePath) => {
91
+ if (!filePath.match(/\.(ts|tsx|js|jsx)$/)) return;
92
+ // Skip node_modules and generated files
93
+ if (filePath.includes('node_modules') || filePath.includes('.anby/')) return;
94
+
95
+ let content: string;
96
+ try {
97
+ content = readFileSync(filePath, 'utf-8');
98
+ } catch {
99
+ return;
100
+ }
101
+
102
+ // Pattern 1: getEntityClient('org.period@v1')
103
+ const entityClientRegex1 = /getEntityClient\s*\(\s*['"]([^'"]+@[^'"]+)['"]/g;
104
+ for (const match of content.matchAll(entityClientRegex1)) {
105
+ requiresEntities.add(match[1]); // e.g. "org.period@v1"
106
+ }
107
+
108
+ // Pattern 2: getEntityClient(tenantId, 'org.period', 'v1') or getEntityClient<T>(tenantId, 'org.period', 'v1')
109
+ const entityClientRegex2 = /getEntityClient\s*(?:<[^>]+>)?\s*\([^,]+,\s*['"]([^'"]+)['"]\s*,\s*['"]([^'"]+)['"]/g;
110
+ for (const match of content.matchAll(entityClientRegex2)) {
111
+ requiresEntities.add(`${match[1]}@${match[2]}`); // e.g. "org.period@v1"
112
+ }
113
+
114
+ // publishEvent({ type: 'org.node.created' ... })
115
+ const publishEventRegex = /publishEvent\s*\(\s*\{[^}]*?type\s*:\s*['"]([^'"]+)['"]/g;
116
+ for (const match of content.matchAll(publishEventRegex)) {
117
+ providesEvents.add(match[1]);
118
+ }
119
+
120
+ // createEvent({ type: 'org.node.created' ... })
121
+ const createEventRegex = /createEvent\s*\(\s*\{[^}]*?type\s*:\s*['"]([^'"]+)['"]/g;
122
+ for (const match of content.matchAll(createEventRegex)) {
123
+ providesEvents.add(match[1]);
124
+ }
125
+
126
+ // Type union declarations near publishEvent context:
127
+ // type: 'org.node.created' | 'org.node.updated' | 'org.node.deleted'
128
+ // Matches dotted string literals in union type annotations
129
+ const typeUnionRegex = /type\s*:\s*((?:['"][a-z][a-z0-9.]*[a-z0-9]['"](?:\s*\|\s*)?)+)/g;
130
+ for (const unionMatch of content.matchAll(typeUnionRegex)) {
131
+ const unionStr = unionMatch[1];
132
+ const literalRegex = /['"]([a-z][a-z0-9]*(?:\.[a-z][a-z0-9]*)+)['"]/g;
133
+ for (const litMatch of unionStr.matchAll(literalRegex)) {
134
+ providesEvents.add(litMatch[1]);
135
+ }
136
+ }
137
+ });
138
+ }
139
+
140
+ return {
141
+ providesEntities,
142
+ providesEvents: [...providesEvents].sort(),
143
+ requiresEntities: [...requiresEntities].sort(),
144
+ };
145
+ }
146
+
147
+ function walkFiles(dir: string, callback: (path: string) => void): void {
148
+ let entries: string[];
149
+ try {
150
+ entries = readdirSync(dir);
151
+ } catch {
152
+ return;
153
+ }
154
+ for (const entry of entries) {
155
+ const full = join(dir, entry);
156
+ try {
157
+ const stat = statSync(full);
158
+ if (stat.isDirectory()) {
159
+ if (entry === 'node_modules' || entry === '.anby' || entry === 'build') continue;
160
+ walkFiles(full, callback);
161
+ } else if (stat.isFile()) {
162
+ callback(full);
163
+ }
164
+ } catch {
165
+ // skip unreadable
166
+ }
167
+ }
168
+ }
169
+
170
+ // ── Manifest sync: merge scan results into manifest ───────────────────
171
+
172
+ function syncManifest(manifestPath: string, scan: ScanResult): boolean {
173
+ if (!existsSync(manifestPath)) return false;
174
+
175
+ let raw: string;
176
+ try {
177
+ raw = readFileSync(manifestPath, 'utf-8');
178
+ } catch {
179
+ return false;
180
+ }
181
+
182
+ const manifest = JSON.parse(raw);
183
+ let changed = false;
184
+
185
+ // Sync provides.entities
186
+ if (scan.providesEntities.length > 0) {
187
+ const current = JSON.stringify(manifest.provides?.entities ?? []);
188
+ const scanned = JSON.stringify(scan.providesEntities);
189
+ if (current !== scanned) {
190
+ manifest.provides = manifest.provides || {};
191
+ manifest.provides.entities = scan.providesEntities;
192
+ changed = true;
193
+ }
194
+ }
195
+
196
+ // Sync provides.events
197
+ if (scan.providesEvents.length > 0) {
198
+ const current = JSON.stringify((manifest.provides?.events ?? []).slice().sort());
199
+ const scanned = JSON.stringify(scan.providesEvents);
200
+ if (current !== scanned) {
201
+ manifest.provides = manifest.provides || {};
202
+ manifest.provides.events = scan.providesEvents;
203
+ changed = true;
204
+ }
205
+ }
206
+
207
+ // Sync requires.entities
208
+ if (scan.requiresEntities.length > 0) {
209
+ const current = JSON.stringify((manifest.requires?.entities ?? []).slice().sort());
210
+ const scanned = JSON.stringify(scan.requiresEntities);
211
+ if (current !== scanned) {
212
+ manifest.requires = manifest.requires || {};
213
+ manifest.requires.entities = scan.requiresEntities;
214
+ changed = true;
215
+ }
216
+ }
217
+
218
+ if (changed) {
219
+ writeFileSync(manifestPath, JSON.stringify(manifest, null, 2) + '\n');
220
+ console.log('[anby-vite] ✔ Auto-updated manifest from source code scan');
221
+ const parts: string[] = [];
222
+ if (scan.providesEntities.length) parts.push(`provides ${scan.providesEntities.length} entities`);
223
+ if (scan.providesEvents.length) parts.push(`provides ${scan.providesEvents.length} events`);
224
+ if (scan.requiresEntities.length) parts.push(`requires ${scan.requiresEntities.length} entities`);
225
+ if (parts.length) console.log(`[anby-vite] ${parts.join(', ')}`);
226
+ }
227
+
228
+ return changed;
55
229
  }
56
230
 
231
+ // ── Codegen: typed module augmentations ───────────────────────────────
232
+
57
233
  function renderTypes(provides: string[], requires: string[]): string {
58
234
  const sections: string[] = [];
59
235
 
@@ -84,7 +260,6 @@ function renderTypes(provides: string[], requires: string[]): string {
84
260
 
85
261
  sections.push('}');
86
262
  sections.push('');
87
- // Pure declaration file marker
88
263
  sections.push('export {};');
89
264
  sections.push('');
90
265
 
@@ -102,16 +277,32 @@ function readManifestEvents(manifestAbsPath: string): {
102
277
  return { provides, requires };
103
278
  }
104
279
 
280
+ // ── Plugin ────────────────────────────────────────────────────────────
281
+
105
282
  export function anbyVitePlugin(opts: AnbyVitePluginOptions = {}): Plugin {
106
283
  const manifestRelative = opts.manifestPath ?? './anby-app.manifest.json';
107
284
  const outRelative = opts.outFile ?? './.anby/types.d.ts';
108
285
  const artifactRelative =
109
286
  opts.manifestArtifactPath ?? './public/_anby/manifest.json';
287
+ const scanDirsRelative = opts.scanDirs ?? ['./app'];
288
+ const autoScan = opts.disableAutoScan !== true;
110
289
 
290
+ let root = '';
111
291
  let resolvedManifest = '';
112
292
  let resolvedOut = '';
113
293
  let resolvedArtifact = '';
114
294
 
295
+ function runAutoScan() {
296
+ if (!autoScan) return;
297
+ if (!existsSync(resolvedManifest)) return;
298
+ try {
299
+ const scan = scanSourceCode(root, scanDirsRelative);
300
+ syncManifest(resolvedManifest, scan);
301
+ } catch (err) {
302
+ console.warn(`[anby-vite] auto-scan failed: ${(err as Error).message}`);
303
+ }
304
+ }
305
+
115
306
  function generateTypes() {
116
307
  if (!existsSync(resolvedManifest)) {
117
308
  console.warn(
@@ -131,13 +322,6 @@ export function anbyVitePlugin(opts: AnbyVitePluginOptions = {}): Plugin {
131
322
  }
132
323
  }
133
324
 
134
- /**
135
- * Generate `public/_anby/manifest.json` — the wire-format manifest
136
- * with all `provides.entities[].schema` paths resolved to inline JSON
137
- * content. Vite/Remix serve `public/` as static assets in both dev
138
- * and production, so this single artifact powers the Marketplace
139
- * Submit-app form everywhere.
140
- */
141
325
  async function generateManifestArtifact() {
142
326
  if (!existsSync(resolvedManifest)) return;
143
327
  try {
@@ -154,17 +338,16 @@ export function anbyVitePlugin(opts: AnbyVitePluginOptions = {}): Plugin {
154
338
  }
155
339
 
156
340
  function regenerateAll() {
157
- generateTypes();
158
- void generateManifestArtifact();
341
+ runAutoScan(); // 1. Scan code → update manifest
342
+ generateTypes(); // 2. Read manifest → generate types
343
+ void generateManifestArtifact(); // 3. Read manifest → generate wire artifact
159
344
  }
160
345
 
161
346
  return {
162
347
  name: '@anby/platform-sdk/vite',
163
348
 
164
349
  configResolved(config) {
165
- // Resolve relative paths against the Vite project root, not cwd.
166
- // This is robust against pnpm workspaces / symlinks / monorepos.
167
- const root = config.root;
350
+ root = config.root;
168
351
  resolvedManifest = isAbsolute(manifestRelative)
169
352
  ? manifestRelative
170
353
  : resolve(root, manifestRelative);
@@ -181,13 +364,28 @@ export function anbyVitePlugin(opts: AnbyVitePluginOptions = {}): Plugin {
181
364
  },
182
365
 
183
366
  configureServer(server) {
184
- // Watch the resolved absolute path. Compare in the change handler
185
- // against the resolved path so we don't false-trigger on other
186
- // manifest.json files in the workspace (e.g., node_modules).
367
+ // Watch manifest + source dirs
187
368
  server.watcher.add(resolvedManifest);
369
+ for (const dir of scanDirsRelative) {
370
+ const absDir = isAbsolute(dir) ? dir : resolve(root, dir);
371
+ if (existsSync(absDir)) server.watcher.add(absDir);
372
+ }
373
+
374
+ let scanTimer: ReturnType<typeof setTimeout> | null = null;
375
+
188
376
  server.watcher.on('change', (changedPath) => {
189
- if (resolve(changedPath) === resolvedManifest) {
190
- regenerateAll();
377
+ const abs = resolve(changedPath);
378
+ if (abs === resolvedManifest) {
379
+ // Manifest changed directly — regenerate types + artifact (no re-scan)
380
+ generateTypes();
381
+ void generateManifestArtifact();
382
+ } else if (changedPath.match(/\.(ts|tsx|js|jsx)$/)) {
383
+ // Debounce source scans — many files change at once during HMR
384
+ if (scanTimer) clearTimeout(scanTimer);
385
+ scanTimer = setTimeout(() => {
386
+ scanTimer = null;
387
+ regenerateAll();
388
+ }, 2000);
191
389
  }
192
390
  });
193
391
  },