From 9ae13c249f3fbb13c3060ad522538e626ece5de8 Mon Sep 17 00:00:00 2001 From: Mohamed Cherif Bouchelaghem Date: Thu, 23 Jan 2020 17:58:58 +0100 Subject: [PATCH] Handle inline define-map static properties transformation (#157) * handle inline define-map static properties transformation * Remove unused code * Add only seal to static properties when it is true * Seal observable objects * Cleaning * Just remove static properties --- build/transforms.json | 12 +++++++ ...servable-object-static-properties-input.js | 11 ++++++ ...ervable-object-static-properties-output.js | 23 ++++++++++++ .../observable-object-test.js | 7 ++++ src/utils/defineTransform.js | 35 ++++++++++++------- ...servable-object-static-properties-input.js | 11 ++++++ ...ervable-object-static-properties-output.js | 23 ++++++++++++ 7 files changed, 110 insertions(+), 12 deletions(-) create mode 100644 src/templates/can-observable-object/observable-object-static-properties-input.js create mode 100644 src/templates/can-observable-object/observable-object-static-properties-output.js create mode 100644 test/fixtures/version-6/can-observable-object/observable-object-static-properties-input.js create mode 100644 test/fixtures/version-6/can-observable-object/observable-object-static-properties-output.js diff --git a/build/transforms.json b/build/transforms.json index 0ab8462d..36826a14 100644 --- a/build/transforms.json +++ b/build/transforms.json @@ -738,6 +738,18 @@ "type": "fixture", "version": "6" }, + { + "input": "can-observable-object/observable-object-static-properties-input.js", + "outputPath": "can-observable-object/observable-object-static-properties-input.js", + "type": "fixture", + "version": "6" + }, + { + "input": "can-observable-object/observable-object-static-properties-output.js", + "outputPath": "can-observable-object/observable-object-static-properties-output.js", + "type": "fixture", + "version": "6" + }, { "input": "can-observable-object/observable-object-test.js", "outputPath": "can-observable-object/observable-object-test.js", diff --git a/src/templates/can-observable-object/observable-object-static-properties-input.js b/src/templates/can-observable-object/observable-object-static-properties-input.js new file mode 100644 index 00000000..bc27088b --- /dev/null +++ b/src/templates/can-observable-object/observable-object-static-properties-input.js @@ -0,0 +1,11 @@ +const Todo = DefineMap.extend('Foo', { bar: 'Bar', seal: true}, { + foo: "number" +}); + +const MyTodo = DefineMap.extend({ bar: 'Bar', seal: false}, { + foo: "number" +}); + +const MyOtherTodo = DefineMap.extend('Foo', { + foo: "number" +}); diff --git a/src/templates/can-observable-object/observable-object-static-properties-output.js b/src/templates/can-observable-object/observable-object-static-properties-output.js new file mode 100644 index 00000000..ca2e36ed --- /dev/null +++ b/src/templates/can-observable-object/observable-object-static-properties-output.js @@ -0,0 +1,23 @@ +class Todo extends ObservableObject { + static get props() { + return { + foo: "number" + }; + } +} + +class MyTodo extends ObservableObject { + static get props() { + return { + foo: "number" + }; + } +} + +class MyOtherTodo extends ObservableObject { + static get props() { + return { + foo: "number" + }; + } +} diff --git a/src/templates/can-observable-object/observable-object-test.js b/src/templates/can-observable-object/observable-object-test.js index 11dbe37f..1672314f 100644 --- a/src/templates/can-observable-object/observable-object-test.js +++ b/src/templates/can-observable-object/observable-object-test.js @@ -29,4 +29,11 @@ describe('can-observable-object/observable-object', function() { utils.diffFiles(fn, inputPath, outputPath); }); + it('Handles DefineMap static propeties to ObservableObject static properties', function() { + const fn = require(toTest.file); + const inputPath = `fixtures/version-6/${toTest.fileName.replace('.js', '-static-properties-input.js')}`; + const outputPath = `fixtures/version-6/${toTest.fileName.replace('.js', '-static-properties-output.js')}`; + utils.diffFiles(fn, inputPath, outputPath); + }); + }); diff --git a/src/utils/defineTransform.js b/src/utils/defineTransform.js index 5d07728f..89d2c95b 100644 --- a/src/utils/defineTransform.js +++ b/src/utils/defineTransform.js @@ -64,9 +64,18 @@ export default function defineTransform ({ classPath = path; } - let propDefinitionsArg = path.value.arguments.length === 1 ? - path.value.arguments[0] : - path.value.arguments[1]; + let propDefinitionsArg; + + if (path.value.arguments.length === 3) { + // Handle DefineMap.extend('Foo', {//staticProps}, {protoProps}) + propDefinitionsArg = path.value.arguments[2]; + } else if (path.value.arguments.length === 2) { + // Handle DefineMap.extend({//staticProps}, {protoProps}) + propDefinitionsArg = path.value.arguments[1]; + } else if (path.value.arguments.length === 1) { + // Handle DefineMap.extend({protoProps}) + propDefinitionsArg = path.value.arguments[0]; + } // Check if we have an existing varDeclaration // if so let's create a new name to prevent clashing @@ -84,18 +93,20 @@ export default function defineTransform ({ debug(`Replacing ${varDeclaration} with ${extendedClassName} class`); + let body = [ + createMethod({ + j, + method: false, // Want this to be a getter + name: 'props', + blockStatement: [j.returnStatement(propDefinitionsArg)], + isStatic: true + }) + ]; + const classDeclaration = createClass({ j, className: varDeclaration ? varDeclaration : '', - body: [ - createMethod({ - j, - method: false, // Want this to be a getter - name: 'props', - blockStatement: [j.returnStatement(propDefinitionsArg)], - isStatic: true - }) - ], + body: body, extendedClassName }); diff --git a/test/fixtures/version-6/can-observable-object/observable-object-static-properties-input.js b/test/fixtures/version-6/can-observable-object/observable-object-static-properties-input.js new file mode 100644 index 00000000..bc27088b --- /dev/null +++ b/test/fixtures/version-6/can-observable-object/observable-object-static-properties-input.js @@ -0,0 +1,11 @@ +const Todo = DefineMap.extend('Foo', { bar: 'Bar', seal: true}, { + foo: "number" +}); + +const MyTodo = DefineMap.extend({ bar: 'Bar', seal: false}, { + foo: "number" +}); + +const MyOtherTodo = DefineMap.extend('Foo', { + foo: "number" +}); diff --git a/test/fixtures/version-6/can-observable-object/observable-object-static-properties-output.js b/test/fixtures/version-6/can-observable-object/observable-object-static-properties-output.js new file mode 100644 index 00000000..ca2e36ed --- /dev/null +++ b/test/fixtures/version-6/can-observable-object/observable-object-static-properties-output.js @@ -0,0 +1,23 @@ +class Todo extends ObservableObject { + static get props() { + return { + foo: "number" + }; + } +} + +class MyTodo extends ObservableObject { + static get props() { + return { + foo: "number" + }; + } +} + +class MyOtherTodo extends ObservableObject { + static get props() { + return { + foo: "number" + }; + } +}