{"_id":"@egulatee/pulumi-spring-cloud-config","_rev":"6-d18a76623a32e35c92da9621ee81a525","name":"@egulatee/pulumi-spring-cloud-config","dist-tags":{"latest":"1.3.0"},"versions":{"0.1.0":{"name":"@egulatee/pulumi-spring-cloud-config","version":"0.1.0","keywords":["pulumi","dynamic-provider","spring-cloud-config","config-server","infrastructure-as-code","iac","configuration-management","spring","cloud-config"],"author":{"name":"Eric Gulatee"},"license":"Apache-2.0","_id":"@egulatee/pulumi-spring-cloud-config@0.1.0","maintainers":[{"name":"egulatee","email":"eric.gulatee@gmail.com"}],"homepage":"https://github.com/egulatee/pulumi-spring-cloud-config#readme","bugs":{"url":"https://github.com/egulatee/pulumi-spring-cloud-config/issues"},"dist":{"shasum":"0fb0206df72798848a1e03187bbf8b66305b49b7","tarball":"https://registry.npmjs.org/@egulatee/pulumi-spring-cloud-config/-/pulumi-spring-cloud-config-0.1.0.tgz","fileCount":23,"integrity":"sha512-hf15JAXqJJ5ULpeeoWdBurlDrfkqQryMqvNGowaknKkaHlyYyMqKLx9iPzi5OmTlsZSLj18d7sz5JmQdFB0EuQ==","signatures":[{"sig":"MEQCIH76OoKpfgs9Z8AG+NmBjveKJ+D4ReitFjWRiScHbKKlAiBcwyCBF205hqfklb06T9DK+dyBQHOUzdlAA1B/VoFT6A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":109860},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"91a20cf782785f965bdaa2b85343737ab20e0e10","scripts":{"lint":"eslint 'src/**/*.ts' 'tests/**/*.ts'","test":"jest","build":"tsc","clean":"rm -rf dist","format":"prettier --write 'src/**/*.ts' 'tests/**/*.ts'","prepare":"husky","lint:fix":"eslint 'src/**/*.ts' 'tests/**/*.ts' --fix","test:watch":"jest --watch","format:check":"prettier --check 'src/**/*.ts' 'tests/**/*.ts'","test:coverage":"jest --coverage","prepublishOnly":"npm run clean && npm run build && npm run test"},"_npmUser":{"name":"egulatee","email":"eric.gulatee@gmail.com"},"repository":{"url":"git+https://github.com/egulatee/pulumi-spring-cloud-config.git","type":"git"},"_npmVersion":"10.5.0","description":"Pulumi Dynamic Provider for integrating Spring Cloud Config Server with infrastructure-as-code projects","directories":{},"_nodeVersion":"20.12.2","dependencies":{"axios":"^1.7.9"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","nock":"^14.0.10","husky":"^9.1.7","eslint":"^8.57.1","ts-jest":"^29.2.5","prettier":"^3.4.2","typescript":"^5.7.2","@types/jest":"^29.5.14","@types/node":"^24.10.0","@pulumi/pulumi":"^3.145.0","@commitlint/cli":"^20.1.0","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.2.1","@typescript-eslint/parser":"^8.18.1","@commitlint/config-conventional":"^19.6.0","@typescript-eslint/eslint-plugin":"^8.18.1"},"peerDependencies":{"@pulumi/pulumi":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/pulumi-spring-cloud-config_0.1.0_1762189510704_0.038024303875312304","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@egulatee/pulumi-spring-cloud-config","version":"1.0.0","keywords":["pulumi","dynamic-provider","spring-cloud-config","config-server","infrastructure-as-code","iac","configuration-management","spring","cloud-config"],"author":{"name":"Eric Gulatee"},"license":"Apache-2.0","_id":"@egulatee/pulumi-spring-cloud-config@1.0.0","maintainers":[{"name":"egulatee","email":"eric.gulatee@gmail.com"}],"homepage":"https://github.com/egulatee/pulumi-spring-cloud-config#readme","bugs":{"url":"https://github.com/egulatee/pulumi-spring-cloud-config/issues"},"dist":{"shasum":"6ff517e324cd1fdcaeac666d0bbbb77789e18646","tarball":"https://registry.npmjs.org/@egulatee/pulumi-spring-cloud-config/-/pulumi-spring-cloud-config-1.0.0.tgz","fileCount":23,"integrity":"sha512-6gTxosDgUoSjP9MRKSGYrPsQmuFxP34fpFHjYSO1+2Agzci2+UCv8efrHksX0Yo8Pb1SBhQUE8z3TzKWJJ0s2g==","signatures":[{"sig":"MEQCIDqGYF8lsoEOHcMOpYlgc8+0C09arFLx35M/BR8KmfnhAiBd832Xf6jPuianPVaG4d+pAdRiHr9as/VpvGd+R48Xig==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":116199},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"d4b912b5c270607f77bf9d1882e7711ccdfd1572","scripts":{"lint":"eslint 'src/**/*.ts' 'tests/**/*.ts'","test":"jest","build":"tsc","clean":"rm -rf dist","format":"prettier --write 'src/**/*.ts' 'tests/**/*.ts'","prepare":"husky","lint:fix":"eslint 'src/**/*.ts' 'tests/**/*.ts' --fix","test:watch":"jest --watch","format:check":"prettier --check 'src/**/*.ts' 'tests/**/*.ts'","test:coverage":"jest --coverage","prepublishOnly":"npm run clean && npm run build && npm run test"},"_npmUser":{"name":"egulatee","email":"eric.gulatee@gmail.com"},"repository":{"url":"git+https://github.com/egulatee/pulumi-spring-cloud-config.git","type":"git"},"_npmVersion":"10.9.4","description":"Pulumi Dynamic Provider for integrating Spring Cloud Config Server with infrastructure-as-code projects","directories":{},"_nodeVersion":"20.19.5","dependencies":{"axios":"^1.7.9"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","nock":"^14.0.10","husky":"^9.1.7","eslint":"^8.57.1","ts-jest":"^29.2.5","prettier":"^3.4.2","typescript":"^5.7.2","@types/jest":"^29.5.14","@types/node":"^24.10.0","@pulumi/pulumi":"^3.145.0","@commitlint/cli":"^20.1.0","semantic-release":"24.2.9","@semantic-release/git":"10.0.1","@semantic-release/npm":"12.0.2","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.2.1","@semantic-release/github":"11.0.6","@typescript-eslint/parser":"^8.18.1","@semantic-release/changelog":"6.0.3","@commitlint/config-conventional":"^19.6.0","@typescript-eslint/eslint-plugin":"^8.18.1","@semantic-release/commit-analyzer":"13.0.1","@semantic-release/release-notes-generator":"14.1.0"},"peerDependencies":{"@pulumi/pulumi":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/pulumi-spring-cloud-config_1.0.0_1762205353939_0.5953203979600461","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@egulatee/pulumi-spring-cloud-config","version":"1.0.1","keywords":["pulumi","dynamic-provider","spring-cloud-config","config-server","infrastructure-as-code","iac","configuration-management","spring","cloud-config"],"author":{"name":"Eric Gulatee"},"license":"Apache-2.0","_id":"@egulatee/pulumi-spring-cloud-config@1.0.1","maintainers":[{"name":"egulatee","email":"eric.gulatee@gmail.com"}],"homepage":"https://github.com/egulatee/pulumi-spring-cloud-config#readme","bugs":{"url":"https://github.com/egulatee/pulumi-spring-cloud-config/issues"},"dist":{"shasum":"03531d9a7f4c0f9d24bc125462b8f80eb803de9e","tarball":"https://registry.npmjs.org/@egulatee/pulumi-spring-cloud-config/-/pulumi-spring-cloud-config-1.0.1.tgz","fileCount":23,"integrity":"sha512-cqUK6XqKcReR0b6KqzWubc8jgy860SsoVjeui58ZCARPOHPfZUytQuQXPQsDCy53wl2wHsgHsYoqBaZN3G6f7g==","signatures":[{"sig":"MEUCIQCwgzVEXZJ0UM5wdiq+M4qudq2Kt210gXUgV9gRjsKXDwIgamOyqDHljPfoySeyQVL31BhIiJZEotwCvEbKVnUZGck=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":125136},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"ad90429069bad25d49b5ea3a89c37457e20e5ee8","scripts":{"lint":"eslint 'src/**/*.ts' 'tests/**/*.ts'","test":"jest","build":"tsc","clean":"rm -rf dist","format":"prettier --write 'src/**/*.ts' 'tests/**/*.ts'","prepare":"husky","lint:fix":"eslint 'src/**/*.ts' 'tests/**/*.ts' --fix","test:watch":"jest --watch","format:check":"prettier --check 'src/**/*.ts' 'tests/**/*.ts'","test:coverage":"jest --coverage","prepublishOnly":"npm run clean && npm run build && npm run test"},"_npmUser":{"name":"egulatee","email":"eric.gulatee@gmail.com"},"repository":{"url":"git+https://github.com/egulatee/pulumi-spring-cloud-config.git","type":"git"},"_npmVersion":"10.9.4","description":"Pulumi Dynamic Provider for integrating Spring Cloud Config Server with infrastructure-as-code projects","directories":{},"_nodeVersion":"20.19.5","dependencies":{"axios":"^1.7.9"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","nock":"^14.0.10","husky":"^9.1.7","eslint":"^8.57.1","ts-jest":"^29.2.5","prettier":"^3.4.2","typescript":"^5.7.2","@types/jest":"^30.0.0","@types/node":"^24.10.0","@pulumi/pulumi":"^3.145.0","@commitlint/cli":"^20.1.0","semantic-release":"24.2.9","@semantic-release/git":"10.0.1","@semantic-release/npm":"12.0.2","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.2.1","@semantic-release/github":"11.0.6","@typescript-eslint/parser":"^8.18.1","@semantic-release/changelog":"6.0.3","@commitlint/config-conventional":"^20.0.0","@typescript-eslint/eslint-plugin":"^8.18.1","@semantic-release/commit-analyzer":"13.0.1","@semantic-release/release-notes-generator":"14.1.0"},"peerDependencies":{"@pulumi/pulumi":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/pulumi-spring-cloud-config_1.0.1_1762218256663_0.10220532301210894","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@egulatee/pulumi-spring-cloud-config","version":"1.1.0","keywords":["pulumi","dynamic-provider","spring-cloud-config","config-server","infrastructure-as-code","iac","configuration-management","spring","cloud-config"],"author":{"name":"Eric Gulatee"},"license":"Apache-2.0","_id":"@egulatee/pulumi-spring-cloud-config@1.1.0","maintainers":[{"name":"egulatee","email":"eric.gulatee@gmail.com"}],"homepage":"https://github.com/egulatee/pulumi-spring-cloud-config#readme","bugs":{"url":"https://github.com/egulatee/pulumi-spring-cloud-config/issues"},"dist":{"shasum":"7800a0263575129f1d95e3021656c676e1de2ac1","tarball":"https://registry.npmjs.org/@egulatee/pulumi-spring-cloud-config/-/pulumi-spring-cloud-config-1.1.0.tgz","fileCount":23,"integrity":"sha512-LiiEmPJfcFMQiHfVII2ad05KpMJrH0e+lUlWjgbgoa1ei0v0VPndguXaa/Wm4os5RCqhRf6a1nmxuy1fB4c5Yw==","signatures":[{"sig":"MEUCIQCOajSR923y0uQ6GX75wB46d5wpigQBgzXE8xZxk7fnfQIgVIc3iXXX0x/ojrxoT8xaYXN9Os0e4PlsG/G0OxWUg44=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":134404},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"13fe37b770cc1dcd9f0ad74035ee5deae4cce147","scripts":{"lint":"eslint 'src/**/*.ts' 'tests/**/*.ts'","test":"jest","build":"tsc","clean":"rm -rf dist","format":"prettier --write 'src/**/*.ts' 'tests/**/*.ts'","prepare":"husky","lint:fix":"eslint 'src/**/*.ts' 'tests/**/*.ts' --fix","test:watch":"jest --watch","format:check":"prettier --check 'src/**/*.ts' 'tests/**/*.ts'","test:coverage":"jest --coverage","prepublishOnly":"npm run clean && npm run build && npm run test"},"_npmUser":{"name":"egulatee","email":"eric.gulatee@gmail.com"},"repository":{"url":"git+https://github.com/egulatee/pulumi-spring-cloud-config.git","type":"git"},"_npmVersion":"10.9.4","description":"Pulumi Dynamic Provider for integrating Spring Cloud Config Server with infrastructure-as-code projects","directories":{},"_nodeVersion":"20.19.5","dependencies":{"axios":"^1.7.9"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","nock":"^14.0.10","husky":"^9.1.7","eslint":"^8.57.1","ts-jest":"^29.2.5","prettier":"^3.4.2","typescript":"^5.7.2","@types/jest":"^30.0.0","@types/node":"^24.10.0","@pulumi/pulumi":"^3.145.0","@commitlint/cli":"^20.1.0","google-protobuf":"4.0.0","semantic-release":"24.2.9","@semantic-release/git":"10.0.1","@semantic-release/npm":"12.0.2","@types/google-protobuf":"3.15.12","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.2.1","@semantic-release/github":"11.0.6","@typescript-eslint/parser":"^8.18.1","@semantic-release/changelog":"6.0.3","@commitlint/config-conventional":"^20.0.0","@typescript-eslint/eslint-plugin":"^8.18.1","@semantic-release/commit-analyzer":"13.0.1","@semantic-release/release-notes-generator":"14.1.0"},"peerDependencies":{"@pulumi/pulumi":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/pulumi-spring-cloud-config_1.1.0_1762225339346_0.3600536341192331","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@egulatee/pulumi-spring-cloud-config","version":"1.2.0","keywords":["pulumi","dynamic-provider","spring-cloud-config","config-server","infrastructure-as-code","iac","configuration-management","spring","cloud-config"],"author":{"name":"Eric Gulatee"},"license":"Apache-2.0","_id":"@egulatee/pulumi-spring-cloud-config@1.2.0","maintainers":[{"name":"egulatee","email":"eric.gulatee@gmail.com"}],"homepage":"https://github.com/egulatee/pulumi-spring-cloud-config#readme","bugs":{"url":"https://github.com/egulatee/pulumi-spring-cloud-config/issues"},"dist":{"shasum":"865dada0f3738922d2b19d1161c6a00572355829","tarball":"https://registry.npmjs.org/@egulatee/pulumi-spring-cloud-config/-/pulumi-spring-cloud-config-1.2.0.tgz","fileCount":23,"integrity":"sha512-9+KN4puVxZ7zdUw4E3s39MoNj0Cqkrjiw5D4Vden8HxykPIn0SlNGb4AqnUyrUWbh3iai084o3boAKvfBQg/+w==","signatures":[{"sig":"MEYCIQDP7zynNsjYCmz7mWeCcgLx1io5PUrmPnhwKoeHz9PQQwIhAPGq84KDyvnmI+hvEF0oU5szRrct8SW8wtQCEIMCCDaS","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":145714},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"59b8457ce1b9598e4624cc7ccbebde66f058fe2f","scripts":{"lint":"eslint 'src/**/*.ts' 'tests/**/*.ts'","test":"jest","build":"tsc","clean":"rm -rf dist","format":"prettier --write 'src/**/*.ts' 'tests/**/*.ts'","prepare":"husky","lint:fix":"eslint 'src/**/*.ts' 'tests/**/*.ts' --fix","test:watch":"jest --watch","format:check":"prettier --check 'src/**/*.ts' 'tests/**/*.ts'","test:coverage":"jest --coverage","prepublishOnly":"npm run clean && npm run build && npm run test"},"_npmUser":{"name":"egulatee","email":"eric.gulatee@gmail.com"},"repository":{"url":"git+https://github.com/egulatee/pulumi-spring-cloud-config.git","type":"git"},"_npmVersion":"10.9.4","description":"Pulumi Dynamic Provider for integrating Spring Cloud Config Server with infrastructure-as-code projects","directories":{},"_nodeVersion":"20.19.5","dependencies":{"axios":"^1.7.9"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","nock":"^14.0.10","husky":"^9.1.7","eslint":"^8.57.1","ts-jest":"^29.2.5","prettier":"^3.4.2","typescript":"^5.7.2","@types/jest":"^30.0.0","@types/node":"^24.10.0","@pulumi/pulumi":"^3.145.0","@commitlint/cli":"^20.1.0","google-protobuf":"4.0.0","semantic-release":"24.2.9","@semantic-release/git":"10.0.1","@semantic-release/npm":"12.0.2","@types/google-protobuf":"3.15.12","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.2.1","@semantic-release/github":"11.0.6","@typescript-eslint/parser":"^8.18.1","@semantic-release/changelog":"6.0.3","@commitlint/config-conventional":"^20.0.0","@typescript-eslint/eslint-plugin":"^8.18.1","@semantic-release/commit-analyzer":"13.0.1","@semantic-release/release-notes-generator":"14.1.0"},"peerDependencies":{"@pulumi/pulumi":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/pulumi-spring-cloud-config_1.2.0_1762231504049_0.9552634631169077","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@egulatee/pulumi-spring-cloud-config","version":"1.3.0","description":"Pulumi Dynamic Provider for integrating Spring Cloud Config Server with infrastructure-as-code projects","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","clean":"rm -rf dist","test":"jest","test:watch":"jest --watch","test:coverage":"jest --coverage","lint":"eslint 'src/**/*.ts' 'tests/**/*.ts'","lint:fix":"eslint 'src/**/*.ts' 'tests/**/*.ts' --fix","format":"prettier --write 'src/**/*.ts' 'tests/**/*.ts'","format:check":"prettier --check 'src/**/*.ts' 'tests/**/*.ts'","prepublishOnly":"npm run clean && npm run build && npm run test","prepare":"husky"},"keywords":["pulumi","dynamic-provider","spring-cloud-config","config-server","infrastructure-as-code","iac","configuration-management","spring","cloud-config"],"author":{"name":"Eric Gulatee"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/egulatee/pulumi-spring-cloud-config.git"},"bugs":{"url":"https://github.com/egulatee/pulumi-spring-cloud-config/issues"},"homepage":"https://github.com/egulatee/pulumi-spring-cloud-config#readme","engines":{"node":">=18.0.0"},"peerDependencies":{"@pulumi/pulumi":"^3.0.0"},"dependencies":{"axios":"^1.7.9"},"devDependencies":{"@commitlint/cli":"^20.1.0","@commitlint/config-conventional":"^20.0.0","@pulumi/pulumi":"^3.145.0","@semantic-release/changelog":"6.0.3","@semantic-release/commit-analyzer":"13.0.1","@semantic-release/git":"10.0.1","@semantic-release/github":"11.0.6","@semantic-release/npm":"12.0.2","@semantic-release/release-notes-generator":"14.1.0","@types/google-protobuf":"3.15.12","@types/jest":"^30.0.0","@types/node":"^24.10.0","@typescript-eslint/eslint-plugin":"^8.18.1","@typescript-eslint/parser":"^8.18.1","eslint":"^8.57.1","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.2.1","globals":"16.5.0","google-protobuf":"4.0.0","husky":"^9.1.7","jest":"^30.2.0","nock":"^14.0.10","prettier":"^3.4.2","semantic-release":"24.2.9","ts-jest":"^29.2.5","typescript":"^5.7.2","typescript-eslint":"8.46.3"},"publishConfig":{"access":"public"},"_id":"@egulatee/pulumi-spring-cloud-config@1.3.0","gitHead":"56487d5fe51d190ef229eb13b8c8539646885d9f","_nodeVersion":"20.19.5","_npmVersion":"10.9.4","dist":{"integrity":"sha512-mFZNVtbYj5vYd2h7DWhUq00+DIYE6H2lHCiPf+YCSMIhzMwlc5TYINcu0907OeHO8Z/voKmyAlz6Zgv6IdG5cg==","shasum":"4389c79a1f77b4217b4a6054a23ee25b786088ba","tarball":"https://registry.npmjs.org/@egulatee/pulumi-spring-cloud-config/-/pulumi-spring-cloud-config-1.3.0.tgz","fileCount":23,"unpackedSize":145774,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIHi9geu4q9Uphh9+IRoR9e8xe+ATTsKFNy1XyQemetLbAiEAoMGXGg8k6PwHKeoxJBIhTz9d4sBrgLvQ2wvxX6Y/zRA="}]},"_npmUser":{"name":"egulatee","email":"eric.gulatee@gmail.com"},"directories":{},"maintainers":[{"name":"egulatee","email":"eric.gulatee@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/pulumi-spring-cloud-config_1.3.0_1762233655670_0.010381314174634726"},"_hasShrinkwrap":false}},"time":{"created":"2025-11-03T17:05:10.629Z","modified":"2025-11-04T05:20:56.066Z","0.1.0":"2025-11-03T17:05:10.907Z","1.0.0":"2025-11-03T21:29:14.131Z","1.0.1":"2025-11-04T01:04:16.876Z","1.1.0":"2025-11-04T03:02:19.542Z","1.2.0":"2025-11-04T04:45:04.310Z","1.3.0":"2025-11-04T05:20:55.874Z"},"bugs":{"url":"https://github.com/egulatee/pulumi-spring-cloud-config/issues"},"author":{"name":"Eric Gulatee"},"license":"Apache-2.0","homepage":"https://github.com/egulatee/pulumi-spring-cloud-config#readme","keywords":["pulumi","dynamic-provider","spring-cloud-config","config-server","infrastructure-as-code","iac","configuration-management","spring","cloud-config"],"repository":{"type":"git","url":"git+https://github.com/egulatee/pulumi-spring-cloud-config.git"},"description":"Pulumi Dynamic Provider for integrating Spring Cloud Config Server with infrastructure-as-code projects","maintainers":[{"name":"egulatee","email":"eric.gulatee@gmail.com"}],"readme":"# @egulatee/pulumi-spring-cloud-config\n\n> Pulumi Dynamic Provider for integrating Spring Cloud Config Server with infrastructure-as-code projects\n\n[![npm version](https://img.shields.io/npm/v/@egulatee/pulumi-spring-cloud-config.svg?color=blue)](https://www.npmjs.com/package/@egulatee/pulumi-spring-cloud-config)\n[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)\n[![Test](https://github.com/egulatee/pulumi-spring-cloud-config/actions/workflows/test.yml/badge.svg)](https://github.com/egulatee/pulumi-spring-cloud-config/actions/workflows/test.yml)\n[![codecov](https://codecov.io/gh/egulatee/pulumi-spring-cloud-config/branch/main/graph/badge.svg)](https://codecov.io/gh/egulatee/pulumi-spring-cloud-config)\n\n## Overview\n\nThis package provides a Pulumi Dynamic Provider that fetches configuration from Spring Cloud Config Server and makes it available to your infrastructure-as-code projects. It eliminates code duplication and provides standardized, secure configuration retrieval across your Pulumi stacks.\n\n## Features\n\n- ✅ **Smart Diffing**: Only fetches configuration when inputs change\n- ✅ **Automatic Secret Detection**: Intelligently detects and marks sensitive properties as Pulumi secrets\n- ✅ **Property Source Filtering**: Filter configuration by source (e.g., Vault-only)\n- ✅ **Basic Authentication**: Secure communication with config-server\n- ✅ **TypeScript Support**: Full type definitions and IntelliSense support\n- ✅ **Configurable Timeouts**: Adjust request timeouts to match your environment\n- ✅ **Debug Mode**: Verbose logging for troubleshooting\n\n## Installation\n\n```bash\nnpm install @egulatee/pulumi-spring-cloud-config\n```\n\n## Requirements\n\n- Node.js >= 18.0.0\n- Pulumi >= 3.0.0\n- Spring Cloud Config Server >= 2.3.0\n\n## Quick Start\n\n```typescript\nimport * as pulumi from '@pulumi/pulumi';\nimport { ConfigServerConfig } from '@egulatee/pulumi-spring-cloud-config';\n\nconst config = new pulumi.Config();\n\n// Fetch configuration from Spring Cloud Config Server\nconst dbConfig = new ConfigServerConfig('database-config', {\n  configServerUrl: 'https://config-server.example.com',\n  application: 'my-service',\n  profile: pulumi.getStack(), // 'dev', 'staging', 'prod'\n  username: config.require('configServerUsername'),\n  password: config.requireSecret('configServerPassword'),\n  propertySources: ['vault'], // Optional: filter to Vault-only\n});\n\n// Get individual properties\nconst dbPassword = dbConfig.getProperty('database.password', true); // marked as secret\nconst dbHost = dbConfig.getProperty('database.host');\nconst dbPort = dbConfig.getProperty('database.port');\n\n// Use in other resources\nexport const databaseUrl = pulumi.interpolate`postgresql://${dbHost}:${dbPort}`;\n```\n\n## Configuration Options\n\n### ConfigServerConfigArgs\n\n| Option | Type | Required | Default | Description |\n|--------|------|----------|---------|-------------|\n| `configServerUrl` | `string` | Yes | - | The URL of the Spring Cloud Config Server |\n| `application` | `string` | Yes | - | The application name to fetch configuration for |\n| `profile` | `string` | Yes | - | The profile(s) to fetch configuration for (comma-separated) |\n| `label` | `string` | No | - | The label/branch to fetch configuration from |\n| `username` | `string` | No | - | Username for Basic Authentication |\n| `password` | `string` | No | - | Password for Basic Authentication |\n| `propertySources` | `string[]` | No | - | Filter property sources by name (e.g., `[\"vault\"]`) |\n| `timeout` | `number` | No | `10000` | Request timeout in milliseconds |\n| `debug` | `boolean` | No | `false` | Enable debug logging |\n| `autoDetectSecrets` | `boolean` | No | `true` | Automatically detect and mark secrets |\n| `enforceHttps` | `boolean` | No | `false` | Enforce HTTPS (fail on HTTP except localhost) |\n\n## How Smart Diffing Works\n\n### Understanding Configuration Refresh Behavior\n\nThis provider uses **smart diffing** to determine when to fetch configuration from the Spring Cloud Config Server:\n\n#### When Configuration is Fetched\n\nConfiguration is fetched from the config-server in these scenarios:\n\n1. **Initial Creation**: When you first create a `ConfigServerConfig` resource\n2. **Input Changes**: When any of these inputs change:\n   - `configServerUrl`\n   - `application`\n   - `profile`\n   - `label`\n   - `username`\n   - `password`\n   - `propertySources`\n\n#### When Configuration is NOT Fetched\n\nConfiguration is **not** fetched in these scenarios:\n\n- Running `pulumi up` without any changes to inputs\n- Running `pulumi preview` (read-only operation)\n- Updating unrelated resources in your stack\n\n### Detecting Upstream Configuration Changes\n\nIf configuration changes on the config-server **without** changing your Pulumi code, use `pulumi refresh`:\n\n```bash\n# Explicitly fetch latest configuration from config-server\npulumi refresh\n```\n\nThis will detect changes made directly on the config-server (e.g., rotated secrets, updated values).\n\n### Best Practices\n\n#### Development Workflow\n\n```bash\n# Normal deployments (only fetches if inputs changed)\npulumi up\n\n# After rotating secrets on config-server\npulumi refresh  # Detect upstream changes\npulumi up       # Apply any resulting infrastructure changes\n```\n\n#### Production Workflow\n\n```bash\n# Regular deployments\npulumi up\n\n# Scheduled configuration sync (optional)\n# Run this periodically to detect upstream changes\npulumi refresh && pulumi up\n```\n\n### Trade-offs\n\n**Smart Diffing (Current Approach)**\n- ✅ Efficient: Fewer API calls to config-server\n- ✅ Predictable: Only fetches when inputs change\n- ✅ Production-friendly: Less dependency on config-server availability\n- ⚠️ Requires manual refresh to detect upstream changes\n\n**Always Refresh (Alternative)**\n- ❌ More API calls on every `pulumi up`\n- ❌ Requires highly available config-server\n- ❌ Slower operations\n- ✅ Automatically detects upstream changes\n\n## Security Best Practices\n\n### HTTPS Enforcement\n\nAlways use HTTPS in production:\n\n```typescript\nconst config = new ConfigServerConfig('config', {\n  configServerUrl: 'https://config-server.example.com', // ✅ HTTPS\n  enforceHttps: true, // Fail if HTTP used (except localhost)\n  // ...\n});\n```\n\nHTTP URLs will trigger warnings unless `enforceHttps` is explicitly set to `false` or the URL is localhost.\n\n### Secret Detection\n\nThe provider automatically detects and marks secrets based on key patterns:\n\n**Detected Patterns:**\n- `password`, `passwd`, `pwd`\n- `secret`, `token`\n- `api_key`, `apikey`, `api-key`\n- `private_key`, `privatekey`\n- `access_key`, `accesskey`\n\n**Override Secret Detection:**\n\n```typescript\n// Disable auto-detection globally\nconst config = new ConfigServerConfig('config', {\n  autoDetectSecrets: false,\n  // ...\n});\n\n// Override per-property\nconst publicKey = dbConfig.getProperty('public_key', false); // NOT marked as secret\nconst apiKey = dbConfig.getProperty('api_key', true); // Force mark as secret\n```\n\n### Credential Management\n\nStore config-server credentials securely:\n\n```typescript\nimport * as pulumi from '@pulumi/pulumi';\n\nconst pulumiConfig = new pulumi.Config();\n\nconst config = new ConfigServerConfig('config', {\n  configServerUrl: pulumiConfig.require('configServerUrl'),\n  username: pulumiConfig.require('configServerUsername'),\n  password: pulumiConfig.requireSecret('configServerPassword'), // ✅ Encrypted\n  // ...\n});\n```\n\nSet encrypted configuration:\n\n```bash\npulumi config set configServerUsername admin\npulumi config set --secret configServerPassword 'your-password'\n```\n\n## Advanced Usage\n\n### Filtering by Property Source\n\nFetch only from specific property sources (e.g., Vault):\n\n```typescript\nconst vaultConfig = new ConfigServerConfig('vault-config', {\n  configServerUrl: 'https://config-server.example.com',\n  application: 'my-service',\n  profile: 'prod',\n  propertySources: ['vault'], // Only fetch from Vault\n  username: config.require('configServerUsername'),\n  password: config.requireSecret('configServerPassword'),\n});\n\n// Get all properties from Vault sources\nconst allVaultProps = vaultConfig.getSourceProperties(['vault']);\n```\n\n### Debug Mode\n\nEnable verbose logging for troubleshooting:\n\n```typescript\nconst config = new ConfigServerConfig('debug-config', {\n  configServerUrl: 'https://config-server.example.com',\n  application: 'my-service',\n  profile: 'dev',\n  debug: true, // ✅ Enable debug logging\n});\n```\n\n### Custom Timeout\n\nAdjust timeout for slow config-servers:\n\n```typescript\nconst config = new ConfigServerConfig('slow-config', {\n  configServerUrl: 'https://slow-config-server.example.com',\n  application: 'my-service',\n  profile: 'prod',\n  timeout: 30000, // 30 seconds (default: 10 seconds)\n});\n```\n\n## Architecture\n\n### How It Works\n\n```\n┌─────────────────┐\n│ Pulumi Program  │\n│                 │\n│ ConfigServer    │\n│ Config(...)     │\n└────────┬────────┘\n         │\n         ▼\n┌─────────────────────────┐\n│ Dynamic Provider        │\n│ - Validates inputs      │\n│ - Fetches config        │\n│ - Detects secrets       │\n│ - Smart diffing         │\n└────────┬────────────────┘\n         │\n         ▼\n┌─────────────────────────┐\n│ HTTP Client             │\n│ - Basic Auth            │\n│ - Retry logic           │\n│ - Error handling        │\n└────────┬────────────────┘\n         │\n         ▼\n┌─────────────────────────────┐\n│ Spring Cloud Config Server  │\n│ ┌─────────────────────────┐ │\n│ │ Property Sources:       │ │\n│ │ • Git Repository        │ │\n│ │ • HashiCorp Vault       │ │\n│ │ • Local Files           │ │\n│ │ • Environment Variables │ │\n│ └─────────────────────────┘ │\n└─────────────────────────────┘\n```\n\nFor a detailed architecture diagram, see [docs/architecture.txt](./docs/architecture.txt).\n\n**Key Components:**\n\n1. **ConfigServerConfig Resource** - User-facing API that creates a Pulumi resource\n2. **Dynamic Provider** - Manages resource lifecycle (create, update, diff)\n3. **HTTP Client** - Handles communication with config server (retry, auth, errors)\n4. **Config Server** - External service that aggregates configuration from multiple sources\n\n**Data Flow:**\n\n1. Pulumi program creates ConfigServerConfig resource\n2. Dynamic provider fetches configuration from config server\n3. Provider flattens property sources and detects secrets\n4. Properties are available via `getProperty()` and `getSourceProperties()`\n5. Smart diffing ensures configuration is only re-fetched when inputs change\n\n## Error Handling\n\nThe provider handles various error scenarios gracefully:\n\n### HTTP Errors\n\n| Status Code | Behavior | Retry? |\n|-------------|----------|--------|\n| **401** | Authentication failed - check username/password | ❌ No |\n| **403** | Access forbidden - insufficient permissions | ❌ No |\n| **404** | Configuration not found for application/profile | ❌ No |\n| **500** | Config server internal error | ❌ No |\n| **503** | Service unavailable | ✅ Yes (up to 3 times) |\n\n### Network Errors\n\n| Error Type | Description | Retry? |\n|------------|-------------|--------|\n| **ECONNREFUSED** | Cannot connect to config server | ✅ Yes |\n| **ETIMEDOUT** | Request timeout | ✅ Yes |\n| **ECONNABORTED** | Connection aborted | ✅ Yes |\n| **ENOTFOUND** | DNS resolution failed | ✅ Yes |\n\n### Retry Logic\n\n- **Max Retries**: 3 (configurable)\n- **Initial Delay**: 1000ms\n- **Backoff Strategy**: Exponential (2x multiplier)\n- **Total Max Time**: ~7 seconds (1s + 2s + 4s)\n\n**Example with retries:**\n\n```typescript\nconst config = new ConfigServerConfig('config', {\n  configServerUrl: 'https://config-server.example.com',\n  application: 'my-app',\n  profile: 'prod',\n  timeout: 15000, // Allow more time for retries\n});\n```\n\n### Error Messages\n\nAll error messages are sanitized to remove credentials:\n\n```\n❌ Bad:  \"Failed to connect to https://user:password@config-server.example.com\"\n✅ Good: \"Failed to connect to https://***:***@config-server.example.com\"\n```\n\n## API Reference\n\n### ConfigServerConfig\n\n#### Constructor\n\n```typescript\nnew ConfigServerConfig(name: string, args: ConfigServerConfigArgs, opts?: pulumi.CustomResourceOptions)\n```\n\n**Parameters:**\n- `name` - Unique name for this resource\n- `args` - Configuration arguments (see [Configuration Options](#configuration-options))\n- `opts` - Optional Pulumi resource options\n\n#### Properties\n\n##### config: pulumi.Output<ConfigServerResponse>\n\nThe full configuration response from the config server.\n\n**Type Definition:**\n```typescript\ninterface ConfigServerResponse {\n  name: string;                    // Application name\n  profiles: string[];              // Active profiles\n  label: string | null;            // Git label/branch\n  version: string | null;          // Git commit hash\n  state: string | null;            // State information\n  propertySources: PropertySource[]; // Array of property sources\n}\n\ninterface PropertySource {\n  name: string;                    // Source identifier (e.g., \"vault:/secret/app/prod\")\n  source: Record<string, unknown>; // Key-value properties\n}\n```\n\n##### properties: pulumi.Output<Record<string, unknown>>\n\nAll configuration properties flattened into a single key-value map. Later sources override earlier ones.\n\n#### Methods\n\n##### getProperty(key: string, markAsSecret?: boolean): pulumi.Output<string | undefined>\n\nGet a single property value from the configuration.\n\n**Parameters:**\n- `key` - The property key using dot notation (e.g., `\"database.password\"`)\n- `markAsSecret` (optional) - Override automatic secret detection:\n  - `true` - Force mark as secret\n  - `false` - Prevent marking as secret\n  - `undefined` - Use automatic detection (default)\n\n**Returns:** `pulumi.Output<string | undefined>` - The property value, or `undefined` if not found\n\n**Examples:**\n```typescript\n// Auto-detect secrets\nconst dbPassword = config.getProperty(\"database.password\");  // Marked as secret\n\n// Force mark as secret\nconst apiKey = config.getProperty(\"api.endpoint\", true);\n\n// Prevent marking as secret\nconst publicKey = config.getProperty(\"rsa.publicKey\", false);\n```\n\n##### getSourceProperties(sourceNames?: string[]): pulumi.Output<Record<string, unknown>>\n\nGet properties from specific property sources.\n\n**Parameters:**\n- `sourceNames` (optional) - Array of source name filters (case-insensitive substring match)\n  - If provided: Returns only properties from matching sources\n  - If omitted: Returns all properties from all sources\n\n**Returns:** `pulumi.Output<Record<string, unknown>>` - Filtered properties map\n\n**Examples:**\n```typescript\n// Get all Vault properties\nconst vaultProps = config.getSourceProperties([\"vault\"]);\n\n// Get properties from Vault OR Git sources\nconst vaultOrGit = config.getSourceProperties([\"vault\", \"git\"]);\n\n// Get all properties (same as config.properties)\nconst allProps = config.getSourceProperties();\n```\n\n**Source Name Matching:**\n- Source: `vault:/secret/app/prod` → Matches filter: `[\"vault\"]` ✅\n- Source: `git:https://github.com/org/config` → Matches filter: `[\"git\"]` ✅\n- Source: `file:///config/application.yml` → Matches filter: `[\"vault\"]` ❌\n\n##### getAllSecrets(): pulumi.Output<Record<string, string>>\n\nGet all properties that were automatically detected as secrets.\n\n**Returns:** `pulumi.Output<Record<string, string>>` - All auto-detected secrets\n\n**Note:** Only works if `autoDetectSecrets: true` (default). Returns empty object if disabled.\n\n**Secret Detection Pattern:**\n```\n/password|secret|token|.*key$|credential|auth|api[_-]?key/i\n```\n\n**Examples:**\n```typescript\nconst secrets = config.getAllSecrets();\n\n// Use with AWS Secrets Manager\nsecrets.apply(secretMap => {\n  for (const [key, value] of Object.entries(secretMap)) {\n    new aws.secretsmanager.Secret(`${key}`, {\n      secretString: value,\n    });\n  }\n});\n```\n\n## Migration Guide\n\n### Migrating from Manual Config Fetching\n\nIf you're currently using custom HTTP client code to fetch configuration from Spring Cloud Config Server, here's how to migrate:\n\n#### Before (Manual Approach)\n\n```typescript\nimport * as pulumi from '@pulumi/pulumi';\nimport axios from 'axios';\n\n// Manually fetch configuration\nasync function getConfig() {\n  const response = await axios.get(\n    'https://config-server.example.com/my-app/prod',\n    {\n      auth: {\n        username: 'admin',\n        password: 'secret',\n      },\n    }\n  );\n\n  // Manually flatten properties\n  const props: Record<string, any> = {};\n  for (const source of response.data.propertySources) {\n    Object.assign(props, source.source);\n  }\n\n  return props;\n}\n\n// Use in Pulumi program (problematic!)\nconst configPromise = getConfig();\nexport const dbPassword = configPromise.then(c => c['database.password']);\n```\n\n**Problems with this approach:**\n- ❌ Async/await doesn't work well with Pulumi Outputs\n- ❌ No automatic secret detection\n- ❌ No retry logic\n- ❌ No smart diffing (fetches on every `pulumi up`)\n- ❌ Credentials exposed in code or environment variables\n- ❌ Error handling is manual\n\n#### After (Using This Package)\n\n```typescript\nimport * as pulumi from '@pulumi/pulumi';\nimport { ConfigServerConfig } from '@egulatee/pulumi-spring-cloud-config';\n\nconst pulumiConfig = new pulumi.Config();\n\nconst config = new ConfigServerConfig('config', {\n  configServerUrl: 'https://config-server.example.com',\n  application: 'my-app',\n  profile: 'prod',\n  username: pulumiConfig.require('configServerUsername'),\n  password: pulumiConfig.requireSecret('configServerPassword'),\n});\n\n// Access properties with proper Pulumi Output handling\nexport const dbPassword = config.getProperty('database.password');\n```\n\n**Benefits:**\n- ✅ Proper Pulumi Output handling\n- ✅ Automatic secret detection and encryption\n- ✅ Built-in retry logic with exponential backoff\n- ✅ Smart diffing (only fetches when needed)\n- ✅ Credentials stored securely in Pulumi config\n- ✅ Comprehensive error handling\n\n### Step-by-Step Migration\n\n**1. Install the package:**\n\n```bash\nnpm install @egulatee/pulumi-spring-cloud-config\n```\n\n**2. Replace manual HTTP calls with ConfigServerConfig:**\n\n```typescript\n// Remove\nimport axios from 'axios';\n\n// Add\nimport { ConfigServerConfig } from '@egulatee/pulumi-spring-cloud-config';\n```\n\n**3. Store credentials in Pulumi config:**\n\n```bash\npulumi config set configServerUsername admin\npulumi config set --secret configServerPassword your-password\n```\n\n**4. Replace config fetching logic:**\n\n```typescript\n// Remove manual fetching\nconst configData = await axios.get(...);\n\n// Add resource\nconst config = new ConfigServerConfig('config', {\n  configServerUrl: 'https://config-server.example.com',\n  application: 'my-app',\n  profile: pulumi.getStack(),\n  username: pulumiConfig.require('configServerUsername'),\n  password: pulumiConfig.requireSecret('configServerPassword'),\n});\n```\n\n**5. Update property access:**\n\n```typescript\n// Replace direct property access\nconst dbHost = configData.properties['database.host'];\n\n// With getProperty()\nconst dbHost = config.getProperty('database.host');\n```\n\n**6. Test the migration:**\n\n```bash\npulumi preview\npulumi up\n```\n\n## Examples\n\nSee the [examples](./examples) directory for complete, runnable examples:\n\n1. **[Basic Usage](./examples/basic/)** - Simple configuration fetch\n   - Minimal working example\n   - Property access and Output unwrapping\n   - Introduction to the package\n\n2. **[With Authentication](./examples/with-auth/)** - Security best practices\n   - Basic Auth with username/password\n   - Secure credential storage using Pulumi Config\n   - Secret handling and detection\n   - Production-ready patterns\n\n3. **[Vault-Only Configuration](./examples/vault-only/)** - Property source filtering\n   - Filter properties by source (simulating Vault)\n   - `getSourceProperties()` usage\n   - `getAllSecrets()` demonstration\n   - Real-world Vault integration patterns\n\n4. **[Complete AWS Infrastructure](./examples/complete/)** - Real-world deployment\n   - Fully deployable AWS stack (VPC, RDS, ECS, ALB)\n   - Using config server values with AWS resources\n   - Secrets Manager integration\n   - Production architecture\n\n5. **[Multi-Environment](./examples/multi-environment/)** - Stack-based environments\n   - Managing dev/staging/prod with Pulumi stacks\n   - Dynamic profile selection\n   - Environment-specific configuration\n   - CI/CD integration patterns\n\nAll examples include:\n- Complete, working Pulumi programs\n- Detailed README with setup instructions\n- Docker Compose test infrastructure\n- Real configuration files\n\nSee [examples/README.md](./examples/README.md) for quick start instructions.\n\n## Releases\n\nThis project uses [semantic-release](https://github.com/semantic-release/semantic-release) for automated version management and package publishing.\n\n### Automated Release Process\n\nReleases happen automatically when commits are merged to the `main` branch. No manual intervention is required.\n\n**How it works:**\n\n1. **Merge to main** - When a pull request is merged to `main`\n2. **CI runs tests** - Full test suite, linting, and build validation\n3. **Semantic-release analyzes commits** - Determines version bump based on commit types\n4. **Version updated** - `package.json` version is bumped automatically\n5. **CHANGELOG generated** - Release notes created from commit messages\n6. **Git tag created** - Version tag pushed to repository (e.g., `v0.1.0`)\n7. **GitHub release created** - Release published with generated notes\n8. **NPM package published** - Package published to NPM registry\n\n### Version Bumping Rules\n\nVersions are determined by commit message types following [Conventional Commits](https://www.conventionalcommits.org/):\n\n| Commit Type | Version Bump | Example |\n|-------------|--------------|---------|\n| `fix:` | **PATCH** | `0.1.0` → `0.1.1` |\n| `feat:` | **MINOR** | `0.1.0` → `0.2.0` |\n| `BREAKING CHANGE:` | **MINOR** (in 0.x) | `0.1.0` → `0.2.0` |\n| `BREAKING CHANGE:` | **MAJOR** (in 1.x+) | `1.0.0` → `2.0.0` |\n\n**Note:** Breaking changes bump MINOR version in `0.x` releases to signal instability. Once the package reaches `1.0.0`, breaking changes will bump MAJOR version.\n\n### For Contributors\n\nWhen contributing to this project:\n\n1. **Follow Conventional Commits** - Your commit messages determine the release version\n   ```bash\n   feat: add OAuth2 authentication support\n   fix: resolve timeout error in config fetch\n   docs: update README with new examples\n   ```\n\n2. **No manual version bumping** - Never edit `package.json` version manually\n   - ❌ Don't: `\"version\": \"0.2.0\"`\n   - ✅ Do: Use conventional commit messages\n\n3. **No manual CHANGELOG edits** - CHANGELOG.md is auto-generated\n   - Write clear commit messages instead\n   - They become your release notes\n\n4. **View releases** - Check [GitHub Releases](https://github.com/egulatee/pulumi-spring-cloud-config/releases) for published versions\n\n### Commit Message Examples\n\n**Adding a feature (MINOR bump):**\n```bash\ngit commit -m \"feat: add support for JWT authentication\n\nImplements JWT token authentication for config server.\nAllows users to authenticate using bearer tokens.\n\nCloses #123\"\n```\n\n**Fixing a bug (PATCH bump):**\n```bash\ngit commit -m \"fix: resolve timeout error in retry logic\n\nThe exponential backoff was not respecting max timeout.\nNow correctly times out after configured duration.\n\nFixes #456\"\n```\n\n**Breaking change (MINOR in 0.x, MAJOR in 1.x+):**\n```bash\ngit commit -m \"feat: redesign authentication API\n\nBREAKING CHANGE: The authentication configuration has been\nrestructured. Users must migrate from 'username/password'\nto 'auth: { type: \"basic\", credentials: {...} }'.\n\nSee migration guide for details.\n\nFixes #789\"\n```\n\n## Development\n\n### Setup\n\n```bash\n# Clone the repository\ngit clone https://github.com/egulatee/pulumi-spring-cloud-config.git\ncd pulumi-spring-cloud-config\n\n# Install dependencies\nnpm install\n\n# Build\nnpm run build\n\n# Run tests\nnpm test\n\n# Run tests with coverage\nnpm run test:coverage\n```\n\n### Scripts\n\n- `npm run build` - Compile TypeScript to JavaScript\n- `npm run clean` - Remove build artifacts\n- `npm test` - Run tests\n- `npm run test:watch` - Run tests in watch mode\n- `npm run test:coverage` - Run tests with coverage report\n- `npm run lint` - Lint code\n- `npm run lint:fix` - Lint and auto-fix issues\n- `npm run format` - Format code with Prettier\n- `npm run format:check` - Check code formatting\n\n### Contributing\n\nSee [CONTRIBUTING.md](./CONTRIBUTING.md) for development guidelines.\n\n## Roadmap\n\n### v0.1.0 (Current)\n- ✅ Smart diffing with input comparison\n- ✅ Basic Authentication\n- ✅ Automatic secret detection\n- ✅ Property source filtering\n- ✅ Configurable timeout\n\n### v0.2.0 (Future)\n- ⏸️ OAuth2/JWT authentication\n- ⏸️ Retry with exponential backoff\n- ⏸️ Partial results support\n- ⏸️ Config-server version detection\n- ⏸️ Rate limiting and request caching\n- ⏸️ Docker-based integration tests\n\n## Troubleshooting\n\n### Configuration Not Updating\n\nIf configuration on the config-server changed but Pulumi doesn't detect it:\n\n```bash\n# Explicitly refresh to detect upstream changes\npulumi refresh\n\n# Then apply\npulumi up\n```\n\n### Timeout Errors\n\nIf requests are timing out:\n\n```typescript\nconst config = new ConfigServerConfig('config', {\n  // Increase timeout\n  timeout: 30000, // 30 seconds\n  // ...\n});\n```\n\n### HTTPS Warnings\n\nTo suppress HTTPS warnings for localhost development:\n\n```typescript\nconst config = new ConfigServerConfig('config', {\n  configServerUrl: 'http://localhost:8888', // Localhost is allowed\n  // ...\n});\n```\n\nOr explicitly allow HTTP:\n\n```typescript\nconst config = new ConfigServerConfig('config', {\n  configServerUrl: 'http://config-server.internal', // Internal network\n  enforceHttps: false, // Disable HTTPS enforcement\n  // ...\n});\n```\n\n## License\n\nApache-2.0 - See [LICENSE](./LICENSE) for details\n\n## Support\n\n- **Issues**: https://github.com/egulatee/pulumi-spring-cloud-config/issues\n- **Security**: See [SECURITY.md](./SECURITY.md)\n\n## Acknowledgments\n\nBuilt with:\n- [Pulumi](https://www.pulumi.com/) - Modern Infrastructure as Code\n- [Spring Cloud Config](https://spring.io/projects/spring-cloud-config) - Centralized Configuration Management\n- [TypeScript](https://www.typescriptlang.org/) - Typed JavaScript\n","readmeFilename":"README.md"}