// Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import 'package:clock/clock.dart'; import 'package:file/file.dart'; import 'constants.dart'; import 'utils.dart'; /// Creates the text file that will contain the client ID /// which will be used across all related tools for analytics /// reporting in GA. void createClientIdFile({required File clientIdFile}) { clientIdFile.createSync(recursive: true); clientIdFile.writeAsStringSync(Uuid().generateV4()); } /// Creates the configuration file with the default message /// in the user's home directory. void createConfigFile({ required File configFile, required Directory homeDirectory, }) { configFile.createSync(recursive: true); // If the user was previously opted out, then we will // replace the line that assumes automatic opt in with // an opt out from the start if (legacyOptOut(homeDirectory: homeDirectory)) { configFile.writeAsStringSync( kConfigString.replaceAll('reporting=1', 'reporting=0')); } else { configFile.writeAsStringSync(kConfigString); } } /// Creates that file that will persist dismissed survey ids. void createDismissedSurveyFile({required File dismissedSurveyFile}) { dismissedSurveyFile.createSync(recursive: true); dismissedSurveyFile.writeAsStringSync('{}'); } /// Creates that log file that will store the record formatted /// events locally on the user's machine. void createLogFile({required File logFile}) { logFile.createSync(recursive: true); } /// Creates the session file which will contain /// the current session id which is the current timestamp. /// /// It also returns the timestamp used for the session if it needs /// to be accessed. DateTime createSessionFile({required File sessionFile}) { final now = clock.now(); sessionFile.createSync(recursive: true); writeSessionContents(sessionFile: sessionFile); return now; } /// Performs all of the initialization checks for the required files. /// /// Returns `true` if the config file was created indicating it is the first /// time this package was run on a user's machine. /// /// Checks for the following: /// - Config file /// - Client ID file /// - Session JSON file /// - Log file /// - Dismissed survey JSON file bool runInitialization({ required Directory homeDirectory, }) { var firstRun = false; final dartToolDirectory = homeDirectory.childDirectory(kDartToolDirectoryName); // When the config file doesn't exist, initialize it with the default tools // and the current date. final configFile = dartToolDirectory.childFile(kConfigFileName); if (!configFile.existsSync()) { firstRun = true; createConfigFile( configFile: configFile, homeDirectory: homeDirectory, ); } // Begin initialization checks for the client id. final clientFile = dartToolDirectory.childFile(kClientIdFileName); if (!clientFile.existsSync()) { createClientIdFile(clientIdFile: clientFile); } // Begin initialization checks for the session file. final sessionFile = dartToolDirectory.childFile(kSessionFileName); if (!sessionFile.existsSync()) { createSessionFile(sessionFile: sessionFile); } // Begin initialization checks for the log file to persist events locally. final logFile = dartToolDirectory.childFile(kLogFileName); if (!logFile.existsSync()) { createLogFile(logFile: logFile); } // Begin initialization checks for the dismissed survey file. final dismissedSurveyFile = dartToolDirectory.childFile(kDismissedSurveyFileName); if (!dismissedSurveyFile.existsSync()) { createDismissedSurveyFile(dismissedSurveyFile: dismissedSurveyFile); } return firstRun; }