diff --git a/exampleSite/content/tests/camelcase.md b/exampleSite/content/tests/camelcase.md new file mode 100644 index 0000000..bb79064 --- /dev/null +++ b/exampleSite/content/tests/camelcase.md @@ -0,0 +1,4 @@ +--- +title: camelcase +outputs: ["json"] +--- diff --git a/exampleSite/data/structures/test-camel.yml b/exampleSite/data/structures/test-camel.yml new file mode 100644 index 0000000..de56cbc --- /dev/null +++ b/exampleSite/data/structures/test-camel.yml @@ -0,0 +1,19 @@ +comment: >- + Test fixture for arguments DECLARED in camelCase (regression: camel-key used to lowercase + the whole first word, storing provided values under a key consumers never read). +arguments: + overlayMode: + type: select + optional: true + default: dark + options: + values: [light, dark, none] + logo-align: + type: select + optional: true + default: start + options: + values: [start, center, end] + plainkey: + type: string + optional: true diff --git a/exampleSite/data/tests/camelcase.yml b/exampleSite/data/tests/camelcase.yml new file mode 100644 index 0000000..bfc74ea --- /dev/null +++ b/exampleSite/data/tests/camelcase.yml @@ -0,0 +1,21 @@ +cases: + # Regression: a value provided under a camelCase-DECLARED key must surface under that key + # (camelKey == declared key), not be silently replaced by the schema default. + - name: camel-declared-provided + structure: test-camel + args: {overlayMode: light} + - name: camel-declared-defaulted + structure: test-camel + args: {} + # Contrast: kebab-declared keys keep their existing camelization (logo-align -> logoAlign). + - name: kebab-declared-provided + structure: test-camel + args: {logo-align: center} + # All-lowercase declared keys are unaffected. + - name: lowercase-declared-provided + structure: test-camel + args: {plainkey: value} + # The compiled schema exposes the camelKeys directly. + - name: schema-camel-keys + structure: test-camel + api: schema diff --git a/layouts/_partials/utilities/ArgsSchema.html b/layouts/_partials/utilities/ArgsSchema.html index ac79940..0345141 100644 --- a/layouts/_partials/utilities/ArgsSchema.html +++ b/layouts/_partials/utilities/ArgsSchema.html @@ -30,7 +30,11 @@ {{ if gt $index 0 }} {{ $result = print $result (strings.FirstUpper $word) }} {{ else }} - {{ $result = strings.ToLower $word }} + {{/* lowercase only the first rune: a key DECLARED in camelCase (e.g. + `overlayMode`) must keep its interior capitals, otherwise provided + values are stored under a camelKey (`overlaymode`) that consuming + partials never read and silently fall back to defaults */}} + {{ $result = print (strings.ToLower (substr $word 0 1)) (substr $word 1) }} {{ end }} {{ end }} {{ return print $prefix $result }} diff --git a/tests/golden/camelcase.json b/tests/golden/camelcase.json new file mode 100644 index 0000000..a217d21 --- /dev/null +++ b/tests/golden/camelcase.json @@ -0,0 +1,196 @@ +{ + "camel-declared-defaulted": { + "args": { + "args": { + "logoAlign": "start", + "overlayMode": "dark" + }, + "defaulted": [ + "logo-align", + "overlayMode" + ], + "err": false, + "errmsg": [], + "warnmsg": [] + }, + "initargs": { + "default": [ + "logo-align", + "overlayMode" + ], + "err": false, + "errmsg": [], + "logo-align": "start", + "logoAlign": "start", + "overlayMode": "dark", + "warnmsg": [] + } + }, + "camel-declared-provided": { + "args": { + "args": { + "logoAlign": "start", + "overlayMode": "light" + }, + "defaulted": [ + "logo-align" + ], + "err": false, + "errmsg": [], + "warnmsg": [] + }, + "initargs": { + "default": [ + "logo-align" + ], + "err": false, + "errmsg": [], + "logo-align": "start", + "logoAlign": "start", + "overlayMode": "light", + "warnmsg": [] + } + }, + "kebab-declared-provided": { + "args": { + "args": { + "logoAlign": "center", + "overlayMode": "dark" + }, + "defaulted": [ + "overlayMode" + ], + "err": false, + "errmsg": [], + "warnmsg": [] + }, + "initargs": { + "default": [ + "overlayMode" + ], + "err": false, + "errmsg": [], + "logo-align": "center", + "logoAlign": "center", + "overlayMode": "dark", + "warnmsg": [] + } + }, + "lowercase-declared-provided": { + "args": { + "args": { + "logoAlign": "start", + "overlayMode": "dark", + "plainkey": "value" + }, + "defaulted": [ + "logo-align", + "overlayMode" + ], + "err": false, + "errmsg": [], + "warnmsg": [] + }, + "initargs": { + "default": [ + "logo-align", + "overlayMode" + ], + "err": false, + "errmsg": [], + "logo-align": "start", + "logoAlign": "start", + "overlayMode": "dark", + "plainkey": "value", + "warnmsg": [] + } + }, + "schema-camel-keys": { + "schema": { + "absent": { + "logo-align": { + "defaulted": [ + "logo-align" + ], + "errmsg": [], + "newmsg": [], + "value": "start", + "warnmsg": [] + }, + "overlayMode": { + "defaulted": [ + "overlayMode" + ], + "errmsg": [], + "newmsg": [], + "value": "dark", + "warnmsg": [] + }, + "plainkey": { + "defaulted": [], + "errmsg": [], + "newmsg": [], + "value": null, + "warnmsg": [] + } + }, + "err": false, + "errmsg": [], + "positions": {}, + "schema": { + "logo-align": { + "accepts": [ + "string" + ], + "camelKey": "logoAlign", + "default": "start", + "kind": "scalar", + "name": "logo-align", + "optional": true, + "options": { + "values": [ + "start", + "center", + "end" + ] + }, + "types": [ + "select" + ] + }, + "overlayMode": { + "accepts": [ + "string" + ], + "camelKey": "overlayMode", + "default": "dark", + "kind": "scalar", + "name": "overlayMode", + "optional": true, + "options": { + "values": [ + "light", + "dark", + "none" + ] + }, + "types": [ + "select" + ] + }, + "plainkey": { + "accepts": [ + "string" + ], + "camelKey": "plainkey", + "kind": "scalar", + "name": "plainkey", + "optional": true, + "types": [ + "string" + ] + } + } + } + } +} \ No newline at end of file