├── .gitignore ├── HelloSketch.sketch ├── HelloSketch.sketchplugin └── Contents │ └── Sketch │ ├── HelloSketch.framework │ ├── Headers │ ├── HelloSketch │ ├── HelloSketch.js │ ├── Modules │ ├── Resources │ └── Versions │ │ ├── A │ │ ├── Headers │ │ │ └── HelloSketch.h │ │ ├── HelloSketch │ │ ├── Modules │ │ │ └── module.modulemap │ │ └── Resources │ │ │ └── Info.plist │ │ └── Current │ ├── manifest.json │ └── script.cocoascript ├── HelloSketch.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ └── contents.xcworkspacedata └── xcuserdata │ └── james.xcuserdatad │ └── xcschemes │ └── xcschememanagement.plist ├── HelloSketch ├── HSMain.h ├── HSMain.m ├── HelloSketch.h ├── HelloSketch.js └── Info.plist ├── HelloSketchTests ├── HelloSketchTests.m └── Info.plist ├── LICENSE └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | *.xcodeproj/xcuserdata/* 2 | -------------------------------------------------------------------------------- /HelloSketch.sketch: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MagicSketch/HelloSketch/e0da543fa709acdf98437b5cebf40d693e5d25b0/HelloSketch.sketch -------------------------------------------------------------------------------- /HelloSketch.sketchplugin/Contents/Sketch/HelloSketch.framework/Headers: -------------------------------------------------------------------------------- 1 | Versions/Current/Headers -------------------------------------------------------------------------------- /HelloSketch.sketchplugin/Contents/Sketch/HelloSketch.framework/HelloSketch: -------------------------------------------------------------------------------- 1 | Versions/Current/HelloSketch -------------------------------------------------------------------------------- /HelloSketch.sketchplugin/Contents/Sketch/HelloSketch.framework/HelloSketch.js: -------------------------------------------------------------------------------- 1 | var HelloSketch_FrameworkPath = HelloSketch_FrameworkPath || COScript.currentCOScript().env().scriptURL.path().stringByDeletingLastPathComponent(); 2 | var HelloSketch_Log = HelloSketch_Log || log; 3 | (function() { 4 | var mocha = Mocha.sharedRuntime(); 5 | var frameworkName = "HelloSketch"; 6 | var directory = HelloSketch_FrameworkPath; 7 | if (mocha.valueForKey(frameworkName)) { 8 | HelloSketch_Log("😎 loadFramework: `" + frameworkName + "` already loaded."); 9 | return true; 10 | } else if ([mocha loadFrameworkWithName:frameworkName inDirectory:directory]) { 11 | HelloSketch_Log("✅ loadFramework: `" + frameworkName + "` success!"); 12 | mocha.setValue_forKey_(true, frameworkName); 13 | return true; 14 | } else { 15 | HelloSketch_Log("❌ loadFramework: `" + frameworkName + "` failed!: " + directory + ". Please define HelloSketch_FrameworkPath if you're trying to @import in a custom plugin"); 16 | return false; 17 | } 18 | })(); 19 | -------------------------------------------------------------------------------- /HelloSketch.sketchplugin/Contents/Sketch/HelloSketch.framework/Modules: -------------------------------------------------------------------------------- 1 | Versions/Current/Modules -------------------------------------------------------------------------------- /HelloSketch.sketchplugin/Contents/Sketch/HelloSketch.framework/Resources: -------------------------------------------------------------------------------- 1 | Versions/Current/Resources -------------------------------------------------------------------------------- /HelloSketch.sketchplugin/Contents/Sketch/HelloSketch.framework/Versions/A/Headers/HelloSketch.h: -------------------------------------------------------------------------------- 1 | // 2 | // HelloSketch.h 3 | // HelloSketch 4 | // 5 | // Created by James Tang on 27/1/2017. 6 | // Copyright © 2017 MagicSketch. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | //! Project version number for HelloSketch. 12 | FOUNDATION_EXPORT double HelloSketchVersionNumber; 13 | 14 | //! Project version string for HelloSketch. 15 | FOUNDATION_EXPORT const unsigned char HelloSketchVersionString[]; 16 | 17 | // In this header, you should import all the public headers of your framework using statements like #import 18 | 19 | 20 | -------------------------------------------------------------------------------- /HelloSketch.sketchplugin/Contents/Sketch/HelloSketch.framework/Versions/A/HelloSketch: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MagicSketch/HelloSketch/e0da543fa709acdf98437b5cebf40d693e5d25b0/HelloSketch.sketchplugin/Contents/Sketch/HelloSketch.framework/Versions/A/HelloSketch -------------------------------------------------------------------------------- /HelloSketch.sketchplugin/Contents/Sketch/HelloSketch.framework/Versions/A/Modules/module.modulemap: -------------------------------------------------------------------------------- 1 | framework module HelloSketch { 2 | umbrella header "HelloSketch.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /HelloSketch.sketchplugin/Contents/Sketch/HelloSketch.framework/Versions/A/Resources/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | BuildMachineOSBuild 6 | 15G31 7 | CFBundleDevelopmentRegion 8 | en 9 | CFBundleExecutable 10 | HelloSketch 11 | CFBundleIdentifier 12 | io.magicsketch.HelloSketch 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | HelloSketch 17 | CFBundlePackageType 18 | FMWK 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleSupportedPlatforms 22 | 23 | MacOSX 24 | 25 | CFBundleVersion 26 | 1 27 | DTCompiler 28 | com.apple.compilers.llvm.clang.1_0 29 | DTPlatformBuild 30 | 8C38 31 | DTPlatformVersion 32 | GM 33 | DTSDKBuild 34 | 16C58 35 | DTSDKName 36 | macosx10.12 37 | DTXcode 38 | 0820 39 | DTXcodeBuild 40 | 8C38 41 | NSHumanReadableCopyright 42 | Copyright © 2017 MagicSketch. All rights reserved. 43 | 44 | 45 | -------------------------------------------------------------------------------- /HelloSketch.sketchplugin/Contents/Sketch/HelloSketch.framework/Versions/Current: -------------------------------------------------------------------------------- 1 | A -------------------------------------------------------------------------------- /HelloSketch.sketchplugin/Contents/Sketch/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "author" : "", 3 | "commands" : [ 4 | { 5 | "script" : "script.cocoascript", 6 | "name" : "HelloSketch", 7 | "handlers" : { 8 | "run" : "onRun" 9 | }, 10 | "identifier" : "com.bohemiancoding.sketch.runscriptidentifier" 11 | } 12 | ], 13 | "menu" : { 14 | "items" : [ 15 | "com.bohemiancoding.sketch.runscriptidentifier" 16 | ], 17 | "title" : "HelloSketch" 18 | }, 19 | "identifier" : "com.example.sketch.4aedaf17-70c6-4226-adc9-a4a3a14c1cb0", 20 | "version" : "1.0", 21 | "description" : "", 22 | "authorEmail" : "", 23 | "name" : "HelloSketch" 24 | } -------------------------------------------------------------------------------- /HelloSketch.sketchplugin/Contents/Sketch/script.cocoascript: -------------------------------------------------------------------------------- 1 | @import 'HelloSketch.framework/HelloSketch.js' 2 | 3 | var onRun = function(context) { 4 | log("Hello") 5 | var main = HSMain.alloc().init(); 6 | context.document.showMessage(main.helloText()); 7 | log("Hello Finish") 8 | }; 9 | -------------------------------------------------------------------------------- /HelloSketch.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 1A8B51BF1E3B1D36008665E4 /* HelloSketch.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A8B51B51E3B1D36008665E4 /* HelloSketch.framework */; }; 11 | 1A8B51C41E3B1D36008665E4 /* HelloSketchTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A8B51C31E3B1D36008665E4 /* HelloSketchTests.m */; }; 12 | 1A8B51C61E3B1D36008665E4 /* HelloSketch.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A8B51B81E3B1D36008665E4 /* HelloSketch.h */; settings = {ATTRIBUTES = (Public, ); }; }; 13 | 1A8B51D91E3B23F1008665E4 /* HSMain.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A8B51D71E3B23F1008665E4 /* HSMain.h */; }; 14 | 1A8B51DA1E3B23F1008665E4 /* HSMain.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A8B51D81E3B23F1008665E4 /* HSMain.m */; }; 15 | 1A8B51E01E3B2687008665E4 /* HelloSketch.js in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1A8B51DD1E3B252D008665E4 /* HelloSketch.js */; }; 16 | /* End PBXBuildFile section */ 17 | 18 | /* Begin PBXContainerItemProxy section */ 19 | 1A8B51C01E3B1D36008665E4 /* PBXContainerItemProxy */ = { 20 | isa = PBXContainerItemProxy; 21 | containerPortal = 1A8B51AC1E3B1D36008665E4 /* Project object */; 22 | proxyType = 1; 23 | remoteGlobalIDString = 1A8B51B41E3B1D36008665E4; 24 | remoteInfo = HelloSketch; 25 | }; 26 | /* End PBXContainerItemProxy section */ 27 | 28 | /* Begin PBXCopyFilesBuildPhase section */ 29 | 1A8B51DF1E3B267F008665E4 /* CopyFiles */ = { 30 | isa = PBXCopyFilesBuildPhase; 31 | buildActionMask = 2147483647; 32 | dstPath = ""; 33 | dstSubfolderSpec = 1; 34 | files = ( 35 | 1A8B51E01E3B2687008665E4 /* HelloSketch.js in CopyFiles */, 36 | ); 37 | runOnlyForDeploymentPostprocessing = 0; 38 | }; 39 | /* End PBXCopyFilesBuildPhase section */ 40 | 41 | /* Begin PBXFileReference section */ 42 | 1A8B51B51E3B1D36008665E4 /* HelloSketch.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = HelloSketch.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 43 | 1A8B51B81E3B1D36008665E4 /* HelloSketch.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HelloSketch.h; sourceTree = ""; }; 44 | 1A8B51B91E3B1D36008665E4 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 45 | 1A8B51BE1E3B1D36008665E4 /* HelloSketchTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = HelloSketchTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 46 | 1A8B51C31E3B1D36008665E4 /* HelloSketchTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HelloSketchTests.m; sourceTree = ""; }; 47 | 1A8B51C51E3B1D36008665E4 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 48 | 1A8B51D71E3B23F1008665E4 /* HSMain.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HSMain.h; sourceTree = ""; }; 49 | 1A8B51D81E3B23F1008665E4 /* HSMain.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HSMain.m; sourceTree = ""; }; 50 | 1A8B51DD1E3B252D008665E4 /* HelloSketch.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = HelloSketch.js; sourceTree = ""; }; 51 | /* End PBXFileReference section */ 52 | 53 | /* Begin PBXFrameworksBuildPhase section */ 54 | 1A8B51B11E3B1D36008665E4 /* Frameworks */ = { 55 | isa = PBXFrameworksBuildPhase; 56 | buildActionMask = 2147483647; 57 | files = ( 58 | ); 59 | runOnlyForDeploymentPostprocessing = 0; 60 | }; 61 | 1A8B51BB1E3B1D36008665E4 /* Frameworks */ = { 62 | isa = PBXFrameworksBuildPhase; 63 | buildActionMask = 2147483647; 64 | files = ( 65 | 1A8B51BF1E3B1D36008665E4 /* HelloSketch.framework in Frameworks */, 66 | ); 67 | runOnlyForDeploymentPostprocessing = 0; 68 | }; 69 | /* End PBXFrameworksBuildPhase section */ 70 | 71 | /* Begin PBXGroup section */ 72 | 1A8B51AB1E3B1D36008665E4 = { 73 | isa = PBXGroup; 74 | children = ( 75 | 1A8B51B71E3B1D36008665E4 /* HelloSketch */, 76 | 1A8B51C21E3B1D36008665E4 /* HelloSketchTests */, 77 | 1A8B51B61E3B1D36008665E4 /* Products */, 78 | ); 79 | sourceTree = ""; 80 | }; 81 | 1A8B51B61E3B1D36008665E4 /* Products */ = { 82 | isa = PBXGroup; 83 | children = ( 84 | 1A8B51B51E3B1D36008665E4 /* HelloSketch.framework */, 85 | 1A8B51BE1E3B1D36008665E4 /* HelloSketchTests.xctest */, 86 | ); 87 | name = Products; 88 | sourceTree = ""; 89 | }; 90 | 1A8B51B71E3B1D36008665E4 /* HelloSketch */ = { 91 | isa = PBXGroup; 92 | children = ( 93 | 1A8B51B81E3B1D36008665E4 /* HelloSketch.h */, 94 | 1A8B51DD1E3B252D008665E4 /* HelloSketch.js */, 95 | 1A8B51D71E3B23F1008665E4 /* HSMain.h */, 96 | 1A8B51D81E3B23F1008665E4 /* HSMain.m */, 97 | 1A8B51B91E3B1D36008665E4 /* Info.plist */, 98 | ); 99 | path = HelloSketch; 100 | sourceTree = ""; 101 | }; 102 | 1A8B51C21E3B1D36008665E4 /* HelloSketchTests */ = { 103 | isa = PBXGroup; 104 | children = ( 105 | 1A8B51C31E3B1D36008665E4 /* HelloSketchTests.m */, 106 | 1A8B51C51E3B1D36008665E4 /* Info.plist */, 107 | ); 108 | path = HelloSketchTests; 109 | sourceTree = ""; 110 | }; 111 | /* End PBXGroup section */ 112 | 113 | /* Begin PBXHeadersBuildPhase section */ 114 | 1A8B51B21E3B1D36008665E4 /* Headers */ = { 115 | isa = PBXHeadersBuildPhase; 116 | buildActionMask = 2147483647; 117 | files = ( 118 | 1A8B51D91E3B23F1008665E4 /* HSMain.h in Headers */, 119 | 1A8B51C61E3B1D36008665E4 /* HelloSketch.h in Headers */, 120 | ); 121 | runOnlyForDeploymentPostprocessing = 0; 122 | }; 123 | /* End PBXHeadersBuildPhase section */ 124 | 125 | /* Begin PBXNativeTarget section */ 126 | 1A8B51B41E3B1D36008665E4 /* HelloSketch */ = { 127 | isa = PBXNativeTarget; 128 | buildConfigurationList = 1A8B51C91E3B1D36008665E4 /* Build configuration list for PBXNativeTarget "HelloSketch" */; 129 | buildPhases = ( 130 | 1A8B51B01E3B1D36008665E4 /* Sources */, 131 | 1A8B51B11E3B1D36008665E4 /* Frameworks */, 132 | 1A8B51B21E3B1D36008665E4 /* Headers */, 133 | 1A8B51B31E3B1D36008665E4 /* Resources */, 134 | 1A8B51DF1E3B267F008665E4 /* CopyFiles */, 135 | ); 136 | buildRules = ( 137 | ); 138 | dependencies = ( 139 | ); 140 | name = HelloSketch; 141 | productName = HelloSketch; 142 | productReference = 1A8B51B51E3B1D36008665E4 /* HelloSketch.framework */; 143 | productType = "com.apple.product-type.framework"; 144 | }; 145 | 1A8B51BD1E3B1D36008665E4 /* HelloSketchTests */ = { 146 | isa = PBXNativeTarget; 147 | buildConfigurationList = 1A8B51CC1E3B1D36008665E4 /* Build configuration list for PBXNativeTarget "HelloSketchTests" */; 148 | buildPhases = ( 149 | 1A8B51BA1E3B1D36008665E4 /* Sources */, 150 | 1A8B51BB1E3B1D36008665E4 /* Frameworks */, 151 | 1A8B51BC1E3B1D36008665E4 /* Resources */, 152 | ); 153 | buildRules = ( 154 | ); 155 | dependencies = ( 156 | 1A8B51C11E3B1D36008665E4 /* PBXTargetDependency */, 157 | ); 158 | name = HelloSketchTests; 159 | productName = HelloSketchTests; 160 | productReference = 1A8B51BE1E3B1D36008665E4 /* HelloSketchTests.xctest */; 161 | productType = "com.apple.product-type.bundle.unit-test"; 162 | }; 163 | /* End PBXNativeTarget section */ 164 | 165 | /* Begin PBXProject section */ 166 | 1A8B51AC1E3B1D36008665E4 /* Project object */ = { 167 | isa = PBXProject; 168 | attributes = { 169 | LastUpgradeCheck = 0820; 170 | ORGANIZATIONNAME = MagicSketch; 171 | TargetAttributes = { 172 | 1A8B51B41E3B1D36008665E4 = { 173 | CreatedOnToolsVersion = 8.2; 174 | ProvisioningStyle = Automatic; 175 | }; 176 | 1A8B51BD1E3B1D36008665E4 = { 177 | CreatedOnToolsVersion = 8.2; 178 | ProvisioningStyle = Automatic; 179 | }; 180 | }; 181 | }; 182 | buildConfigurationList = 1A8B51AF1E3B1D36008665E4 /* Build configuration list for PBXProject "HelloSketch" */; 183 | compatibilityVersion = "Xcode 3.2"; 184 | developmentRegion = English; 185 | hasScannedForEncodings = 0; 186 | knownRegions = ( 187 | en, 188 | ); 189 | mainGroup = 1A8B51AB1E3B1D36008665E4; 190 | productRefGroup = 1A8B51B61E3B1D36008665E4 /* Products */; 191 | projectDirPath = ""; 192 | projectRoot = ""; 193 | targets = ( 194 | 1A8B51B41E3B1D36008665E4 /* HelloSketch */, 195 | 1A8B51BD1E3B1D36008665E4 /* HelloSketchTests */, 196 | ); 197 | }; 198 | /* End PBXProject section */ 199 | 200 | /* Begin PBXResourcesBuildPhase section */ 201 | 1A8B51B31E3B1D36008665E4 /* Resources */ = { 202 | isa = PBXResourcesBuildPhase; 203 | buildActionMask = 2147483647; 204 | files = ( 205 | ); 206 | runOnlyForDeploymentPostprocessing = 0; 207 | }; 208 | 1A8B51BC1E3B1D36008665E4 /* Resources */ = { 209 | isa = PBXResourcesBuildPhase; 210 | buildActionMask = 2147483647; 211 | files = ( 212 | ); 213 | runOnlyForDeploymentPostprocessing = 0; 214 | }; 215 | /* End PBXResourcesBuildPhase section */ 216 | 217 | /* Begin PBXSourcesBuildPhase section */ 218 | 1A8B51B01E3B1D36008665E4 /* Sources */ = { 219 | isa = PBXSourcesBuildPhase; 220 | buildActionMask = 2147483647; 221 | files = ( 222 | 1A8B51DA1E3B23F1008665E4 /* HSMain.m in Sources */, 223 | ); 224 | runOnlyForDeploymentPostprocessing = 0; 225 | }; 226 | 1A8B51BA1E3B1D36008665E4 /* Sources */ = { 227 | isa = PBXSourcesBuildPhase; 228 | buildActionMask = 2147483647; 229 | files = ( 230 | 1A8B51C41E3B1D36008665E4 /* HelloSketchTests.m in Sources */, 231 | ); 232 | runOnlyForDeploymentPostprocessing = 0; 233 | }; 234 | /* End PBXSourcesBuildPhase section */ 235 | 236 | /* Begin PBXTargetDependency section */ 237 | 1A8B51C11E3B1D36008665E4 /* PBXTargetDependency */ = { 238 | isa = PBXTargetDependency; 239 | target = 1A8B51B41E3B1D36008665E4 /* HelloSketch */; 240 | targetProxy = 1A8B51C01E3B1D36008665E4 /* PBXContainerItemProxy */; 241 | }; 242 | /* End PBXTargetDependency section */ 243 | 244 | /* Begin XCBuildConfiguration section */ 245 | 1A8B51C71E3B1D36008665E4 /* Debug */ = { 246 | isa = XCBuildConfiguration; 247 | buildSettings = { 248 | ALWAYS_SEARCH_USER_PATHS = NO; 249 | CLANG_ANALYZER_NONNULL = YES; 250 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 251 | CLANG_CXX_LIBRARY = "libc++"; 252 | CLANG_ENABLE_MODULES = YES; 253 | CLANG_ENABLE_OBJC_ARC = YES; 254 | CLANG_WARN_BOOL_CONVERSION = YES; 255 | CLANG_WARN_CONSTANT_CONVERSION = YES; 256 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 257 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 258 | CLANG_WARN_EMPTY_BODY = YES; 259 | CLANG_WARN_ENUM_CONVERSION = YES; 260 | CLANG_WARN_INFINITE_RECURSION = YES; 261 | CLANG_WARN_INT_CONVERSION = YES; 262 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 263 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 264 | CLANG_WARN_UNREACHABLE_CODE = YES; 265 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 266 | CODE_SIGN_IDENTITY = "-"; 267 | COPY_PHASE_STRIP = NO; 268 | CURRENT_PROJECT_VERSION = 1; 269 | DEBUG_INFORMATION_FORMAT = dwarf; 270 | ENABLE_STRICT_OBJC_MSGSEND = YES; 271 | ENABLE_TESTABILITY = YES; 272 | GCC_C_LANGUAGE_STANDARD = gnu99; 273 | GCC_DYNAMIC_NO_PIC = NO; 274 | GCC_NO_COMMON_BLOCKS = YES; 275 | GCC_OPTIMIZATION_LEVEL = 0; 276 | GCC_PREPROCESSOR_DEFINITIONS = ( 277 | "DEBUG=1", 278 | "$(inherited)", 279 | ); 280 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 281 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 282 | GCC_WARN_UNDECLARED_SELECTOR = YES; 283 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 284 | GCC_WARN_UNUSED_FUNCTION = YES; 285 | GCC_WARN_UNUSED_VARIABLE = YES; 286 | MACOSX_DEPLOYMENT_TARGET = 10.11; 287 | MTL_ENABLE_DEBUG_INFO = YES; 288 | ONLY_ACTIVE_ARCH = YES; 289 | SDKROOT = macosx; 290 | VERSIONING_SYSTEM = "apple-generic"; 291 | VERSION_INFO_PREFIX = ""; 292 | }; 293 | name = Debug; 294 | }; 295 | 1A8B51C81E3B1D36008665E4 /* Release */ = { 296 | isa = XCBuildConfiguration; 297 | buildSettings = { 298 | ALWAYS_SEARCH_USER_PATHS = NO; 299 | CLANG_ANALYZER_NONNULL = YES; 300 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 301 | CLANG_CXX_LIBRARY = "libc++"; 302 | CLANG_ENABLE_MODULES = YES; 303 | CLANG_ENABLE_OBJC_ARC = YES; 304 | CLANG_WARN_BOOL_CONVERSION = YES; 305 | CLANG_WARN_CONSTANT_CONVERSION = YES; 306 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 307 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 308 | CLANG_WARN_EMPTY_BODY = YES; 309 | CLANG_WARN_ENUM_CONVERSION = YES; 310 | CLANG_WARN_INFINITE_RECURSION = YES; 311 | CLANG_WARN_INT_CONVERSION = YES; 312 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 313 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 314 | CLANG_WARN_UNREACHABLE_CODE = YES; 315 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 316 | CODE_SIGN_IDENTITY = "-"; 317 | COPY_PHASE_STRIP = NO; 318 | CURRENT_PROJECT_VERSION = 1; 319 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 320 | ENABLE_NS_ASSERTIONS = NO; 321 | ENABLE_STRICT_OBJC_MSGSEND = YES; 322 | GCC_C_LANGUAGE_STANDARD = gnu99; 323 | GCC_NO_COMMON_BLOCKS = YES; 324 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 325 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 326 | GCC_WARN_UNDECLARED_SELECTOR = YES; 327 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 328 | GCC_WARN_UNUSED_FUNCTION = YES; 329 | GCC_WARN_UNUSED_VARIABLE = YES; 330 | MACOSX_DEPLOYMENT_TARGET = 10.11; 331 | MTL_ENABLE_DEBUG_INFO = NO; 332 | SDKROOT = macosx; 333 | VERSIONING_SYSTEM = "apple-generic"; 334 | VERSION_INFO_PREFIX = ""; 335 | }; 336 | name = Release; 337 | }; 338 | 1A8B51CA1E3B1D36008665E4 /* Debug */ = { 339 | isa = XCBuildConfiguration; 340 | buildSettings = { 341 | CODE_SIGN_IDENTITY = ""; 342 | COMBINE_HIDPI_IMAGES = YES; 343 | DEFINES_MODULE = YES; 344 | DYLIB_COMPATIBILITY_VERSION = 1; 345 | DYLIB_CURRENT_VERSION = 1; 346 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 347 | FRAMEWORK_VERSION = A; 348 | INFOPLIST_FILE = HelloSketch/Info.plist; 349 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 350 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; 351 | PRODUCT_BUNDLE_IDENTIFIER = io.magicsketch.HelloSketch; 352 | PRODUCT_NAME = "$(TARGET_NAME)"; 353 | SKIP_INSTALL = YES; 354 | }; 355 | name = Debug; 356 | }; 357 | 1A8B51CB1E3B1D36008665E4 /* Release */ = { 358 | isa = XCBuildConfiguration; 359 | buildSettings = { 360 | CODE_SIGN_IDENTITY = ""; 361 | COMBINE_HIDPI_IMAGES = YES; 362 | DEFINES_MODULE = YES; 363 | DYLIB_COMPATIBILITY_VERSION = 1; 364 | DYLIB_CURRENT_VERSION = 1; 365 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 366 | FRAMEWORK_VERSION = A; 367 | INFOPLIST_FILE = HelloSketch/Info.plist; 368 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 369 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; 370 | PRODUCT_BUNDLE_IDENTIFIER = io.magicsketch.HelloSketch; 371 | PRODUCT_NAME = "$(TARGET_NAME)"; 372 | SKIP_INSTALL = YES; 373 | }; 374 | name = Release; 375 | }; 376 | 1A8B51CD1E3B1D36008665E4 /* Debug */ = { 377 | isa = XCBuildConfiguration; 378 | buildSettings = { 379 | COMBINE_HIDPI_IMAGES = YES; 380 | INFOPLIST_FILE = HelloSketchTests/Info.plist; 381 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; 382 | PRODUCT_BUNDLE_IDENTIFIER = io.magicsketch.HelloSketchTests; 383 | PRODUCT_NAME = "$(TARGET_NAME)"; 384 | }; 385 | name = Debug; 386 | }; 387 | 1A8B51CE1E3B1D36008665E4 /* Release */ = { 388 | isa = XCBuildConfiguration; 389 | buildSettings = { 390 | COMBINE_HIDPI_IMAGES = YES; 391 | INFOPLIST_FILE = HelloSketchTests/Info.plist; 392 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; 393 | PRODUCT_BUNDLE_IDENTIFIER = io.magicsketch.HelloSketchTests; 394 | PRODUCT_NAME = "$(TARGET_NAME)"; 395 | }; 396 | name = Release; 397 | }; 398 | /* End XCBuildConfiguration section */ 399 | 400 | /* Begin XCConfigurationList section */ 401 | 1A8B51AF1E3B1D36008665E4 /* Build configuration list for PBXProject "HelloSketch" */ = { 402 | isa = XCConfigurationList; 403 | buildConfigurations = ( 404 | 1A8B51C71E3B1D36008665E4 /* Debug */, 405 | 1A8B51C81E3B1D36008665E4 /* Release */, 406 | ); 407 | defaultConfigurationIsVisible = 0; 408 | defaultConfigurationName = Release; 409 | }; 410 | 1A8B51C91E3B1D36008665E4 /* Build configuration list for PBXNativeTarget "HelloSketch" */ = { 411 | isa = XCConfigurationList; 412 | buildConfigurations = ( 413 | 1A8B51CA1E3B1D36008665E4 /* Debug */, 414 | 1A8B51CB1E3B1D36008665E4 /* Release */, 415 | ); 416 | defaultConfigurationIsVisible = 0; 417 | }; 418 | 1A8B51CC1E3B1D36008665E4 /* Build configuration list for PBXNativeTarget "HelloSketchTests" */ = { 419 | isa = XCConfigurationList; 420 | buildConfigurations = ( 421 | 1A8B51CD1E3B1D36008665E4 /* Debug */, 422 | 1A8B51CE1E3B1D36008665E4 /* Release */, 423 | ); 424 | defaultConfigurationIsVisible = 0; 425 | }; 426 | /* End XCConfigurationList section */ 427 | }; 428 | rootObject = 1A8B51AC1E3B1D36008665E4 /* Project object */; 429 | } 430 | -------------------------------------------------------------------------------- /HelloSketch.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /HelloSketch.xcodeproj/xcuserdata/james.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | HelloSketch.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | 1A8B51B41E3B1D36008665E4 16 | 17 | primary 18 | 19 | 20 | 1A8B51BD1E3B1D36008665E4 21 | 22 | primary 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /HelloSketch/HSMain.h: -------------------------------------------------------------------------------- 1 | // 2 | // HSMain.h 3 | // HelloSketch 4 | // 5 | // Created by James Tang on 27/1/2017. 6 | // Copyright © 2017 MagicSketch. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface HSMain : NSObject 12 | 13 | - (NSString *)helloText; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /HelloSketch/HSMain.m: -------------------------------------------------------------------------------- 1 | // 2 | // HSMain.m 3 | // HelloSketch 4 | // 5 | // Created by James Tang on 27/1/2017. 6 | // Copyright © 2017 MagicSketch. All rights reserved. 7 | // 8 | 9 | 10 | #import "HSMain.h" 11 | @import AppKit; 12 | 13 | #define HSLog(fmt, ...) NSLog((@"HelloSketch (Sketch Plugin) %s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__); 14 | 15 | @implementation HSMain 16 | 17 | - (NSString *)helloText { 18 | HSLog(@"Reading helloText"); 19 | return @"Hey there, sending signal from HSMain, over."; 20 | } 21 | 22 | @end 23 | -------------------------------------------------------------------------------- /HelloSketch/HelloSketch.h: -------------------------------------------------------------------------------- 1 | // 2 | // HelloSketch.h 3 | // HelloSketch 4 | // 5 | // Created by James Tang on 27/1/2017. 6 | // Copyright © 2017 MagicSketch. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | //! Project version number for HelloSketch. 12 | FOUNDATION_EXPORT double HelloSketchVersionNumber; 13 | 14 | //! Project version string for HelloSketch. 15 | FOUNDATION_EXPORT const unsigned char HelloSketchVersionString[]; 16 | 17 | // In this header, you should import all the public headers of your framework using statements like #import 18 | 19 | 20 | -------------------------------------------------------------------------------- /HelloSketch/HelloSketch.js: -------------------------------------------------------------------------------- 1 | var HelloSketch_FrameworkPath = HelloSketch_FrameworkPath || COScript.currentCOScript().env().scriptURL.path().stringByDeletingLastPathComponent(); 2 | var HelloSketch_Log = HelloSketch_Log || log; 3 | (function() { 4 | var mocha = Mocha.sharedRuntime(); 5 | var frameworkName = "HelloSketch"; 6 | var directory = HelloSketch_FrameworkPath; 7 | if (mocha.valueForKey(frameworkName)) { 8 | HelloSketch_Log("😎 loadFramework: `" + frameworkName + "` already loaded."); 9 | return true; 10 | } else if ([mocha loadFrameworkWithName:frameworkName inDirectory:directory]) { 11 | HelloSketch_Log("✅ loadFramework: `" + frameworkName + "` success!"); 12 | mocha.setValue_forKey_(true, frameworkName); 13 | return true; 14 | } else { 15 | HelloSketch_Log("❌ loadFramework: `" + frameworkName + "` failed!: " + directory + ". Please define HelloSketch_FrameworkPath if you're trying to @import in a custom plugin"); 16 | return false; 17 | } 18 | })(); 19 | -------------------------------------------------------------------------------- /HelloSketch/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | $(CURRENT_PROJECT_VERSION) 21 | NSHumanReadableCopyright 22 | Copyright © 2017 MagicSketch. All rights reserved. 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /HelloSketchTests/HelloSketchTests.m: -------------------------------------------------------------------------------- 1 | // 2 | // HelloSketchTests.m 3 | // HelloSketchTests 4 | // 5 | // Created by James Tang on 27/1/2017. 6 | // Copyright © 2017 MagicSketch. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface HelloSketchTests : XCTestCase 12 | 13 | @end 14 | 15 | @implementation HelloSketchTests 16 | 17 | - (void)setUp { 18 | [super setUp]; 19 | // Put setup code here. This method is called before the invocation of each test method in the class. 20 | } 21 | 22 | - (void)tearDown { 23 | // Put teardown code here. This method is called after the invocation of each test method in the class. 24 | [super tearDown]; 25 | } 26 | 27 | - (void)testExample { 28 | // This is an example of a functional test case. 29 | // Use XCTAssert and related functions to verify your tests produce the correct results. 30 | } 31 | 32 | - (void)testPerformanceExample { 33 | // This is an example of a performance test case. 34 | [self measureBlock:^{ 35 | // Put the code you want to measure the time of here. 36 | }]; 37 | } 38 | 39 | @end 40 | -------------------------------------------------------------------------------- /HelloSketchTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 MagicSketch 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | HelloSketch 2 | --- 3 | 4 | Beginning Sketch Plugins Development in Xcode 5 | 6 | https://blog.magicsketch.io/beginning-sketch-plugins-development-in-xcode-2ee562352798 7 | 8 | --------------------------------------------------------------------------------