@sentry/wizard 3.39.0 → 3.41.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -1
- package/README.md +21 -21
- package/bin.ts +5 -0
- package/codecov.yml +15 -0
- package/dist/bin.js +4 -0
- package/dist/bin.js.map +1 -1
- package/dist/e2e-tests/jest.config.d.ts +1 -0
- package/dist/e2e-tests/jest.config.js +1 -0
- package/dist/e2e-tests/jest.config.js.map +1 -1
- package/dist/e2e-tests/tests/flutter.test.d.ts +1 -0
- package/dist/e2e-tests/tests/flutter.test.js +190 -0
- package/dist/e2e-tests/tests/flutter.test.js.map +1 -0
- package/dist/e2e-tests/utils/index.d.ts +11 -0
- package/dist/e2e-tests/utils/index.js +36 -1
- package/dist/e2e-tests/utils/index.js.map +1 -1
- package/dist/lib/Constants.d.ts +1 -0
- package/dist/lib/Constants.js +5 -0
- package/dist/lib/Constants.js.map +1 -1
- package/dist/package.json +3 -2
- package/dist/src/apple/apple-wizard.js +2 -3
- package/dist/src/apple/apple-wizard.js.map +1 -1
- package/dist/src/apple/code-tools.d.ts +10 -0
- package/dist/src/apple/code-tools.js +16 -12
- package/dist/src/apple/code-tools.js.map +1 -1
- package/dist/src/apple/fastlane.d.ts +23 -0
- package/dist/src/apple/fastlane.js +11 -7
- package/dist/src/apple/fastlane.js.map +1 -1
- package/dist/src/apple/templates.d.ts +1 -1
- package/dist/src/apple/templates.js +0 -2
- package/dist/src/apple/templates.js.map +1 -1
- package/dist/src/apple/xcode-manager.d.ts +13 -9
- package/dist/src/apple/xcode-manager.js +146 -61
- package/dist/src/apple/xcode-manager.js.map +1 -1
- package/dist/src/flutter/code-tools.d.ts +17 -0
- package/dist/src/flutter/code-tools.js +263 -0
- package/dist/src/flutter/code-tools.js.map +1 -0
- package/dist/src/flutter/flutter-wizard.d.ts +2 -0
- package/dist/src/flutter/flutter-wizard.js +171 -0
- package/dist/src/flutter/flutter-wizard.js.map +1 -0
- package/dist/src/flutter/templates.d.ts +9 -0
- package/dist/src/flutter/templates.js +40 -0
- package/dist/src/flutter/templates.js.map +1 -0
- package/dist/src/nextjs/nextjs-wizard.js +5 -3
- package/dist/src/nextjs/nextjs-wizard.js.map +1 -1
- package/dist/src/nuxt/nuxt-wizard.js +6 -4
- package/dist/src/nuxt/nuxt-wizard.js.map +1 -1
- package/dist/src/nuxt/sdk-setup.d.ts +1 -1
- package/dist/src/nuxt/sdk-setup.js +2 -1
- package/dist/src/nuxt/sdk-setup.js.map +1 -1
- package/dist/src/react-native/react-native-wizard.js +5 -3
- package/dist/src/react-native/react-native-wizard.js.map +1 -1
- package/dist/src/remix/remix-wizard.js +5 -3
- package/dist/src/remix/remix-wizard.js.map +1 -1
- package/dist/src/run.d.ts +2 -1
- package/dist/src/run.js +40 -32
- package/dist/src/run.js.map +1 -1
- package/dist/src/sveltekit/sveltekit-wizard.js +5 -3
- package/dist/src/sveltekit/sveltekit-wizard.js.map +1 -1
- package/dist/src/utils/clack-utils.d.ts +4 -2
- package/dist/src/utils/clack-utils.js +18 -12
- package/dist/src/utils/clack-utils.js.map +1 -1
- package/dist/src/utils/package-manager.d.ts +1 -0
- package/dist/src/utils/package-manager.js +5 -0
- package/dist/src/utils/package-manager.js.map +1 -1
- package/dist/src/utils/types.d.ts +9 -0
- package/dist/src/utils/types.js.map +1 -1
- package/dist/test/apple/cocoapod.test.d.ts +1 -0
- package/dist/test/apple/cocoapod.test.js +409 -0
- package/dist/test/apple/cocoapod.test.js.map +1 -0
- package/dist/test/apple/code-tools.test.d.ts +1 -0
- package/dist/test/apple/code-tools.test.js +673 -0
- package/dist/test/apple/code-tools.test.js.map +1 -0
- package/dist/test/apple/fastfile.test.d.ts +1 -0
- package/dist/test/apple/fastfile.test.js +431 -0
- package/dist/test/apple/fastfile.test.js.map +1 -0
- package/dist/test/apple/templates.test.d.ts +1 -0
- package/dist/test/apple/templates.test.js +73 -0
- package/dist/test/apple/templates.test.js.map +1 -0
- package/dist/test/apple/xcode-manager.test.d.ts +1 -0
- package/dist/test/apple/xcode-manager.test.js +834 -0
- package/dist/test/apple/xcode-manager.test.js.map +1 -0
- package/dist/test/flutter/code-tools.test.d.ts +1 -0
- package/dist/test/flutter/code-tools.test.js +84 -0
- package/dist/test/flutter/code-tools.test.js.map +1 -0
- package/dist/test/flutter/templates.test.d.ts +1 -0
- package/dist/test/flutter/templates.test.js +41 -0
- package/dist/test/flutter/templates.test.js.map +1 -0
- package/dist/test/utils/clack-utils.test.js +89 -0
- package/dist/test/utils/clack-utils.test.js.map +1 -1
- package/e2e-tests/README.md +5 -1
- package/e2e-tests/jest.config.ts +1 -0
- package/e2e-tests/test-applications/apple/damaged-missing-configuration-list/Project.xcodeproj/project.pbxproj +52 -0
- package/e2e-tests/test-applications/apple/damaged-missing-configuration-list/Project.xcodeproj/xcshareddata/xcschemes/Project1.xcscheme +78 -0
- package/e2e-tests/test-applications/apple/no-targets/Project.xcodeproj/project.pbxproj +62 -0
- package/e2e-tests/test-applications/apple/no-targets/Project.xcodeproj/xcshareddata/xcschemes/Project1.xcscheme +78 -0
- package/e2e-tests/test-applications/apple/spm-swiftui-multi-targets/Project.xcodeproj/project.pbxproj +470 -0
- package/e2e-tests/test-applications/apple/spm-swiftui-multi-targets/Project.xcodeproj/xcshareddata/xcschemes/Project1.xcscheme +78 -0
- package/e2e-tests/test-applications/apple/spm-swiftui-multi-targets/Project1/ContentView.swift +7 -0
- package/e2e-tests/test-applications/apple/spm-swiftui-multi-targets/Project1/Project1App.swift +10 -0
- package/e2e-tests/test-applications/apple/spm-swiftui-multi-targets/Project2/ContentView.swift +7 -0
- package/e2e-tests/test-applications/apple/spm-swiftui-multi-targets/Project2/Project2App.swift +10 -0
- package/e2e-tests/test-applications/apple/spm-swiftui-single-target/Project.xcodeproj/project.pbxproj +382 -0
- package/e2e-tests/test-applications/apple/spm-swiftui-single-target/Project.xcodeproj/xcshareddata/xcschemes/Project.xcscheme +78 -0
- package/e2e-tests/test-applications/apple/spm-swiftui-single-target/Sources/ContentView.swift +7 -0
- package/e2e-tests/test-applications/apple/spm-swiftui-single-target/Sources/MainApp.swift +10 -0
- package/e2e-tests/test-applications/flutter-test-app/.metadata +45 -0
- package/e2e-tests/test-applications/flutter-test-app/README.md +16 -0
- package/e2e-tests/test-applications/flutter-test-app/analysis_options.yaml +28 -0
- package/e2e-tests/test-applications/flutter-test-app/android/app/build.gradle +44 -0
- package/e2e-tests/test-applications/flutter-test-app/android/app/src/debug/AndroidManifest.xml +7 -0
- package/e2e-tests/test-applications/flutter-test-app/android/app/src/main/AndroidManifest.xml +45 -0
- package/e2e-tests/test-applications/flutter-test-app/android/app/src/main/kotlin/com/example/flutter_magic/MainActivity.kt +5 -0
- package/e2e-tests/test-applications/flutter-test-app/android/app/src/main/res/drawable/launch_background.xml +12 -0
- package/e2e-tests/test-applications/flutter-test-app/android/app/src/main/res/drawable-v21/launch_background.xml +12 -0
- package/e2e-tests/test-applications/flutter-test-app/android/app/src/main/res/mipmap-hdpi/ic_launcher.png +0 -0
- package/e2e-tests/test-applications/flutter-test-app/android/app/src/main/res/mipmap-mdpi/ic_launcher.png +0 -0
- package/e2e-tests/test-applications/flutter-test-app/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png +0 -0
- package/e2e-tests/test-applications/flutter-test-app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png +0 -0
- package/e2e-tests/test-applications/flutter-test-app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
- package/e2e-tests/test-applications/flutter-test-app/android/app/src/main/res/values/styles.xml +18 -0
- package/e2e-tests/test-applications/flutter-test-app/android/app/src/main/res/values-night/styles.xml +18 -0
- package/e2e-tests/test-applications/flutter-test-app/android/app/src/profile/AndroidManifest.xml +7 -0
- package/e2e-tests/test-applications/flutter-test-app/android/build.gradle +18 -0
- package/e2e-tests/test-applications/flutter-test-app/android/gradle/wrapper/gradle-wrapper.properties +5 -0
- package/e2e-tests/test-applications/flutter-test-app/android/gradle.properties +3 -0
- package/e2e-tests/test-applications/flutter-test-app/android/settings.gradle +25 -0
- package/e2e-tests/test-applications/flutter-test-app/lib/main.dart +125 -0
- package/e2e-tests/test-applications/flutter-test-app/linux/CMakeLists.txt +145 -0
- package/e2e-tests/test-applications/flutter-test-app/linux/flutter/CMakeLists.txt +88 -0
- package/e2e-tests/test-applications/flutter-test-app/linux/flutter/generated_plugin_registrant.cc +11 -0
- package/e2e-tests/test-applications/flutter-test-app/linux/flutter/generated_plugin_registrant.h +15 -0
- package/e2e-tests/test-applications/flutter-test-app/linux/flutter/generated_plugins.cmake +23 -0
- package/e2e-tests/test-applications/flutter-test-app/linux/main.cc +6 -0
- package/e2e-tests/test-applications/flutter-test-app/linux/my_application.cc +124 -0
- package/e2e-tests/test-applications/flutter-test-app/linux/my_application.h +18 -0
- package/e2e-tests/test-applications/flutter-test-app/macos/Flutter/Flutter-Debug.xcconfig +2 -0
- package/e2e-tests/test-applications/flutter-test-app/macos/Flutter/Flutter-Release.xcconfig +2 -0
- package/e2e-tests/test-applications/flutter-test-app/macos/Flutter/GeneratedPluginRegistrant.swift +10 -0
- package/e2e-tests/test-applications/flutter-test-app/macos/Podfile +43 -0
- package/e2e-tests/test-applications/flutter-test-app/macos/Runner/AppDelegate.swift +9 -0
- package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +68 -0
- package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png +0 -0
- package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png +0 -0
- package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png +0 -0
- package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png +0 -0
- package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png +0 -0
- package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png +0 -0
- package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png +0 -0
- package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Base.lproj/MainMenu.xib +343 -0
- package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Configs/AppInfo.xcconfig +14 -0
- package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Configs/Debug.xcconfig +2 -0
- package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Configs/Release.xcconfig +2 -0
- package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Configs/Warnings.xcconfig +13 -0
- package/e2e-tests/test-applications/flutter-test-app/macos/Runner/DebugProfile.entitlements +12 -0
- package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Info.plist +32 -0
- package/e2e-tests/test-applications/flutter-test-app/macos/Runner/MainFlutterWindow.swift +15 -0
- package/e2e-tests/test-applications/flutter-test-app/macos/Runner/Release.entitlements +8 -0
- package/e2e-tests/test-applications/flutter-test-app/macos/Runner.xcodeproj/project.pbxproj +705 -0
- package/e2e-tests/test-applications/flutter-test-app/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
- package/e2e-tests/test-applications/flutter-test-app/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +98 -0
- package/e2e-tests/test-applications/flutter-test-app/macos/Runner.xcworkspace/contents.xcworkspacedata +7 -0
- package/e2e-tests/test-applications/flutter-test-app/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
- package/e2e-tests/test-applications/flutter-test-app/macos/RunnerTests/RunnerTests.swift +12 -0
- package/e2e-tests/test-applications/flutter-test-app/pubspec.lock +213 -0
- package/e2e-tests/test-applications/flutter-test-app/pubspec.yaml +89 -0
- package/e2e-tests/test-applications/flutter-test-app/test/widget_test.dart +30 -0
- package/e2e-tests/test-applications/flutter-test-app/web/favicon.png +0 -0
- package/e2e-tests/test-applications/flutter-test-app/web/icons/Icon-192.png +0 -0
- package/e2e-tests/test-applications/flutter-test-app/web/icons/Icon-512.png +0 -0
- package/e2e-tests/test-applications/flutter-test-app/web/icons/Icon-maskable-192.png +0 -0
- package/e2e-tests/test-applications/flutter-test-app/web/icons/Icon-maskable-512.png +0 -0
- package/e2e-tests/test-applications/flutter-test-app/web/index.html +38 -0
- package/e2e-tests/test-applications/flutter-test-app/web/manifest.json +35 -0
- package/e2e-tests/test-applications/flutter-test-app/windows/CMakeLists.txt +108 -0
- package/e2e-tests/test-applications/flutter-test-app/windows/flutter/CMakeLists.txt +109 -0
- package/e2e-tests/test-applications/flutter-test-app/windows/flutter/generated_plugin_registrant.cc +11 -0
- package/e2e-tests/test-applications/flutter-test-app/windows/flutter/generated_plugin_registrant.h +15 -0
- package/e2e-tests/test-applications/flutter-test-app/windows/flutter/generated_plugins.cmake +23 -0
- package/e2e-tests/test-applications/flutter-test-app/windows/runner/CMakeLists.txt +40 -0
- package/e2e-tests/test-applications/flutter-test-app/windows/runner/Runner.rc +121 -0
- package/e2e-tests/test-applications/flutter-test-app/windows/runner/flutter_window.cpp +71 -0
- package/e2e-tests/test-applications/flutter-test-app/windows/runner/flutter_window.h +33 -0
- package/e2e-tests/test-applications/flutter-test-app/windows/runner/main.cpp +43 -0
- package/e2e-tests/test-applications/flutter-test-app/windows/runner/resource.h +16 -0
- package/e2e-tests/test-applications/flutter-test-app/windows/runner/resources/app_icon.ico +0 -0
- package/e2e-tests/test-applications/flutter-test-app/windows/runner/runner.exe.manifest +14 -0
- package/e2e-tests/test-applications/flutter-test-app/windows/runner/utils.cpp +65 -0
- package/e2e-tests/test-applications/flutter-test-app/windows/runner/utils.h +19 -0
- package/e2e-tests/test-applications/flutter-test-app/windows/runner/win32_window.cpp +288 -0
- package/e2e-tests/test-applications/flutter-test-app/windows/runner/win32_window.h +102 -0
- package/e2e-tests/tests/flutter.test.ts +127 -0
- package/e2e-tests/utils/index.ts +33 -0
- package/lib/Constants.ts +5 -0
- package/package.json +3 -2
- package/src/apple/apple-wizard.ts +2 -3
- package/src/apple/code-tools.ts +21 -6
- package/src/apple/fastlane.ts +18 -2
- package/src/apple/templates.ts +2 -2
- package/src/apple/xcode-manager.ts +186 -99
- package/src/flutter/code-tools.ts +284 -0
- package/src/flutter/flutter-wizard.ts +164 -0
- package/src/flutter/templates.ts +90 -0
- package/src/nextjs/nextjs-wizard.ts +5 -2
- package/src/nuxt/nuxt-wizard.ts +6 -3
- package/src/nuxt/sdk-setup.ts +2 -0
- package/src/react-native/react-native-wizard.ts +5 -2
- package/src/remix/remix-wizard.ts +5 -2
- package/src/run.ts +9 -0
- package/src/sveltekit/sveltekit-wizard.ts +5 -2
- package/src/utils/clack-utils.ts +16 -4
- package/src/utils/package-manager.ts +6 -0
- package/src/utils/types.ts +10 -0
- package/test/apple/cocoapod.test.ts +306 -0
- package/test/apple/code-tools.test.ts +1042 -0
- package/test/apple/fastfile.test.ts +550 -0
- package/test/apple/templates.test.ts +191 -0
- package/test/apple/xcode-manager.test.ts +1066 -0
- package/test/flutter/code-tools.test.ts +212 -0
- package/test/flutter/templates.test.ts +100 -0
- package/test/utils/clack-utils.test.ts +92 -0
- package/types/xcode.d.ts +526 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-tools.test.js","sourceRoot":"","sources":["../../../test/apple/code-tools.test.ts"],"names":[],"mappings":"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","sourcesContent":["import * as Sentry from '@sentry/node';\nimport * as fs from 'fs';\nimport * as os from 'os';\nimport * as path from 'path';\nimport {\n addCodeSnippetToProject,\n exportForTesting,\n} from '../../src/apple/code-tools';\n// @ts-ignore - clack is ESM and TS complains about that. It works though\nimport * as clack from '@clack/prompts';\n\n// Test Constants\nconst invalidAppDelegateSwift = `func application() {}`;\nconst validAppDelegateSwift = `\nimport UIKit\n\n@main\nclass AppDelegate: UIResponder, UIApplicationDelegate {\n\n func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {\n // Override point for customization after application launch.\n return true\n }\n}`;\nconst validAppDelegateSwiftWithSentry = `\nimport UIKit\nimport Sentry\n\n\n@main\nclass AppDelegate: UIResponder, UIApplicationDelegate {\n\n func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {\n SentrySDK.start { options in\n options.dsn = \"https://example.com/sentry-dsn\"\n options.debug = true // Enabled debug when first installing is always helpful\n // Set tracesSampleRate to 1.0 to capture 100% of transactions for performance monitoring.\n // We recommend adjusting this value in production.\n options.tracesSampleRate = 1.0\n\n // Sample rate for profiling, applied on top of TracesSampleRate.\n // We recommend adjusting this value in production.\n options.profilesSampleRate = 1.0 \n\n // Uncomment the following lines to add more data to your events\n // options.attachScreenshot = true // This adds a screenshot to the error events\n // options.attachViewHierarchy = true // This adds the view hierarchy to the error events\n }\n // Remove the next line after confirming that your Sentry integration is working.\n SentrySDK.capture(message: \"This app uses Sentry! :)\")\n\n // Override point for customization after application launch.\n return true\n }\n}`;\nconst invalidAppDelegateObjC = `\n- (BOOL)application:(UIApplication *) {\n return NO;\n}`;\nconst validAppDelegateObjC = `\n#import \"AppDelegate.h\"\n\n@interface AppDelegate ()\n\n@end\n\n@implementation AppDelegate\n\n- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {\n // Override point for customization after application launch.\n return YES;\n}\n\n@end`;\nconst validAppDelegateObjCWithSentry = `@import Sentry;\n\n#import \"AppDelegate.h\"\n\n@interface AppDelegate ()\n\n@end\n\n@implementation AppDelegate\n\n- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {\n [SentrySDK startWithConfigureOptions:^(SentryOptions * options) {\n options.dsn = @\"https://example.com/sentry-dsn\";\n options.debug = YES; // Enabled debug when first installing is always helpful\n // Set tracesSampleRate to 1.0 to capture 100% of transactions for performance monitoring.\n // We recommend adjusting this value in production.\n options.tracesSampleRate = @1.0;\n\n // Sample rate for profiling, applied on top of TracesSampleRate.\n // We recommend adjusting this value in production.\n options.profilesSampleRate = @1.0;\n\n //Uncomment the following lines to add more data to your events\n //options.attachScreenshot = YES; //This will add a screenshot to the error events\n //options.attachViewHierarchy = YES; //This will add the view hierarchy to the error events\n }];\n //Remove the next line after confirming that your Sentry integration is working.\n [SentrySDK captureMessage:@\"This app uses Sentry!\"];\n\n // Override point for customization after application launch.\n return YES;\n}\n\n@end`;\nconst invalidAppDelegateSwiftUI = `\nstruct MyApp: App {\n var body: some Scene {\n WindowGroup { Text(\"Hello, world!\") }\n }\n}`;\nconst validAppDelegateSwiftUI = `\nimport SwiftUI\n\n@main\nstruct TestApp: App {\n var body: some Scene {\n WindowGroup {\n ContentView()\n }\n }\n}`;\nconst validAppDelegateSwiftUIWithSentry = `\nimport SwiftUI\nimport Sentry\n\n\n@main\nstruct TestApp: App {\n init() {\n SentrySDK.start { options in\n options.dsn = \"https://example.com/sentry-dsn\"\n options.debug = true // Enabled debug when first installing is always helpful\n // Set tracesSampleRate to 1.0 to capture 100% of transactions for performance monitoring.\n // We recommend adjusting this value in production.\n options.tracesSampleRate = 1.0\n\n // Sample rate for profiling, applied on top of TracesSampleRate.\n // We recommend adjusting this value in production.\n options.profilesSampleRate = 1.0 \n\n // Uncomment the following lines to add more data to your events\n // options.attachScreenshot = true // This adds a screenshot to the error events\n // options.attachViewHierarchy = true // This adds the view hierarchy to the error events\n }\n // Remove the next line after confirming that your Sentry integration is working.\n SentrySDK.capture(message: \"This app uses Sentry! :)\")\n }\n var body: some Scene {\n WindowGroup {\n ContentView()\n }\n }\n}`;\n\nconst prepareTempDir = (): string => {\n const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'code-tools-test'));\n return tempDir;\n};\n\nconst prepareAppDelegateFile = (\n dir: string,\n content: string,\n ext: 'm' | 'mm' | 'swift',\n): string => {\n const filePath = path.join(dir, `AppDelegate.${ext}`);\n fs.writeFileSync(filePath, content, 'utf8');\n return filePath;\n};\n\nconst dsn = 'https://example.com/sentry-dsn';\n\n// Mock Setup\n\njest.mock('../../src/utils/bash');\njest.spyOn(Sentry, 'setTag').mockImplementation();\njest.spyOn(Sentry, 'captureException').mockImplementation();\n\n// Test Suite\n\ndescribe('code-tools', () => {\n beforeEach(() => {\n jest.spyOn(clack.log, 'info').mockImplementation();\n });\n\n afterEach(() => {\n jest.clearAllMocks();\n });\n\n describe('#isAppDelegateFile', () => {\n const prepareTestFile = (\n content: string,\n ext: 'm' | 'mm' | 'swift',\n ): string => {\n const tempDir = prepareTempDir();\n return prepareAppDelegateFile(tempDir, content, ext);\n };\n\n describe('swift files', () => {\n describe('swift app launch regex', () => {\n describe('valid cases', () => {\n const variations: {\n name: string;\n code: string;\n }[] = [\n {\n name: 'with underscores',\n code: 'func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {',\n },\n {\n name: 'with different dictionary type',\n code: 'func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {',\n },\n {\n name: 'with extra whitespace',\n code: ' func application ( _ application: UIApplication , didFinishLaunchingWithOptions launchOptions: [ NSObject : AnyObject ]? ) -> Bool { ',\n },\n {\n name: 'macOS notification variant',\n code: 'func applicationDidFinishLaunching(_ aNotification: Notification) {',\n },\n {\n name: 'macOS with extra whitespace',\n code: 'func applicationDidFinishLaunching ( _ aNotification: Notification ) {',\n },\n ];\n\n for (const variation of variations) {\n describe(`${variation.name}`, () => {\n it(`should return true`, () => {\n // -- Arrange --\n const filePath = prepareTestFile(variation.code, 'swift');\n\n // -- Act --\n const result = exportForTesting.isAppDelegateFile(filePath);\n\n // -- Assert --\n expect(result).toBeTruthy();\n });\n });\n }\n\n describe('invalid cases', () => {\n const variations: {\n name: string;\n code: string;\n }[] = [\n {\n name: 'missing application method',\n code: 'import UIKit',\n },\n {\n name: 'typo in method name',\n code: 'func applicatioM(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {',\n },\n {\n name: 'garbage input',\n code: 'asdf;jk23;uas()d{',\n },\n ];\n\n for (const variation of variations) {\n describe(`${variation.name}`, () => {\n it('should return false', () => {\n // -- Arrange --\n const filePath = prepareTestFile(variation.code, 'swift');\n\n // -- Act --\n const result = exportForTesting.isAppDelegateFile(filePath);\n\n // -- Assert --\n expect(result).toBeFalsy();\n });\n });\n }\n });\n });\n });\n });\n\n describe('objc files', () => {\n describe('valid cases', () => {\n const variations: {\n name: string;\n code: string;\n }[] = [\n {\n name: 'basic',\n code: '- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {',\n },\n {\n name: 'with more whitespace',\n code: '- ( BOOL ) application: ( UIApplication * ) application didFinishLaunchingWithOptions: ( NSDictionary * ) launchOptions {',\n },\n ];\n\n for (const variation of variations) {\n describe(`${variation.name}`, () => {\n it('should return true', () => {\n // -- Arrange --\n const filePath = prepareTestFile(variation.code, 'm');\n\n // -- Act --\n const result = exportForTesting.isAppDelegateFile(filePath);\n\n // -- Assert --\n expect(result).toBeTruthy();\n });\n });\n }\n });\n\n describe('invalid cases', () => {\n const variations: {\n name: string;\n code: string;\n }[] = [\n {\n name: 'missing application method',\n code: 'import UIKit',\n },\n ];\n\n for (const variation of variations) {\n describe(`${variation.name}`, () => {\n it('should return false', () => {\n // -- Arrange --\n const filePath = prepareTestFile(variation.code, 'm');\n\n // -- Act --\n const result = exportForTesting.isAppDelegateFile(filePath);\n\n // -- Assert --\n expect(result).toBeFalsy();\n });\n });\n }\n });\n });\n\n describe('swiftui files', () => {\n describe('valid cases', () => {\n const variations: {\n name: string;\n code: string;\n }[] = [\n {\n name: 'basic',\n code: '@main struct MyApp: App {',\n },\n {\n name: 'with more whitespace',\n code: '@main struct MyApp: App {',\n },\n {\n name: 'with SwiftUI namespace',\n code: '@main struct App: SwiftUI.App {',\n },\n ];\n\n for (const variation of variations) {\n describe(`${variation.name}`, () => {\n it('should return true', () => {\n // -- Arrange --\n const filePath = prepareTestFile(variation.code, 'swift');\n\n // -- Act --\n const result = exportForTesting.isAppDelegateFile(filePath);\n\n // -- Assert --\n expect(result).toBeTruthy();\n });\n });\n }\n });\n\n describe('invalid cases', () => {\n const variations: {\n name: string;\n code: string;\n }[] = [\n {\n name: 'missing @main',\n code: 'struct App: App {',\n },\n {\n name: 'missing super-type App',\n code: 'struct MyApp {',\n },\n {\n name: 'imported not from SwiftUI',\n code: '@main struct App: MySwiftyUI.App {',\n },\n {\n name: 'imported not from SwiftUI but similar',\n code: '@main struct App: MySwiftUI.App {',\n },\n ];\n\n for (const variation of variations) {\n describe(`${variation.name}`, () => {\n it('should return false', () => {\n // -- Arrange --\n const filePath = prepareTestFile(variation.code, 'swift');\n\n // -- Act --\n const result = exportForTesting.isAppDelegateFile(filePath);\n\n // -- Assert --\n expect(result).toBeFalsy();\n });\n });\n }\n });\n });\n\n describe('file not found', () => {\n it('should throw an error', () => {\n // -- Arrange --\n const invalidPath = path.join(os.tmpdir(), 'invalid-path');\n\n // -- Act & Assert --\n expect(() => exportForTesting.isAppDelegateFile(invalidPath)).toThrow();\n });\n });\n });\n\n describe('#findAppDidFinishLaunchingWithOptions', () => {\n describe('no files given', () => {\n it('should check files in directory', () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n const filePath = prepareAppDelegateFile(\n tempDir,\n validAppDelegateSwift,\n 'swift',\n );\n\n // -- Act --\n const result =\n exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);\n\n // -- Assert --\n expect(result).toBe(filePath);\n });\n });\n\n describe('SwiftUI file found', () => {\n describe('is app delegate', () => {\n it('should return the file path', () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n const filePath = prepareAppDelegateFile(\n tempDir,\n validAppDelegateSwiftUI,\n 'swift',\n );\n\n // -- Act --\n const result =\n exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);\n\n // -- Assert --\n expect(result).toBe(filePath);\n });\n });\n\n describe('is not app delegate', () => {\n it('should be ignored', () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n prepareAppDelegateFile(tempDir, invalidAppDelegateSwiftUI, 'swift');\n\n // -- Act --\n const result =\n exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);\n\n // -- Assert --\n expect(result).toBeNull();\n });\n });\n });\n\n describe('Swift file found', () => {\n describe('is app delegate', () => {\n it('should return the file path', () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n const filePath = prepareAppDelegateFile(\n tempDir,\n validAppDelegateSwift,\n 'swift',\n );\n\n // -- Act --\n const result =\n exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);\n\n // -- Assert --\n expect(result).toBe(filePath);\n });\n });\n\n describe('is not app delegate', () => {\n it('should be ignored', () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n prepareAppDelegateFile(tempDir, invalidAppDelegateSwift, 'swift');\n\n // -- Act --\n const result =\n exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);\n\n // -- Assert --\n expect(result).toBeNull();\n });\n });\n });\n\n describe('Objective-C file found', () => {\n describe('is app delegate', () => {\n it('should return the file path', () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n const filePath = prepareAppDelegateFile(\n tempDir,\n validAppDelegateObjC,\n 'm',\n );\n\n // -- Act --\n const result =\n exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);\n\n // -- Assert --\n expect(result).toBe(filePath);\n });\n });\n\n describe('is not app delegate', () => {\n it('should be ignored', () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n prepareAppDelegateFile(tempDir, invalidAppDelegateObjC, 'm');\n\n // -- Act --\n const result =\n exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);\n\n // -- Assert --\n expect(result).toBeNull();\n });\n });\n });\n\n describe('Objective-C++ file found', () => {\n describe('is app delegate', () => {\n it('should return the file path', () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n const filePath = prepareAppDelegateFile(\n tempDir,\n validAppDelegateObjC,\n 'mm',\n );\n\n // -- Act --\n const result = exportForTesting.findAppDidFinishLaunchingWithOptions(\n tempDir,\n [filePath],\n );\n\n // -- Assert --\n expect(result).toBe(filePath);\n });\n });\n\n describe('is not app delegate', () => {\n it('should be ignored', () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n prepareAppDelegateFile(tempDir, invalidAppDelegateObjC, 'mm');\n\n // -- Act --\n const result =\n exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);\n\n // -- Assert --\n expect(result).toBeNull();\n });\n });\n });\n\n describe('file in list not found', () => {\n it('should return null', () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n const filePath = prepareAppDelegateFile(\n tempDir,\n invalidAppDelegateSwift,\n 'swift',\n );\n\n // -- Act --\n const result = exportForTesting.findAppDidFinishLaunchingWithOptions(\n tempDir,\n [filePath],\n );\n\n // -- Assert --\n expect(result).toBeNull();\n });\n });\n\n describe('unrelated file found', () => {\n it('should be ignored', () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n const filePath = prepareAppDelegateFile(\n tempDir,\n invalidAppDelegateSwift,\n 'swift',\n );\n\n // -- Act --\n const result = exportForTesting.findAppDidFinishLaunchingWithOptions(\n tempDir,\n [filePath],\n );\n\n // -- Assert --\n expect(result).toBeNull();\n });\n });\n\n describe('directory in list', () => {\n describe('name starts with dot', () => {\n it('should be ignored', () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n\n const hiddenDir = path.join(tempDir, '.hidden');\n fs.mkdirSync(hiddenDir);\n\n prepareAppDelegateFile(hiddenDir, validAppDelegateSwift, 'swift');\n\n // -- Act --\n const result =\n exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);\n\n // -- Assert --\n expect(result).toBeNull();\n });\n });\n\n describe('name ends with .xcodeproj', () => {\n it('should be ignored', () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n const xcodeDir = path.join(tempDir, 'MyProject.xcodeproj');\n fs.mkdirSync(xcodeDir);\n\n prepareAppDelegateFile(xcodeDir, validAppDelegateSwift, 'swift');\n\n // -- Act --\n const result =\n exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);\n\n // -- Assert --\n expect(result).toBeNull();\n });\n });\n\n describe('name ends with .xcassets', () => {\n it('should be ignored', () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n const xcassetsDir = path.join(tempDir, 'MyProject.xcassets');\n fs.mkdirSync(xcassetsDir);\n\n prepareAppDelegateFile(xcassetsDir, validAppDelegateSwift, 'swift');\n\n // -- Act --\n const result =\n exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);\n\n // -- Assert --\n expect(result).toBeNull();\n });\n });\n\n describe('is not a directory', () => {\n it('should be ignored', () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n const filePath = path.join(tempDir, 'some-file');\n fs.writeFileSync(filePath, validAppDelegateSwift, 'utf8');\n\n // -- Act --\n const result =\n exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);\n\n // -- Assert --\n expect(result).toBeNull();\n });\n });\n });\n\n describe('multiple files could be app delegate', () => {\n it('should return the first one', () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n const filePath = prepareAppDelegateFile(\n tempDir,\n validAppDelegateSwift,\n 'swift',\n );\n prepareAppDelegateFile(tempDir, validAppDelegateSwift, 'swift');\n\n // -- Act --\n const result =\n exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);\n\n // -- Assert --\n expect(result).toBe(filePath);\n });\n });\n\n describe('multiple nested directories with app delegate', () => {\n it('should return the first one', () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n\n const nestedDir = path.join(tempDir, 'nested');\n fs.mkdirSync(nestedDir);\n const nestedFilePath = prepareAppDelegateFile(\n nestedDir,\n validAppDelegateSwift,\n 'swift',\n );\n\n const nestedDir2 = path.join(tempDir, 'nested2');\n fs.mkdirSync(nestedDir2);\n prepareAppDelegateFile(nestedDir2, validAppDelegateSwift, 'swift');\n\n // -- Act --\n const result =\n exportForTesting.findAppDidFinishLaunchingWithOptions(tempDir);\n\n // -- Assert --\n expect(result).toBe(nestedFilePath);\n });\n });\n\n describe('no app delegate found', () => {\n it('should return null', () => {\n // -- Arrange --\n const tempDir = fs.mkdtempSync(\n path.join(os.tmpdir(), 'code-tools-test'),\n );\n\n // -- Act --\n const result = exportForTesting.findAppDidFinishLaunchingWithOptions(\n tempDir,\n [],\n );\n\n // -- Assert --\n expect(result).toBeNull();\n });\n });\n });\n\n describe('#addCodeSnippetToProject', () => {\n describe('app delegate file is not found', () => {\n it('should return false', () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n\n // -- Act --\n const result = addCodeSnippetToProject(\n tempDir,\n ['AppDelegate.swift'],\n 'https://example.com/sentry-dsn',\n );\n\n // -- Assert --\n expect(result).toBeFalsy();\n });\n });\n\n describe('app delegate file is found', () => {\n let tempDir: string;\n let appDelegatePath: string;\n\n beforeEach(() => {\n // -- Arrange --\n tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'code-tools-test'));\n appDelegatePath = path.join(tempDir, 'AppDelegate.swift');\n fs.writeFileSync(appDelegatePath, validAppDelegateSwift, 'utf8');\n });\n\n describe('is Swift file', () => {\n describe('Sentry is not initialized', () => {\n let tempDir: string;\n let filePath: string;\n\n beforeEach(() => {\n tempDir = prepareTempDir();\n filePath = prepareAppDelegateFile(\n tempDir,\n validAppDelegateSwift,\n 'swift',\n );\n });\n\n it('should add the code snippet', () => {\n // -- Act --\n const result = addCodeSnippetToProject(tempDir, [filePath], dsn);\n\n // -- Assert --\n expect(result).toBeTruthy();\n const modifiedFileContent = fs.readFileSync(filePath, 'utf8');\n expect(modifiedFileContent).toBe(validAppDelegateSwiftWithSentry);\n });\n\n it(\"should set tag 'code-language'\", () => {\n // -- Act --\n const result = addCodeSnippetToProject(tempDir, [filePath], dsn);\n\n // -- Assert --\n expect(result).toBeTruthy();\n expect(Sentry.setTag).toHaveBeenCalledWith(\n 'code-language',\n 'swift',\n );\n });\n\n it(\"should set tag 'ui-engine'\", () => {\n // -- Act --\n const result = addCodeSnippetToProject(tempDir, [filePath], dsn);\n\n // -- Assert --\n expect(result).toBeTruthy();\n expect(Sentry.setTag).toHaveBeenCalledWith('ui-engine', 'uikit');\n });\n });\n\n describe('Sentry is already initialized', () => {\n it('should not add the code snippet', () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n const filePath = prepareAppDelegateFile(\n tempDir,\n validAppDelegateSwiftWithSentry,\n 'swift',\n );\n\n // -- Act --\n const result = addCodeSnippetToProject(tempDir, [filePath], dsn);\n\n // -- Assert --\n expect(result).toBeTruthy();\n const modifiedFileContent = fs.readFileSync(filePath, 'utf8');\n expect(modifiedFileContent).toBe(validAppDelegateSwiftWithSentry);\n });\n });\n\n describe('is SwiftUI file', () => {\n describe('Sentry is not initialized', () => {\n let tempDir: string;\n let filePath: string;\n\n beforeEach(() => {\n tempDir = prepareTempDir();\n filePath = prepareAppDelegateFile(\n tempDir,\n validAppDelegateSwiftUI,\n 'swift',\n );\n });\n\n it('should add the code snippet', () => {\n // -- Act --\n const result = addCodeSnippetToProject(tempDir, [filePath], dsn);\n\n // -- Assert --\n expect(result).toBeTruthy();\n const modifiedFileContent = fs.readFileSync(filePath, 'utf8');\n expect(modifiedFileContent).toBe(\n validAppDelegateSwiftUIWithSentry,\n );\n });\n\n it(\"should set tag 'code-language'\", () => {\n // -- Act --\n const result = addCodeSnippetToProject(tempDir, [filePath], dsn);\n\n // -- Assert --\n expect(result).toBeTruthy();\n expect(Sentry.setTag).toHaveBeenNthCalledWith(\n 1,\n 'code-language',\n 'swift',\n );\n });\n\n it(\"should set tag 'ui-engine'\", () => {\n // -- Act --\n const result = addCodeSnippetToProject(tempDir, [filePath], dsn);\n\n // -- Assert --\n expect(result).toBeTruthy();\n expect(Sentry.setTag).toHaveBeenNthCalledWith(\n 2,\n 'ui-engine',\n 'swiftui',\n );\n });\n });\n\n describe('Sentry is already initialized', () => {\n it('should not add the code snippet', () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n const filePath = prepareAppDelegateFile(\n tempDir,\n validAppDelegateSwiftUIWithSentry,\n 'swift',\n );\n\n // -- Act --\n const result = addCodeSnippetToProject(tempDir, [filePath], dsn);\n\n // -- Assert --\n expect(result).toBeTruthy();\n const modifiedFileContent = fs.readFileSync(filePath, 'utf8');\n expect(modifiedFileContent).toBe(\n validAppDelegateSwiftUIWithSentry,\n );\n });\n });\n });\n\n describe('is not matching SwiftUI regex', () => {\n it('should not add the code snippet', () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n const filePath = prepareAppDelegateFile(\n tempDir,\n invalidAppDelegateSwiftUI,\n 'swift',\n );\n\n // -- Act --\n const result = addCodeSnippetToProject(tempDir, [filePath], dsn);\n\n // -- Assert --\n expect(result).toBeFalsy();\n });\n });\n });\n\n describe('is Objective-C file', () => {\n describe('Sentry is not initialized', () => {\n it('should add the code snippet', () => {\n // -- Act --\n const tempDir = prepareTempDir();\n const filePath = prepareAppDelegateFile(\n tempDir,\n validAppDelegateObjC,\n 'm',\n );\n\n // -- Act --\n const result = addCodeSnippetToProject(tempDir, [filePath], dsn);\n\n // -- Assert --\n expect(result).toBeTruthy();\n const modifiedFileContent = fs.readFileSync(filePath, 'utf8');\n expect(modifiedFileContent).toBe(validAppDelegateObjCWithSentry);\n });\n });\n\n describe('Sentry is already initialized', () => {\n let tempDir: string;\n let filePath: string;\n\n beforeEach(() => {\n tempDir = prepareTempDir();\n filePath = prepareAppDelegateFile(\n tempDir,\n validAppDelegateObjCWithSentry,\n 'm',\n );\n });\n\n it('should not add the code snippet', () => {\n // -- Act --\n const result = addCodeSnippetToProject(tempDir, [filePath], dsn);\n\n // -- Assert --\n expect(result).toBeTruthy();\n const modifiedFileContent = fs.readFileSync(filePath, 'utf8');\n expect(modifiedFileContent).toBe(validAppDelegateObjCWithSentry);\n });\n\n it('should log info', () => {\n // -- Act --\n const result = addCodeSnippetToProject(tempDir, [filePath], dsn);\n\n // -- Assert --\n expect(result).toBeTruthy();\n expect(clack.log.info).toHaveBeenCalledWith(\n 'Sentry is already initialized in your AppDelegate. Skipping adding the code snippet.',\n );\n });\n });\n\n it(\"should set tag 'code-language'\", () => {\n // -- Arrange --\n const tempDir = prepareTempDir();\n const filePath = prepareAppDelegateFile(\n tempDir,\n validAppDelegateObjC,\n 'm',\n );\n\n // -- Act --\n const result = addCodeSnippetToProject(tempDir, [filePath], dsn);\n\n // -- Assert --\n expect(result).toBeTruthy();\n expect(Sentry.setTag).toHaveBeenCalledWith('code-language', 'objc');\n });\n });\n });\n });\n});\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,431 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
26
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
27
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
28
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
29
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
30
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
31
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
32
|
+
});
|
|
33
|
+
};
|
|
34
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
35
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
36
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
37
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
38
|
+
function step(op) {
|
|
39
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
40
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
41
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
42
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
43
|
+
switch (op[0]) {
|
|
44
|
+
case 0: case 1: t = op; break;
|
|
45
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
46
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
47
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
48
|
+
default:
|
|
49
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
50
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
51
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
52
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
53
|
+
if (t[2]) _.ops.pop();
|
|
54
|
+
_.trys.pop(); continue;
|
|
55
|
+
}
|
|
56
|
+
op = body.call(thisArg, _);
|
|
57
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
58
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
62
|
+
var fs = __importStar(require("fs"));
|
|
63
|
+
var os = __importStar(require("os"));
|
|
64
|
+
var path = __importStar(require("path"));
|
|
65
|
+
var fastlane_1 = require("../../src/apple/fastlane");
|
|
66
|
+
// @ts-ignore - clack is ESM and TS complains about that. It works though
|
|
67
|
+
var clack = __importStar(require("@clack/prompts"));
|
|
68
|
+
describe('fastlane', function () {
|
|
69
|
+
beforeEach(function () {
|
|
70
|
+
jest.spyOn(clack.log, 'warn').mockImplementation();
|
|
71
|
+
jest.spyOn(clack, 'select').mockResolvedValue(undefined);
|
|
72
|
+
});
|
|
73
|
+
describe('#fastFile', function () {
|
|
74
|
+
describe('file exists', function () {
|
|
75
|
+
it('should return path', function () {
|
|
76
|
+
// -- Arrange --
|
|
77
|
+
var _a = createFastlaneDir(), fastlaneDir = _a.fastlaneDir, projectPath = _a.projectPath;
|
|
78
|
+
var fastfile = createFastfile(fastlaneDir, 'lane :test do');
|
|
79
|
+
// -- Act --
|
|
80
|
+
var result = (0, fastlane_1.fastFile)(projectPath);
|
|
81
|
+
// -- Assert --
|
|
82
|
+
expect(result).toBe(fastfile);
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
describe('file does not exist', function () {
|
|
86
|
+
it('should return null', function () {
|
|
87
|
+
// -- Arrange --
|
|
88
|
+
var projectPath = createFastlaneDir().projectPath;
|
|
89
|
+
// do not create Fastfile
|
|
90
|
+
// -- Act --
|
|
91
|
+
var result = (0, fastlane_1.fastFile)(projectPath);
|
|
92
|
+
// -- Assert --
|
|
93
|
+
expect(result).toBeNull();
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
describe('#findIOSPlatform', function () {
|
|
98
|
+
describe('platform block detection', function () {
|
|
99
|
+
var variations = [
|
|
100
|
+
{
|
|
101
|
+
name: 'no platform',
|
|
102
|
+
content: "lane :test do\nend",
|
|
103
|
+
expected: { index: 0, length: 17 },
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
name: 'platform is ios',
|
|
107
|
+
content: "platform: ios\nlane :test do\nend",
|
|
108
|
+
expected: { index: 0, length: 31 },
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
name: 'platform is ios and other platform',
|
|
112
|
+
content: "platform: ios\nend\nplatform: android\n lane :test do\n end",
|
|
113
|
+
expected: { index: 0, length: 57 },
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
name: 'platform is ios and other platform',
|
|
117
|
+
content: "\n\t\tplatform: ios\n\t\tend\n\t\tplatform: android\n\t\t\tlane :test do\n\t\t\tend",
|
|
118
|
+
expected: { index: 0, length: 66 },
|
|
119
|
+
},
|
|
120
|
+
];
|
|
121
|
+
var _loop_1 = function (variation) {
|
|
122
|
+
describe("".concat(variation.name), function () {
|
|
123
|
+
it('should return null', function () {
|
|
124
|
+
// -- Act --
|
|
125
|
+
var result = fastlane_1.exportForTesting.findIOSPlatform(variation.content);
|
|
126
|
+
// -- Assert --
|
|
127
|
+
expect(result).toEqual(variation.expected);
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
};
|
|
131
|
+
for (var _i = 0, variations_1 = variations; _i < variations_1.length; _i++) {
|
|
132
|
+
var variation = variations_1[_i];
|
|
133
|
+
_loop_1(variation);
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
describe('platform block not found', function () {
|
|
137
|
+
it('should return full content', function () {
|
|
138
|
+
// -- Arrange --
|
|
139
|
+
var content = "\n lane :test do\n puts 'Hello, world!'\n end";
|
|
140
|
+
// -- Act --
|
|
141
|
+
var result = fastlane_1.exportForTesting.findIOSPlatform(content);
|
|
142
|
+
// -- Assert --
|
|
143
|
+
expect(result).toEqual({ index: 0, length: 65 });
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
describe('invalid platform block', function () {
|
|
147
|
+
it('should return null', function () {
|
|
148
|
+
// -- Arrange --
|
|
149
|
+
// platform block is not opened with `do`
|
|
150
|
+
var content = "\nplatform :ios\n\n lane :test do\n puts 'Hello, world!'\n end\nend\n";
|
|
151
|
+
// -- Act --
|
|
152
|
+
var result = fastlane_1.exportForTesting.findIOSPlatform(content);
|
|
153
|
+
// -- Assert --
|
|
154
|
+
expect(result).toBeNull();
|
|
155
|
+
});
|
|
156
|
+
});
|
|
157
|
+
describe('platform block is not closed', function () {
|
|
158
|
+
it('should return null', function () {
|
|
159
|
+
// -- Arrange --
|
|
160
|
+
var content = "\nplatform :ios do\n lane :test do\n puts 'Hello, world!'\n end\n";
|
|
161
|
+
// -- Act --
|
|
162
|
+
var result = fastlane_1.exportForTesting.findIOSPlatform(content);
|
|
163
|
+
// -- Assert --
|
|
164
|
+
expect(result).toBeNull();
|
|
165
|
+
});
|
|
166
|
+
});
|
|
167
|
+
describe('multiple platforms detected', function () {
|
|
168
|
+
it('should return block with ios platform', function () {
|
|
169
|
+
// -- Arrange --
|
|
170
|
+
var content = "\nfastlane_version '2.53.1'\n\nbefore_all do\n ensure_git_branch\n ensure_git_status_clean\n git_pull\nend\n\nplatform :ios do\n # iOS Lanes\nend\n\nplatform :android do\n # Android Lanes\nend\n";
|
|
171
|
+
// -- Act --
|
|
172
|
+
var result = fastlane_1.exportForTesting.findIOSPlatform(content);
|
|
173
|
+
// -- Assert --
|
|
174
|
+
expect(result).toEqual({ index: 121, length: 15 });
|
|
175
|
+
});
|
|
176
|
+
});
|
|
177
|
+
});
|
|
178
|
+
describe('#findLanes', function () {
|
|
179
|
+
describe('lanes detection', function () {
|
|
180
|
+
describe('valid cases', function () {
|
|
181
|
+
var variations = [
|
|
182
|
+
{
|
|
183
|
+
name: 'single lane',
|
|
184
|
+
content: "\n lane :test do\n puts 'Hello, world!'\n end\n",
|
|
185
|
+
expected: [{ index: 17, length: 25, name: 'test' }],
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
name: 'multiple lanes',
|
|
189
|
+
content: "\n lane :test do\n puts 'Hello, world!'\n end\n lane :test2 do\n puts 'Hello, world!'\n end",
|
|
190
|
+
expected: [
|
|
191
|
+
{ index: 17, length: 25, name: 'test' },
|
|
192
|
+
{ index: 65, length: 25, name: 'test2' },
|
|
193
|
+
],
|
|
194
|
+
},
|
|
195
|
+
];
|
|
196
|
+
var _loop_2 = function (variation) {
|
|
197
|
+
describe("".concat(variation.name), function () {
|
|
198
|
+
it('should return lanes', function () {
|
|
199
|
+
// -- Act --
|
|
200
|
+
var result = fastlane_1.exportForTesting.findLanes(variation.content);
|
|
201
|
+
// -- Assert --
|
|
202
|
+
expect(result).toEqual(variation.expected);
|
|
203
|
+
});
|
|
204
|
+
});
|
|
205
|
+
};
|
|
206
|
+
for (var _i = 0, variations_2 = variations; _i < variations_2.length; _i++) {
|
|
207
|
+
var variation = variations_2[_i];
|
|
208
|
+
_loop_2(variation);
|
|
209
|
+
}
|
|
210
|
+
});
|
|
211
|
+
describe('invalid cases', function () {
|
|
212
|
+
describe('lane is not indented', function () {
|
|
213
|
+
it('should return null', function () {
|
|
214
|
+
// -- Arrange --
|
|
215
|
+
var content = "lane :test do\nend";
|
|
216
|
+
// -- Act --
|
|
217
|
+
var result = fastlane_1.exportForTesting.findLanes(content);
|
|
218
|
+
// -- Assert --
|
|
219
|
+
expect(result).toBeNull();
|
|
220
|
+
});
|
|
221
|
+
});
|
|
222
|
+
describe('lane is not closed', function () {
|
|
223
|
+
it('should return null', function () {
|
|
224
|
+
// -- Arrange --
|
|
225
|
+
var content = " lane :test do\n";
|
|
226
|
+
// -- Act --
|
|
227
|
+
var result = fastlane_1.exportForTesting.findLanes(content);
|
|
228
|
+
// -- Assert --
|
|
229
|
+
expect(result).toBeNull();
|
|
230
|
+
});
|
|
231
|
+
});
|
|
232
|
+
});
|
|
233
|
+
});
|
|
234
|
+
});
|
|
235
|
+
describe('#addSentryToLane', function () {
|
|
236
|
+
describe('sentry_cli is not present', function () {
|
|
237
|
+
it('should return original content', function () {
|
|
238
|
+
// -- Arrange --
|
|
239
|
+
var content = "\nplatform :ios do\n lane :test do\n puts 'Hello, world!'\n end\nend\n";
|
|
240
|
+
var lane = { index: 34, length: 25, name: 'test' };
|
|
241
|
+
// -- Act --
|
|
242
|
+
var result = fastlane_1.exportForTesting.addSentryToLane(content, lane, 'test-org', 'test-project');
|
|
243
|
+
// -- Assert --
|
|
244
|
+
expect(result).toBe("\nplatform :ios do\n lane :test do\n puts 'Hello, world!'\n\n sentry_cli(\n org_slug: 'test-org',\n project_slug: 'test-project',\n include_sources: true\n )\n end\nend\n");
|
|
245
|
+
});
|
|
246
|
+
});
|
|
247
|
+
describe('sentry_cli is present', function () {
|
|
248
|
+
it('should return updated content', function () {
|
|
249
|
+
// -- Arrange --
|
|
250
|
+
var content = "\nplatform :ios do\n lane :test do\n puts 'Hello, world!'\n\n sentry_cli(org_slug: 'test-org', project_slug: 'test-project')\n end\nend\n";
|
|
251
|
+
var lane = { index: 34, length: 92, name: 'test' };
|
|
252
|
+
// -- Act --
|
|
253
|
+
var result = fastlane_1.exportForTesting.addSentryToLane(content, lane, 'test-org', 'test-project');
|
|
254
|
+
// -- Assert --
|
|
255
|
+
expect(result).toBe("\nplatform :ios do\n lane :test do\n puts 'Hello, world!'\n\n sentry_cli(\n org_slug: 'test-org',\n project_slug: 'test-project',\n include_sources: true\n )\n end\nend\n");
|
|
256
|
+
});
|
|
257
|
+
});
|
|
258
|
+
});
|
|
259
|
+
describe('#addSentryToFastlane', function () {
|
|
260
|
+
var org = 'test-org';
|
|
261
|
+
var project = 'test-project';
|
|
262
|
+
describe('Fastfile not found', function () {
|
|
263
|
+
it('should return false', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
264
|
+
var projectPath, fastfilePath, result;
|
|
265
|
+
return __generator(this, function (_a) {
|
|
266
|
+
switch (_a.label) {
|
|
267
|
+
case 0:
|
|
268
|
+
projectPath = createFastlaneDir().projectPath;
|
|
269
|
+
fastfilePath = path.join(projectPath, 'Fastfile');
|
|
270
|
+
return [4 /*yield*/, (0, fastlane_1.addSentryToFastlane)(projectPath, org, project)];
|
|
271
|
+
case 1:
|
|
272
|
+
result = _a.sent();
|
|
273
|
+
// -- Assert --
|
|
274
|
+
expect(result).toBe(false);
|
|
275
|
+
expect(fs.existsSync(fastfilePath)).toBe(false);
|
|
276
|
+
return [2 /*return*/];
|
|
277
|
+
}
|
|
278
|
+
});
|
|
279
|
+
}); });
|
|
280
|
+
});
|
|
281
|
+
describe('platform not found', function () {
|
|
282
|
+
it('should return false', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
283
|
+
var _a, fastlaneDir, projectPath, fastfilePath, originalContent, result;
|
|
284
|
+
return __generator(this, function (_b) {
|
|
285
|
+
switch (_b.label) {
|
|
286
|
+
case 0:
|
|
287
|
+
_a = createFastlaneDir(), fastlaneDir = _a.fastlaneDir, projectPath = _a.projectPath;
|
|
288
|
+
fastfilePath = createFastfile(fastlaneDir, "\nplatform :ios\n lane :test do\n puts 'Hello, world!'\n end\nend\n");
|
|
289
|
+
originalContent = fs.readFileSync(fastfilePath, 'utf8');
|
|
290
|
+
return [4 /*yield*/, (0, fastlane_1.addSentryToFastlane)(projectPath, org, project)];
|
|
291
|
+
case 1:
|
|
292
|
+
result = _b.sent();
|
|
293
|
+
// -- Assert --
|
|
294
|
+
expect(result).toBe(false);
|
|
295
|
+
expect(fs.readFileSync(fastfilePath, 'utf8')).toBe(originalContent);
|
|
296
|
+
return [2 /*return*/];
|
|
297
|
+
}
|
|
298
|
+
});
|
|
299
|
+
}); });
|
|
300
|
+
});
|
|
301
|
+
describe('no lanes', function () {
|
|
302
|
+
it('should return false', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
303
|
+
var _a, fastlaneDir, projectPath, result;
|
|
304
|
+
return __generator(this, function (_b) {
|
|
305
|
+
switch (_b.label) {
|
|
306
|
+
case 0:
|
|
307
|
+
_a = createFastlaneDir(), fastlaneDir = _a.fastlaneDir, projectPath = _a.projectPath;
|
|
308
|
+
createFastfile(fastlaneDir, "platform :ios");
|
|
309
|
+
return [4 /*yield*/, (0, fastlane_1.addSentryToFastlane)(projectPath, org, project)];
|
|
310
|
+
case 1:
|
|
311
|
+
result = _b.sent();
|
|
312
|
+
// -- Assert --
|
|
313
|
+
expect(result).toBe(false);
|
|
314
|
+
return [2 /*return*/];
|
|
315
|
+
}
|
|
316
|
+
});
|
|
317
|
+
}); });
|
|
318
|
+
it('should warn user', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
319
|
+
var _a, fastlaneDir, projectPath, result;
|
|
320
|
+
return __generator(this, function (_b) {
|
|
321
|
+
switch (_b.label) {
|
|
322
|
+
case 0:
|
|
323
|
+
_a = createFastlaneDir(), fastlaneDir = _a.fastlaneDir, projectPath = _a.projectPath;
|
|
324
|
+
createFastfile(fastlaneDir, "platform :ios");
|
|
325
|
+
return [4 /*yield*/, (0, fastlane_1.addSentryToFastlane)(projectPath, org, project)];
|
|
326
|
+
case 1:
|
|
327
|
+
result = _b.sent();
|
|
328
|
+
// -- Assert --
|
|
329
|
+
expect(result).toBe(false);
|
|
330
|
+
expect(clack.log.warn).toHaveBeenCalledWith('No suitable lanes in your Fastfile.');
|
|
331
|
+
return [2 /*return*/];
|
|
332
|
+
}
|
|
333
|
+
});
|
|
334
|
+
}); });
|
|
335
|
+
});
|
|
336
|
+
describe('single lane', function () {
|
|
337
|
+
it('should return true', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
338
|
+
var _a, fastlaneDir, projectPath, fastfilePath, result;
|
|
339
|
+
return __generator(this, function (_b) {
|
|
340
|
+
switch (_b.label) {
|
|
341
|
+
case 0:
|
|
342
|
+
_a = createFastlaneDir(), fastlaneDir = _a.fastlaneDir, projectPath = _a.projectPath;
|
|
343
|
+
fastfilePath = createFastfile(fastlaneDir, "\nplatform :ios do\n lane :test do\n puts 'Hello, world!'\n end \nend\n");
|
|
344
|
+
return [4 /*yield*/, (0, fastlane_1.addSentryToFastlane)(projectPath, org, project)];
|
|
345
|
+
case 1:
|
|
346
|
+
result = _b.sent();
|
|
347
|
+
// -- Assert --
|
|
348
|
+
expect(result).toBe(true);
|
|
349
|
+
expect(fs.readFileSync(fastfilePath, 'utf8')).toBe("\nplatform :ios do\n lane :test do\n puts 'Hello, world!'\n\n sentry_cli(\n org_slug: 'test-org',\n project_slug: 'test-project',\n include_sources: true\n )\n end \nend\n");
|
|
350
|
+
return [2 /*return*/];
|
|
351
|
+
}
|
|
352
|
+
});
|
|
353
|
+
}); });
|
|
354
|
+
});
|
|
355
|
+
describe('multiple lanes', function () {
|
|
356
|
+
var fastfilePath;
|
|
357
|
+
var projectPath;
|
|
358
|
+
var originalContent;
|
|
359
|
+
beforeEach(function () {
|
|
360
|
+
var createdFastlaneDir = createFastlaneDir();
|
|
361
|
+
projectPath = createdFastlaneDir.projectPath;
|
|
362
|
+
fastfilePath = createFastfile(createdFastlaneDir.fastlaneDir, "platform :ios do\n lane :test do\n puts 'Hello, world!'\n end \n\n lane :beta do\n puts 'Beta lane'\n end\nend\n");
|
|
363
|
+
});
|
|
364
|
+
describe('no lane selected', function () {
|
|
365
|
+
it('should not modify Fastfile', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
366
|
+
var result;
|
|
367
|
+
return __generator(this, function (_a) {
|
|
368
|
+
switch (_a.label) {
|
|
369
|
+
case 0:
|
|
370
|
+
// -- Arrange --
|
|
371
|
+
originalContent = fs.readFileSync(fastfilePath, 'utf8');
|
|
372
|
+
jest.spyOn(clack, 'select').mockResolvedValue(undefined);
|
|
373
|
+
return [4 /*yield*/, (0, fastlane_1.addSentryToFastlane)(projectPath, org, project)];
|
|
374
|
+
case 1:
|
|
375
|
+
result = _a.sent();
|
|
376
|
+
// -- Assert --
|
|
377
|
+
expect(result).toBe(false);
|
|
378
|
+
expect(fs.readFileSync(fastfilePath, 'utf8')).toBe(originalContent);
|
|
379
|
+
return [2 /*return*/];
|
|
380
|
+
}
|
|
381
|
+
});
|
|
382
|
+
}); });
|
|
383
|
+
});
|
|
384
|
+
describe('lane selected', function () {
|
|
385
|
+
it('should modify only selected lane', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
386
|
+
var result;
|
|
387
|
+
return __generator(this, function (_a) {
|
|
388
|
+
switch (_a.label) {
|
|
389
|
+
case 0:
|
|
390
|
+
// -- Arrange --
|
|
391
|
+
jest.spyOn(clack, 'select').mockResolvedValue({
|
|
392
|
+
value: 'beta',
|
|
393
|
+
index: 1,
|
|
394
|
+
});
|
|
395
|
+
return [4 /*yield*/, (0, fastlane_1.addSentryToFastlane)(projectPath, org, project)];
|
|
396
|
+
case 1:
|
|
397
|
+
result = _a.sent();
|
|
398
|
+
// -- Assert --
|
|
399
|
+
expect(result).toBe(true);
|
|
400
|
+
expect(fs.readFileSync(fastfilePath, 'utf8')).toBe("platform :ios do\n lane :test do\n puts 'Hello, world!'\n end \n\n lane :beta do\n puts 'Beta lane'\n\n sentry_cli(\n org_slug: 'test-org',\n project_slug: 'test-project',\n include_sources: true\n )\n end\nend\n");
|
|
401
|
+
expect(clack.select).toHaveBeenCalledWith({
|
|
402
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
403
|
+
maxItems: expect.any(Number),
|
|
404
|
+
message: 'Select lane to add Sentry to:',
|
|
405
|
+
options: [
|
|
406
|
+
{ value: { value: 'test', index: 0 }, label: 'test' },
|
|
407
|
+
{ value: { value: 'beta', index: 1 }, label: 'beta' },
|
|
408
|
+
],
|
|
409
|
+
});
|
|
410
|
+
return [2 /*return*/];
|
|
411
|
+
}
|
|
412
|
+
});
|
|
413
|
+
}); });
|
|
414
|
+
});
|
|
415
|
+
});
|
|
416
|
+
});
|
|
417
|
+
});
|
|
418
|
+
function createFastlaneDir() {
|
|
419
|
+
var projectPath = fs.mkdtempSync(path.join(os.tmpdir(), 'test-project'));
|
|
420
|
+
var fastlaneDir = path.join(projectPath, 'fastlane');
|
|
421
|
+
fs.mkdirSync(fastlaneDir, {
|
|
422
|
+
recursive: true,
|
|
423
|
+
});
|
|
424
|
+
return { fastlaneDir: fastlaneDir, projectPath: projectPath };
|
|
425
|
+
}
|
|
426
|
+
function createFastfile(fastlaneDir, content) {
|
|
427
|
+
var fastfile = path.join(fastlaneDir, 'Fastfile');
|
|
428
|
+
fs.writeFileSync(fastfile, content);
|
|
429
|
+
return fastfile;
|
|
430
|
+
}
|
|
431
|
+
//# sourceMappingURL=fastfile.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fastfile.test.js","sourceRoot":"","sources":["../../../test/apple/fastfile.test.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from 'fs';\nimport * as os from 'os';\nimport * as path from 'path';\nimport {\n addSentryToFastlane,\n exportForTesting,\n fastFile,\n} from '../../src/apple/fastlane';\n// @ts-ignore - clack is ESM and TS complains about that. It works though\nimport * as clack from '@clack/prompts';\n\ndescribe('fastlane', () => {\n beforeEach(() => {\n jest.spyOn(clack.log, 'warn').mockImplementation();\n jest.spyOn(clack, 'select').mockResolvedValue(undefined);\n });\n\n describe('#fastFile', () => {\n describe('file exists', () => {\n it('should return path', () => {\n // -- Arrange --\n const { fastlaneDir, projectPath } = createFastlaneDir();\n const fastfile = createFastfile(fastlaneDir, 'lane :test do');\n\n // -- Act --\n const result = fastFile(projectPath);\n\n // -- Assert --\n expect(result).toBe(fastfile);\n });\n });\n\n describe('file does not exist', () => {\n it('should return null', () => {\n // -- Arrange --\n const { projectPath } = createFastlaneDir();\n // do not create Fastfile\n\n // -- Act --\n const result = fastFile(projectPath);\n\n // -- Assert --\n expect(result).toBeNull();\n });\n });\n });\n\n describe('#findIOSPlatform', () => {\n describe('platform block detection', () => {\n const variations: {\n name: string;\n content: string;\n expected: { index: number; length: number };\n }[] = [\n {\n name: 'no platform',\n content: `lane :test do\nend`,\n expected: { index: 0, length: 17 },\n },\n {\n name: 'platform is ios',\n content: `platform: ios\nlane :test do\nend`,\n expected: { index: 0, length: 31 },\n },\n {\n name: 'platform is ios and other platform',\n content: `platform: ios\nend\nplatform: android\n lane :test do\n end`,\n expected: { index: 0, length: 57 },\n },\n {\n name: 'platform is ios and other platform',\n content: `\n\\t\\tplatform: ios\n\\t\\tend\n\\t\\tplatform: android\n\\t\\t\\tlane :test do\n\\t\\t\\tend`,\n expected: { index: 0, length: 66 },\n },\n ];\n\n for (const variation of variations) {\n describe(`${variation.name}`, () => {\n it('should return null', () => {\n // -- Act --\n const result = exportForTesting.findIOSPlatform(variation.content);\n\n // -- Assert --\n expect(result).toEqual(variation.expected);\n });\n });\n }\n });\n\n describe('platform block not found', () => {\n it('should return full content', () => {\n // -- Arrange --\n const content = `\n lane :test do\n puts 'Hello, world!'\n end`;\n\n // -- Act --\n const result = exportForTesting.findIOSPlatform(content);\n\n // -- Assert --\n expect(result).toEqual({ index: 0, length: 65 });\n });\n });\n\n describe('invalid platform block', () => {\n it('should return null', () => {\n // -- Arrange --\n // platform block is not opened with `do`\n const content = `\nplatform :ios\\n\n lane :test do\n puts 'Hello, world!'\n end\nend\n`;\n\n // -- Act --\n const result = exportForTesting.findIOSPlatform(content);\n\n // -- Assert --\n expect(result).toBeNull();\n });\n });\n\n describe('platform block is not closed', () => {\n it('should return null', () => {\n // -- Arrange --\n const content = `\nplatform :ios do\n lane :test do\n puts 'Hello, world!'\n end\n`;\n\n // -- Act --\n const result = exportForTesting.findIOSPlatform(content);\n\n // -- Assert --\n expect(result).toBeNull();\n });\n });\n\n describe('multiple platforms detected', () => {\n it('should return block with ios platform', () => {\n // -- Arrange --\n const content = `\nfastlane_version '2.53.1'\n\nbefore_all do\n ensure_git_branch\n ensure_git_status_clean\n git_pull\nend\n\nplatform :ios do\n # iOS Lanes\nend\n\nplatform :android do\n # Android Lanes\nend\n`;\n // -- Act --\n const result = exportForTesting.findIOSPlatform(content);\n\n // -- Assert --\n expect(result).toEqual({ index: 121, length: 15 });\n });\n });\n });\n\n describe('#findLanes', () => {\n describe('lanes detection', () => {\n describe('valid cases', () => {\n const variations: {\n name: string;\n content: string;\n expected: { index: number; length: number; name: string }[] | null;\n }[] = [\n {\n name: 'single lane',\n content: `\n lane :test do\n puts 'Hello, world!'\n end\n`,\n expected: [{ index: 17, length: 25, name: 'test' }],\n },\n {\n name: 'multiple lanes',\n content: `\n lane :test do\n puts 'Hello, world!'\n end\n lane :test2 do\n puts 'Hello, world!'\n end`,\n expected: [\n { index: 17, length: 25, name: 'test' },\n { index: 65, length: 25, name: 'test2' },\n ],\n },\n ];\n\n for (const variation of variations) {\n describe(`${variation.name}`, () => {\n it('should return lanes', () => {\n // -- Act --\n const result = exportForTesting.findLanes(variation.content);\n\n // -- Assert --\n expect(result).toEqual(variation.expected);\n });\n });\n }\n });\n\n describe('invalid cases', () => {\n describe('lane is not indented', () => {\n it('should return null', () => {\n // -- Arrange --\n const content = `lane :test do\\nend`;\n\n // -- Act --\n const result = exportForTesting.findLanes(content);\n\n // -- Assert --\n expect(result).toBeNull();\n });\n });\n\n describe('lane is not closed', () => {\n it('should return null', () => {\n // -- Arrange --\n const content = ` lane :test do\\n`;\n\n // -- Act --\n const result = exportForTesting.findLanes(content);\n\n // -- Assert --\n expect(result).toBeNull();\n });\n });\n });\n });\n });\n\n describe('#addSentryToLane', () => {\n describe('sentry_cli is not present', () => {\n it('should return original content', () => {\n // -- Arrange --\n const content = `\nplatform :ios do\n lane :test do\n puts 'Hello, world!'\n end\nend\n`;\n const lane = { index: 34, length: 25, name: 'test' };\n\n // -- Act --\n const result = exportForTesting.addSentryToLane(\n content,\n lane,\n 'test-org',\n 'test-project',\n );\n\n // -- Assert --\n expect(result).toBe(`\nplatform :ios do\n lane :test do\n puts 'Hello, world!'\n\n sentry_cli(\n org_slug: 'test-org',\n project_slug: 'test-project',\n include_sources: true\n )\n end\nend\n`);\n });\n });\n\n describe('sentry_cli is present', () => {\n it('should return updated content', () => {\n // -- Arrange --\n const content = `\nplatform :ios do\n lane :test do\n puts 'Hello, world!'\n\n sentry_cli(org_slug: 'test-org', project_slug: 'test-project')\n end\nend\n`;\n const lane = { index: 34, length: 92, name: 'test' };\n\n // -- Act --\n const result = exportForTesting.addSentryToLane(\n content,\n lane,\n 'test-org',\n 'test-project',\n );\n\n // -- Assert --\n expect(result).toBe(\n `\nplatform :ios do\n lane :test do\n puts 'Hello, world!'\n\n sentry_cli(\n org_slug: 'test-org',\n project_slug: 'test-project',\n include_sources: true\n )\n end\nend\n`,\n );\n });\n });\n });\n\n describe('#addSentryToFastlane', () => {\n const org = 'test-org';\n const project = 'test-project';\n\n describe('Fastfile not found', () => {\n it('should return false', async () => {\n // -- Arrange --\n const { projectPath } = createFastlaneDir();\n const fastfilePath = path.join(projectPath, 'Fastfile');\n // do not create Fastfile\n\n // -- Act --\n const result = await addSentryToFastlane(projectPath, org, project);\n\n // -- Assert --\n expect(result).toBe(false);\n expect(fs.existsSync(fastfilePath)).toBe(false);\n });\n });\n\n describe('platform not found', () => {\n it('should return false', async () => {\n // -- Arrange --\n const { fastlaneDir, projectPath } = createFastlaneDir();\n const fastfilePath = createFastfile(\n fastlaneDir,\n `\nplatform :ios\n lane :test do\n puts 'Hello, world!'\n end\nend\n`,\n );\n const originalContent = fs.readFileSync(fastfilePath, 'utf8');\n\n // -- Act --\n const result = await addSentryToFastlane(projectPath, org, project);\n\n // -- Assert --\n expect(result).toBe(false);\n expect(fs.readFileSync(fastfilePath, 'utf8')).toBe(originalContent);\n });\n });\n\n describe('no lanes', () => {\n it('should return false', async () => {\n // -- Arrange --\n const { fastlaneDir, projectPath } = createFastlaneDir();\n createFastfile(fastlaneDir, `platform :ios`);\n\n // -- Act --\n const result = await addSentryToFastlane(projectPath, org, project);\n\n // -- Assert --\n expect(result).toBe(false);\n });\n\n it('should warn user', async () => {\n // -- Arrange --\n const { fastlaneDir, projectPath } = createFastlaneDir();\n createFastfile(fastlaneDir, `platform :ios`);\n\n // -- Act --\n const result = await addSentryToFastlane(projectPath, org, project);\n\n // -- Assert --\n expect(result).toBe(false);\n expect(clack.log.warn).toHaveBeenCalledWith(\n 'No suitable lanes in your Fastfile.',\n );\n });\n });\n\n describe('single lane', () => {\n it('should return true', async () => {\n // -- Arrange --\n const { fastlaneDir, projectPath } = createFastlaneDir();\n const fastfilePath = createFastfile(\n fastlaneDir,\n `\nplatform :ios do\n lane :test do\n puts 'Hello, world!'\n end \nend\n`,\n );\n\n // -- Act --\n const result = await addSentryToFastlane(projectPath, org, project);\n\n // -- Assert --\n expect(result).toBe(true);\n expect(fs.readFileSync(fastfilePath, 'utf8')).toBe(\n `\nplatform :ios do\n lane :test do\n puts 'Hello, world!'\n\n sentry_cli(\n org_slug: 'test-org',\n project_slug: 'test-project',\n include_sources: true\n )\n end \nend\n`,\n );\n });\n });\n\n describe('multiple lanes', () => {\n let fastfilePath: string;\n let projectPath: string;\n let originalContent: string;\n\n beforeEach(() => {\n const createdFastlaneDir = createFastlaneDir();\n projectPath = createdFastlaneDir.projectPath;\n fastfilePath = createFastfile(\n createdFastlaneDir.fastlaneDir,\n `platform :ios do\n lane :test do\n puts 'Hello, world!'\n end \n\n lane :beta do\n puts 'Beta lane'\n end\nend\n`,\n );\n });\n\n describe('no lane selected', () => {\n it('should not modify Fastfile', async () => {\n // -- Arrange --\n originalContent = fs.readFileSync(fastfilePath, 'utf8');\n jest.spyOn(clack, 'select').mockResolvedValue(undefined);\n\n // -- Act --\n const result = await addSentryToFastlane(projectPath, org, project);\n\n // -- Assert --\n expect(result).toBe(false);\n expect(fs.readFileSync(fastfilePath, 'utf8')).toBe(originalContent);\n });\n });\n\n describe('lane selected', () => {\n it('should modify only selected lane', async () => {\n // -- Arrange --\n jest.spyOn(clack, 'select').mockResolvedValue({\n value: 'beta',\n index: 1,\n });\n\n // -- Act --\n const result = await addSentryToFastlane(projectPath, org, project);\n\n // -- Assert --\n expect(result).toBe(true);\n expect(fs.readFileSync(fastfilePath, 'utf8')).toBe(\n `platform :ios do\n lane :test do\n puts 'Hello, world!'\n end \n\n lane :beta do\n puts 'Beta lane'\n\n sentry_cli(\n org_slug: 'test-org',\n project_slug: 'test-project',\n include_sources: true\n )\n end\nend\n`,\n );\n expect(clack.select).toHaveBeenCalledWith({\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n maxItems: expect.any(Number),\n message: 'Select lane to add Sentry to:',\n options: [\n { value: { value: 'test', index: 0 }, label: 'test' },\n { value: { value: 'beta', index: 1 }, label: 'beta' },\n ],\n });\n });\n });\n });\n });\n});\n\nfunction createFastlaneDir() {\n const projectPath = fs.mkdtempSync(path.join(os.tmpdir(), 'test-project'));\n const fastlaneDir = path.join(projectPath, 'fastlane');\n fs.mkdirSync(fastlaneDir, {\n recursive: true,\n });\n return { fastlaneDir, projectPath };\n}\n\nfunction createFastfile(fastlaneDir: string, content: string) {\n const fastfile = path.join(fastlaneDir, 'Fastfile');\n fs.writeFileSync(fastfile, content);\n return fastfile;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|