Import Instagram archive to a Bluesky account
9
fork

Configure Feed

Select the types of activity you want to include in your feed.

Add codecov

+257 -10
+42
.codecov.yml
··· 1 + codecov: 2 + require_ci_to_pass: yes 3 + notify: 4 + wait_for_ci: yes 5 + 6 + coverage: 7 + precision: 2 8 + round: down 9 + range: "65...90" 10 + status: 11 + project: 12 + default: 13 + target: 65% 14 + threshold: 2% 15 + if_ci_failed: error 16 + patch: 17 + default: 18 + target: 65% 19 + threshold: 2% 20 + if_ci_failed: error 21 + changes: no 22 + 23 + parsers: 24 + gcov: 25 + branch_detection: 26 + conditional: yes 27 + loop: yes 28 + method: no 29 + macro: no 30 + 31 + comment: 32 + layout: "reach,diff,flags,tree" 33 + behavior: default 34 + require_changes: no 35 + 36 + ignore: 37 + - "**/*.test.ts" 38 + - "**/*.spec.ts" 39 + - "**/test/**" 40 + - "**/tests/**" 41 + - "src/main.ts" 42 + - "src/**/index.ts"
+2
README.md
··· 4 4 5 5 This utility reads an Instagram archive from your local disk and uses the official Bluesky TypeScript SDK to import posts into your configured Bluesky account. 6 6 7 + [![codecov](https://codecov.io/gh/marcomaroni/instagram-to-bluesky/branch/main/graph/badge.svg)](https://codecov.io/gh/marcomaroni/instagram-to-bluesky) 8 + 7 9 [**An example of an account used to import posts from Instagram**](https://bsky.app/profile/mm-instagram-arch.bsky.social) 8 10 9 11 ⚠️ We recommend creating a specific account to test the import and not using your main Bluesky account ⚠️
+18 -5
jest.config.ts
··· 13 13 }, 14 14 collectCoverage: true, 15 15 coverageDirectory: 'coverage', 16 - coverageReporters: ['text', 'lcov'], 16 + coverageReporters: ['json', 'lcov', 'text', 'clover'], 17 17 collectCoverageFrom: [ 18 - 'src/**/*.{js,jsx,ts,tsx}', 19 - '!src/**/*.d.ts', 20 - '!src/**/*.test.{js,jsx,ts,tsx}' 21 - ] 18 + 'src/**/*.ts', 19 + '!src/**/*.test.ts', 20 + '!src/**/*.spec.ts', 21 + '!src/test/**', 22 + '!src/**/index.ts', 23 + '!src/main.ts' 24 + ], 25 + coverageThreshold: { 26 + global: { 27 + branches: 65, 28 + functions: 80, 29 + lines: 80, 30 + statements: 80 31 + } 32 + }, 33 + forceExit: true, 34 + detectOpenHandles: true 22 35 };
+191 -5
package-lock.json
··· 27 27 "@types/node": "^22.10.10", 28 28 "@typescript-eslint/eslint-plugin": "^8.26.0", 29 29 "@typescript-eslint/parser": "^8.26.0", 30 + "codecov": "^3.8.2", 30 31 "eslint": "^9.21.0", 31 32 "eslint-plugin-import": "^2.31.0", 32 33 "eslint-plugin-jest": "^28.11.0", ··· 1817 1818 "@sinonjs/commons": "^3.0.0" 1818 1819 } 1819 1820 }, 1821 + "node_modules/@tootallnate/once": { 1822 + "version": "1.1.2", 1823 + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", 1824 + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", 1825 + "dev": true, 1826 + "license": "MIT", 1827 + "engines": { 1828 + "node": ">= 6" 1829 + } 1830 + }, 1820 1831 "node_modules/@tsconfig/node10": { 1821 1832 "version": "1.0.11", 1822 1833 "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", ··· 2242 2253 "node": ">=0.4.0" 2243 2254 } 2244 2255 }, 2256 + "node_modules/agent-base": { 2257 + "version": "6.0.2", 2258 + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", 2259 + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", 2260 + "dev": true, 2261 + "license": "MIT", 2262 + "dependencies": { 2263 + "debug": "4" 2264 + }, 2265 + "engines": { 2266 + "node": ">= 6.0.0" 2267 + } 2268 + }, 2245 2269 "node_modules/ajv": { 2246 2270 "version": "6.12.6", 2247 2271 "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", ··· 2325 2349 "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 2326 2350 "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 2327 2351 "dev": true, 2328 - "peer": true, 2329 2352 "dependencies": { 2330 2353 "sprintf-js": "~1.0.2" 2354 + } 2355 + }, 2356 + "node_modules/argv": { 2357 + "version": "0.0.2", 2358 + "resolved": "https://registry.npmjs.org/argv/-/argv-0.0.2.tgz", 2359 + "integrity": "sha512-dEamhpPEwRUBpLNHeuCm/v+g0anFByHahxodVO/BbAarHVBBg2MccCwf9K+o1Pof+2btdnkJelYVUWjW/VrATw==", 2360 + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", 2361 + "dev": true, 2362 + "engines": { 2363 + "node": ">=0.6.10" 2331 2364 } 2332 2365 }, 2333 2366 "node_modules/array-buffer-byte-length": { ··· 2891 2924 "node": ">= 0.12.0" 2892 2925 } 2893 2926 }, 2927 + "node_modules/codecov": { 2928 + "version": "3.8.2", 2929 + "resolved": "https://registry.npmjs.org/codecov/-/codecov-3.8.2.tgz", 2930 + "integrity": "sha512-6w/kt/xvmPsWMfDFPE/T054txA9RTgcJEw36PNa6MYX+YV29jCHCRFXwbQ3QZBTOgnex1J2WP8bo2AT8TWWz9g==", 2931 + "dev": true, 2932 + "license": "MIT", 2933 + "dependencies": { 2934 + "argv": "0.0.2", 2935 + "ignore-walk": "3.0.3", 2936 + "js-yaml": "3.14.1", 2937 + "teeny-request": "7.0.1", 2938 + "urlgrey": "0.4.4" 2939 + }, 2940 + "bin": { 2941 + "codecov": "bin/codecov" 2942 + }, 2943 + "engines": { 2944 + "node": ">=4.0" 2945 + } 2946 + }, 2894 2947 "node_modules/collect-v8-coverage": { 2895 2948 "version": "1.0.2", 2896 2949 "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", ··· 3840 3893 "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 3841 3894 "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 3842 3895 "dev": true, 3843 - "peer": true, 3844 3896 "bin": { 3845 3897 "esparse": "bin/esparse.js", 3846 3898 "esvalidate": "bin/esvalidate.js" ··· 4511 4563 "dev": true, 4512 4564 "peer": true 4513 4565 }, 4566 + "node_modules/http-proxy-agent": { 4567 + "version": "4.0.1", 4568 + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", 4569 + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", 4570 + "dev": true, 4571 + "license": "MIT", 4572 + "dependencies": { 4573 + "@tootallnate/once": "1", 4574 + "agent-base": "6", 4575 + "debug": "4" 4576 + }, 4577 + "engines": { 4578 + "node": ">= 6" 4579 + } 4580 + }, 4581 + "node_modules/https-proxy-agent": { 4582 + "version": "5.0.1", 4583 + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", 4584 + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", 4585 + "dev": true, 4586 + "license": "MIT", 4587 + "dependencies": { 4588 + "agent-base": "6", 4589 + "debug": "4" 4590 + }, 4591 + "engines": { 4592 + "node": ">= 6" 4593 + } 4594 + }, 4514 4595 "node_modules/human-signals": { 4515 4596 "version": "2.1.0", 4516 4597 "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", ··· 4529 4610 "license": "MIT", 4530 4611 "engines": { 4531 4612 "node": ">= 4" 4613 + } 4614 + }, 4615 + "node_modules/ignore-walk": { 4616 + "version": "3.0.3", 4617 + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", 4618 + "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", 4619 + "dev": true, 4620 + "license": "ISC", 4621 + "dependencies": { 4622 + "minimatch": "^3.0.4" 4532 4623 } 4533 4624 }, 4534 4625 "node_modules/import-fresh": { ··· 5757 5848 "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", 5758 5849 "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", 5759 5850 "dev": true, 5760 - "peer": true, 5761 5851 "dependencies": { 5762 5852 "argparse": "^1.0.7", 5763 5853 "esprima": "^4.0.0" ··· 6065 6155 "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", 6066 6156 "dev": true 6067 6157 }, 6158 + "node_modules/node-fetch": { 6159 + "version": "2.7.0", 6160 + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", 6161 + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", 6162 + "dev": true, 6163 + "license": "MIT", 6164 + "dependencies": { 6165 + "whatwg-url": "^5.0.0" 6166 + }, 6167 + "engines": { 6168 + "node": "4.x || >=6.0.0" 6169 + }, 6170 + "peerDependencies": { 6171 + "encoding": "^0.1.0" 6172 + }, 6173 + "peerDependenciesMeta": { 6174 + "encoding": { 6175 + "optional": true 6176 + } 6177 + } 6178 + }, 6068 6179 "node_modules/node-int64": { 6069 6180 "version": "0.4.0", 6070 6181 "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", ··· 7138 7249 "version": "1.0.3", 7139 7250 "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 7140 7251 "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", 7141 - "dev": true, 7142 - "peer": true 7252 + "dev": true 7143 7253 }, 7144 7254 "node_modules/stack-utils": { 7145 7255 "version": "2.0.6", ··· 7151 7261 }, 7152 7262 "engines": { 7153 7263 "node": ">=10" 7264 + } 7265 + }, 7266 + "node_modules/stream-events": { 7267 + "version": "1.0.5", 7268 + "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", 7269 + "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", 7270 + "dev": true, 7271 + "license": "MIT", 7272 + "dependencies": { 7273 + "stubs": "^3.0.0" 7154 7274 } 7155 7275 }, 7156 7276 "node_modules/string-length": { ··· 7286 7406 "url": "https://github.com/sponsors/sindresorhus" 7287 7407 } 7288 7408 }, 7409 + "node_modules/stubs": { 7410 + "version": "3.0.0", 7411 + "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", 7412 + "integrity": "sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==", 7413 + "dev": true, 7414 + "license": "MIT" 7415 + }, 7289 7416 "node_modules/supports-color": { 7290 7417 "version": "7.2.0", 7291 7418 "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", ··· 7310 7437 "url": "https://github.com/sponsors/ljharb" 7311 7438 } 7312 7439 }, 7440 + "node_modules/teeny-request": { 7441 + "version": "7.0.1", 7442 + "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-7.0.1.tgz", 7443 + "integrity": "sha512-sasJmQ37klOlplL4Ia/786M5YlOcoLGQyq2TE4WHSRupbAuDaQW0PfVxV4MtdBtRJ4ngzS+1qim8zP6Zp35qCw==", 7444 + "dev": true, 7445 + "license": "Apache-2.0", 7446 + "dependencies": { 7447 + "http-proxy-agent": "^4.0.0", 7448 + "https-proxy-agent": "^5.0.0", 7449 + "node-fetch": "^2.6.1", 7450 + "stream-events": "^1.0.5", 7451 + "uuid": "^8.0.0" 7452 + }, 7453 + "engines": { 7454 + "node": ">=10" 7455 + } 7456 + }, 7313 7457 "node_modules/test-exclude": { 7314 7458 "version": "6.0.0", 7315 7459 "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", ··· 7360 7504 "engines": { 7361 7505 "node": ">=8.0" 7362 7506 } 7507 + }, 7508 + "node_modules/tr46": { 7509 + "version": "0.0.3", 7510 + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", 7511 + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", 7512 + "dev": true, 7513 + "license": "MIT" 7363 7514 }, 7364 7515 "node_modules/ts-api-utils": { 7365 7516 "version": "2.0.1", ··· 7704 7855 "punycode": "^2.1.0" 7705 7856 } 7706 7857 }, 7858 + "node_modules/urlgrey": { 7859 + "version": "0.4.4", 7860 + "resolved": "https://registry.npmjs.org/urlgrey/-/urlgrey-0.4.4.tgz", 7861 + "integrity": "sha512-vfQzI+JDPBrBRw374pgWi6bFPfc+6BonRsazCj3weBIWe8moRcvfgy0lpaiGkMGnExs4Z/Dws8lp5mc9IegURw==", 7862 + "dev": true, 7863 + "license": "BSD-2-Clause" 7864 + }, 7865 + "node_modules/uuid": { 7866 + "version": "8.3.2", 7867 + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", 7868 + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", 7869 + "dev": true, 7870 + "license": "MIT", 7871 + "bin": { 7872 + "uuid": "dist/bin/uuid" 7873 + } 7874 + }, 7707 7875 "node_modules/v8-compile-cache-lib": { 7708 7876 "version": "3.0.1", 7709 7877 "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", ··· 7739 7907 "peer": true, 7740 7908 "dependencies": { 7741 7909 "makeerror": "1.0.12" 7910 + } 7911 + }, 7912 + "node_modules/webidl-conversions": { 7913 + "version": "3.0.1", 7914 + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", 7915 + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", 7916 + "dev": true, 7917 + "license": "BSD-2-Clause" 7918 + }, 7919 + "node_modules/whatwg-url": { 7920 + "version": "5.0.0", 7921 + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", 7922 + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", 7923 + "dev": true, 7924 + "license": "MIT", 7925 + "dependencies": { 7926 + "tr46": "~0.0.3", 7927 + "webidl-conversions": "^3.0.0" 7742 7928 } 7743 7929 }, 7744 7930 "node_modules/which": {
+4
package.json
··· 13 13 "test": "jest", 14 14 "test:watch": "jest --watch", 15 15 "test:coverage": "jest --coverage", 16 + "coverage": "jest --coverage --detectOpenHandles --forceExit", 17 + "coverage:ci": "jest --coverage --ci --detectOpenHandles --forceExit && codecov", 18 + "coverage:open": "npm run coverage && open coverage/lcov-report/index.html", 16 19 "lint": "eslint . --ext .ts", 17 20 "lint:fix": "eslint . --ext .ts --fix" 18 21 }, ··· 36 39 "@types/node": "^22.10.10", 37 40 "@typescript-eslint/eslint-plugin": "^8.26.0", 38 41 "@typescript-eslint/parser": "^8.26.0", 42 + "codecov": "^3.8.2", 39 43 "eslint": "^9.21.0", 40 44 "eslint-plugin-import": "^2.31.0", 41 45 "eslint-plugin-jest": "^28.11.0",