diff --git a/README.md b/README.md index 62ab6fcc..c76fff38 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# privacy.sexy — Now you have the choice +# privacy.sexy — Privacy is sexy > Enforce privacy & security best-practices on Windows, macOS and Linux, because privacy is sexy. diff --git a/package.json b/package.json index 582f6191..61ff6ce6 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "privacy.sexy", "version": "0.12.10", "private": true, - "slogan": "Now you have the choice", + "slogan": "Privacy is sexy", "description": "Enforce privacy & security best-practices on Windows, macOS and Linux, because privacy is sexy.", "author": "undergroundwires", "type": "module", diff --git a/src/application/Parser/ApplicationParser.ts b/src/application/Parser/ApplicationParser.ts index 1f6c24fa..ee21efee 100644 --- a/src/application/Parser/ApplicationParser.ts +++ b/src/application/Parser/ApplicationParser.ts @@ -1,11 +1,11 @@ import type { CollectionData } from '@/application/collections/'; import { IApplication } from '@/domain/IApplication'; -import { IProjectInformation } from '@/domain/IProjectInformation'; +import type { ProjectDetails } from '@/domain/Project/ProjectDetails'; import { ICategoryCollection } from '@/domain/ICategoryCollection'; import WindowsData from '@/application/collections/windows.yaml'; import MacOsData from '@/application/collections/macos.yaml'; import LinuxData from '@/application/collections/linux.yaml'; -import { parseProjectInformation } from '@/application/Parser/ProjectInformationParser'; +import { parseProjectDetails } from '@/application/Parser/ProjectDetailsParser'; import { Application } from '@/domain/Application'; import { IAppMetadata } from '@/infrastructure/EnvironmentVariables/IAppMetadata'; import { EnvironmentVariablesFactory } from '@/infrastructure/EnvironmentVariables/EnvironmentVariablesFactory'; @@ -13,19 +13,21 @@ import { parseCategoryCollection } from './CategoryCollectionParser'; export function parseApplication( categoryParser = parseCategoryCollection, - informationParser = parseProjectInformation, + projectDetailsParser = parseProjectDetails, metadata: IAppMetadata = EnvironmentVariablesFactory.Current.instance, collectionsData = PreParsedCollections, ): IApplication { validateCollectionsData(collectionsData); - const information = informationParser(metadata); - const collections = collectionsData.map((collection) => categoryParser(collection, information)); - const app = new Application(information, collections); + const projectDetails = projectDetailsParser(metadata); + const collections = collectionsData.map( + (collection) => categoryParser(collection, projectDetails), + ); + const app = new Application(projectDetails, collections); return app; } export type CategoryCollectionParserType - = (file: CollectionData, info: IProjectInformation) => ICategoryCollection; + = (file: CollectionData, projectDetails: ProjectDetails) => ICategoryCollection; const PreParsedCollections: readonly CollectionData [] = [ WindowsData, MacOsData, LinuxData, diff --git a/src/application/Parser/CategoryCollectionParser.ts b/src/application/Parser/CategoryCollectionParser.ts index 0752dd0a..a61bc290 100644 --- a/src/application/Parser/CategoryCollectionParser.ts +++ b/src/application/Parser/CategoryCollectionParser.ts @@ -2,7 +2,7 @@ import type { CollectionData } from '@/application/collections/'; import { OperatingSystem } from '@/domain/OperatingSystem'; import { ICategoryCollection } from '@/domain/ICategoryCollection'; import { CategoryCollection } from '@/domain/CategoryCollection'; -import { IProjectInformation } from '@/domain/IProjectInformation'; +import type { ProjectDetails } from '@/domain/Project/ProjectDetails'; import { createEnumParser } from '../Common/Enum'; import { parseCategory } from './CategoryParser'; import { CategoryCollectionParseContext } from './Script/CategoryCollectionParseContext'; @@ -10,12 +10,12 @@ import { ScriptingDefinitionParser } from './ScriptingDefinition/ScriptingDefini export function parseCategoryCollection( content: CollectionData, - info: IProjectInformation, + projectDetails: ProjectDetails, osParser = createEnumParser(OperatingSystem), ): ICategoryCollection { validate(content); const scripting = new ScriptingDefinitionParser() - .parse(content.scripting, info); + .parse(content.scripting, projectDetails); const context = new CategoryCollectionParseContext(content.functions, scripting); const categories = content.actions.map((action) => parseCategory(action, context)); const os = osParser.parseEnum(content.os, 'os'); diff --git a/src/application/Parser/ProjectInformationParser.ts b/src/application/Parser/ProjectDetailsParser.ts similarity index 56% rename from src/application/Parser/ProjectInformationParser.ts rename to src/application/Parser/ProjectDetailsParser.ts index 7f573040..5c67bbc1 100644 --- a/src/application/Parser/ProjectInformationParser.ts +++ b/src/application/Parser/ProjectDetailsParser.ts @@ -1,21 +1,21 @@ -import { IProjectInformation } from '@/domain/IProjectInformation'; -import { ProjectInformation } from '@/domain/ProjectInformation'; +import type { ProjectDetails } from '@/domain/Project/ProjectDetails'; +import { GitHubProjectDetails } from '@/domain/Project/GitHubProjectDetails'; import { IAppMetadata } from '@/infrastructure/EnvironmentVariables/IAppMetadata'; import { Version } from '@/domain/Version'; import { EnvironmentVariablesFactory } from '@/infrastructure/EnvironmentVariables/EnvironmentVariablesFactory'; import { ConstructorArguments } from '@/TypeHelpers'; export function -parseProjectInformation( +parseProjectDetails( metadata: IAppMetadata = EnvironmentVariablesFactory.Current.instance, - createProjectInformation: ProjectInformationFactory = ( + createProjectDetails: ProjectDetailsFactory = ( ...args - ) => new ProjectInformation(...args), -): IProjectInformation { + ) => new GitHubProjectDetails(...args), +): ProjectDetails { const version = new Version( metadata.version, ); - return createProjectInformation( + return createProjectDetails( metadata.name, version, metadata.slogan, @@ -24,6 +24,6 @@ parseProjectInformation( ); } -export type ProjectInformationFactory = ( - ...args: ConstructorArguments -) => IProjectInformation; +export type ProjectDetailsFactory = ( + ...args: ConstructorArguments +) => ProjectDetails; diff --git a/src/application/Parser/ScriptingDefinition/CodeSubstituter.ts b/src/application/Parser/ScriptingDefinition/CodeSubstituter.ts index fefadd22..518202c1 100644 --- a/src/application/Parser/ScriptingDefinition/CodeSubstituter.ts +++ b/src/application/Parser/ScriptingDefinition/CodeSubstituter.ts @@ -2,7 +2,7 @@ import { IExpressionsCompiler } from '@/application/Parser/Script/Compiler/Expre import { ParameterSubstitutionParser } from '@/application/Parser/Script/Compiler/Expressions/SyntaxParsers/ParameterSubstitutionParser'; import { CompositeExpressionParser } from '@/application/Parser/Script/Compiler/Expressions/Parser/CompositeExpressionParser'; import { ExpressionsCompiler } from '@/application/Parser/Script/Compiler/Expressions/ExpressionsCompiler'; -import { IProjectInformation } from '@/domain/IProjectInformation'; +import type { ProjectDetails } from '@/domain/Project/ProjectDetails'; import { FunctionCallArgumentCollection } from '@/application/Parser/Script/Compiler/Function/Call/Argument/FunctionCallArgumentCollection'; import { FunctionCallArgument } from '@/application/Parser/Script/Compiler/Function/Call/Argument/FunctionCallArgument'; import { ICodeSubstituter } from './ICodeSubstituter'; @@ -15,13 +15,13 @@ export class CodeSubstituter implements ICodeSubstituter { } - public substitute(code: string, info: IProjectInformation): string { + public substitute(code: string, projectDetails: ProjectDetails): string { if (!code) { throw new Error('missing code'); } const args = new FunctionCallArgumentCollection(); const substitute = (name: string, value: string) => args .addArgument(new FunctionCallArgument(name, value)); - substitute('homepage', info.homepage); - substitute('version', info.version.toString()); + substitute('homepage', projectDetails.homepage); + substitute('version', projectDetails.version.toString()); substitute('date', this.date.toUTCString()); const compiledCode = this.compiler.compileExpressions(code, args); return compiledCode; diff --git a/src/application/Parser/ScriptingDefinition/ICodeSubstituter.ts b/src/application/Parser/ScriptingDefinition/ICodeSubstituter.ts index 989018ea..b3d624e9 100644 --- a/src/application/Parser/ScriptingDefinition/ICodeSubstituter.ts +++ b/src/application/Parser/ScriptingDefinition/ICodeSubstituter.ts @@ -1,5 +1,5 @@ -import { IProjectInformation } from '@/domain/IProjectInformation'; +import type { ProjectDetails } from '@/domain/Project/ProjectDetails'; export interface ICodeSubstituter { - substitute(code: string, info: IProjectInformation): string; + substitute(code: string, projectDetails: ProjectDetails): string; } diff --git a/src/application/Parser/ScriptingDefinition/ScriptingDefinitionParser.ts b/src/application/Parser/ScriptingDefinition/ScriptingDefinitionParser.ts index 2c25d6db..6a9c2bb5 100644 --- a/src/application/Parser/ScriptingDefinition/ScriptingDefinitionParser.ts +++ b/src/application/Parser/ScriptingDefinition/ScriptingDefinitionParser.ts @@ -2,7 +2,7 @@ import type { ScriptingDefinitionData } from '@/application/collections/'; import { IScriptingDefinition } from '@/domain/IScriptingDefinition'; import { ScriptingDefinition } from '@/domain/ScriptingDefinition'; import { ScriptingLanguage } from '@/domain/ScriptingLanguage'; -import { IProjectInformation } from '@/domain/IProjectInformation'; +import type { ProjectDetails } from '@/domain/Project/ProjectDetails'; import { createEnumParser } from '../../Common/Enum'; import { ICodeSubstituter } from './ICodeSubstituter'; import { CodeSubstituter } from './CodeSubstituter'; @@ -16,11 +16,11 @@ export class ScriptingDefinitionParser { public parse( definition: ScriptingDefinitionData, - info: IProjectInformation, + projectDetails: ProjectDetails, ): IScriptingDefinition { const language = this.languageParser.parseEnum(definition.language, 'language'); - const startCode = this.codeSubstituter.substitute(definition.startCode, info); - const endCode = this.codeSubstituter.substitute(definition.endCode, info); + const startCode = this.codeSubstituter.substitute(definition.startCode, projectDetails); + const endCode = this.codeSubstituter.substitute(definition.endCode, projectDetails); return new ScriptingDefinition( language, startCode, diff --git a/src/domain/Application.ts b/src/domain/Application.ts index afbb710c..e6171523 100644 --- a/src/domain/Application.ts +++ b/src/domain/Application.ts @@ -1,11 +1,11 @@ import { IApplication } from './IApplication'; import { ICategoryCollection } from './ICategoryCollection'; -import { IProjectInformation } from './IProjectInformation'; +import { ProjectDetails } from './Project/ProjectDetails'; import { OperatingSystem } from './OperatingSystem'; export class Application implements IApplication { constructor( - public info: IProjectInformation, + public projectDetails: ProjectDetails, public collections: readonly ICategoryCollection[], ) { validateCollections(collections); diff --git a/src/domain/IApplication.ts b/src/domain/IApplication.ts index 4ff92fae..308f9278 100644 --- a/src/domain/IApplication.ts +++ b/src/domain/IApplication.ts @@ -1,9 +1,9 @@ import { ICategoryCollection } from './ICategoryCollection'; -import { IProjectInformation } from './IProjectInformation'; +import { ProjectDetails } from './Project/ProjectDetails'; import { OperatingSystem } from './OperatingSystem'; export interface IApplication { - readonly info: IProjectInformation; + readonly projectDetails: ProjectDetails; readonly collections: readonly ICategoryCollection[]; getSupportedOsList(): OperatingSystem[]; diff --git a/src/domain/ProjectInformation.ts b/src/domain/Project/GitHubProjectDetails.ts similarity index 88% rename from src/domain/ProjectInformation.ts rename to src/domain/Project/GitHubProjectDetails.ts index 380e8840..05dae56e 100644 --- a/src/domain/ProjectInformation.ts +++ b/src/domain/Project/GitHubProjectDetails.ts @@ -1,9 +1,9 @@ import { assertInRange } from '@/application/Common/Enum'; -import { IProjectInformation } from './IProjectInformation'; -import { OperatingSystem } from './OperatingSystem'; -import { Version } from './Version'; +import { OperatingSystem } from '../OperatingSystem'; +import { Version } from '../Version'; +import type { ProjectDetails } from './ProjectDetails'; -export class ProjectInformation implements IProjectInformation { +export class GitHubProjectDetails implements ProjectDetails { public readonly repositoryWebUrl: string; constructor( diff --git a/src/domain/IProjectInformation.ts b/src/domain/Project/ProjectDetails.ts similarity index 91% rename from src/domain/IProjectInformation.ts rename to src/domain/Project/ProjectDetails.ts index 6c0dac7f..cee82e23 100644 --- a/src/domain/IProjectInformation.ts +++ b/src/domain/Project/ProjectDetails.ts @@ -1,7 +1,7 @@ import { OperatingSystem } from '@/domain/OperatingSystem'; import { Version } from '@/domain/Version'; -export interface IProjectInformation { +export interface ProjectDetails { readonly name: string; readonly version: Version; diff --git a/src/presentation/components/Code/CodeButtons/Save/RunInstructions/RunInstructions.vue b/src/presentation/components/Code/CodeButtons/Save/RunInstructions/RunInstructions.vue index 670f2525..7f4c5db3 100644 --- a/src/presentation/components/Code/CodeButtons/Save/RunInstructions/RunInstructions.vue +++ b/src/presentation/components/Code/CodeButtons/Save/RunInstructions/RunInstructions.vue @@ -44,14 +44,14 @@ export default defineComponent({ setup() { const { currentState } = injectKey((keys) => keys.useCollectionState); - const { info } = injectKey((keys) => keys.useApplication); + const { projectDetails } = injectKey((keys) => keys.useApplication); const operatingSystem = computed(() => currentState.value.os); - const appName = computed(() => info.name); + const appName = computed(() => projectDetails.name); const downloadUrl = computed( - () => info.getDownloadUrl(operatingSystem.value), + () => projectDetails.getDownloadUrl(operatingSystem.value), ); const osName = computed( diff --git a/src/presentation/components/Code/TheCodeArea.vue b/src/presentation/components/Code/TheCodeArea.vue index 50d3a588..d7c29474 100644 --- a/src/presentation/components/Code/TheCodeArea.vue +++ b/src/presentation/components/Code/TheCodeArea.vue @@ -24,6 +24,7 @@ import { IReadOnlyCategoryCollectionState } from '@/application/Context/State/IC import { CodeBuilderFactory } from '@/application/Context/State/Code/Generation/CodeBuilderFactory'; import SizeObserver from '@/presentation/components/Shared/SizeObserver.vue'; import { NonCollapsing } from '@/presentation/components/Scripts/View/Cards/NonCollapsingDirective'; +import type { ProjectDetails } from '@/domain/Project/ProjectDetails'; import ace from './ace-importer'; export default defineComponent({ @@ -41,6 +42,7 @@ export default defineComponent({ }, setup(props) { const { onStateChange, currentState } = injectKey((keys) => keys.useCollectionState); + const { projectDetails } = injectKey((keys) => keys.useApplication); const { events } = injectKey((keys) => keys.useAutoUnsubscribedEvents); const editorId = 'codeEditor'; @@ -74,7 +76,7 @@ export default defineComponent({ } function updateCode(code: string, language: ScriptingLanguage) { - const innerCode = code || getDefaultCode(language); + const innerCode = code || getDefaultCode(language, projectDetails); editor?.setValue(innerCode, 1); } @@ -171,10 +173,14 @@ function getLanguage(language: ScriptingLanguage) { } } -function getDefaultCode(language: ScriptingLanguage): string { +function getDefaultCode(language: ScriptingLanguage, project: ProjectDetails): string { return new CodeBuilderFactory() .create(language) - .appendCommentLine('privacy.sexy — Now you have the choice.') + .appendCommentLine(`${project.name} — ${project.slogan}`) + /* + Keep the slogan without a period for impact and continuity. + Slogans should be punchy and memorable, not punctuated like full sentences. + */ .appendCommentLine(' 🔐 Enforce privacy & security best-practices on Windows, macOS and Linux.') .appendLine() .appendCommentLine('-- 🤔 How to use') @@ -183,7 +189,7 @@ function getDefaultCode(language: ScriptingLanguage): string { .appendCommentLine(' 📙 After you choose any tweak, you can download or copy to execute your script.') .appendCommentLine(' 📙 Come back regularly to apply latest version for stronger privacy and security.') .appendLine() - .appendCommentLine('-- 🧐 Why privacy.sexy') + .appendCommentLine(`-- 🧐 Why ${project.name}`) .appendCommentLine(' ✔️ Rich tweak pool to harden security & privacy of the OS and other software on it.') .appendCommentLine(' ✔️ No need to run any compiled software on your system, just run the generated scripts.') .appendCommentLine(' ✔️ Have full visibility into what the tweaks do as you enable them.') diff --git a/src/presentation/components/Scripts/View/TheScriptsView.vue b/src/presentation/components/Scripts/View/TheScriptsView.vue index cbd0ae44..642a202d 100644 --- a/src/presentation/components/Scripts/View/TheScriptsView.vue +++ b/src/presentation/components/Scripts/View/TheScriptsView.vue @@ -62,9 +62,9 @@ export default defineComponent({ setup() { const { modifyCurrentState, onStateChange } = injectKey((keys) => keys.useCollectionState); const { events } = injectKey((keys) => keys.useAutoUnsubscribedEvents); - const { info } = injectKey((keys) => keys.useApplication); + const { projectDetails } = injectKey((keys) => keys.useApplication); - const repositoryUrl = computed(() => info.repositoryWebUrl); + const repositoryUrl = computed(() => projectDetails.repositoryWebUrl); const searchQuery = ref(); const isSearching = computed(() => Boolean(searchQuery.value)); const searchHasMatches = ref(false); diff --git a/src/presentation/components/Shared/Hooks/UseApplication.ts b/src/presentation/components/Shared/Hooks/UseApplication.ts index 5c96c16e..55be7eb1 100644 --- a/src/presentation/components/Shared/Hooks/UseApplication.ts +++ b/src/presentation/components/Shared/Hooks/UseApplication.ts @@ -3,6 +3,6 @@ import { IApplication } from '@/domain/IApplication'; export function useApplication(application: IApplication) { return { application, - info: application.info, + projectDetails: application.projectDetails, }; } diff --git a/src/presentation/components/TheFooter/DownloadUrlListItem.vue b/src/presentation/components/TheFooter/DownloadUrlListItem.vue index 0bbaa4e0..5932c75e 100644 --- a/src/presentation/components/TheFooter/DownloadUrlListItem.vue +++ b/src/presentation/components/TheFooter/DownloadUrlListItem.vue @@ -26,7 +26,7 @@ export default defineComponent({ }, }, setup(props) { - const { info } = injectKey((keys) => keys.useApplication); + const { projectDetails } = injectKey((keys) => keys.useApplication); const { os: currentOs } = injectKey((keys) => keys.useRuntimeEnvironment); const isCurrentOs = computed(() => { @@ -42,7 +42,7 @@ export default defineComponent({ }); const downloadUrl = computed(() => { - return info.getDownloadUrl(props.operatingSystem); + return projectDetails.getDownloadUrl(props.operatingSystem); }); return { diff --git a/src/presentation/components/TheFooter/PrivacyPolicy.vue b/src/presentation/components/TheFooter/PrivacyPolicy.vue index 1d39fa8e..aaf1d3ee 100644 --- a/src/presentation/components/TheFooter/PrivacyPolicy.vue +++ b/src/presentation/components/TheFooter/PrivacyPolicy.vue @@ -59,11 +59,11 @@ import { injectKey } from '@/presentation/injectionSymbols'; export default defineComponent({ setup() { - const { info } = injectKey((keys) => keys.useApplication); + const { projectDetails } = injectKey((keys) => keys.useApplication); const { isRunningAsDesktopApplication } = injectKey((keys) => keys.useRuntimeEnvironment); - const repositoryUrl = computed(() => info.repositoryUrl); - const feedbackUrl = computed(() => info.feedbackUrl); + const repositoryUrl = computed(() => projectDetails.repositoryUrl); + const feedbackUrl = computed(() => projectDetails.feedbackUrl); return { repositoryUrl, diff --git a/src/presentation/components/TheFooter/TheFooter.vue b/src/presentation/components/TheFooter/TheFooter.vue index 899cba4c..802c217e 100644 --- a/src/presentation/components/TheFooter/TheFooter.vue +++ b/src/presentation/components/TheFooter/TheFooter.vue @@ -67,20 +67,20 @@ export default defineComponent({ FlatButton, }, setup() { - const { info } = injectKey((keys) => keys.useApplication); + const { projectDetails } = injectKey((keys) => keys.useApplication); const { isRunningAsDesktopApplication } = injectKey((keys) => keys.useRuntimeEnvironment); const isPrivacyDialogVisible = ref(false); - const version = computed(() => info.version.toString()); + const version = computed(() => projectDetails.version.toString()); - const homepageUrl = computed(() => info.homepage); + const homepageUrl = computed(() => projectDetails.homepage); - const repositoryUrl = computed(() => info.repositoryWebUrl); + const repositoryUrl = computed(() => projectDetails.repositoryWebUrl); - const releaseUrl = computed(() => info.releaseUrl); + const releaseUrl = computed(() => projectDetails.releaseUrl); - const feedbackUrl = computed(() => info.feedbackUrl); + const feedbackUrl = computed(() => projectDetails.feedbackUrl); function showPrivacyDialog() { isPrivacyDialogVisible.value = true; diff --git a/src/presentation/components/TheHeader.vue b/src/presentation/components/TheHeader.vue index 6a2ce26b..be6e4b35 100644 --- a/src/presentation/components/TheHeader.vue +++ b/src/presentation/components/TheHeader.vue @@ -1,9 +1,13 @@