diff --git a/build/transforms.json b/build/transforms.json index 0ab8462..36826a1 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 0000000..bc27088 --- /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 0000000..ca2e36e --- /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 11dbe37..1672314 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 5d07728..89d2c95 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 0000000..bc27088 --- /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 0000000..ca2e36e --- /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" + }; + } +}