Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: any swift format #734

Merged
merged 10 commits into from
Dec 22, 2021
51 changes: 51 additions & 0 deletions __tests__/common/formatHelpers/setSwiftFileProperties.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
/*
* Copyright 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance with
* the License. A copy of the License is located at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
* CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions
* and limitations under the License.
*/

const setSwiftFileProperties = require('../../../lib/common/formatHelpers/setSwiftFileProperties');

describe('common', () => {
describe('formatHelpers', () => {

describe('setSwiftFileProperties', () => {
dbanksdesign marked this conversation as resolved.
Show resolved Hide resolved
it('should default accessControl be public', () => {
const file = setSwiftFileProperties({}, undefined, 'ios-swift');
expect(file.accessControl).toEqual('public ');
});

it('should default objectType be class', () => {
const file = setSwiftFileProperties({}, undefined, 'ios-swift');
expect(file.objectType).toEqual('class');
});

it('should default import be ["UIKit"]', () => {
const file = setSwiftFileProperties({}, undefined, 'ios-swift');
const fileSeparate = setSwiftFileProperties({}, undefined, 'ios-swift-separate');
expect(file.import).toEqual(['UIKit']);
expect(fileSeparate.import).toEqual(['UIKit']);
});

it('should transform string import to array', () => {
const file = setSwiftFileProperties({ import: 'SwiftUI' }, undefined, 'ios-swift');
expect(file.import).toEqual(['SwiftUI']);
});

it('should file be properly configured', () => {
const file = setSwiftFileProperties({ objectType: 'extension', import: ['SwiftUI'], accessControl: 'public'}, undefined, 'ios-swift');
expect(file.objectType).toEqual('extension');
expect(file.import).toEqual(['SwiftUI']);
expect(file.accessControl).toEqual('public ');
});

});
})
})
18 changes: 18 additions & 0 deletions __tests__/formats/__snapshots__/all.test.js.snap
Original file line number Diff line number Diff line change
Expand Up @@ -407,6 +407,24 @@ NSString * const color_red = #FF0000;
"
`;

exports[`formats all should match ios-swift/any.swift snapshot 1`] = `
"
//
// __output/
//

// Do not edit directly
// Generated on Sat, 01 Jan 2000 00:00:00 GMT


import UIKit

public class {
public static let color_red = #FF0000 /* comment */
}
"
`;

exports[`formats all should match ios-swift/class.swift snapshot 1`] = `
"
//
Expand Down
74 changes: 74 additions & 0 deletions __tests__/formats/__snapshots__/swiftFile.test.js.snap
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`formats ios-swift/any.swift should match default snapshot 1`] = `
"
//
// __output/
//

// Do not edit directly
// Generated on Sat, 01 Jan 2000 00:00:00 GMT


import UIKit

public class StyleDictionary {
public static let colorBaseRed = UIColor(red: 1.000, green: 0.000, blue: 0.000, alpha: 1)
}
"
`;

exports[`formats ios-swift/any.swift with access control override should match snapshot 1`] = `
"
//
// __output/
//

// Do not edit directly
// Generated on Sat, 01 Jan 2000 00:00:00 GMT


import UIKit

internal class StyleDictionary {
internal static let colorBaseRed = UIColor(red: 1.000, green: 0.000, blue: 0.000, alpha: 1)
}
"
`;

exports[`formats ios-swift/any.swift with import override should match snapshot 1`] = `
"
//
// __output/
//

// Do not edit directly
// Generated on Sat, 01 Jan 2000 00:00:00 GMT


import UIKit
import AnotherModule

public class StyleDictionary {
public static let colorBaseRed = UIColor(red: 1.000, green: 0.000, blue: 0.000, alpha: 1)
}
"
`;

exports[`formats ios-swift/any.swift with objectType override should match snapshot 1`] = `
"
//
// __output/
//

// Do not edit directly
// Generated on Sat, 01 Jan 2000 00:00:00 GMT


import UIKit

public struct StyleDictionary {
public static let colorBaseRed = UIColor(red: 1.000, green: 0.000, blue: 0.000, alpha: 1)
}
"
`;
94 changes: 94 additions & 0 deletions __tests__/formats/swiftFile.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
/*
* Copyright 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance with
* the License. A copy of the License is located at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
* CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions
* and limitations under the License.
*/
const formats = require('../../lib/common/formats');
const createDictionary = require('../../lib/utils/createDictionary');
const createFormatArgs = require('../../lib/utils/createFormatArgs');
const _ = require('../../lib/utils/es6_');

const originalFile = {
"destination": "__output/",
"format": "ios-swift/any.swift",
"className": "StyleDictionary",
"filter": {
"attributes": {
"category": "color"
}
},
"options": {}
};

