From af7a3e562ed3ae49186549525a1217ab89841641 Mon Sep 17 00:00:00 2001 From: Mark Lundin Date: Mon, 24 Feb 2025 14:49:03 +0000 Subject: [PATCH 1/2] 1.5.1 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 93c326e..6cc329e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@playcanvas/attribute-parser", - "version": "1.5.0", + "version": "1.5.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@playcanvas/attribute-parser", - "version": "1.5.0", + "version": "1.5.1", "dependencies": { "@playcanvas/eslint-config": "^1.7.4 || ^2.0.0", "@typescript/vfs": "^1.6.0", diff --git a/package.json b/package.json index c296c71..ac06a2d 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "engines": { "node": ">=18.0.0" }, - "version": "1.5.0", + "version": "1.5.1", "dependencies": { "@playcanvas/eslint-config": "^1.7.4 || ^2.0.0", "@typescript/vfs": "^1.6.0", From 0f4a20fbe5bcb19ff456e09b680d670e9980e1a6 Mon Sep 17 00:00:00 2001 From: Mark Lundin Date: Thu, 1 May 2025 09:22:31 +0100 Subject: [PATCH 2/2] feat: add support for static scriptName property in JSDocParser --- src/index.js | 17 +++++++++++++++++ test/fixtures/program.valid.js | 2 ++ test/tests/valid/program.test.js | 7 ++++++- 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/index.js b/src/index.js index ebe1888..f41bcd5 100644 --- a/src/index.js +++ b/src/index.js @@ -143,9 +143,26 @@ export class JSDocParser { const esmScriptClass = pcTypes.statements.find(node => node.kind === ts.SyntaxKind.ClassDeclaration && node.name.text === 'Script')?.symbol; + const isScriptNameMember = member => ( + ts.isPropertyDeclaration(member) && // Is a property declaration + ts.isIdentifier(member.name) && + member.name.text === 'scriptName' && + (ts.getCombinedModifierFlags(member) & ts.ModifierFlags.Static) !== 0 && + ts.isStringLiteral(member.initializer) + ); + // Check if the file exports a class that inherits from `Script` nodes.forEach((node, name) => { if (isAliasedClassDeclaration(node, typeChecker) && inheritsFrom(node, typeChecker, esmScriptClass)) { + + // Check for a static scriptName property and use that as the name if it exists + const scriptNameMember = node.members.find(isScriptNameMember); + + // If the scriptName property exists, use that as the name + if (scriptNameMember) { + name = scriptNameMember.initializer.text; + } + esmScripts.set(name, node); } }); diff --git a/test/fixtures/program.valid.js b/test/fixtures/program.valid.js index 6ff593d..4444884 100644 --- a/test/fixtures/program.valid.js +++ b/test/fixtures/program.valid.js @@ -6,6 +6,8 @@ import { Script } from 'playcanvas'; export const MyEnum = { value: 0 }; class Example extends Script { + static scriptName = 'customExample'; + /** * @attribute * @precision 1 diff --git a/test/tests/valid/program.test.js b/test/tests/valid/program.test.js index 0d03ea3..6867bec 100644 --- a/test/tests/valid/program.test.js +++ b/test/tests/valid/program.test.js @@ -9,10 +9,15 @@ describe('VALID: Program ', function () { data = await parseAttributes('./program.valid.js'); }); + it('should have a customExample script', function () { + expect(data[0].customExample).to.exist; + expect(data[0].customExample.errors).to.be.empty; + }); + it('only results should exist', function () { expect(data).to.exist; expect(data[0]).to.not.be.empty; expect(data[1]).to.be.empty; - expect(data[0].example.errors).to.be.empty; + expect(data[0].customExample.errors).to.be.empty; }); });