From d4a0cddddc079318398efce82ecda473b769e4c3 Mon Sep 17 00:00:00 2001 From: "s.vanriessen" Date: Thu, 23 Oct 2025 15:15:47 +0200 Subject: [PATCH 1/4] fix: use camelcase from new package to match lodash behaviour --- .../functions/functionDefinition.test.ts | 22 +++++++++++++---- .../functions/jsonToXML/1.0/function.json | 24 +++++++++++++++++++ .../support/functions/jsonToXML/1.0/index.js | 5 ++++ bun.lock | 3 +++ package.json | 3 ++- src/bb-blocks-new.ts | 4 ++-- src/functions/createWasmDefinitionFiles.ts | 6 ++--- src/functions/functionDefinitions.ts | 10 ++++---- .../publishWasmBlockStoreFunctions.ts | 4 ++-- 9 files changed, 64 insertions(+), 17 deletions(-) create mode 100644 __tests__/support/functions/jsonToXML/1.0/function.json create mode 100644 __tests__/support/functions/jsonToXML/1.0/index.js diff --git a/__tests__/functions/functionDefinition.test.ts b/__tests__/functions/functionDefinition.test.ts index 4bbf8645..82328c5a 100644 --- a/__tests__/functions/functionDefinition.test.ts +++ b/__tests__/functions/functionDefinition.test.ts @@ -49,6 +49,19 @@ test('functionDefinition', async (): Promise => { }); }); +test('functionDefinition name with correct camelCase', async (): Promise => { + const functionPath = path.join(functionsPath, 'jsonToXML', '1.0'); + expect(functionDefinition(functionPath, functionsPath)).toMatchObject({ + name: 'jsonToXml', + path: path.join(functionPath, 'function.json'), + schema: { + description: 'Convert JSON to XML', + label: 'json to xml', + }, + version: '1.0', + }); +}); + test('creating a new functionDefinition', async (): Promise => { const tmpFunctionsDir = `tmpFunctions${Math.random().toString()}`; const tmpFunctionsPath = path.join(supportDir, tmpFunctionsDir); @@ -64,7 +77,7 @@ test('creating a new functionDefinition', async (): Promise => { }); test('functionDefinitions for a directory with functions', async (): Promise => { - const [{ schema }] = await functionDefinitions(functionsPath); + const [, { schema }] = await functionDefinitions(functionsPath); expect(schema).toMatchObject({ label: 'Say Hello', }); @@ -76,16 +89,17 @@ test('functionDefinitions for a directory without functions', async (): Promise< }); test('stringifying function definitions', async (): Promise => { - const expected = - '[{"name":"sayHello","version":"1.0","description":"Say Hello to the world","label":"Say Hello","category":"Misc","icon":{"name":"ChatIcon","color":"Teal"},"options":"[{\\"meta\\":{\\"type\\":\\"Text\\"},\\"name\\":\\"name\\",\\"label\\":\\"Name\\",\\"info\\":\\"The name that\'s going to be used to say hello to the world!\\",\\"advanced\\":false,\\"configuration\\":{\\"placeholder\\":\\"Betty Blocks\\"}}]","yields":"NONE","paths":"{}"}]'; + const expected = `[{"name":"jsonToXml","version":"1.0","description":"Convert JSON to XML","label":"json to xml","category":"Misc","icon":{"name":"ChatIcon","color":"Teal"},"options":"[{\\"meta\\":{\\"type\\":\\"Text\\"},\\"name\\":\\"name\\",\\"label\\":\\"Name\\",\\"info\\":\\"The name of the XML root element.\\",\\"advanced\\":false,\\"configuration\\":{\\"placeholder\\":\\"Betty Blocks\\"}}]","yields":"NONE","paths":"{}"},{"name":"sayHello","version":"1.0","description":"Say Hello to the world","label":"Say Hello","category":"Misc","icon":{"name":"ChatIcon","color":"Teal"},"options":"[{\\"meta\\":{\\"type\\":\\"Text\\"},\\"name\\":\\"name\\",\\"label\\":\\"Name\\",\\"info\\":\\"The name that's going to be used to say hello to the world!\\",\\"advanced\\":false,\\"configuration\\":{\\"placeholder\\":\\"Betty Blocks\\"}}]","yields":"NONE","paths":"{}"}]`; const definitions = await functionDefinitions(functionsPath); expect(stringifyDefinitions(definitions)).toEqual(expected); }); test('generating the package index.js', async (): Promise => { - const expected = `import { default as sayHello_1_0 } from './functions/say-hello/1.0'; + const expected = `import { default as jsonToXml_1_0 } from './functions/jsonToXML/1.0'; +import { default as sayHello_1_0 } from './functions/say-hello/1.0'; const fn = { + "jsonToXml 1.0": jsonToXml_1_0, "sayHello 1.0": sayHello_1_0, }; diff --git a/__tests__/support/functions/jsonToXML/1.0/function.json b/__tests__/support/functions/jsonToXML/1.0/function.json new file mode 100644 index 00000000..276991d4 --- /dev/null +++ b/__tests__/support/functions/jsonToXML/1.0/function.json @@ -0,0 +1,24 @@ +{ + "description": "Convert JSON to XML", + "label": "json to xml", + "category": "Misc", + "icon": { + "name": "ChatIcon", + "color": "Teal" + }, + "options": [ + { + "meta": { + "type": "Text" + }, + "name": "name", + "label": "Name", + "info": "The name of the XML root element.", + "advanced": false, + "configuration": { + "placeholder": "Betty Blocks" + } + } + ], + "yields": "NONE" +} diff --git a/__tests__/support/functions/jsonToXML/1.0/index.js b/__tests__/support/functions/jsonToXML/1.0/index.js new file mode 100644 index 00000000..1da249e9 --- /dev/null +++ b/__tests__/support/functions/jsonToXML/1.0/index.js @@ -0,0 +1,5 @@ +const jsonToXML = async ({ name }) => { + return `${name}`; +}; + +export default jsonToXML; diff --git a/bun.lock b/bun.lock index 5bd333a6..97b4a056 100644 --- a/bun.lock +++ b/bun.lock @@ -19,6 +19,7 @@ "adm-zip": "0.5.16", "case": "^1.6.3", "chalk": "^5.6.2", + "change-case": "^5.4.4", "commander": "^14.0.1", "fs-extra": "11.3.2", "joi": "18.0.1", @@ -418,6 +419,8 @@ "chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], + "change-case": ["change-case@5.4.4", "", {}, "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w=="], + "char-regex": ["char-regex@1.0.2", "", {}, "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw=="], "chardet": ["chardet@2.1.0", "", {}, "sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA=="], diff --git a/package.json b/package.json index 7bbbdf9e..625bc977 100644 --- a/package.json +++ b/package.json @@ -59,6 +59,7 @@ "adm-zip": "0.5.16", "case": "^1.6.3", "chalk": "^5.6.2", + "change-case": "^5.4.4", "commander": "^14.0.1", "fs-extra": "11.3.2", "joi": "18.0.1", @@ -70,8 +71,8 @@ "prismjs": "1.30.0", "prompts": "^2.4.2", "semver": "^7.7.2", - "serve-handler": "6.1.6", "serve": "^11.1.0", + "serve-handler": "6.1.6", "ts-node": "10.9.2", "tsconfig-paths": "^3.15.0", "typescript": "^5.9.2", diff --git a/src/bb-blocks-new.ts b/src/bb-blocks-new.ts index a26ce573..cd4c290f 100644 --- a/src/bb-blocks-new.ts +++ b/src/bb-blocks-new.ts @@ -1,4 +1,4 @@ -import { kebab } from 'case'; +import { kebabCase } from 'change-case'; import { Command } from 'commander'; import fs from 'fs-extra'; import path from 'path'; @@ -13,7 +13,7 @@ program .parse(process.argv); const { args } = program; -const inputBlockName = kebab(args.join()); +const inputBlockName = kebabCase(args.join()); const workingDir = process.cwd(); if (fs.existsSync(path.join(workingDir, '.app-functions'))) { diff --git a/src/functions/createWasmDefinitionFiles.ts b/src/functions/createWasmDefinitionFiles.ts index d35a9972..2def72f3 100644 --- a/src/functions/createWasmDefinitionFiles.ts +++ b/src/functions/createWasmDefinitionFiles.ts @@ -1,9 +1,9 @@ -import { snake } from 'case'; +import { snakeCase } from 'change-case'; import fs from 'fs-extra'; import path from 'path'; const createlibRsFile = (functionDir: string, functionName: string): void => { - const functionDefName = snake(functionName); + const functionDefName = snakeCase(functionName); fs.mkdirpSync(path.join(functionDir, 'src')); fs.writeFileSync( path.join(functionDir, 'src', 'lib.rs'), @@ -59,7 +59,7 @@ const createCargoTomlFile = ( functionDir: string, functionName: string, ): void => { - const functionDefName = snake(functionName); + const functionDefName = snakeCase(functionName); fs.writeFileSync( path.join(functionDir, 'Cargo.toml'), `[package] diff --git a/src/functions/functionDefinitions.ts b/src/functions/functionDefinitions.ts index b532e5cf..c838ada4 100644 --- a/src/functions/functionDefinitions.ts +++ b/src/functions/functionDefinitions.ts @@ -1,6 +1,6 @@ import AdmZip from 'adm-zip'; import { Glob } from 'bun'; -import { camel, title } from 'case'; +import { camelCase, capitalCase } from 'change-case'; import fs from 'fs-extra'; import path from 'path'; @@ -113,10 +113,10 @@ const functionDefinition = ( let version = ''; if (isFunctionVersion(functionPath, functionsDir)) { - name = camel(path.basename(path.dirname(functionPath))); + name = camelCase(path.basename(path.dirname(functionPath))); version = path.basename(functionPath); } else { - name = camel(path.basename(functionPath)); + name = camelCase(path.basename(functionPath)); } const filePath = functionDefinitionPath(functionPath); @@ -184,7 +184,7 @@ const newFunctionDefinition = ( category: 'Misc', description: 'Description', icon: { color: 'Orange', name: 'ActionsIcon' }, - label: title(functionName), + label: capitalCase(functionName), options: [], yields: 'NONE', }, @@ -238,7 +238,7 @@ const createNewWasmFunction = ( }; const toVariableName = ({ name, version }: FunctionDefinition): string => - `${camel(name)}_${version.replace('.', '_')}`; + `${camelCase(name)}_${version.replace('.', '_')}`; /* @doc importFunctions Returns an array of strings, each item being an imported function: diff --git a/src/functions/publishWasmBlockStoreFunctions.ts b/src/functions/publishWasmBlockStoreFunctions.ts index b111fc19..20a642cf 100644 --- a/src/functions/publishWasmBlockStoreFunctions.ts +++ b/src/functions/publishWasmBlockStoreFunctions.ts @@ -1,5 +1,5 @@ -import { camel } from 'case'; import chalk from 'chalk'; +import { camelCase } from 'change-case'; import fs from 'fs-extra'; import fetch, { fileFromSync, FormData } from 'node-fetch'; import path from 'path'; @@ -68,7 +68,7 @@ const getFunctionJsonFromDir = (functionDir: string): string | null => { const functionJsonPath = path.join(functionDir, 'function.json'); if (fs.existsSync(functionJsonPath)) { const version = path.basename(functionDir); - const name = camel(path.basename(path.dirname(functionDir))); + const name = camelCase(path.basename(path.dirname(functionDir))); const json = { ...fs.readJsonSync(functionJsonPath), name, From 01247e242e15dfdd8cc50cf51f8c02a934d1aa93 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Thu, 23 Oct 2025 13:24:06 +0000 Subject: [PATCH 2/4] chore(release): 26.0.2-beta.1 [skip ci] ## [26.0.2-beta.1](https://github.com/bettyblocks/cli/compare/v26.0.1...v26.0.2-beta.1) (2025-10-23) ### Bug Fixes * use camelcase from new package to match lodash behaviour ([d4a0cdd](https://github.com/bettyblocks/cli/commit/d4a0cddddc079318398efce82ecda473b769e4c3)) --- CHANGELOG.md | 7 +++++++ package.json | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d0c7b760..abe5d0a7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## [26.0.2-beta.1](https://github.com/bettyblocks/cli/compare/v26.0.1...v26.0.2-beta.1) (2025-10-23) + + +### Bug Fixes + +* use camelcase from new package to match lodash behaviour ([d4a0cdd](https://github.com/bettyblocks/cli/commit/d4a0cddddc079318398efce82ecda473b769e4c3)) + ## [26.0.1](https://github.com/bettyblocks/cli/compare/v26.0.0...v26.0.1) (2025-10-09) diff --git a/package.json b/package.json index 625bc977..75ea1ca7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@betty-blocks/cli", - "version": "26.0.1", + "version": "26.0.2-beta.1", "description": "A Betty Blocks CLI", "module": "./build/bb.js", "type": "module", From 161f7f25a2e36cc43ef72721b8c1b08d18096a7a Mon Sep 17 00:00:00 2001 From: "s.vanriessen" Date: Thu, 23 Oct 2025 15:58:26 +0200 Subject: [PATCH 3/4] fix: use camelcase from new package to match lodash behaviour From 24147d5de6e40596424a002a8ee8e40f923ad3b9 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Thu, 23 Oct 2025 13:59:18 +0000 Subject: [PATCH 4/4] chore(release): 26.0.2-beta.2 [skip ci] ## [26.0.2-beta.2](https://github.com/bettyblocks/cli/compare/v26.0.2-beta.1...v26.0.2-beta.2) (2025-10-23) ### Bug Fixes * use camelcase from new package to match lodash behaviour ([161f7f2](https://github.com/bettyblocks/cli/commit/161f7f25a2e36cc43ef72721b8c1b08d18096a7a)) --- CHANGELOG.md | 7 +++++++ package.json | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index abe5d0a7..3f8af816 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## [26.0.2-beta.2](https://github.com/bettyblocks/cli/compare/v26.0.2-beta.1...v26.0.2-beta.2) (2025-10-23) + + +### Bug Fixes + +* use camelcase from new package to match lodash behaviour ([161f7f2](https://github.com/bettyblocks/cli/commit/161f7f25a2e36cc43ef72721b8c1b08d18096a7a)) + ## [26.0.2-beta.1](https://github.com/bettyblocks/cli/compare/v26.0.1...v26.0.2-beta.1) (2025-10-23) diff --git a/package.json b/package.json index 75ea1ca7..497846ad 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@betty-blocks/cli", - "version": "26.0.2-beta.1", + "version": "26.0.2-beta.2", "description": "A Betty Blocks CLI", "module": "./build/bb.js", "type": "module",