var file = {}

const properties = {
color: {
base: {
red: {
value: 'UIColor(red: 1.000, green: 0.000, blue: 0.000, alpha: 1)',
filePath: 'tokens/color/base.json',
original: { value: '#FF0000' },
name: 'colorBaseRed',
attributes: { category: 'color', type: 'base', item: 'red' },
path: [ 'color', 'base', 'red' ]
}
}
}
};

const format = formats['ios-swift/any.swift'];
const dictionary = createDictionary({ properties });

describe('formats', () => {

describe('ios-swift/any.swift', () => {
beforeEach(() => {
file = _.cloneDeep(originalFile);
});

it('should match default snapshot', () => {
expect(format(createFormatArgs({
dictionary,
file,
platform: {}
}), {}, file)).toMatchSnapshot();
});

it('with import override should match snapshot', () => {
file.options.import = ["UIKit", "AnotherModule"];
expect(format(createFormatArgs({
dictionary,
file,
platform: {}
}), {}, file)).toMatchSnapshot();
});

it('with objectType override should match snapshot', () => {
file.options.objectType = "struct"
expect(format(createFormatArgs({
dictionary,
file,
platform: {}
}), {}, file)).toMatchSnapshot();
});

it('with access control override should match snapshot', () => {
file.options.accessControl = "internal"
expect(format(createFormatArgs({
dictionary,
file,
platform: {}
}), {}, file)).toMatchSnapshot();
});

});

});
20 changes: 17 additions & 3 deletions examples/basic/config.json
Original file line number Diff line number Diff line change
Expand Up @@ -95,10 +95,25 @@
"transformGroup": "ios-swift",
"buildPath": "build/ios-swift/",
"files": [{
"destination": "StyleDictionary.swift",
"destination": "StyleDictionary+Class.swift",
"format": "ios-swift/class.swift",
"className": "StyleDictionary",
"className": "StyleDictionaryClass",
"filter": {}
},{
"destination": "StyleDictionary+Enum.swift",
"format": "ios-swift/enum.swift",
"className": "StyleDictionaryEnum",
"filter": {}
},{
"destination": "StyleDictionary+Struct.swift",
"format": "ios-swift/any.swift",
"className": "StyleDictionaryStruct",
"filter": {},
"options": {
"imports": "SwiftUI",
"objectType": "struct",
"accessControl": "internal"
}
}]
},
"ios-swift-separate-enums": {
Expand All @@ -117,7 +132,6 @@
"destination": "StyleDictionarySize.swift",
"format": "ios-swift/enum.swift",
"className": "StyleDictionarySize",
"type": "float",
"filter": {
"attributes": {
"category": "size"
Expand Down
3 changes: 2 additions & 1 deletion lib/common/formatHelpers/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,5 +23,6 @@
iconsWithPrefix: require('./iconsWithPrefix'),
sortByReference: require('./sortByReference'),
sortByName: require('./sortByName'),
minifyDictionary: require('./minifyDictionary')
minifyDictionary: require('./minifyDictionary'),
setSwiftFileProperties: require('./setSwiftFileProperties')
}
55 changes: 55 additions & 0 deletions lib/common/formatHelpers/setSwiftFileProperties.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
/*
* Copyright 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance with
* the License. A copy of the License is located at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
* CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions
* and limitations under the License.
*/

/**
* Outputs an object with swift format configurations. Sets import, object type and access control.
* @memberof module:formatHelpers
* @param {Object} options - The options object declared at configuration
* @param {String} objectType - The type of the object in the final file. Could be a class, enum, struct, etc.
* @param {String} transformGroup - The transformGroup of the file, so it can be applied proper import
* @returns {Object}
*/
function setSwiftFileProperties(options, objectType, transformGroup) {
if (typeof options.objectType === 'undefined') {
if (typeof objectType === 'undefined') {
options.objectType = 'class';
} else {
options.objectType = objectType;
}
}

if (typeof options.import === 'undefined') {
if (typeof transformGroup === 'undefined') {
options.import = ['UIKit'];
} else if (['ios-swift', 'ios-swift-separate'].includes(transformGroup)) {
options.import = ['UIKit'];
} else {
// future swift-ui transformGroup to be added here
options.import = ['SwiftUI'];
}
} else if (typeof options.import === 'string') {
options.import = [options.import];
}

if (typeof options.accessControl === 'undefined') {
options.accessControl = 'public ';
} else {
if (options.accessControl !== "") {
options.accessControl = `${options.accessControl} `;
}
}

return options
}

module.exports = setSwiftFileProperties;
Loading