ããã«ã¡ã¯ãPay ID Devã®å€§æš ( @roothybrid7 )ã§ãã ä»åå€éšã¹ã¯ãªãããšããŠèªã¿èŸŒã¿å©çšããå€éšSDKããReactã«çµã¿èŸŒãããã®ã©ãããŒã©ã€ãã©ãªãäœã£ãã®ã§ããã®éçºäºäŸã玹ä»ããŸãã ä»åã SWC(Speedy Web Compiler) ã Release Please ãå©çšããŠéçºããã®ã§ãäž»ã«ããããã©ã䜿ã£ãã®ãã玹ä»ããããŸãã èæ¯ å»å¹Ž12/16ã«éå¬ããŸãããªã³ã©ã€ã³ã€ãã³ã ãBASE Tech Talk #1 ãNext.jsã䜿ã£ãã«ãŒãå€§èŠæš¡ãªãã¬ã€ã¹PJã®è£åŽãã ã®éããBASEã«ãŒãã·ã¹ãã ã®Frontendã¢ããªã±ãŒã·ã§ã³ã¯ãNext.jsã§åäœããŠãŸãã ããŠãã¢ããªã±ãŒã·ã§ã³ã§ã¯ãAmazon PayãPayPalãªã©æ§ã
ãªå€éšã®æ±ºæžãµãŒãã¹ãå©çšããŠããããããã®JavaScript SDKãããã€ãå©çšããŠããŸãã ãããã®SDKã¯ãå¹
åºãWebãµã€ãã§åäœããããã«äœãããŠãããããã¥ã¡ã³ããçšæãããåçš®APIãç°¡åã«å©çšã§ããããã«ãªã£ãŠããŸãã å©ç𿹿³ã«é¢ããŠã¯æ±ºããããŠããããã³ãã«ãããèªåèªèº«ã§ãã¹ãã£ã³ã°ããŠå©çšããããšã¯ã§ããã <script> ã¿ã°ã䜿ã£ãŠçŽæ¥èªã¿èŸŒãå¿
èŠããããŸãã ãŸããå©çšç»é²ãããŠãAPI Keyãšãã£ããã®ãå¿
èŠã«ãªã£ããããŸãã SDKã®æ©èœå©çšã®æ¹æ³ã¯ããµãŒãã¹ã«ãã£ãŠæ§ã
ãããã¹ã¯ãªããèªã¿èŸŒã¿åŸã®ã°ããŒãã«ãªããžã§ã¯ãã®ã¡ãœããã䜿ãã ãã®ãã®ã§ãã£ãããäžåºŠããäœããªãã€ã³ã¹ã¿ã³ã¹ãååŸãããã«ãã£ãŠå§ããŠæ©èœã䜿ãããšãã§ãããã®ããããŸãã Reactã«çµã¿èŸŒãã®ã¯ã ä»ã®ã©ã€ãã©ãªãšã®ã€ã³ãã°ã¬ãŒã·ã§ã³ ã§è¿°ã¹ãããŠããããã«ç¢ºãã«å¯èœã§ãã ããã§ã¯ãä»ã©ã€ãã©ãªã®ã¹ã¯ãªãããçµã¿èŸŒãŸããåæã®è©±ã§å§ããããŠããŸããã <script> ã§çŽæ¥èªã¿èŸŒãSDKã®å Žåã以äžã®ç¹ãèæ
®ããå¿
èŠããããšæã£ãŠããŸãã ãã³ãã«ããŠå©çšããããšã¯ã§ããªããããã¹ã¯ãªãããèªã¿èŸŒãŸããŠããããéè€ããŠèªã¿èŸŒãŸãªãããSDKã®åæåæ¹æ³ã®ç¢ºèª SDKã®I/Fã䜿ã£ãŠãReactã®ã©ã€ããµã€ã¯ã«ã«å¿ããåŠçã®å®è¡ãSDKããååŸããå€ãã€ã³ã¹ã¿ã³ã¹ã倱ããªãããã«ä¿æ å°èŠæš¡ãªã¢ããªã±ãŒã·ã§ã³ãªããã°ããŒãã«å€æ°ãSDKãå©çšããReactã³ã³ããŒãã³ãã§ä¿æããã°åé¡ãªãã®ãããããŸããã ãã ããèŠæš¡ã倧ãããªãã°ãReactã³ã³ããŒãã³ãããªãŒã®æ«ç«¯ã§ãããè€æ°ã®é¢ããç®æã§å©çšããããšããããããçµã¿èŸŒãã®ã¯é£ãããªããŸãã åé¡ã«é¢ããŠã¯ã react-paypal-js ã«èšèŒãããŠããéãã§ãä»ã®SDKã§ãåããããªåé¡ãèµ·ãããŸãã The Problem Developers integrating with PayPal are expected to add the JS SDK <script> to a website and then render components like the PayPal Buttons after the script loads. This architecture works great for simple websites but can be challenging when building single page apps. React developers think in terms of components and not about loading external scripts from an index.html file. It's easy to end up with a React PayPal integration that's sub-optimal and hurts the buyer's user experience. For example, abstracting away all the implementation details of the PayPal Buttons into a single React component is an anti-pattern because it tightly couples script loading with rendering. It's also problematic when you need to render multiple different PayPal components that share the same global script parameters. ãããã®æ¬è³ªçã§ãªãè€éãªåŠçã¯ãã¢ããªã±ãŒã·ã§ã³ã«å®è£
ããããã©ã€ãã©ãªã«ãŸãšããŠããŸã£ãæ¹ããã¢ããªã±ãŒã·ã§ã³å®è£
ã¯ç°¡åã«ãªãã®ã§ãæ€èšã«å€ãããšæããŸããããšã¯ãæ°ããããŒã«ã詊ãçµ¶å¥œã®æ©äŒã«ããªããŸãã ãŸããå®è£
ã«ã¯ã以äžã®ã©ã€ãã©ãªãåèã«ããŸããã react-paypal-js react-google-recaptcha-v3 react-stripe-js ãããžã§ã¯ãæ§æ ããŠãå®è£
ããã©ã€ãã©ãªã¯ãå€éšSDKãããŒãããŠå©çšããã©ãããŒã§ãããReactã®I/Fã«æºæ ããŠãããåäœã§ã¯åäœããªããã©ã°ã€ã³ãšåŒã¶ãããªãã®ã§ãã 以äžã« package.json ã®å
容ãæç²ããŸãã // package.json { " name ": " @baseinc/react-payid-js ", " version ": " 0.1.0 ", " main ": " dist/index.js ", " types ": " dist/types/index.d.ts ", " publishConfig ": { " registry ": " https://npm.pkg.github.com/ " } , " files ": [ " dist ", " README.md ", " CHANGELOG.md " ] , " scripts ": { " bundle ": " spack ", " build ": " yarn bundle ", " test ": " jest ", " type:check ": " tsc --noEmit ", " type:declarations ": " tsc --emitDeclarationOnly --outDir dist/types ", " validate ": " concurrently yarn:format:check yarn:type:check yarn:lint yarn:test yarn:build ", " sync ": " concurrently yarn:build yarn:type:declarations ", " prepack ": " yarn clean && yarn sync ", " clean ": " rimraf dist " } , " devDependencies ": { " @swc/cli ": " ^0.1.57 ", " @swc/core ": " ^1.2.203 ", " @swc/jest ": " ^0.2.21 ", " @testing-library/react ": " ^13.3.0 ", " @types/react ": " ^18.0.14 ", " @types/react-dom ": " ^18.0.5 ",, " concurrently ": " ^7.2.2 ", " jest ": " ^28.1.1 ", " jest-environment-jsdom ": " ^28.1.1 ", " jest-mock-extended ": " ^2.0.6 ", " react ": " ^18.2.0 ", " react-dom ": " ^18.2.0 ", " rimraf ": " ^3.0.2 ", " typescript ": " ^4.7.3 " } , " peerDependencies ": { " react ": " >=17.0.0 ", " react-dom ": " >=17.0.0 " } } peerDependencies ã§ããã¹ããšãªãã¢ããªã±ãŒã·ã§ã³ãªã©ãå©çšãæ³å®ãããReactã®æäœããŒãžã§ã³ãæå® éçºæããã¹ãå®è¡æã«ã Reactãå¿
èŠãšãªãã®ã§ã devDependencies ã§ãæç€ºçã«æå® TypeScriptã®ã³ã³ãã€ã«ãšbundleã¯ãSWCã§è¡ã TypeScriptã®åãã§ãã¯ãšåå®çŸ©ãã¡ã€ã«ã®åºåã¯ã tsc ã§è¡ã GitHub Packagesã§ãprivate㪠npm packageãšããŠå©çšã§ããããã« SWCã«ã€ã㊠SWCã¯ãææ°æ©èœã䜿ã£ãJavaScriptãTypeScriptãã¡ã€ã«ããã©ãŠã¶äºæã®JavaScriptã«å€æããããšãã§ããŸãã Next.js ã Deno ã§ã䜿ãããŠããŸãã èšå® ã¯ã .swcrc ã«èšè¿°ããŸãã Babelã®çœ®ãæã ãç®æšãšããŠãããããªãšããããããèšå®ã«ã¯ãããšåçã®èšå®ãèŠãããŸãã ãŸãã spack(swcpack) ãšããè€æ°ã®JavaScriptãTypeScriptãã¡ã€ã«ãäžã€ã«bundleã§ããæ©èœããããŸãã rollup.js ã webpack ãå©çšããããšããããšãã人ã¯ãããããšäŒŒããããªããŒã«ã ãšèããŠããããã°ããã§ãã bundleã®å®è¡ bundleããŒã«ã®èšå® ã¯ã spack.config.js ãšãããã¡ã€ã«ã«ã .swcrc ã«è¿œå ãããããªèšå®ãšããããŠèšè¿°ã§ããŸãããéçºéäžã ãããªã®ããã³ã³ãã€ã«åšãã®èšå®ã®ããã€ãã¯ã .swcrc ãã¡ã€ã«ã«è¿œå ããªããã°ãªããªããšããçœ ããããŸãã èšå®ãã¡ã€ã«ã¯ä»¥äžã®éãã§ãã // spack.config.js const { config } = require( '@swc/core/spack' ); module.exports = config( { entry: { web: __dirname + '/src/index.ts' , } , output: { path: __dirname + '/dist' , name: 'index.js' , } , module: {} , externalModules: [ 'react' , 'react-dom' ] , // [...snip...] } ); react ã react-dom ã¯ãã©ã€ãã©ãªãå©çšãããã¹ãåŽã®ã¢ããªã±ãŒã·ã§ã³ãªã©ã§è§£æ±ºãããããBundleã«å«ããå¿
èŠããªãã®ã§ã externalModules ã§é€å€ããŸãã rollup.jsã®external ãšåããããªæå®æ¹æ³ã§ããã spack.config.js ã®ãããã£ã¬ã¯ããªã§ã spack ã³ãã³ããå®è¡ãããšã output ã«æå®ãããã£ã¬ã¯ããªã«bundleãã¡ã€ã«ãåºåãããŸãã $ spack Bundling done: 0s 138.030983ms Done: 0s 0.351072ms âš Done in 0.49s. BundleããŒã«å©çšæã®ã³ã³ãã€ã«èšå® ããŠãã® spack ã¯ã .swcrc ã«è¿œå ãããããªã³ã³ãã€ã«åšãã®èšå®ã options ã«è¿œå ããããšãã§ããŸãã ããã«ããJavaScriptãžã®å€æãminifyãé£èªåãè¡ãããšãã§ããŸãã // spack.config.js const { config } = require( '@swc/core/spack' ); module.exports = config( { // [...snip...] options: { minify: true , jsc: { target: 'es5' , minify: { compress: true , mangle: { keepFnNames: true , } , } , parser: { syntax: 'typescript' , tsx: true , decorators: true , dynamicImport: true , } , transform: { legacyDecorator: true , decoratorMetadata: true , react: { runtime: 'automatic' , useBuiltins: true , } , } , } , } , } ); ããããæªå®è£
ãªç®æãããã®ãäžéšã®èšå®ã¯è¿œå ããŠãåããŸãããããã§ã .swcrc ã䜵çšãããããªã®ã§ãããããã©ã«ãã ãšæé»çã«ãããå©çšããŠãããŸãã å©çšããŠãããã®ã§ããã°ã .swcrc ã«å
šãŠå®çŸ©ããã°ããã®ã§ã¯? ãšæããããããŸããããJSON圢åŒã§èšå®ãæ±ããšèšè¿°ãã¹ãæãã®ã§ãã§ããã ãJavaScript圢åŒã®èšå®ãã¡ã€ã«ã䜿ãããã§ãã 以äžã«ã .swcrc ã®èšå®å
容ãèŒããŸãã // .swcrc { " exclude ": [ " .*.test.tsx? ", " .*.js$ " ] , " module ": { " type ": " commonjs ", " lazy ": true } , " jsc ": { " transform ": { " optimizer ": { " globals ": { " vars ": { " ENTRYPOINT_FUNCTION_NAME ": " '__payid%example%v1__' " , } } } } } } exclude ã¯ãé©çšããªããã¡ã€ã«ã®ãªã¹ããèšå®ããŸãããœãŒã¹ã³ãŒãã¯TypeScriptãªã®ã§ãJavaScriptã®èšå®ãã¡ã€ã«ããã¹ãã³ãŒãã®ãã¡ã€ã«ãé€å€ããŠããŸãã ã³ã³ãã€ã«æã«ã³ãŒãã眮ãæãã jsc.transform.optimizer.globals ãã spack.config.js ã«æå®ããŠãåããªãèšå®ã®äžã€ã§ãã³ã³ãã€ã«æã«æå®ãã倿°ã眮ãæããããšãå¯èœã§ãã Webpackã®DefinePlugin ãšåããããªããšãã§ããŸãã // .swcrc { // [...snip...] " jsc ": { " transform ": { " optimizer ": { " globals ": { " vars ": { " ENTRYPOINT_FUNCTION_NAME ": " '__payid%example%v1__' " , } } } } } } ä»åå©çšããSDKã¯ã䜿ãã®ã«çšæãããã°ããŒãã«é¢æ°ãå®è¡ããã®ã§ãããä»åŸåŸæ¹äºææ§ã®ãªãã¢ããããŒããªã©ãçºçããå Žåã颿°åã倿Žãããããªã©ãååãå¯å€ãªãããã³ã³ãã€ã«æã«æå®ã®ååã«çœ®ãæãããšããåŠçã«äœ¿ããŸããã ãœãŒã¹ã³ãŒãã§ä»¥äžã®èšè¿°ããã£ããšããŠã declare const ENTRYPOINT_FUNCTION_NAME: string ; // [...snip...] return window [ ENTRYPOINT_FUNCTION_NAME ] ; swcã§ã³ã³ãã€ã«ãããšã以äžã®ããã«å€æãããŸãã return window [ '__payid%example%v1__' ] ; ã³ã³ãã€ã«ãBundleèšå®ã®èª¿æŽ ãŸããBundleãã¡ã€ã«ãåäœãããã¯ããªããžããªã«å¥ãã£ã¬ã¯ããªãåã£ãŠãæå°éã®ãµã³ãã«ã¢ããªã±ãŒã·ã§ã³ãäœã£ãŠç¢ºèªããŸããã ä»åã®æ³å®ç°å¢ã¯ãNext.jsã¢ããªã±ãŒã·ã§ã³ã§ãReactã®ããŒãžã§ã³ãv17以äžãªã®ã§ã以äžã®ãããªãããžã§ã¯ãã®èšå®ãçšæããŸããã { " name ": " next ", " version ": " 0.1.0 ", " private ": true , " scripts ": { " dev ": " next dev ", " build ": " next build ", " start ": " next start ", " lint ": " next lint ", " dev:sync ": " cd ../../; yarn sync " } , " dependencies ": { " @baseinc/react-payid-js ": " latest ", " jose ": " ^4.8.1 ", " next ": " 12.1.6 ", " react ": " 17.0.2 ", " react-dom ": " 17.0.2 " } , " devDependencies ": { " @types/node ": " 18.0.0 ", " @types/react ": " ^17.0.0 ", " @types/react-dom ": " ^17.0.0 ", " eslint ": " 8.18.0 ", " eslint-config-next ": " 12.1.6 ", " typescript ": " 4.7.4 " } } commonjs圢åŒã«ããŠé£èªåãªã©ããããããããã§ãBundleãã¡ã€ã«ã§æäŸããã©ã€ãã©ãªãæ£ããåäœãããã確èªããŠãã³ã³ãã€ã«èšå®ã詊è¡é¯èª€ããŠãããŸããã åå®çŸ©ãã¡ã€ã«ã®åºå TypeScriptã§ã³ãŒãã£ã³ã°ããã¢ããªã±ãŒã·ã§ã³ã«çµã¿èŸŒãã§ãããã®ã«ãã³ãŒãè£å®ãåãã§ãã¯ã«å©çšããåå®çŸ©ãã¡ã€ã«(.d.ts)ãçšæããæ¹ã䟿å©ã§ãã ããã«ã¯ã tsc ã³ãã³ãã䜿ã£ãŠåºåããŸãã $ tsc --emitDeclarationOnly --outDir dist/types âš Done in 3.65s. ãã¹ã å€éšSDKãããŒãããŠå©çšããã©ãããŒãªã®ã§ãã¹ã¯ãªããã®ããŒã管çãŸããã®åäœç¢ºèªã¯ãèªååããŠãããããšããã§ãã ãã¹ãã£ã³ã°ãã¬ãŒã ã¯ãŒã¯ãšããŠã Jest ã䜿ãããšã«ããŸããã ãŸãããœãŒã¹ã³ãŒãã®ã³ã³ãã€ã«ãšãã³ãã«ã« swc ãå©çšããŠãããããTypeScriptã§æžãããã¹ãã³ãŒãã®å€æã« @swc/jest ãå©çšããããšã«ããŸããã Jest transformerãšããŠã @swc/jest ãæå®ããã®ã§ãããswcã®èšå®ã jest.config.js ã«èšè¿°ããããšãã§ããŸãã bundleããŒã«ã® spack(swcpack) ãšç°ãªããèšå®ã¯å
šãŠJestã®èšå®ã«ãŸãšããããšãå¯èœã§ãã ãŸãã .swcrc ãããå Žåãæé»çã«å©çšããããã䜿ããªãããã«èšå®ãããšããã¹ãçšã®swcèšå®ããŸãšããããŸãã /** @type {import('@jest/types').Config.InitialOptions} */ module.exports = { testEnvironment: 'jest-environment-jsdom' , transform: { '^.+ \\ .(t|j)sx?$' : [ '@swc/jest' , { swcrc: false , sourceMaps: true , jsc: { parser: { syntax: 'typescript' , tsx: true , } , transform: { hidden: { jest: true , } , react: { runtime: 'automatic' , } , optimizer: { globals: { vars: { ENTRYPOINT_FUNCTION_NAME: "'__payid%js%test__'" , } , } , } , } , } , } , ] , } , } ; ããã±ãŒãžå
¬éã»ç®¡ç äœã£ãã©ã€ãã©ãªãç°¡åã«å°å
¥ããããã«ã¯ãnpmæšæºã®ããã±ãŒãžç®¡çã·ã¹ãã ã®ä»çµã¿ã§æ±ãããšäŸ¿å©ã§ãããœãŒã¹ã³ãŒã管çã«GitHubãªããžããªãå©çšããŠãããããç°¡åã«çµ±åã§ãã GitHub Packages ãå©çšããããšã«ããŸããã ãšããã®ããGitHub Packagesãžã®å
¬éã¯ãGitHub Tokenãå©çšãããããªããžããªã®æš©éãšå¯èŠæ§(public/private)ãç¶æ¿ã§ããããã³ãããã®ããã·ã¥ãããã©ã«ããã©ã³ãã®ããŒãžãããªã¬ãŒã«ãGitHub Actionsã䜿ã£ãŠèªååãç°¡åã«ã§ããŸãã ããã±ãŒãžã®å
¬éã®æºåããªãªãŒã¹ã®ãããªå®åäœæ¥ã®èªååãšããã®ã¯ãããŸããŸãªããŒã«ãå
¬éãããŠããŸãã ä»åã¯ãCHANGELOGãGitHubãªãªãŒã¹ã®äœæãããŒãžã§ã³çªå·ã®æŽæ°ãèªååã§ãã Release Please ãšãã®GitHub Actionã§ãã Release Please Action ãå©çšããŸããã ãªããããã±ãŒãžã®å
¬éèªäœã¯ããã®ããŒã«ã§çŽæ¥è¡ããšããèš³ã§ã¯ãªããããŒã«ã§äœæãããGitHubãªãªãŒã¹äœæãããªã¬ãŒãšããŠå©çšããŸãã Release Pleaseã«ã€ã㊠Release Please ã䜿ããšã以äžã®äœæ¥ãèªååã§ããŸãã CHANGELOGã®çæ GitHubãªãªãŒã¹ã®äœæ(ãšããã«çŽã¥ãã³ããããžã®Git Tagã®äœæ) ãããžã§ã¯ãã®ããŒãžã§ã³çªå·æŽæ° ãããã®äœæ¥ããªãªãŒã¹PRãšåŒã°ããPull RequestãäœæãããããããŒãžããããšã«ãã£ãŠãªãªãŒã¹ãå®è¡ãããŸãã ããã©ã«ããã©ã³ãã«ããŒãžããããèªåãªãªãŒã¹ããã®ãšç°ãªãããªãªãŒã¹PRãæãããšã«ãã£ãŠãäºåã«å€æŽå
容ããªãªãŒã¹ããŒãã確èªã§ããèªåã®ã¿ã€ãã³ã°ã§ãªãªãŒã¹ããããšãã§ããŸãã ãŸããPRã«ã©ãã«ãã€ãããã®ãªãªãŒã¹ãã©ã®ç¶æ
ããèšé²ããŠããŸãã ãªãªãŒã¹PRã¯ã fix: ã feat: ãšãã£ã Conventional Commits 察å¿ããã¡ãã»ãŒãžãå«ãŸããã³ãããããããŒãžããããšäœæãããŸãã feat: ãšã©ãŒã³ãŒãã®è¿œå ã®ãããªã¡ãã»ãŒãžã§ãã³ããããããŒãžãããšãCHANGELOGãžã®å€æŽå
容ã®è¿œèšãšããŒãžã§ã³çªå·ã®æŽæ°ããããŸããCHANGELOGã®è¿œèšå
容ã¯ãã³ãããã¡ãã»ãŒãžããèªåçæãããŸãããŸããããŒãžã§ã³çªå·ã¯ãããšãã°ã feat: ãšãããã¬ãã£ãã¯ã¹ãå«ããšãã»ãã³ãã£ãã¯ããŒãžã§ã³ã®ãã€ããŒããŒãžã§ã³ããã€ã³ã¯ãªã¡ã³ãããããšããä»çµã¿ã§ãããã¬ãã£ãã¯ã¹ã«ãã£ãŠãã©ããã€ã³ã¯ãªã¡ã³ãããããã¯ç°ãªããŸãã package.json { "name": "@baseinc/react-payid-js", - "version": "0.4.0", + "version": "0.5.0", "main": "dist/index.js", ãããŠãPRãããŒãžãããšãGitHubãªãªãŒã¹ãäœããããšããä»çµã¿ã§ãã Release Please Actionã䜿ã£ãããã±ãŒãžå
¬é åè¿°ã®Release PleaseãçšããŠãªãªãŒã¹äœæ¥ãèªååããããã®Actionãã Release Please Action ã§ãã ããã䜿ããšããªãªãŒã¹PRãšGitHubãªãªãŒã¹äœæãè¡ãæ¬æ¥ã®åŠçã®ä»ã«ãGitHubãªãªãŒã¹äœæãããªã¬ãŒã«GitHub Packagesãžã®å
¬éãè¡ãããšãã§ããŸãã ããã«ã¯ãActionå®è¡åŸã®outputsãå©çšããŸãã release_created ãšãã倿°ã«GitHubãªãªãŒã¹ãäœæããããbooleanå€ã§æ ŒçŽãããŠããŸãã release_created=true ã§ããã°ãGitHub Actionã®jobã§ãã³ãã³ãã䜿ã£ãŠå
¬éãè¡ããŸãã name : release on : push : branches : - main jobs : release-please : runs-on : ubuntu-latest steps : - uses : google-github-actions/release-please-action@v3 id : release with : release-type : node - uses : actions/checkout@v2 if : ${{ steps.release.outputs.release_created }} - uses : actions/setup-node@v1 with : node-version : "16.x" if : ${{ steps.release.outputs.release_created }} - name : Resolve dependencies run : yarn install --frozen-lockfile if : ${{ steps.release.outputs.release_created }} - name : Configure git user run : | git config --global user.email ${{ github.actor }}@users.noreply.github.com git config --global user.name ${{ github.actor }} if : ${{ steps.release.outputs.release_created }} - name : Set GitHub packages env : GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }} run : | npm config set //npm.pkg.github.com/:_authToken=$GITHUB_TOKEN if : ${{ steps.release.outputs.release_created }} - run : yarn publish env : NODE_AUTH_TOKEN : ${{ secrets.GITHUB_TOKEN }} if : ${{ steps.release.outputs.release_created }} æåŸã«ãããã±ãŒãžã«ã¯ãbundleãã¡ã€ã«ãåå®çŸ©ãã¡ã€ã«ãå«ãããããã publishæã«åäœããnpm script ã䜿ã£ãŠãbundleãã¡ã€ã«ãšåå®çŸ©ãã¡ã€ã«ã®åºåãå®è¡ããŸãã prepack ãšããã¹ã¯ãªããã§å®è¡ããŸãã // package.json { " name ": " @baseinc/react-payid-js ", " version ": " 0.1.0 ", " main ": " dist/index.js ", " types ": " dist/types/index.d.ts ", " publishConfig ": { " registry ": " https://npm.pkg.github.com/ " } , " files ": [ " dist ", " README.md ", " CHANGELOG.md " ] , " scripts ": { " bundle ": " spack ", " build ": " yarn bundle ", " type:declarations ": " tsc --emitDeclarationOnly --outDir dist/types ", " sync ": " concurrently yarn:build yarn:type:declarations ", " prepack ": " yarn clean && yarn sync ", " clean ": " rimraf dist " } , // [...snip...] } Actionã«ãŠãGitHub Packagesã«å
¬éãããããã±ãŒãžã¯ããªããžããªããåç
§ããããšãã§ããŸãã ãããã« SWCãšRelease Pleaseãå©çšããReact TypeScriptã©ã€ãã©ãªéçºãšå
¬éã®äºäŸã玹ä»ããŸããã ã¢ããªã±ãŒã·ã§ã³äžã§æ°ããæè¡ãå°å
¥ããã®ã«èºèºãããã±ãŒã¹ã§ããç¹å®ã®æ©èœãå¥éã©ã€ãã©ãªåããããšã«ãã£ãŠãå°ããå§ããããã®ã§ãäœãã¢ããªã±ãŒã·ã§ã³ããåé¢ã§ããããªæ©èœãããå Žåã¯ãæ€èšããŠã¿ãŠã¯ãããã§ãããã?