@bestagentkits/render 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +29 -0
- package/LICENSE +21 -0
- package/README.md +166 -0
- package/dist/cli.d.ts +18 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +336 -0
- package/dist/cli.js.map +1 -0
- package/dist/diagnostics.d.ts +45 -0
- package/dist/diagnostics.d.ts.map +1 -0
- package/dist/diagnostics.js +57 -0
- package/dist/diagnostics.js.map +1 -0
- package/dist/diagram/adapter.d.ts +71 -0
- package/dist/diagram/adapter.d.ts.map +1 -0
- package/dist/diagram/adapter.js +87 -0
- package/dist/diagram/adapter.js.map +1 -0
- package/dist/errors.d.ts +37 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +42 -0
- package/dist/errors.js.map +1 -0
- package/dist/hash.d.ts +14 -0
- package/dist/hash.d.ts.map +1 -0
- package/dist/hash.js +27 -0
- package/dist/hash.js.map +1 -0
- package/dist/index.d.ts +43 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/yaml-error.d.ts +14 -0
- package/dist/internal/yaml-error.d.ts.map +1 -0
- package/dist/internal/yaml-error.js +12 -0
- package/dist/internal/yaml-error.js.map +1 -0
- package/dist/ir.d.ts +77 -0
- package/dist/ir.d.ts.map +1 -0
- package/dist/ir.js +20 -0
- package/dist/ir.js.map +1 -0
- package/dist/json.d.ts +23 -0
- package/dist/json.d.ts.map +1 -0
- package/dist/json.js +47 -0
- package/dist/json.js.map +1 -0
- package/dist/registry/actions.d.ts +48 -0
- package/dist/registry/actions.d.ts.map +1 -0
- package/dist/registry/actions.js +274 -0
- package/dist/registry/actions.js.map +1 -0
- package/dist/registry/prop-schema.d.ts +108 -0
- package/dist/registry/prop-schema.d.ts.map +1 -0
- package/dist/registry/prop-schema.js +400 -0
- package/dist/registry/prop-schema.js.map +1 -0
- package/dist/registry/registry.d.ts +47 -0
- package/dist/registry/registry.d.ts.map +1 -0
- package/dist/registry/registry.js +201 -0
- package/dist/registry/registry.js.map +1 -0
- package/dist/registry/roster.d.ts +53 -0
- package/dist/registry/roster.d.ts.map +1 -0
- package/dist/registry/roster.js +692 -0
- package/dist/registry/roster.js.map +1 -0
- package/dist/render/blocks.d.ts +41 -0
- package/dist/render/blocks.d.ts.map +1 -0
- package/dist/render/blocks.js +749 -0
- package/dist/render/blocks.js.map +1 -0
- package/dist/render/charts.d.ts +29 -0
- package/dist/render/charts.d.ts.map +1 -0
- package/dist/render/charts.js +235 -0
- package/dist/render/charts.js.map +1 -0
- package/dist/render/document.d.ts +40 -0
- package/dist/render/document.d.ts.map +1 -0
- package/dist/render/document.js +90 -0
- package/dist/render/document.js.map +1 -0
- package/dist/render/escape.d.ts +46 -0
- package/dist/render/escape.d.ts.map +1 -0
- package/dist/render/escape.js +108 -0
- package/dist/render/escape.js.map +1 -0
- package/dist/render/render.d.ts +52 -0
- package/dist/render/render.d.ts.map +1 -0
- package/dist/render/render.js +216 -0
- package/dist/render/render.js.map +1 -0
- package/dist/render/runtime.d.ts +25 -0
- package/dist/render/runtime.d.ts.map +1 -0
- package/dist/render/runtime.js +451 -0
- package/dist/render/runtime.js.map +1 -0
- package/dist/render/styles.d.ts +15 -0
- package/dist/render/styles.d.ts.map +1 -0
- package/dist/render/styles.js +163 -0
- package/dist/render/styles.js.map +1 -0
- package/dist/render/verify.d.ts +25 -0
- package/dist/render/verify.d.ts.map +1 -0
- package/dist/render/verify.js +168 -0
- package/dist/render/verify.js.map +1 -0
- package/dist/spec/bindings.d.ts +19 -0
- package/dist/spec/bindings.d.ts.map +1 -0
- package/dist/spec/bindings.js +51 -0
- package/dist/spec/bindings.js.map +1 -0
- package/dist/spec/bounds.d.ts +43 -0
- package/dist/spec/bounds.d.ts.map +1 -0
- package/dist/spec/bounds.js +144 -0
- package/dist/spec/bounds.js.map +1 -0
- package/dist/spec/forbidden.d.ts +27 -0
- package/dist/spec/forbidden.d.ts.map +1 -0
- package/dist/spec/forbidden.js +91 -0
- package/dist/spec/forbidden.js.map +1 -0
- package/dist/spec/migrate.d.ts +33 -0
- package/dist/spec/migrate.d.ts.map +1 -0
- package/dist/spec/migrate.js +113 -0
- package/dist/spec/migrate.js.map +1 -0
- package/dist/spec/normalize.d.ts +29 -0
- package/dist/spec/normalize.d.ts.map +1 -0
- package/dist/spec/normalize.js +649 -0
- package/dist/spec/normalize.js.map +1 -0
- package/dist/spec/parse.d.ts +22 -0
- package/dist/spec/parse.d.ts.map +1 -0
- package/dist/spec/parse.js +62 -0
- package/dist/spec/parse.js.map +1 -0
- package/dist/spec/providers.d.ts +30 -0
- package/dist/spec/providers.d.ts.map +1 -0
- package/dist/spec/providers.js +64 -0
- package/dist/spec/providers.js.map +1 -0
- package/dist/spec/validate.d.ts +28 -0
- package/dist/spec/validate.d.ts.map +1 -0
- package/dist/spec/validate.js +68 -0
- package/dist/spec/validate.js.map +1 -0
- package/dist/theme/load-theme.d.ts +55 -0
- package/dist/theme/load-theme.d.ts.map +1 -0
- package/dist/theme/load-theme.js +219 -0
- package/dist/theme/load-theme.js.map +1 -0
- package/dist/theme/presets.d.ts +50 -0
- package/dist/theme/presets.d.ts.map +1 -0
- package/dist/theme/presets.js +304 -0
- package/dist/theme/presets.js.map +1 -0
- package/dist/theme/theme-catalog.d.ts +68 -0
- package/dist/theme/theme-catalog.d.ts.map +1 -0
- package/dist/theme/theme-catalog.js +198 -0
- package/dist/theme/theme-catalog.js.map +1 -0
- package/dist/theme/tokens.d.ts +38 -0
- package/dist/theme/tokens.d.ts.map +1 -0
- package/dist/theme/tokens.js +190 -0
- package/dist/theme/tokens.js.map +1 -0
- package/dist/version.d.ts +12 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +12 -0
- package/dist/version.js.map +1 -0
- package/package.json +80 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../src/spec/normalize.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAmB,aAAa,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACvF,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,OAAO,EAAE,aAAa,EAAkB,MAAM,YAAY,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC5E,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAEzE,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAmB,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACtE,OAAO,EAAqB,WAAW,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAqB,SAAS,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAQvE,MAAM,oBAAoB,GAAG,2BAA2B,CAAC;AACzD,MAAM,cAAc,GAAG,oCAAoC,CAAC;AAC5D,MAAM,oBAAoB,GAAG,WAAW,CAAC;AACzC,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAU,CAAC;AAQ1E,SAAS,aAAa,CACpB,KAAc,EACd,IAAY,EACZ,GAAkB,EAClB,OAA0F;IAE1F,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,IAAI,OAAO,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;YAC9B,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,IAAI,EAAE,OAAO,EAAE,2BAA2B,EAAE,CAAC,CAAC;QACzF,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,IAAI,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC,CAAC;QAC/E,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;QAC3D,GAAG,CAAC,GAAG,CAAC;YACN,IAAI,EAAE,uBAAuB;YAC7B,IAAI;YACJ,OAAO,EAAE,cAAc,OAAO,CAAC,SAAS,yBAAyB,KAAK,CAAC,MAAM,EAAE;SAChF,CAAC,CAAC;QACH,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAClE,GAAG,CAAC,GAAG,CAAC;YACN,IAAI,EAAE,uBAAuB;YAC7B,IAAI;YACJ,OAAO,EAAE,IAAI,KAAK,iBAAiB,OAAO,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,WAAW,GAAG,EAAE;SAC1G,CAAC,CAAC;QACH,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAUD,SAAS,iBAAiB,CACxB,QAAiC,EACjC,GAAkB;IAElB,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC;IAChC,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,wBAAwB,EAAE,CAAC,CAAC;QAC9F,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,KAAK,GAAG,aAAa,CAAC,SAAS,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,EAAE;QAChE,SAAS,EAAE,GAAG;QACd,QAAQ,EAAE,IAAI;KACf,CAAC,CAAC;IACH,MAAM,WAAW,GAAG,aAAa,CAAC,SAAS,CAAC,WAAW,EAAE,oBAAoB,EAAE,GAAG,EAAE;QAClF,SAAS,EAAE,GAAG;KACf,CAAC,CAAC;IACH,MAAM,MAAM,GACV,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,EAAE;QACpD,SAAS,EAAE,EAAE;QACb,OAAO,EAAE,cAAc;QACvB,WAAW,EAAE,wCAAwC;KACtD,CAAC,IAAI,IAAI,CAAC;IACb,MAAM,IAAI,GAAG,aAAa,CAAC,SAAS,CAAC,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;IAEnF,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QACzC,IAAI,CAAC,CAAC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9D,GAAG,CAAC,GAAG,CAAC;gBACN,IAAI,EAAE,uBAAuB;gBAC7B,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;gBAC5B,OAAO,EAAE,uBAAuB,GAAG,GAAG;gBACtC,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE;aACjE,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC;IAClC,IAAI,KAAK,GAAY,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC;IACtD,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,EAAE,CAAC;YAC/B,GAAG,CAAC,GAAG,CAAC;gBACN,IAAI,EAAE,uBAAuB;gBAC7B,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,yBAAyB;aACnC,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,MAAM,MAAM,GAAG,aAAa,CAAC,UAAU,CAAC,MAAM,EAAE,gBAAgB,EAAE,GAAG,EAAE;gBACrE,SAAS,EAAE,EAAE;gBACb,OAAO,EAAE,oBAAoB;gBAC7B,WAAW,EAAE,uCAAuC;aACrD,CAAC,CAAC;YACH,MAAM,WAAW,GAAG,aAAa,CAAC,UAAU,CAAC,OAAO,EAAE,iBAAiB,EAAE,GAAG,EAAE;gBAC5E,SAAS,EAAE,EAAE;gBACb,OAAO,EAAE,oBAAoB;gBAC7B,WAAW,EAAE,uCAAuC;aACrD,CAAC,CAAC;YACH,KAAK,GAAG,EAAE,MAAM,EAAE,MAAM,IAAI,oBAAoB,EAAE,CAAC;YACnD,IAAI,WAAW,KAAK,SAAS;gBAAE,KAAK,CAAC,OAAO,GAAG,WAAW,CAAC;YAC3D,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;YACjC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzB,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC3B,GAAG,CAAC,GAAG,CAAC;wBACN,IAAI,EAAE,uBAAuB;wBAC7B,IAAI,EAAE,gBAAgB;wBACtB,OAAO,EAAE,yBAAyB;qBACnC,CAAC,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACN,KAAK,CAAC,MAAM,GAAG,MAAmB,CAAC;gBACrC,CAAC;YACH,CAAC;YACD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC1C,IAAI,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;oBACnD,GAAG,CAAC,GAAG,CAAC;wBACN,IAAI,EAAE,uBAAuB;wBAC7B,IAAI,EAAE,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;wBAC7B,OAAO,EAAE,wBAAwB,GAAG,GAAG;wBACvC,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE;qBACtD,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC;IACpC,IAAI,MAAM,GAAyB,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IACvD,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QAC9B,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,EAAE,CAAC;YAChC,GAAG,CAAC,GAAG,CAAC;gBACN,IAAI,EAAE,uBAAuB;gBAC7B,IAAI,EAAE,UAAU;gBAChB,OAAO,EAAE,0BAA0B;aACpC,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC;YACpC,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;gBAChD,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC5B,GAAG,CAAC,GAAG,CAAC;wBACN,IAAI,EAAE,uBAAuB;wBAC7B,IAAI,EAAE,kBAAkB;wBACxB,OAAO,EAAE,mDAAmD;qBAC7D,CAAC,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACN,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;oBAC5B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;wBAChD,GAAG,CAAC,GAAG,CAAC;4BACN,IAAI,EAAE,uBAAuB;4BAC7B,IAAI,EAAE,wBAAwB;4BAC9B,OAAO,EAAE,2CAA2C;4BACpD,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,GAAG,oBAAoB,CAAC,EAAE;yBAChD,CAAC,CAAC;oBACL,CAAC;yBAAM,CAAC;wBACN,MAAM,YAAY,GAAa,EAAE,CAAC;wBAClC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;4BACrD,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;4BAChC,IACE,OAAO,UAAU,KAAK,QAAQ;gCAC9B,CAAE,oBAA0C,CAAC,QAAQ,CAAC,UAAU,CAAC,EACjE,CAAC;gCACD,GAAG,CAAC,GAAG,CAAC;oCACN,IAAI,EAAE,kBAAkB;oCACxB,IAAI,EAAE,SAAS,CAAC,wBAAwB,EAAE,KAAK,CAAC;oCAChD,OAAO,EAAE,+BAA+B,MAAM,CAAC,UAAU,CAAC,GAAG;oCAC7D,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,GAAG,oBAAoB,CAAC,EAAE;iCAChD,CAAC,CAAC;gCACH,SAAS;4BACX,CAAC;4BACD,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;wBAChC,CAAC;wBACD,iEAAiE;wBACjE,gEAAgE;wBAChE,MAAM,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC;wBACxC,MAAM,SAAS,GAAa,EAAE,CAAC;wBAC/B,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;4BAChC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gCAChE,GAAG,CAAC,GAAG,CAAC;oCACN,IAAI,EAAE,uBAAuB;oCAC7B,IAAI,EAAE,4BAA4B;oCAClC,OAAO,EAAE,6CAA6C;oCACtD,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,GAAG,oBAAoB,CAAC,EAAE;iCAChD,CAAC,CAAC;4BACL,CAAC;iCAAM,CAAC;gCACN,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,aAAa,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;oCAC7D,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;oCACtC,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC;wCAC/D,GAAG,CAAC,GAAG,CAAC;4CACN,IAAI,EAAE,kBAAkB;4CACxB,IAAI,EAAE,SAAS,CAAC,4BAA4B,EAAE,KAAK,CAAC;4CACpD,OAAO,EAAE,2BAA2B,MAAM,CAAC,QAAQ,CAAC,GAAG;4CACvD,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,GAAG,oBAAoB,CAAC,EAAE;yCAChD,CAAC,CAAC;wCACH,SAAS;oCACX,CAAC;oCACD,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gCAC3B,CAAC;4BACH,CAAC;wBACH,CAAC;wBACD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;4BACvC,IAAI,GAAG,KAAK,OAAO,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;gCAC3C,GAAG,CAAC,GAAG,CAAC;oCACN,IAAI,EAAE,uBAAuB;oCAC7B,IAAI,EAAE,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC;oCACtC,OAAO,EAAE,iCAAiC,GAAG,GAAG;oCAChD,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE;iCAC7C,CAAC,CAAC;4BACL,CAAC;wBACH,CAAC;wBACD,MAAM;4BACJ,SAAS,CAAC,MAAM,KAAK,CAAC;gCACpB,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE;gCACtC,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,EAAE,CAAC;oBACxD,CAAC;gBACH,CAAC;YACH,CAAC;YACD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC3C,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;oBACtB,GAAG,CAAC,GAAG,CAAC;wBACN,IAAI,EAAE,uBAAuB;wBAC7B,IAAI,EAAE,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC;wBAC9B,OAAO,EAAE,yBAAyB,GAAG,GAAG;wBACxC,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,SAAS,CAAC,EAAE;qBAClC,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC;IAClC,MAAM,KAAK,GAA8B,EAAE,CAAC;IAC5C,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,EAAE,CAAC;YAC/B,GAAG,CAAC,GAAG,CAAC;gBACN,IAAI,EAAE,uBAAuB;gBAC7B,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,yBAAyB;aACnC,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;gBACtD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;oBAChD,GAAG,CAAC,GAAG,CAAC;wBACN,IAAI,EAAE,uBAAuB;wBAC7B,IAAI,EAAE,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;wBAC7B,OAAO,EAAE,yDAAyD;qBACnE,CAAC,CAAC;oBACH,SAAS;gBACX,CAAC;gBACD,KAAK,CAAC,GAAG,CAAC,GAAG,KAAkB,CAAC;YAClC,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;IAC/B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClD,GAAG,CAAC,GAAG,CAAC;YACN,IAAI,EAAE,uBAAuB;YAC7B,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,sCAAsC;SAChD,CAAC,CAAC;QACH,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO;QACL,IAAI,EAAE;YACJ,KAAK,EAAE,KAAK,IAAI,eAAe;YAC/B,MAAM;YACN,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;YACrD,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;SACxC;QACD,KAAK;QACL,MAAM;QACN,KAAK;QACL,MAAM;KACP,CAAC;AACJ,CAAC;AAOD,SAAS,aAAa,CACpB,UAA2B,EAC3B,QAAiB,EACjB,IAAY,EACZ,OAAqB;IAErB,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YACpE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;gBACd,IAAI,EAAE,uBAAuB;gBAC7B,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC;gBACzB,OAAO,EAAE,IAAI,MAAM,CAAC,QAAQ,CAAC,oEAAoE;aAClG,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;gBACd,IAAI,EAAE,uBAAuB;gBAC7B,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC;gBACzB,OAAO,EAAE,sBAAsB,QAAQ,GAAG;aAC3C,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC9B,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;QAChD,CAAC;IACH,CAAC;IAED,MAAM,IAAI,GAAG,aAAa,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAClD,IAAI,SAAS,GAAG,IAAI,CAAC;IACrB,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;QACtC,SAAS,GAAG,GAAG,IAAI,IAAI,MAAM,EAAE,CAAC;QAChC,MAAM,IAAI,CAAC,CAAC;IACd,CAAC;IACD,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC/B,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC;AAClD,CAAC;AAED,SAAS,SAAS,CAChB,KAAc,EACd,QAAuB,EACvB,KAAa,EACb,IAAY,EACZ,OAAqB;IAErB,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,IAAI,EAAE,OAAO,EAAE,yBAAyB,EAAE,CAAC,CAAC;QAC7F,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC;IAC7B,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;YACd,IAAI,EAAE,uBAAuB;YAC7B,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;YAC3B,OAAO,EAAE,8BAA8B;SACxC,CAAC,CAAC;QACH,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,UAAU,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;IACjD,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;YACd,IAAI,EAAE,oBAAoB;YAC1B,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;YAC3B,OAAO,EAAE,uBAAuB,SAAS,GAAG;YAC5C,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE;SAClD,CAAC,CAAC;QACH,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC;IAC7C,MAAM,QAAQ,GAA4B,EAAE,CAAC;IAC7C,IAAI,WAAoB,CAAC;IACzB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,IAAI,GAAG,KAAK,MAAM;YAAE,SAAS;QAC7B,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;YACrB,WAAW,GAAG,KAAK,CAAC;YACpB,SAAS;QACX,CAAC;QACD,QAAQ,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACxB,CAAC;IACD,IAAI,WAAW,KAAK,SAAS,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;YACd,IAAI,EAAE,uBAAuB;YAC7B,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;YAC7B,OAAO,EAAE,eAAe,SAAS,gCAAgC;SAClE,CAAC,CAAC;IACL,CAAC;IAED,MAAM,QAAQ,GAAG,aAAa,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACpE,MAAM,SAAS,GAAG,aAAa,CAAC,UAAU,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IAC/E,MAAM,YAAY,GAAG,oBAAoB,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IACxE,MAAM,KAAK,GAAG,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAA8B,CAAC;IAC7F,MAAM,WAAW,GAAG,KAAK,CAAC,EAAE,CAAC;IAC7B,MAAM,QAAQ,GAAe,aAAa,CAAC,WAAW,CAAC;QACrD,CAAC,CAAE,WAAqC;QACxC,CAAC,CAAC,EAAE,CAAC;IACP,IAAI,WAAW,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC,EAAE,CAAC;IAE/C,MAAM,IAAI,GAAW;QACnB,EAAE,EAAE,QAAQ,CAAC,EAAE;QACf,IAAI,EAAE,UAAU,CAAC,IAAI;QACrB,WAAW,EAAE,UAAU,CAAC,OAAO;QAC/B,IAAI,EAAE,UAAU,CAAC,IAAI;QACrB,IAAI;QACJ,QAAQ;QACR,KAAK;QACL,KAAK;QACL,QAAQ;QACR,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,UAAU,CAAC,IAAI;QACrB,eAAe,EAAE,CAAC,GAAG,UAAU,CAAC,eAAe,CAAqB;QACpE,MAAM,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC;QAC9B,OAAO,EAAE,UAAU,CAAC,OAAO;KAC5B,CAAC;IACF,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEzB,IAAI,SAAS,KAAK,SAAS,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QACzD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;gBACd,IAAI,EAAE,uBAAuB;gBAC7B,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;gBAC7B,OAAO,EAAE,mCAAmC;aAC7C,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC;YAC/B,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,IAAI,MAAM,CAAC,gBAAgB,CAAC;YACrD,IAAI,WAAW,CAAC,MAAM,GAAG,GAAG,IAAI,WAAW,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;gBACzD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;oBACd,IAAI,EAAE,uBAAuB;oBAC7B,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;oBAC7B,OAAO,EAAE,gBAAgB,GAAG,IAAI,GAAG,2BAA2B,WAAW,CAAC,MAAM,EAAE;iBACnF,CAAC,CAAC;YACL,CAAC;YACD,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAC1C,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,WAAW,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;gBAC3D,MAAM,OAAO,GAAG,SAAS,CACvB,WAAW,CAAC,KAAK,CAAC,EAClB,QAAQ,CAAC,EAAE,EACX,KAAK,GAAG,CAAC,EACT,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,EAC3B,OAAO,CACR,CAAC;gBACF,IAAI,OAAO,KAAK,SAAS;oBAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACzD,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC,EAAE,CAAC;AACrB,CAAC;AAED,SAAS,UAAU,CAAC,IAAY,EAAE,GAAW;IAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC;AAED,SAAS,UAAU,CAAC,IAAY,EAAE,GAAW;IAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC;AAED,mEAAmE;AACnE,SAAS,UAAU,CAAC,KAAe,EAAE,GAAkB;IACrD,IAAI,oBAAwC,CAAC;IAE7C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;YAC7C,IAAI,oBAAoB,KAAK,SAAS,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBACpD,GAAG,CAAC,GAAG,CAAC;oBACN,IAAI,EAAE,uBAAuB;oBAC7B,QAAQ,EAAE,SAAS;oBACnB,OAAO,EAAE,4CAA4C;oBACrD,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,MAAM,EAAE,IAAI,CAAC,EAAE;iBAChB,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,oBAAoB,KAAK,SAAS,IAAI,KAAK,GAAG,oBAAoB,GAAG,CAAC,EAAE,CAAC;gBAClF,GAAG,CAAC,GAAG,CAAC;oBACN,IAAI,EAAE,uBAAuB;oBAC7B,QAAQ,EAAE,SAAS;oBACnB,OAAO,EAAE,4BAA4B,oBAAoB,OAAO,KAAK,EAAE;oBACvE,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,MAAM,EAAE,IAAI,CAAC,EAAE;iBAChB,CAAC,CAAC;YACL,CAAC;YACD,oBAAoB,GAAG,KAAK,CAAC;YAC7B,SAAS;QACX,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC3B,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACzC,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,GAAG,CAAC;YAC3C,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;YAC3C,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC;gBACf,GAAG,CAAC,GAAG,CAAC;oBACN,IAAI,EAAE,uBAAuB;oBAC7B,OAAO,EAAE,eAAe,GAAG,+BAA+B,GAAG,GAAG;oBAChE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC;oBAC/B,MAAM,EAAE,IAAI,CAAC,EAAE;iBAChB,CAAC,CAAC;YACL,CAAC;YACD,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,EAAE,CAAC;gBACrB,GAAG,CAAC,GAAG,CAAC;oBACN,IAAI,EAAE,uBAAuB;oBAC7B,OAAO,EAAE,gBAAgB,IAAI,+BAA+B,GAAG,GAAG,GAAG,GAAG;oBACxE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC;oBAChC,MAAM,EAAE,IAAI,CAAC,EAAE;iBAChB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;YACnC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;YAC7B,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;gBAClD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;oBACpD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;oBACxB,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC;wBACxD,GAAG,CAAC,GAAG,CAAC;4BACN,IAAI,EAAE,uBAAuB;4BAC7B,QAAQ,EAAE,SAAS;4BACnB,OAAO,EAAE,WAAW,GAAG,CAAC,MAAM,iCAAiC,OAAO,CAAC,MAAM,UAAU;4BACvF,IAAI,EAAE,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,KAAK,CAAC;4BAClD,MAAM,EAAE,IAAI,CAAC,EAAE;yBAChB,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YACtD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;YACjC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;YACjC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBACnD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;oBACtD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;oBAC5B,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;wBAAE,SAAS;oBACpC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;oBAC5B,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC;wBAC7D,GAAG,CAAC,GAAG,CAAC;4BACN,IAAI,EAAE,uBAAuB;4BAC7B,QAAQ,EAAE,SAAS;4BACnB,OAAO,EAAE,WAAW,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,SAAS,MAAM,CAAC,MAAM,eAAe,MAAM,CAAC,MAAM,SAAS;4BAC3G,IAAI,EAAE,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,KAAK,CAAC;4BACpD,MAAM,EAAE,IAAI,CAAC,EAAE;yBAChB,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtE,GAAG,CAAC,GAAG,CAAC;gBACN,IAAI,EAAE,uBAAuB;gBAC7B,QAAQ,EAAE,SAAS;gBACnB,OAAO,EAAE,0DAA0D;gBACnE,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,MAAM,EAAE,IAAI,CAAC,EAAE;aAChB,CAAC,CAAC;QACL,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACzB,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YACtC,IAAI,IAAI,EAAE,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBAChC,GAAG,CAAC,GAAG,CAAC;oBACN,IAAI,EAAE,kBAAkB;oBACxB,QAAQ,EAAE,SAAS;oBACnB,OAAO,EAAE,uBAAuB;oBAChC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC;oBAChC,MAAM,EAAE,IAAI,CAAC,EAAE;iBAChB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;YAClC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;YAC7B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzB,GAAG,CAAC,GAAG,CAAC;oBACN,IAAI,EAAE,uBAAuB;oBAC7B,OAAO,EAAE,gCAAgC;oBACzC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC;oBAChC,MAAM,EAAE,IAAI,CAAC,EAAE;iBAChB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,aAAa,CAAC,KAAc,EAAE,UAAwB,EAAE;IACtE,MAAM,GAAG,GAAG,IAAI,aAAa,EAAE,CAAC;IAEhC,0EAA0E;IAC1E,6CAA6C;IAC7C,IAAI,QAAQ,GAAY,KAAK,CAAC;IAC9B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,QAAQ,GAAG,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzB,GAAG,CAAC,GAAG,CAAC;oBACN,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,GAAG;oBACvB,OAAO,EAAE,KAAK,CAAC,OAAO;iBACvB,CAAC,CAAC;gBACH,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,CAAC;YAC3E,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,WAAW,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAC1C,iBAAiB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IACjC,MAAM,QAAQ,GAAG,WAAW,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAC5C,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC;IAC5D,CAAC;IAED,MAAM,QAAQ,GAAG,iBAAiB,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAiB,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,GAAG,EAAU,EAAE,CAAC;IAC7E,MAAM,YAAY,GAAa,EAAE,CAAC;IAElC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;YAC/D,MAAM,OAAO,GAAG,SAAS,CACvB,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,EACtB,MAAM,EACN,CAAC,EACD,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC,EAC5B,OAAO,CACR,CAAC;YACF,IAAI,OAAO,KAAK,SAAS;gBAAE,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAED,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAE/B,MAAM,IAAI,GAAW;QACnB,EAAE,EAAE,MAAM;QACV,IAAI,EAAE,MAAM;QACZ,WAAW,EAAE,CAAC;QACd,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,GAAG;QACT,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,CAAC;QACR,KAAK,EAAE,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE;QACnE,QAAQ,EAAE,EAAE;QACZ,QAAQ,EAAE,YAAY;QACtB,IAAI,EAAE,sEAAsE;QAC5E,eAAe,EAAE,EAAE;QACnB,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,MAAM;KAChB,CAAC;IAEF,MAAM,EAAE,GAAe;QACrB,SAAS,EAAE,CAAC;QACZ,WAAW,EAAE,QAAQ,CAAC,eAAe,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,eAAe;QAC1E,eAAe,EAAE,OAAO;QACxB,IAAI,EAAE,QAAQ,EAAE,IAAI,IAAI,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,IAAI,EAAE;QAChE,KAAK,EAAE,QAAQ,EAAE,KAAK,IAAI,EAAE,MAAM,EAAE,oBAAoB,EAAE;QAC1D,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE;QAC/C,KAAK,EAAE,QAAQ,EAAE,KAAK,IAAI,EAAE;QAC5B,MAAM,EAAE,IAAI,CAAC,EAAE;QACf,KAAK,EAAE,CAAC,IAAI,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC;QAC/B,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE;KACzB,CAAC;IAEF,OAAO,EAAE,EAAE,EAAE,WAAW,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC;AACjD,CAAC;AAED,SAAS,WAAW;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;AACvF,CAAC;AAED,SAAS,OAAO;IACd,OAAO;QACL,SAAS,EAAE,CAAC;QACZ,WAAW,EAAE,CAAC;QACd,eAAe,EAAE,OAAO;QACxB,IAAI,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,IAAI,EAAE;QAC9C,KAAK,EAAE,EAAE,MAAM,EAAE,oBAAoB,EAAE;QACvC,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE;QAC3B,KAAK,EAAE,EAAE;QACT,MAAM,EAAE,MAAM;QACd,KAAK,EAAE,EAAE;QACT,QAAQ,EAAE,EAAE;KACb,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CAAC,KAAc,EAAE,UAAwB,EAAE;IAClE,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC;IAC1F,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACxB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,MAAM,IAAI,WAAW,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE;YAC/C,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;YAC/D,uEAAuE;YACvE,qDAAqD;YACrD,OAAO,EAAE,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE;SAC3D,CAAC,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC,EAAE,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Input boundary.
|
|
3
|
+
*
|
|
4
|
+
* Everything entering the compiler arrives as an untrusted string or an
|
|
5
|
+
* untrusted object. Parsing happens here and only here, with YAML alias
|
|
6
|
+
* expansion bounded so a small document cannot expand into a large one.
|
|
7
|
+
*/
|
|
8
|
+
export interface ParseOptions {
|
|
9
|
+
/** Source label used in diagnostics (`--out` name, filename, or `<input>`). */
|
|
10
|
+
source?: string;
|
|
11
|
+
/** Force a parser instead of detecting from content. */
|
|
12
|
+
format?: 'json' | 'yaml';
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Parse a spec from a string or pass through an already-parsed object.
|
|
16
|
+
*
|
|
17
|
+
* JSON is detected by its first non-whitespace character; anything else is
|
|
18
|
+
* parsed as YAML, which is a superset of JSON. Parse failures are reported as
|
|
19
|
+
* `SPEC_PARSE_ERROR` with the source label and, for YAML, the offending line.
|
|
20
|
+
*/
|
|
21
|
+
export declare function parseSpec(input: unknown, options?: ParseOptions): unknown;
|
|
22
|
+
//# sourceMappingURL=parse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../src/spec/parse.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,MAAM,WAAW,YAAY;IAC3B,+EAA+E;IAC/E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wDAAwD;IACxD,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC1B;AASD;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAiC7E"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Input boundary.
|
|
3
|
+
*
|
|
4
|
+
* Everything entering the compiler arrives as an untrusted string or an
|
|
5
|
+
* untrusted object. Parsing happens here and only here, with YAML alias
|
|
6
|
+
* expansion bounded so a small document cannot expand into a large one.
|
|
7
|
+
*/
|
|
8
|
+
import { parse as parseYaml } from 'yaml';
|
|
9
|
+
import { RenderError } from '../errors.js';
|
|
10
|
+
import { isNumberedError } from '../internal/yaml-error.js';
|
|
11
|
+
const MAX_ALIAS_COUNT = 100;
|
|
12
|
+
function looksLikeJson(text) {
|
|
13
|
+
const trimmed = text.trimStart();
|
|
14
|
+
return trimmed.startsWith('{') || trimmed.startsWith('[');
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Parse a spec from a string or pass through an already-parsed object.
|
|
18
|
+
*
|
|
19
|
+
* JSON is detected by its first non-whitespace character; anything else is
|
|
20
|
+
* parsed as YAML, which is a superset of JSON. Parse failures are reported as
|
|
21
|
+
* `SPEC_PARSE_ERROR` with the source label and, for YAML, the offending line.
|
|
22
|
+
*/
|
|
23
|
+
export function parseSpec(input, options = {}) {
|
|
24
|
+
if (typeof input !== 'string')
|
|
25
|
+
return input;
|
|
26
|
+
const source = options.source ?? '<input>';
|
|
27
|
+
const format = options.format ?? (looksLikeJson(input) ? 'json' : 'yaml');
|
|
28
|
+
if (format === 'json') {
|
|
29
|
+
try {
|
|
30
|
+
return JSON.parse(input);
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
throw new RenderError('SPEC_PARSE_ERROR', `invalid JSON in ${source}: ${describe(error)}`, {
|
|
34
|
+
path: '$',
|
|
35
|
+
cause: error,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
try {
|
|
40
|
+
return parseYaml(input, {
|
|
41
|
+
maxAliasCount: MAX_ALIAS_COUNT,
|
|
42
|
+
uniqueKeys: true,
|
|
43
|
+
logLevel: 'silent',
|
|
44
|
+
prettyErrors: true,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
const detail = isNumberedError(error)
|
|
49
|
+
? `${describe(error)} (line ${error.linePos[0]?.line ?? '?'}, column ${error.linePos[0]?.col ?? '?'})`
|
|
50
|
+
: describe(error);
|
|
51
|
+
throw new RenderError('SPEC_PARSE_ERROR', `invalid YAML in ${source}: ${detail}`, {
|
|
52
|
+
path: '$',
|
|
53
|
+
cause: error,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function describe(error) {
|
|
58
|
+
if (error instanceof Error)
|
|
59
|
+
return error.message;
|
|
60
|
+
return String(error);
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=parse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.js","sourceRoot":"","sources":["../../src/spec/parse.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAS5D,MAAM,eAAe,GAAG,GAAG,CAAC;AAE5B,SAAS,aAAa,CAAC,IAAY;IACjC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;IACjC,OAAO,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AAC5D,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,SAAS,CAAC,KAAc,EAAE,UAAwB,EAAE;IAClE,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAE5C,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,SAAS,CAAC;IAC3C,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAE1E,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAY,CAAC;QACtC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,WAAW,CAAC,kBAAkB,EAAE,mBAAmB,MAAM,KAAK,QAAQ,CAAC,KAAK,CAAC,EAAE,EAAE;gBACzF,IAAI,EAAE,GAAG;gBACT,KAAK,EAAE,KAAK;aACb,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,IAAI,CAAC;QACH,OAAO,SAAS,CAAC,KAAK,EAAE;YACtB,aAAa,EAAE,eAAe;YAC9B,UAAU,EAAE,IAAI;YAChB,QAAQ,EAAE,QAAQ;YAClB,YAAY,EAAE,IAAI;SACnB,CAAY,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC;YACnC,CAAC,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,UAAU,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,GAAG,YAAY,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,GAAG,GAAG;YACtG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACpB,MAAM,IAAI,WAAW,CAAC,kBAAkB,EAAE,mBAAmB,MAAM,KAAK,MAAM,EAAE,EAAE;YAChF,IAAI,EAAE,GAAG;YACT,KAAK,EAAE,KAAK;SACb,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,IAAI,KAAK,YAAY,KAAK;QAAE,OAAO,KAAK,CAAC,OAAO,CAAC;IACjD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Network-backed media providers.
|
|
3
|
+
*
|
|
4
|
+
* A page never embeds a remote frame: the compiler emits no iframe at all, so a
|
|
5
|
+
* provider reference can only ever become a poster, a link, or a direct media
|
|
6
|
+
* source. This module defines the closed provider vocabulary and the hosts each
|
|
7
|
+
* provider may be referenced from, so a spec cannot point a "YouTube" block at
|
|
8
|
+
* an arbitrary domain and have the policy treat it as trusted.
|
|
9
|
+
*/
|
|
10
|
+
export interface EmbedProvider {
|
|
11
|
+
readonly label: string;
|
|
12
|
+
/** Hosts the provider serves content from; a subdomain of any of these matches. */
|
|
13
|
+
readonly hosts: readonly string[];
|
|
14
|
+
/** Short description for catalog output. */
|
|
15
|
+
readonly description: string;
|
|
16
|
+
}
|
|
17
|
+
export declare const EMBED_PROVIDERS: Readonly<Record<string, EmbedProvider>>;
|
|
18
|
+
export declare const EMBED_PROVIDER_NAMES: readonly string[];
|
|
19
|
+
export declare function isEmbedProvider(name: string): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* True when a remote reference belongs to the named provider.
|
|
22
|
+
*
|
|
23
|
+
* Matching is on the parsed hostname, so `https://youtube.com.evil.example/`
|
|
24
|
+
* does not match `youtube.com` and a lookalike host cannot inherit a provider's
|
|
25
|
+
* allowlist entry.
|
|
26
|
+
*/
|
|
27
|
+
export declare function hostMatchesProvider(provider: string, reference: string): boolean;
|
|
28
|
+
/** True when the reference belongs to any provider in the allowlist. */
|
|
29
|
+
export declare function hostMatchesAnyProvider(providers: readonly string[], reference: string): boolean;
|
|
30
|
+
//# sourceMappingURL=providers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../../src/spec/providers.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,mFAAmF;IACnF,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,4CAA4C;IAC5C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,eAAO,MAAM,eAAe,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAqBnE,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,SAAS,MAAM,EAAwC,CAAC;AAE3F,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAErD;AAUD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAMhF;AAED,wEAAwE;AACxE,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAE/F"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Network-backed media providers.
|
|
3
|
+
*
|
|
4
|
+
* A page never embeds a remote frame: the compiler emits no iframe at all, so a
|
|
5
|
+
* provider reference can only ever become a poster, a link, or a direct media
|
|
6
|
+
* source. This module defines the closed provider vocabulary and the hosts each
|
|
7
|
+
* provider may be referenced from, so a spec cannot point a "YouTube" block at
|
|
8
|
+
* an arbitrary domain and have the policy treat it as trusted.
|
|
9
|
+
*/
|
|
10
|
+
export const EMBED_PROVIDERS = {
|
|
11
|
+
youtube: {
|
|
12
|
+
label: 'YouTube',
|
|
13
|
+
hosts: ['youtube.com', 'youtu.be', 'youtube-nocookie.com'],
|
|
14
|
+
description: 'YouTube video page or short link.',
|
|
15
|
+
},
|
|
16
|
+
vimeo: {
|
|
17
|
+
label: 'Vimeo',
|
|
18
|
+
hosts: ['vimeo.com'],
|
|
19
|
+
description: 'Vimeo video page or player link.',
|
|
20
|
+
},
|
|
21
|
+
spotify: {
|
|
22
|
+
label: 'Spotify',
|
|
23
|
+
hosts: ['open.spotify.com'],
|
|
24
|
+
description: 'Spotify track, album, playlist, or episode.',
|
|
25
|
+
},
|
|
26
|
+
soundcloud: {
|
|
27
|
+
label: 'SoundCloud',
|
|
28
|
+
hosts: ['soundcloud.com'],
|
|
29
|
+
description: 'SoundCloud track or set.',
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
export const EMBED_PROVIDER_NAMES = Object.keys(EMBED_PROVIDERS).sort();
|
|
33
|
+
export function isEmbedProvider(name) {
|
|
34
|
+
return Object.hasOwn(EMBED_PROVIDERS, name);
|
|
35
|
+
}
|
|
36
|
+
function hostOf(reference) {
|
|
37
|
+
try {
|
|
38
|
+
return new URL(reference).hostname.toLowerCase();
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* True when a remote reference belongs to the named provider.
|
|
46
|
+
*
|
|
47
|
+
* Matching is on the parsed hostname, so `https://youtube.com.evil.example/`
|
|
48
|
+
* does not match `youtube.com` and a lookalike host cannot inherit a provider's
|
|
49
|
+
* allowlist entry.
|
|
50
|
+
*/
|
|
51
|
+
export function hostMatchesProvider(provider, reference) {
|
|
52
|
+
const entry = EMBED_PROVIDERS[provider];
|
|
53
|
+
if (entry === undefined)
|
|
54
|
+
return false;
|
|
55
|
+
const host = hostOf(reference);
|
|
56
|
+
if (host === undefined)
|
|
57
|
+
return false;
|
|
58
|
+
return entry.hosts.some((allowed) => host === allowed || host.endsWith(`.${allowed}`));
|
|
59
|
+
}
|
|
60
|
+
/** True when the reference belongs to any provider in the allowlist. */
|
|
61
|
+
export function hostMatchesAnyProvider(providers, reference) {
|
|
62
|
+
return providers.some((provider) => hostMatchesProvider(provider, reference));
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=providers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"providers.js","sourceRoot":"","sources":["../../src/spec/providers.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAUH,MAAM,CAAC,MAAM,eAAe,GAA4C;IACtE,OAAO,EAAE;QACP,KAAK,EAAE,SAAS;QAChB,KAAK,EAAE,CAAC,aAAa,EAAE,UAAU,EAAE,sBAAsB,CAAC;QAC1D,WAAW,EAAE,mCAAmC;KACjD;IACD,KAAK,EAAE;QACL,KAAK,EAAE,OAAO;QACd,KAAK,EAAE,CAAC,WAAW,CAAC;QACpB,WAAW,EAAE,kCAAkC;KAChD;IACD,OAAO,EAAE;QACP,KAAK,EAAE,SAAS;QAChB,KAAK,EAAE,CAAC,kBAAkB,CAAC;QAC3B,WAAW,EAAE,6CAA6C;KAC3D;IACD,UAAU,EAAE;QACV,KAAK,EAAE,YAAY;QACnB,KAAK,EAAE,CAAC,gBAAgB,CAAC;QACzB,WAAW,EAAE,0BAA0B;KACxC;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAsB,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,IAAI,EAAE,CAAC;AAE3F,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,OAAO,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,MAAM,CAAC,SAAiB;IAC/B,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAgB,EAAE,SAAiB;IACrE,MAAM,KAAK,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IACxC,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACtC,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;IAC/B,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACrC,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC;AACzF,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,sBAAsB,CAAC,SAA4B,EAAE,SAAiB;IACpF,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,mBAAmB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;AAChF,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `validate()` — report everything wrong with a spec without normalizing or
|
|
3
|
+
* rendering it. Used by the CLI and by skills that want a pre-flight check.
|
|
4
|
+
*/
|
|
5
|
+
import type { Diagnostic } from '../diagnostics.js';
|
|
6
|
+
import { type ParseOptions } from './parse.js';
|
|
7
|
+
export interface ValidateSummary {
|
|
8
|
+
title: string;
|
|
9
|
+
themePreset: string;
|
|
10
|
+
blocks: number;
|
|
11
|
+
nodes: number;
|
|
12
|
+
depth: number;
|
|
13
|
+
bytes: number;
|
|
14
|
+
}
|
|
15
|
+
export interface ValidateResult {
|
|
16
|
+
ok: boolean;
|
|
17
|
+
diagnostics: Diagnostic[];
|
|
18
|
+
summary: ValidateSummary;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Validate a spec given as a string (JSON or YAML) or an already-parsed object.
|
|
22
|
+
* Never throws for spec problems; a thrown error is reserved for programmer
|
|
23
|
+
* error.
|
|
24
|
+
*/
|
|
25
|
+
export declare function validate(input: unknown, options?: ParseOptions): ValidateResult;
|
|
26
|
+
/** Validate or throw the first error, for callers that want exception flow. */
|
|
27
|
+
export declare function validateOrThrow(input: unknown, options?: ParseOptions): ValidateResult;
|
|
28
|
+
//# sourceMappingURL=validate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/spec/validate.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAGpD,OAAO,EAAE,KAAK,YAAY,EAAa,MAAM,YAAY,CAAC;AAE1D,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,OAAO,CAAC;IACZ,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,OAAO,EAAE,eAAe,CAAC;CAC1B;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,GAAE,YAAiB,GAAG,cAAc,CAqCnF;AAED,+EAA+E;AAC/E,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,GAAE,YAAiB,GAAG,cAAc,CAW1F"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `validate()` — report everything wrong with a spec without normalizing or
|
|
3
|
+
* rendering it. Used by the CLI and by skills that want a pre-flight check.
|
|
4
|
+
*/
|
|
5
|
+
import { isRenderError, RenderError } from '../errors.js';
|
|
6
|
+
import { normalizeSpec } from './normalize.js';
|
|
7
|
+
import { parseSpec } from './parse.js';
|
|
8
|
+
/**
|
|
9
|
+
* Validate a spec given as a string (JSON or YAML) or an already-parsed object.
|
|
10
|
+
* Never throws for spec problems; a thrown error is reserved for programmer
|
|
11
|
+
* error.
|
|
12
|
+
*/
|
|
13
|
+
export function validate(input, options = {}) {
|
|
14
|
+
let document = input;
|
|
15
|
+
try {
|
|
16
|
+
document = parseSpec(input, options);
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
const diagnostics = [];
|
|
20
|
+
if (isRenderError(error)) {
|
|
21
|
+
diagnostics.push({
|
|
22
|
+
code: error.code,
|
|
23
|
+
severity: 'error',
|
|
24
|
+
message: error.message,
|
|
25
|
+
path: error.path ?? '$',
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
throw error;
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
ok: false,
|
|
33
|
+
diagnostics,
|
|
34
|
+
summary: emptySummary(),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
const result = normalizeSpec(document);
|
|
38
|
+
const errors = result.diagnostics.some((diagnostic) => diagnostic.severity === 'error');
|
|
39
|
+
return {
|
|
40
|
+
ok: !errors,
|
|
41
|
+
diagnostics: result.diagnostics,
|
|
42
|
+
summary: {
|
|
43
|
+
title: result.ir.meta.title,
|
|
44
|
+
themePreset: result.ir.theme.preset,
|
|
45
|
+
blocks: Math.max(result.ir.nodes.length - 1, 0),
|
|
46
|
+
nodes: result.ir.nodes.length,
|
|
47
|
+
depth: result.bounds.depth,
|
|
48
|
+
bytes: result.bounds.bytes,
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
/** Validate or throw the first error, for callers that want exception flow. */
|
|
53
|
+
export function validateOrThrow(input, options = {}) {
|
|
54
|
+
const result = validate(input, options);
|
|
55
|
+
const first = result.diagnostics.find((diagnostic) => diagnostic.severity === 'error');
|
|
56
|
+
if (first !== undefined) {
|
|
57
|
+
throw new RenderError(first.code, first.message, {
|
|
58
|
+
path: first.path,
|
|
59
|
+
...(first.nodeId === undefined ? {} : { nodeId: first.nodeId }),
|
|
60
|
+
details: { diagnostics: result.diagnostics },
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
return result;
|
|
64
|
+
}
|
|
65
|
+
function emptySummary() {
|
|
66
|
+
return { title: '', themePreset: '', blocks: 0, nodes: 0, depth: 0, bytes: 0 };
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/spec/validate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Theme resolution.
|
|
3
|
+
*
|
|
4
|
+
* A preset is resolved through its `extends` chain into a complete light and
|
|
5
|
+
* dark token set, then emitted as CSS custom properties. This is the only place
|
|
6
|
+
* a theme becomes CSS, and it can only emit declarations built from validated
|
|
7
|
+
* token values — which is what makes "themes are typed data, never CSS" a
|
|
8
|
+
* property of the implementation rather than a promise.
|
|
9
|
+
*
|
|
10
|
+
* Nonces and font policy are deliberately absent: nothing here can reference a
|
|
11
|
+
* remote font, so the emitted artifact never needs a webfont licence.
|
|
12
|
+
*/
|
|
13
|
+
import { type Diagnostic, DiagnosticBag } from '../diagnostics.js';
|
|
14
|
+
import { type ThemeCatalog } from './theme-catalog.js';
|
|
15
|
+
import { type Tokens } from './tokens.js';
|
|
16
|
+
export interface ThemeInput {
|
|
17
|
+
preset?: string;
|
|
18
|
+
extends?: string;
|
|
19
|
+
tokens?: Record<string, unknown>;
|
|
20
|
+
dark?: Record<string, unknown>;
|
|
21
|
+
}
|
|
22
|
+
export interface ResolvedTheme {
|
|
23
|
+
/** Resolved preset name, which may be a user-defined name. */
|
|
24
|
+
name: string;
|
|
25
|
+
/** Root preset of the resolution chain. */
|
|
26
|
+
base: string;
|
|
27
|
+
version: number;
|
|
28
|
+
description: string;
|
|
29
|
+
/** Ordered chain from the root preset to the resolved preset. */
|
|
30
|
+
chain: string[];
|
|
31
|
+
light: Tokens;
|
|
32
|
+
dark: Tokens;
|
|
33
|
+
css: string;
|
|
34
|
+
motionPolicy: string;
|
|
35
|
+
density: string;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Resolve a theme, reporting problems as diagnostics instead of throwing.
|
|
39
|
+
*/
|
|
40
|
+
export declare function resolveTheme(input: unknown, bag: DiagnosticBag, catalog?: ThemeCatalog): ResolvedTheme | undefined;
|
|
41
|
+
export interface LoadThemeOptions {
|
|
42
|
+
catalog?: ThemeCatalog;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Load and validate a theme preset.
|
|
46
|
+
*
|
|
47
|
+
* Accepts a preset name (`'blueprint'`), an object with `preset`, `extends`,
|
|
48
|
+
* `tokens`, and `dark`, or a spec-shaped theme block. Throws a `RenderError`
|
|
49
|
+
* carrying every token problem when the input is invalid.
|
|
50
|
+
*/
|
|
51
|
+
export declare function loadTheme(input?: unknown, options?: LoadThemeOptions): ResolvedTheme;
|
|
52
|
+
/** Diagnostics produced while resolving a theme, including completion warnings. */
|
|
53
|
+
export declare function themeDiagnostics(input: unknown, catalog: ThemeCatalog): Diagnostic[];
|
|
54
|
+
export declare function themePresetNames(catalog?: ThemeCatalog): string[];
|
|
55
|
+
//# sourceMappingURL=load-theme.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load-theme.d.ts","sourceRoot":"","sources":["../../src/theme/load-theme.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,KAAK,UAAU,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGnE,OAAO,EAA2C,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAChG,OAAO,EAEL,KAAK,MAAM,EAIZ,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,aAAa;IAC5B,8DAA8D;IAC9D,IAAI,EAAE,MAAM,CAAC;IACb,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,iEAAiE;IACjE,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB;AA4ID;;GAEG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,aAAa,EAClB,OAAO,GAAE,YAAoC,GAC5C,aAAa,GAAG,SAAS,CAsE3B;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,YAAY,CAAC;CACxB;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,OAAO,GAAE,gBAAqB,GAAG,aAAa,CAexF;AAED,mFAAmF;AACnF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,GAAG,UAAU,EAAE,CAIpF;AAED,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,YAAoC,GAAG,MAAM,EAAE,CAExF"}
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Theme resolution.
|
|
3
|
+
*
|
|
4
|
+
* A preset is resolved through its `extends` chain into a complete light and
|
|
5
|
+
* dark token set, then emitted as CSS custom properties. This is the only place
|
|
6
|
+
* a theme becomes CSS, and it can only emit declarations built from validated
|
|
7
|
+
* token values — which is what makes "themes are typed data, never CSS" a
|
|
8
|
+
* property of the implementation rather than a promise.
|
|
9
|
+
*
|
|
10
|
+
* Nonces and font policy are deliberately absent: nothing here can reference a
|
|
11
|
+
* remote font, so the emitted artifact never needs a webfont licence.
|
|
12
|
+
*/
|
|
13
|
+
import { DiagnosticBag } from '../diagnostics.js';
|
|
14
|
+
import { RenderError } from '../errors.js';
|
|
15
|
+
import { DEFAULT_PRESET } from './presets.js';
|
|
16
|
+
import { builtinThemeCatalog, catalogPresetNames } from './theme-catalog.js';
|
|
17
|
+
import { TOKEN_SPECS, tokenCssValue, tokenVariable, validateTokenValue, } from './tokens.js';
|
|
18
|
+
function declarations(tokens) {
|
|
19
|
+
return Object.keys(tokens)
|
|
20
|
+
.sort()
|
|
21
|
+
.map((token) => `${tokenVariable(token)}:${tokenCssValue(token, tokens[token] ?? '')}`)
|
|
22
|
+
.join(';');
|
|
23
|
+
}
|
|
24
|
+
function buildThemeCss(light, dark, motionDisabled) {
|
|
25
|
+
const parts = [`:root{${declarations(light)}}`];
|
|
26
|
+
parts.push(`@media (prefers-color-scheme: dark){:root:not([data-theme="light"]){${declarations(dark)}}}`);
|
|
27
|
+
parts.push(`:root[data-theme="dark"]{${declarations(dark)}}`);
|
|
28
|
+
parts.push(`:root[data-theme="light"]{${declarations(light)}}`);
|
|
29
|
+
if (motionDisabled)
|
|
30
|
+
parts.push(':root{--ak-motion-duration:0ms}');
|
|
31
|
+
parts.push('@media (prefers-reduced-motion: reduce){:root{--ak-motion-duration:0ms}}');
|
|
32
|
+
return parts.join('\n');
|
|
33
|
+
}
|
|
34
|
+
function coerceInput(input) {
|
|
35
|
+
if (input === undefined || input === null)
|
|
36
|
+
return {};
|
|
37
|
+
if (typeof input === 'string')
|
|
38
|
+
return { preset: input };
|
|
39
|
+
if (typeof input === 'object' && !Array.isArray(input))
|
|
40
|
+
return input;
|
|
41
|
+
return {};
|
|
42
|
+
}
|
|
43
|
+
function resolveChain(name, catalog, bag, trail) {
|
|
44
|
+
const entry = catalog.entries[name];
|
|
45
|
+
if (entry === undefined) {
|
|
46
|
+
bag.add({
|
|
47
|
+
code: 'SPEC_VALIDATION_ERROR',
|
|
48
|
+
path: 'theme.preset',
|
|
49
|
+
message: `unknown theme preset "${name}"`,
|
|
50
|
+
details: { known: catalogPresetNames(catalog) },
|
|
51
|
+
});
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
54
|
+
if (trail.includes(name)) {
|
|
55
|
+
bag.add({
|
|
56
|
+
code: 'SPEC_VALIDATION_ERROR',
|
|
57
|
+
path: 'theme.extends',
|
|
58
|
+
message: `theme preset cycle: ${[...trail, name].join(' -> ')}`,
|
|
59
|
+
details: { chain: [...trail, name] },
|
|
60
|
+
});
|
|
61
|
+
return undefined;
|
|
62
|
+
}
|
|
63
|
+
let inherited = { tokens: {}, dark: {}, description: '', version: 1, chain: [] };
|
|
64
|
+
if (entry.extends !== undefined) {
|
|
65
|
+
const parent = resolveChain(entry.extends, catalog, bag, [...trail, name]);
|
|
66
|
+
if (parent === undefined)
|
|
67
|
+
return undefined;
|
|
68
|
+
inherited = parent;
|
|
69
|
+
}
|
|
70
|
+
const applyOverrides = (key, overrides) => {
|
|
71
|
+
const merged = {};
|
|
72
|
+
for (const [token, value] of Object.entries(overrides)) {
|
|
73
|
+
const problem = validateTokenValue(token, value);
|
|
74
|
+
if (problem !== undefined) {
|
|
75
|
+
bag.add({
|
|
76
|
+
code: 'POLICY_VIOLATION',
|
|
77
|
+
path: `theme.${key}.${token}`,
|
|
78
|
+
message: `theme token "${token}": ${problem.message}`,
|
|
79
|
+
details: {
|
|
80
|
+
token,
|
|
81
|
+
preset: entry.name,
|
|
82
|
+
...(entry.file === undefined ? {} : { file: entry.file }),
|
|
83
|
+
known: Object.keys(TOKEN_SPECS).sort(),
|
|
84
|
+
},
|
|
85
|
+
});
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
merged[token] = value;
|
|
89
|
+
}
|
|
90
|
+
return merged;
|
|
91
|
+
};
|
|
92
|
+
return {
|
|
93
|
+
tokens: { ...inherited.tokens, ...applyOverrides('tokens', entry.tokens) },
|
|
94
|
+
dark: { ...inherited.dark, ...applyOverrides('dark', entry.dark) },
|
|
95
|
+
description: entry.description === '' ? inherited.description : entry.description,
|
|
96
|
+
version: entry.version,
|
|
97
|
+
chain: [...inherited.chain, entry.name],
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
/** Fill any token a preset chain left unset, so a partial preset still renders. */
|
|
101
|
+
function completeTokens(tokens, bag, presetName, scheme) {
|
|
102
|
+
const fallback = catalogFallbackTokens();
|
|
103
|
+
const completed = { ...tokens };
|
|
104
|
+
for (const token of Object.keys(TOKEN_SPECS)) {
|
|
105
|
+
if (completed[token] !== undefined)
|
|
106
|
+
continue;
|
|
107
|
+
const value = fallback[token];
|
|
108
|
+
if (value === undefined)
|
|
109
|
+
continue;
|
|
110
|
+
completed[token] = value;
|
|
111
|
+
bag.add({
|
|
112
|
+
code: 'SPEC_VALIDATION_ERROR',
|
|
113
|
+
severity: 'warning',
|
|
114
|
+
path: `theme.${scheme}.${token}`,
|
|
115
|
+
message: `preset "${presetName}" does not declare "${token}"; the default preset value is used`,
|
|
116
|
+
details: { token, preset: presetName },
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
return completed;
|
|
120
|
+
}
|
|
121
|
+
let fallbackCache;
|
|
122
|
+
function catalogFallbackTokens() {
|
|
123
|
+
if (fallbackCache === undefined) {
|
|
124
|
+
const defaultEntry = builtinThemeCatalog().entries[DEFAULT_PRESET];
|
|
125
|
+
fallbackCache = { ...(defaultEntry?.tokens ?? {}) };
|
|
126
|
+
}
|
|
127
|
+
return fallbackCache;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Resolve a theme, reporting problems as diagnostics instead of throwing.
|
|
131
|
+
*/
|
|
132
|
+
export function resolveTheme(input, bag, catalog = builtinThemeCatalog()) {
|
|
133
|
+
const themeInput = coerceInput(input);
|
|
134
|
+
// `extends` names the preset to inherit from; `preset` names the result. An
|
|
135
|
+
// inline theme therefore labels itself and inherits a catalog preset, while a
|
|
136
|
+
// bare name (or a discovered preset file used without `extends`) resolves
|
|
137
|
+
// directly through the catalog.
|
|
138
|
+
const lookup = themeInput.extends ?? themeInput.preset ?? DEFAULT_PRESET;
|
|
139
|
+
const root = resolveChain(lookup, catalog, bag, []);
|
|
140
|
+
if (root === undefined)
|
|
141
|
+
return undefined;
|
|
142
|
+
const resolvedName = themeInput.preset ?? lookup;
|
|
143
|
+
const lightOverrides = themeInput.tokens ?? {};
|
|
144
|
+
const darkOverrides = themeInput.dark ?? {};
|
|
145
|
+
const applyInput = (key, base, overrides) => {
|
|
146
|
+
const merged = { ...base };
|
|
147
|
+
for (const [token, value] of Object.entries(overrides)) {
|
|
148
|
+
if (TOKEN_SPECS[token] === undefined) {
|
|
149
|
+
bag.add({
|
|
150
|
+
code: 'POLICY_VIOLATION',
|
|
151
|
+
path: `theme.${key}.${token}`,
|
|
152
|
+
message: `theme token "${token}": unknown token`,
|
|
153
|
+
details: { token, known: Object.keys(TOKEN_SPECS).sort() },
|
|
154
|
+
});
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
const problem = validateTokenValue(token, value);
|
|
158
|
+
if (problem !== undefined) {
|
|
159
|
+
bag.add({
|
|
160
|
+
code: 'POLICY_VIOLATION',
|
|
161
|
+
path: `theme.${key}.${token}`,
|
|
162
|
+
message: `theme token "${token}": ${problem.message}`,
|
|
163
|
+
details: { token },
|
|
164
|
+
});
|
|
165
|
+
continue;
|
|
166
|
+
}
|
|
167
|
+
merged[token] = String(value);
|
|
168
|
+
}
|
|
169
|
+
return merged;
|
|
170
|
+
};
|
|
171
|
+
const light = completeTokens(applyInput('tokens', root.tokens, lightOverrides), bag, resolvedName, 'tokens');
|
|
172
|
+
const dark = completeTokens(applyInput('dark', root.dark, darkOverrides), bag, resolvedName, 'dark');
|
|
173
|
+
const motionPolicy = light['motion-policy'] ?? 'full';
|
|
174
|
+
return {
|
|
175
|
+
name: resolvedName,
|
|
176
|
+
base: root.chain[0] ?? lookup,
|
|
177
|
+
version: root.version,
|
|
178
|
+
description: root.description,
|
|
179
|
+
chain: root.chain,
|
|
180
|
+
light,
|
|
181
|
+
dark,
|
|
182
|
+
css: buildThemeCss(light, dark, motionPolicy === 'none'),
|
|
183
|
+
motionPolicy,
|
|
184
|
+
density: light.density ?? 'comfortable',
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Load and validate a theme preset.
|
|
189
|
+
*
|
|
190
|
+
* Accepts a preset name (`'blueprint'`), an object with `preset`, `extends`,
|
|
191
|
+
* `tokens`, and `dark`, or a spec-shaped theme block. Throws a `RenderError`
|
|
192
|
+
* carrying every token problem when the input is invalid.
|
|
193
|
+
*/
|
|
194
|
+
export function loadTheme(input, options = {}) {
|
|
195
|
+
const bag = new DiagnosticBag();
|
|
196
|
+
const resolved = resolveTheme(input, bag, options.catalog ?? builtinThemeCatalog());
|
|
197
|
+
const errors = bag.errors();
|
|
198
|
+
const first = errors[0];
|
|
199
|
+
if (resolved === undefined || first !== undefined) {
|
|
200
|
+
if (first === undefined) {
|
|
201
|
+
throw new RenderError('INTERNAL_ERROR', 'theme resolution failed without a diagnostic');
|
|
202
|
+
}
|
|
203
|
+
throw new RenderError(first.code, first.message, {
|
|
204
|
+
path: first.path,
|
|
205
|
+
details: { ...(first.details ?? {}), diagnostics: errors },
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
return resolved;
|
|
209
|
+
}
|
|
210
|
+
/** Diagnostics produced while resolving a theme, including completion warnings. */
|
|
211
|
+
export function themeDiagnostics(input, catalog) {
|
|
212
|
+
const bag = new DiagnosticBag();
|
|
213
|
+
resolveTheme(input, bag, catalog);
|
|
214
|
+
return bag.list();
|
|
215
|
+
}
|
|
216
|
+
export function themePresetNames(catalog = builtinThemeCatalog()) {
|
|
217
|
+
return catalogPresetNames(catalog);
|
|
218
|
+
}
|
|
219
|
+
//# sourceMappingURL=load-theme.js.map
|