diff --git a/core/.github/pull_request_template.md b/.github/pull_request_template.md similarity index 100% rename from core/.github/pull_request_template.md rename to .github/pull_request_template.md diff --git a/.github/workflows/branch-check.yml b/.github/workflows/branch-check.yml new file mode 100644 index 0000000..2dd5275 --- /dev/null +++ b/.github/workflows/branch-check.yml @@ -0,0 +1,21 @@ +name: Valid Source Branches + +on: + pull_request: + branches: + - master + +jobs: + validate-source-branch: + name: Validate Source Branch Pattern + runs-on: ubuntu-latest + steps: + - name: Check if source branch is allowed + run: | + echo "πŸ” Checking branch: ${{ github.head_ref }}" + if [[ ! "${{ github.head_ref }}" =~ ^release/v[0-9]+\.[0-9]+\.[0-9]+$ && ! "${{ github.head_ref }}" =~ ^hotfix/LM-[0-9]+_[a-zA-Z0-9_-]+$ ]]; then + echo "🚫 Only branches matching 'release/vX.Y.Z' or 'hotfix/LM-12345_description' can be merged into master." + exit 1 + else + echo "βœ… Valid source branch: ${{ github.head_ref }}" + fi diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..e69de29 diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 0000000..daaa4a2 --- /dev/null +++ b/Jenkinsfile @@ -0,0 +1,160 @@ +pipeline { + agent any + + environment { + NODE_ENV = 'development' // Don’t set to production to allow dev deps + NPM_TOKEN = credentials('ISHAAN_NPM_TOKEN') + SLACK_WEBHOOK = credentials('SLACK_JS_CHANNEL_URL') + REPO = 'LikeMindsCommunity/likeminds-feed-reactjs' + } + + tools { + nodejs 'nodejs' + } + + stages { + stage('Checkout') { + steps { + checkout scm + } + } + + stage('Check git tags') { + steps { + dir('core') { + script { + sh 'git fetch --tags' + + def previousVersion = sh( + script: 'git describe --tags --abbrev=0', + returnStdout: true + ).trim() + + def currentVersion = sh( + script: "node -p \"require('./package.json').version\"", + returnStdout: true + ).trim() + + echo "Previous version: ${previousVersion}, Current version: v${currentVersion}" + + if (previousVersion != "v${currentVersion}") { + echo "Version has changed from ${previousVersion} to v${currentVersion}." + } else { + echo 'Version has not changed.' + error "Stopping the pipeline as the version hasn't changed." + } + } + } + } + } + + stage('Install & Build SDK') { + steps { + dir('core') { + sh 'npm install --legacy-peer-deps' + sh 'npm run build-lib' + } + } + } + + stage('Publish to npm') { + steps { + dir('core') { + sh ''' + echo "//registry.npmjs.org/:_authToken=${NPM_TOKEN}" > ~/.npmrc + npm publish + ''' + } + } + } + + stage('Tag & GitHub Release') { + steps { + dir('core') { + script { + def version = sh(script: "node -p \"require('./package.json').version\"", returnStdout: true).trim() + def tagName = "v${version}" + def releaseName = "Release ${version}" + + sh ''' + git config user.name 'Ishaan Jain' + git config user.email 'ishaan.jain@likeminds.community' + ''' + + sh "git tag ${tagName}" + + withCredentials([string(credentialsId: 'ISHAAN_GITHUB_TOKEN', variable: 'GITHUB_TOKEN')]) { + writeFile file: 'release_payload.json', text: """ + { + "tag_name": "${tagName}", + "name": "${releaseName}", + "generate_release_notes": true, + "draft": false, + "prerelease": false + } + """ + + // push the tag securely & safely + sh """ + git remote set-url origin https://\$GITHUB_TOKEN@github.com/${REPO}.git + git push origin refs/tags/${tagName} + """ + + // create the GitHub release + sh ''' + curl -X POST https://api.github.com/repos/LikeMindsCommunity/likeminds-feed-reactjs/releases \ + -H "Authorization: token $GITHUB_TOKEN" \ + -H "Content-Type: application/json" \ + -d @release_payload.json + ''' + } + + currentBuild.description = tagName + } + } + } + } + + stage('Notify Slack') { + steps { + withCredentials([string(credentialsId: 'SLACK_JS_CHANNEL_URL', variable: 'SLACK_WEBHOOK')]) { + script { + def version = sh(script: "node -p \"require('./core/package.json').version\"", returnStdout: true).trim() + def branch = env.GIT_BRANCH ?: 'unknown' + def buildNumber = env.BUILD_NUMBER + def jobName = env.JOB_NAME + def timestamp = (System.currentTimeMillis() / 1000) + + def slackPayload = """ + { + "attachments": [ + { + "color": "#36a64f", + "title": "βœ… ReactJS SDK Deployed", + "title_link": "https://github.com/${REPO}/releases/tag/${version}", + "text": "A new version of the React SDK has been deployed and released.", + "fields": [ + { "title": "Version", "value": "${version}", "short": true }, + { "title": "Branch", "value": "${branch}", "short": true }, + { "title": "Build", "value": "#${buildNumber}", "short": true }, + { "title": "Job Name", "value": "${jobName}", "short": true } + ], + "footer": "Jenkins CI", + "footer_icon": "https://jenkins.io/images/logos/jenkins/jenkins.png", + "ts": ${timestamp} + } + ] + } + """ + writeFile file: 'slack_payload.json', text: slackPayload + + sh ''' + curl -X POST -H "Content-Type: application/json" \ + --data @slack_payload.json $SLACK_WEBHOOK + ''' + } + } + } + } + } +} diff --git a/core/package.json b/core/package.json index f8f222b..1df1de0 100644 --- a/core/package.json +++ b/core/package.json @@ -1,6 +1,6 @@ { "name": "@likeminds.community/likeminds-feed-reactjs", - "version": "1.10.0", + "version": "1.11.0", "scripts": { "start": "react-app-rewired start", "build": "react-app-rewired build", diff --git a/core/src/shared/getClient.ts b/core/src/shared/getClient.ts index e0c1992..516836f 100644 --- a/core/src/shared/getClient.ts +++ b/core/src/shared/getClient.ts @@ -3,7 +3,7 @@ import { LMFeedClient } from "@likeminds.community/feed-js"; export function initiateFeedClient() { const lmFeedClient = LMFeedClient.Builder() .setPlatformCode("rt") - .setVersionCode(21) + .setVersionCode(22) .build(); return lmFeedClient; } diff --git a/core/vite.config.js.timestamp-1730223298821-ceb3232dc5a83.mjs b/core/vite.config.js.timestamp-1730223298821-ceb3232dc5a83.mjs deleted file mode 100644 index 08ffd72..0000000 --- a/core/vite.config.js.timestamp-1730223298821-ceb3232dc5a83.mjs +++ /dev/null @@ -1,40 +0,0 @@ -// vite.config.js -import { resolve } from "path"; -import { defineConfig } from "file:///Users/omen/likeminds-feed-reactjs/core/node_modules/vite/dist/node/index.js"; -import react from "file:///Users/omen/likeminds-feed-reactjs/core/node_modules/@vitejs/plugin-react/dist/index.mjs"; -import dts from "file:///Users/omen/likeminds-feed-reactjs/core/node_modules/vite-plugin-dts/dist/index.mjs"; -import { libInjectCss } from "file:///Users/omen/likeminds-feed-reactjs/core/node_modules/vite-plugin-lib-inject-css/dist/index.js"; -var __vite_injected_original_dirname = "/Users/omen/likeminds-feed-reactjs/core"; -var vite_config_default = defineConfig({ - plugins: [react(), libInjectCss({}), dts({ include: ["src"] })], - build: { - cssCodeSplit: true, - copyPublicDir: false, - lib: { - // Could also be a dictionary or array of multiple entry points - entry: resolve(__vite_injected_original_dirname, "src/index.ts"), - name: "react-feed-lib", - // the proper extensions will be added - fileName: "index" - }, - rollupOptions: { - // make sure to externalize deps that shouldn't be bundled - // into your library - external: ["react", "react-dom", "vite"], - output: { - // Provide global variables to use in the UMD build - // for externalized deps - globals: { - react: "React" - } - } - } - }, - optimizeDeps: { - disabled: false - } -}); -export { - vite_config_default as default -}; -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcuanMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCIvVXNlcnMvb21lbi9saWtlbWluZHMtZmVlZC1yZWFjdGpzL2NvcmVcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZmlsZW5hbWUgPSBcIi9Vc2Vycy9vbWVuL2xpa2VtaW5kcy1mZWVkLXJlYWN0anMvY29yZS92aXRlLmNvbmZpZy5qc1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9pbXBvcnRfbWV0YV91cmwgPSBcImZpbGU6Ly8vVXNlcnMvb21lbi9saWtlbWluZHMtZmVlZC1yZWFjdGpzL2NvcmUvdml0ZS5jb25maWcuanNcIjsvKiBlc2xpbnQtZGlzYWJsZSBuby11bmRlZiAqL1xuLy8gdml0ZS5jb25maWcuanNcbmltcG9ydCB7IHJlc29sdmUgfSBmcm9tICdwYXRoJ1xuaW1wb3J0IHsgZGVmaW5lQ29uZmlnIH0gZnJvbSAndml0ZSdcbi8vIGltcG9ydCBzY3NzIGZyb20gJ3JvbGx1cC1wbHVnaW4tc2NzcydcbmltcG9ydCByZWFjdCBmcm9tICdAdml0ZWpzL3BsdWdpbi1yZWFjdCdcbmltcG9ydCBkdHMgZnJvbSAndml0ZS1wbHVnaW4tZHRzJ1xuaW1wb3J0IHsgbGliSW5qZWN0Q3NzIH0gZnJvbSAndml0ZS1wbHVnaW4tbGliLWluamVjdC1jc3MnXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoe1xuICAgIHBsdWdpbnM6IFtyZWFjdCgpLCBsaWJJbmplY3RDc3Moe1xuXG4gICAgfSksIGR0cyh7IGluY2x1ZGU6IFsnc3JjJ10gfSldLFxuICAgIGJ1aWxkOiB7XG4gICAgICAgIGNzc0NvZGVTcGxpdDogdHJ1ZSxcbiAgICAgICAgY29weVB1YmxpY0RpcjogZmFsc2UsXG4gICAgICAgIGxpYjoge1xuICAgICAgICAgICAgLy8gQ291bGQgYWxzbyBiZSBhIGRpY3Rpb25hcnkgb3IgYXJyYXkgb2YgbXVsdGlwbGUgZW50cnkgcG9pbnRzXG4gICAgICAgICAgICBlbnRyeTogcmVzb2x2ZShfX2Rpcm5hbWUsICdzcmMvaW5kZXgudHMnKSxcbiAgICAgICAgICAgIG5hbWU6ICdyZWFjdC1mZWVkLWxpYicsXG4gICAgICAgICAgICAvLyB0aGUgcHJvcGVyIGV4dGVuc2lvbnMgd2lsbCBiZSBhZGRlZFxuICAgICAgICAgICAgZmlsZU5hbWU6ICdpbmRleCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJvbGx1cE9wdGlvbnM6IHtcbiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0byBleHRlcm5hbGl6ZSBkZXBzIHRoYXQgc2hvdWxkbid0IGJlIGJ1bmRsZWRcbiAgICAgICAgICAgIC8vIGludG8geW91ciBsaWJyYXJ5XG4gICAgICAgICAgICBleHRlcm5hbDogWydyZWFjdCcsICdyZWFjdC1kb20nLCAndml0ZSddLFxuICAgICAgICAgICAgb3V0cHV0OiB7XG4gICAgICAgICAgICAgICAgLy8gUHJvdmlkZSBnbG9iYWwgdmFyaWFibGVzIHRvIHVzZSBpbiB0aGUgVU1EIGJ1aWxkXG4gICAgICAgICAgICAgICAgLy8gZm9yIGV4dGVybmFsaXplZCBkZXBzXG4gICAgICAgICAgICAgICAgZ2xvYmFsczoge1xuICAgICAgICAgICAgICAgICAgICByZWFjdDogJ1JlYWN0JyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcblxuICAgIH0sXG4gICAgb3B0aW1pemVEZXBzOiB7XG4gICAgICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICB9LFxuXG59KSJdLAogICJtYXBwaW5ncyI6ICI7QUFFQSxTQUFTLGVBQWU7QUFDeEIsU0FBUyxvQkFBb0I7QUFFN0IsT0FBTyxXQUFXO0FBQ2xCLE9BQU8sU0FBUztBQUNoQixTQUFTLG9CQUFvQjtBQVA3QixJQUFNLG1DQUFtQztBQVF6QyxJQUFPLHNCQUFRLGFBQWE7QUFBQSxFQUN4QixTQUFTLENBQUMsTUFBTSxHQUFHLGFBQWEsQ0FFaEMsQ0FBQyxHQUFHLElBQUksRUFBRSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztBQUFBLEVBQzdCLE9BQU87QUFBQSxJQUNILGNBQWM7QUFBQSxJQUNkLGVBQWU7QUFBQSxJQUNmLEtBQUs7QUFBQTtBQUFBLE1BRUQsT0FBTyxRQUFRLGtDQUFXLGNBQWM7QUFBQSxNQUN4QyxNQUFNO0FBQUE7QUFBQSxNQUVOLFVBQVU7QUFBQSxJQUNkO0FBQUEsSUFDQSxlQUFlO0FBQUE7QUFBQTtBQUFBLE1BR1gsVUFBVSxDQUFDLFNBQVMsYUFBYSxNQUFNO0FBQUEsTUFDdkMsUUFBUTtBQUFBO0FBQUE7QUFBQSxRQUdKLFNBQVM7QUFBQSxVQUNMLE9BQU87QUFBQSxRQUNYO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUVKO0FBQUEsRUFDQSxjQUFjO0FBQUEsSUFDVixVQUFVO0FBQUEsRUFDZDtBQUVKLENBQUM7IiwKICAibmFtZXMiOiBbXQp9Cg== diff --git a/qna-feed/package.json b/qna-feed/package.json index 452d4bb..86fc46b 100644 --- a/qna-feed/package.json +++ b/qna-feed/package.json @@ -12,7 +12,7 @@ "dependencies": { "@emotion/react": "^11.13.3", "@emotion/styled": "^11.13.0", - "@likeminds.community/likeminds-feed-reactjs": "^1.8.1", + "@likeminds.community/likeminds-feed-reactjs": "^1.11.0", "@mui/icons-material": "^6.0.2", "@mui/material": "^6.0.2", "react": "^18.2.0", diff --git a/social-feed/package.json b/social-feed/package.json index 69b07d0..a9fc334 100644 --- a/social-feed/package.json +++ b/social-feed/package.json @@ -17,7 +17,7 @@ "react": "^18.2.0", "react-dom": "^18.2.0", "react-router-dom": "^7.3.0", - "@likeminds.community/likeminds-feed-reactjs": "1.10.0" + "@likeminds.community/likeminds-feed-reactjs": "1.11.0" }, "devDependencies": { "@types/react": "^18.0.0",