From db6dd080c3dd9dc9de62bd9d6fbed9b8c954b2ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=E2=88=8Er?= <140930+codekiln@users.noreply.github.com> Date: Tue, 11 Feb 2025 05:04:33 -0500 Subject: [PATCH 1/3] pull maxmsp-ts into monorepo until original is compatible Fixes #20 --- apps/kebricide/Project/kebricide.js | 2 +- apps/kebricide/package.json | 2 +- apps/kebricide/src/kebricide.ts | 2 +- ...o-monorepo-until-original-is-compatible.md | 15 + ...onorepo-until-original-is-compatible.pr.md | 32 + package.json | 2 +- packages/maxmsp-ts/.changeset/README.md | 8 + packages/maxmsp-ts/.changeset/config.json | 11 + packages/maxmsp-ts/.github/dependabot.yml | 11 + packages/maxmsp-ts/.github/workflows/main.yml | 19 + .../maxmsp-ts/.github/workflows/publish.yml | 35 + packages/maxmsp-ts/.gitignore | 3 + packages/maxmsp-ts/.npmignore | 4 + packages/maxmsp-ts/CHANGELOG.md | 7 + packages/maxmsp-ts/README.md | 53 ++ packages/maxmsp-ts/gh/issue_28.md | 76 ++ packages/maxmsp-ts/package.json | 35 + packages/maxmsp-ts/pnpm-lock.yaml | 858 ++++++++++++++++++ packages/maxmsp-ts/src/index.ts | 439 +++++++++ packages/maxmsp-ts/tsconfig.json | 16 + pnpm-lock.yaml | 30 +- 21 files changed, 1645 insertions(+), 15 deletions(-) create mode 100644 gh/issue20-pull-maxmsp-ts-into-monorepo-until-original-is-compatible.md create mode 100644 gh/issue20-pull-maxmsp-ts-into-monorepo-until-original-is-compatible.pr.md create mode 100644 packages/maxmsp-ts/.changeset/README.md create mode 100644 packages/maxmsp-ts/.changeset/config.json create mode 100644 packages/maxmsp-ts/.github/dependabot.yml create mode 100644 packages/maxmsp-ts/.github/workflows/main.yml create mode 100644 packages/maxmsp-ts/.github/workflows/publish.yml create mode 100644 packages/maxmsp-ts/.gitignore create mode 100644 packages/maxmsp-ts/.npmignore create mode 100644 packages/maxmsp-ts/CHANGELOG.md create mode 100644 packages/maxmsp-ts/README.md create mode 100644 packages/maxmsp-ts/gh/issue_28.md create mode 100644 packages/maxmsp-ts/package.json create mode 100644 packages/maxmsp-ts/pnpm-lock.yaml create mode 100644 packages/maxmsp-ts/src/index.ts create mode 100644 packages/maxmsp-ts/tsconfig.json diff --git a/apps/kebricide/Project/kebricide.js b/apps/kebricide/Project/kebricide.js index 987e31a..37716d4 100644 --- a/apps/kebricide/Project/kebricide.js +++ b/apps/kebricide/Project/kebricide.js @@ -4,7 +4,7 @@ inlets = 1; outlets = 1; autowatch = 1; function bang() { - post("is this working? " + mylib.greet() + "\n"); + post("is this working x2? " + mylib.greet() + "\n"); } bang(); // .ts files with this at the end become a script usable in a [js] or [jsui] object diff --git a/apps/kebricide/package.json b/apps/kebricide/package.json index 1e929a3..02679a8 100644 --- a/apps/kebricide/package.json +++ b/apps/kebricide/package.json @@ -15,7 +15,7 @@ "license": "MIT", "devDependencies": { "@my-username/my-library": "workspace:*", - "@aptrn/maxmsp-ts": "file:../../../maxmsp-ts", + "@codekiln/maxmsp-ts": "workspace:*", "@types/maxmsp": "^1.0.13", "typescript": "^5.6.2" } diff --git a/apps/kebricide/src/kebricide.ts b/apps/kebricide/src/kebricide.ts index e1e71f3..e15ccbb 100644 --- a/apps/kebricide/src/kebricide.ts +++ b/apps/kebricide/src/kebricide.ts @@ -5,7 +5,7 @@ outlets = 1; autowatch = 1; function bang() { - post("is this working? " + mylib.greet() + "\n"); + post("is this working x2? " + mylib.greet() + "\n"); } bang(); diff --git a/gh/issue20-pull-maxmsp-ts-into-monorepo-until-original-is-compatible.md b/gh/issue20-pull-maxmsp-ts-into-monorepo-until-original-is-compatible.md new file mode 100644 index 0000000..bf0aa2b --- /dev/null +++ b/gh/issue20-pull-maxmsp-ts-into-monorepo-until-original-is-compatible.md @@ -0,0 +1,15 @@ +title: pull maxmsp-ts into monorepo until original is compatible +state: OPEN +author: codekiln +labels: enhancement +comments: 0 +assignees: codekiln +projects: +milestone: +number: 20 +-- +Until [Feature request: Max for Live compatibility - make it possible to compile all js assets to the root directory (not lib/) for use in Max for Live · Issue #28 · aptrn/maxmsp-ts](https://github.com/aptrn/maxmsp-ts/issues/28) issue is fixed or the MR [Max for Live compatibility - optionally compile js assets to root directory by codekiln · Pull Request #29 · aptrn/maxmsp-ts](https://github.com/aptrn/maxmsp-ts/pull/29/files) [[GitHub/MR]] is merged, pull [updated maxmsp-ts](https://github.com/codekiln/maxmsp-ts) into this monorepo. + +## Failing Builds +Until this is merged, builds in CI and in the dev container will fail, since they don't have access to the right version of `maxmsp-ts`. + * see https://github.com/codekiln/alits/actions/runs/13240482396/job/36954570963 diff --git a/gh/issue20-pull-maxmsp-ts-into-monorepo-until-original-is-compatible.pr.md b/gh/issue20-pull-maxmsp-ts-into-monorepo-until-original-is-compatible.pr.md new file mode 100644 index 0000000..55222c2 --- /dev/null +++ b/gh/issue20-pull-maxmsp-ts-into-monorepo-until-original-is-compatible.pr.md @@ -0,0 +1,32 @@ +title: Pull maxmsp-ts into monorepo temporarily for M4L compatibility +type: pull_request +base: main +author: codekiln +-- +This PR temporarily pulls maxmsp-ts into our monorepo to address Max for Live compatibility issues until aptrn/maxmsp-ts#28 is resolved or aptrn/maxmsp-ts#29 is merged. + +## Why +Currently, our CI builds are failing because they can't access the correct version of maxmsp-ts that supports compiling assets to the root directory for Max for Live compatibility. This is blocking development and CI pipelines. + +## Changes +- Adds maxmsp-ts package to monorepo workspace +- Updates kebricide to use workspace version (`@codekiln/maxmsp-ts: "workspace:*"`) instead of external dependency +- Maintains compatibility with Max for Live by allowing compilation to root directory + +### Migration Plan +Once aptrn/maxmsp-ts#28 is fixed or PR #29 is merged upstream, we will: +1. Remove the local maxmsp-ts package +2. Switch back to using the npm published version +3. Update all dependent packages accordingly + +### Testing +- [ ] Verify CI builds pass with workspace version +- [x] Confirm Max for Live compatibility works +- [x] Test kebricide builds with workspace dependency + +### Related Issues +- Fixes CI build failures (see job [36954570963](https://github.com/codekiln/alits/actions/runs/13240482396/job/36954570963)) +- Temporary solution for aptrn/maxmsp-ts#28 +- Implements #20 + +This is a temporary solution until upstream changes are merged. diff --git a/package.json b/package.json index cf3d815..3ee420e 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "monorepo", + "name": "alits-monorepo", "private": true, "scripts": { "build": "turbo build", diff --git a/packages/maxmsp-ts/.changeset/README.md b/packages/maxmsp-ts/.changeset/README.md new file mode 100644 index 0000000..e5b6d8d --- /dev/null +++ b/packages/maxmsp-ts/.changeset/README.md @@ -0,0 +1,8 @@ +# Changesets + +Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works +with multi-package repos, or single-package repos to help you version and publish your code. You can +find the full documentation for it [in our repository](https://github.com/changesets/changesets) + +We have a quick list of common questions to get you started engaging with this project in +[our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md) diff --git a/packages/maxmsp-ts/.changeset/config.json b/packages/maxmsp-ts/.changeset/config.json new file mode 100644 index 0000000..428ac59 --- /dev/null +++ b/packages/maxmsp-ts/.changeset/config.json @@ -0,0 +1,11 @@ +{ + "$schema": "https://unpkg.com/@changesets/config@3.0.3/schema.json", + "changelog": "@changesets/cli/changelog", + "commit": false, + "fixed": [], + "linked": [], + "access": "public", + "baseBranch": "main", + "updateInternalDependencies": "patch", + "ignore": [] +} diff --git a/packages/maxmsp-ts/.github/dependabot.yml b/packages/maxmsp-ts/.github/dependabot.yml new file mode 100644 index 0000000..b417983 --- /dev/null +++ b/packages/maxmsp-ts/.github/dependabot.yml @@ -0,0 +1,11 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file + +version: 2 +updates: + - package-ecosystem: "npm" # See documentation for possible values + directory: "/" # Location of package manifests + schedule: + interval: "daily" diff --git a/packages/maxmsp-ts/.github/workflows/main.yml b/packages/maxmsp-ts/.github/workflows/main.yml new file mode 100644 index 0000000..8b10276 --- /dev/null +++ b/packages/maxmsp-ts/.github/workflows/main.yml @@ -0,0 +1,19 @@ +name: CI +on: + push: + branches: + - "**" +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: pnpm/action-setup@v2 + with: + version: 9 + - uses: actions/setup-node@v3 + with: + node-version: 20 + cache: "pnpm" + - run: pnpm install --frozen-lockfile + - run: pnpm run build diff --git a/packages/maxmsp-ts/.github/workflows/publish.yml b/packages/maxmsp-ts/.github/workflows/publish.yml new file mode 100644 index 0000000..98373c4 --- /dev/null +++ b/packages/maxmsp-ts/.github/workflows/publish.yml @@ -0,0 +1,35 @@ +name: Publish +on: + workflow_run: + workflows: [CI] + branches: [main] + types: [completed] + +concurrency: ${{ github.workflow }}-${{ github.ref }} + +permissions: + contents: write + pull-requests: write + +jobs: + publish: + if: ${{ github.event.workflow_run.conclusion == 'success' }} + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: pnpm/action-setup@v2 + with: + version: 9 + - uses: actions/setup-node@v3 + with: + node-version: 20 + cache: "pnpm" + - run: pnpm install --frozen-lockfile + - name: Create Release Pull Request or Publish + id: changesets + uses: changesets/action@v1 + with: + publish: pnpm run release + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/packages/maxmsp-ts/.gitignore b/packages/maxmsp-ts/.gitignore new file mode 100644 index 0000000..52106d3 --- /dev/null +++ b/packages/maxmsp-ts/.gitignore @@ -0,0 +1,3 @@ +node_modules +dist +maxmsp.config.json \ No newline at end of file diff --git a/packages/maxmsp-ts/.npmignore b/packages/maxmsp-ts/.npmignore new file mode 100644 index 0000000..299ef6e --- /dev/null +++ b/packages/maxmsp-ts/.npmignore @@ -0,0 +1,4 @@ +.git +.gitignore +src +node_modules \ No newline at end of file diff --git a/packages/maxmsp-ts/CHANGELOG.md b/packages/maxmsp-ts/CHANGELOG.md new file mode 100644 index 0000000..2c66cb6 --- /dev/null +++ b/packages/maxmsp-ts/CHANGELOG.md @@ -0,0 +1,7 @@ +# @aptrn/maxmsp-ts + +## 0.0.1 + +### Patch Changes + +- 4d3b009: first publish diff --git a/packages/maxmsp-ts/README.md b/packages/maxmsp-ts/README.md new file mode 100644 index 0000000..646c6cb --- /dev/null +++ b/packages/maxmsp-ts/README.md @@ -0,0 +1,53 @@ +# maxmsp-ts + +CLI tool for building TypeScript projects and dependencies for usage in MaxMsp js object + +## How to Use + +For practical applications, you might want to check out: + +- [How to use TypeScript in Max](https://github.com/aptrn/maxmsp-ts-example.git) +- [Write your own TypeScript library](https://github.com/aptrn/maxmsp-ts-library-template) + +This repository contains the CLI tool called "maxmsp" used in those projects. + +## Installation + +The package is hosted on [npm](https://www.npmjs.com/package/@aptrn/maxmsp-ts). You can install it with: + +```bash +npm install -D @aptrn/maxmsp-ts +``` + +## Available Commands + +### `build` + +Builds your project, copying over files and fixing require paths. + +### `dev` + +Builds any time a file in `src` changes. + +### `rm ` + +Removes the package from the maxmsp.config.json file. + +### `add [options]` + +Adds a package to the maxmsp.config.json file. + +Options: + +- `--alias`: Optional. Sets the prefix for the copied files. Default is the package name. +- `--path`: Optional. Sets the path to the package. Default is the package name. +- `--files`: Optional. Sets the files to copy. Default is `index.js`. + +## Todo + +- [ ] Add "rename" command for renaming project and folder +- [ ] Find a way to auto-sanitize Max Project file structure +- [ ] Add a function to create patcher files from JSON, possibly "ui" or "main" +- [ ] Experiment with [maxpy](https://github.com/Barnard-PL-Labs/MaxPy) to build max patches programmatically +- [ ] Experiment with [are-you-es5](https://www.npmjs.com/package/are-you-es5) to check dependencies compatibility +- [ ] Experiment with [babel](https://babeljs.io/) to transpile dependencies diff --git a/packages/maxmsp-ts/gh/issue_28.md b/packages/maxmsp-ts/gh/issue_28.md new file mode 100644 index 0000000..f7b045e --- /dev/null +++ b/packages/maxmsp-ts/gh/issue_28.md @@ -0,0 +1,76 @@ +title: Feature request: Max for Live compatibility - make it possible to compile all js assets to the root directory (not lib/) for use in Max for Live +state: OPEN +author: codekiln +labels: +comments: 0 +assignees: +projects: +milestone: +number: 28 +-- +Thanks for scaffolding out this ecosystem of repositories for using typescript with max! + +## tl;dr Requested Feature Description +* make it possible for an application to configure `maxmsp.config.json` so as to not have `maxmsp` compiled assets put in subdirectories or expect the `lib/*` structure, so that Max for Live users can utilize it without needing to manually update their Max search path. + +## Context +I'm trying to write an Ableton Max for Live plugin with your template over at https://github.com/codekiln/alits. It's the first time I've made a Max for Live plugin, so please forgive me in advance if I've misunderstood something about Max, Max for Live, etc. + +Like most Ableton users, I don't have a standalone license to Max, and as a result, I can't create a Max Project file with the path references to the compiled artifacts in subdirectories. + +For example, `lib/${effectivePath}/${alias}_index.js` will not be available to the users of my Max for Live device unless I provide instructions to them to edit their [[c74/max/File Browser]] and add a path for each folder individually, because while Max for Live is capable of opening Max Projects, it's not capable of saving or editing them. + +I realize that Max's unique javascript model requires each js file to be uniquely named, and I think the aliasing functionality might be sufficient to meet that requirement without needing folders in the case of Max for Live. + +## Feature Request + +If `apps/kebricide/maxmsp.config.json` has: +```json +{ + "output_path": "", + "dependencies": { + "@my-username/my-library": { + "alias": "myLibrary", + "files": ["index.js"], + "path": "" + } + } +} +``` + +and `apps/kebricide/tsconfig.json` has: +```json +{ + "compileOnSave": true, + "compilerOptions": { + "module": "CommonJS", + "target": "ES5", + "ignoreDeprecations": "5.0", + "strict": true, + "noImplicitAny": true, + "sourceMap": false, + "outDir": "./Project", + "baseUrl": "src", + "types": ["maxmsp"], + "lib": ["es5"] + }, + "include": ["./src/**/*.ts"] +} +``` + +then currently, `pnpm dev` -> `maxmsp dev` ends up calling `postBuild()` which results in: +``` +apps/kebricide/Project/@my-username-my-library/myLibrary_index.js +apps/kebricide/Project/kebricide.js +apps/kebricide/Project/maxmsp-test.amxd +``` +instead of: +``` +apps/kebricide/Project/myLibrary_index.js +apps/kebricide/Project/index.js +apps/kebricide/Project/maxmsp-test.amxd +``` + +Also, of course, `myLibrary_index.js` would need to have its require statements updated so as to no longer expect the results to be located in a subdirectory. + +I will likely implement the changes in a fork as they are necessary for my use case. I'd love to submit a PR if you are welcome to that. Please let me knokw if you have any advice or guidance in this matter. diff --git a/packages/maxmsp-ts/package.json b/packages/maxmsp-ts/package.json new file mode 100644 index 0000000..52f3359 --- /dev/null +++ b/packages/maxmsp-ts/package.json @@ -0,0 +1,35 @@ +{ + "name": "@codekiln/maxmsp-ts", + "version": "0.0.1", + "description": "CLI tool for building typescript projects and dependencies for usage in MaxMsp js object, adapted for Max for Live", + "main": "index.js", + "type": "module", + "bin": { + "maxmsp": "dist/index.js" + }, + "files": [ + "dist", + "README.md" + ], + "scripts": { + "build": "tsc", + "dev": "tsc --watch" + }, + "keywords": [ + "maxmsp" + ], + "author": "aptrn", + "repository": { + "type": "git", + "url": "git+https://github.com/aptrn/maxmsp-ts.git" + }, + "license": "MIT", + "devDependencies": { + "@changesets/cli": "^2.27.9", + "@types/node": "^22.7.4", + "typescript": "^5.6.2" + }, + "dependencies": { + "chokidar": "^4.0.1" + } +} diff --git a/packages/maxmsp-ts/pnpm-lock.yaml b/packages/maxmsp-ts/pnpm-lock.yaml new file mode 100644 index 0000000..ccd327b --- /dev/null +++ b/packages/maxmsp-ts/pnpm-lock.yaml @@ -0,0 +1,858 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + chokidar: + specifier: ^4.0.1 + version: 4.0.1 + devDependencies: + '@changesets/cli': + specifier: ^2.27.9 + version: 2.27.9 + '@types/node': + specifier: ^22.7.4 + version: 22.7.4 + typescript: + specifier: ^5.6.2 + version: 5.6.3 + +packages: + + '@babel/runtime@7.25.7': + resolution: {integrity: sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==} + engines: {node: '>=6.9.0'} + + '@changesets/apply-release-plan@7.0.5': + resolution: {integrity: sha512-1cWCk+ZshEkSVEZrm2fSj1Gz8sYvxgUL4Q78+1ZZqeqfuevPTPk033/yUZ3df8BKMohkqqHfzj0HOOrG0KtXTw==} + + '@changesets/assemble-release-plan@6.0.4': + resolution: {integrity: sha512-nqICnvmrwWj4w2x0fOhVj2QEGdlUuwVAwESrUo5HLzWMI1rE5SWfsr9ln+rDqWB6RQ2ZyaMZHUcU7/IRaUJS+Q==} + + '@changesets/changelog-git@0.2.0': + resolution: {integrity: sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ==} + + '@changesets/cli@2.27.9': + resolution: {integrity: sha512-q42a/ZbDnxPpCb5Wkm6tMVIxgeI9C/bexntzTeCFBrQEdpisQqk8kCHllYZMDjYtEc1ZzumbMJAG8H0Z4rdvjg==} + hasBin: true + + '@changesets/config@3.0.3': + resolution: {integrity: sha512-vqgQZMyIcuIpw9nqFIpTSNyc/wgm/Lu1zKN5vECy74u95Qx/Wa9g27HdgO4NkVAaq+BGA8wUc/qvbvVNs93n6A==} + + '@changesets/errors@0.2.0': + resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} + + '@changesets/get-dependents-graph@2.1.2': + resolution: {integrity: sha512-sgcHRkiBY9i4zWYBwlVyAjEM9sAzs4wYVwJUdnbDLnVG3QwAaia1Mk5P8M7kraTOZN+vBET7n8KyB0YXCbFRLQ==} + + '@changesets/get-release-plan@4.0.4': + resolution: {integrity: sha512-SicG/S67JmPTrdcc9Vpu0wSQt7IiuN0dc8iR5VScnnTVPfIaLvKmEGRvIaF0kcn8u5ZqLbormZNTO77bCEvyWw==} + + '@changesets/get-version-range-type@0.4.0': + resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} + + '@changesets/git@3.0.1': + resolution: {integrity: sha512-pdgHcYBLCPcLd82aRcuO0kxCDbw/yISlOtkmwmE8Odo1L6hSiZrBOsRl84eYG7DRCab/iHnOkWqExqc4wxk2LQ==} + + '@changesets/logger@0.1.1': + resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} + + '@changesets/parse@0.4.0': + resolution: {integrity: sha512-TS/9KG2CdGXS27S+QxbZXgr8uPsP4yNJYb4BC2/NeFUj80Rni3TeD2qwWmabymxmrLo7JEsytXH1FbpKTbvivw==} + + '@changesets/pre@2.0.1': + resolution: {integrity: sha512-vvBJ/If4jKM4tPz9JdY2kGOgWmCowUYOi5Ycv8dyLnEE8FgpYYUo1mgJZxcdtGGP3aG8rAQulGLyyXGSLkIMTQ==} + + '@changesets/read@0.6.1': + resolution: {integrity: sha512-jYMbyXQk3nwP25nRzQQGa1nKLY0KfoOV7VLgwucI0bUO8t8ZLCr6LZmgjXsiKuRDc+5A6doKPr9w2d+FEJ55zQ==} + + '@changesets/should-skip-package@0.1.1': + resolution: {integrity: sha512-H9LjLbF6mMHLtJIc/eHR9Na+MifJ3VxtgP/Y+XLn4BF7tDTEN1HNYtH6QMcjP1uxp9sjaFYmW8xqloaCi/ckTg==} + + '@changesets/types@4.1.0': + resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} + + '@changesets/types@6.0.0': + resolution: {integrity: sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==} + + '@changesets/write@0.3.2': + resolution: {integrity: sha512-kDxDrPNpUgsjDbWBvUo27PzKX4gqeKOlhibaOXDJA6kuBisGqNHv/HwGJrAu8U/dSf8ZEFIeHIPtvSlZI1kULw==} + + '@manypkg/find-root@1.1.0': + resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} + + '@manypkg/get-packages@1.1.3': + resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@types/node@12.20.55': + resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + + '@types/node@22.7.4': + resolution: {integrity: sha512-y+NPi1rFzDs1NdQHHToqeiX2TIS79SWEAw9GYhkkx8bD0ChpfqC+n2j5OXOCpzfojBEBt6DnEnnG9MY0zk1XLg==} + + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + better-path-resolve@1.0.0: + resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} + engines: {node: '>=4'} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + + chokidar@4.0.1: + resolution: {integrity: sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==} + engines: {node: '>= 14.16.0'} + + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + + cross-spawn@5.1.0: + resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} + + detect-indent@6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + enquirer@2.4.1: + resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} + engines: {node: '>=8.6'} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + extendable-error@0.1.7: + resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} + + external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} + + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + human-id@1.0.2: + resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-subdir@1.2.0: + resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} + engines: {node: '>=4'} + + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + lodash.startcase@4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + + lru-cache@4.1.5: + resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + + outdent@0.5.0: + resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} + + p-filter@2.1.0: + resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} + engines: {node: '>=8'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-map@2.1.0: + resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} + engines: {node: '>=6'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-manager-detector@0.2.0: + resolution: {integrity: sha512-E385OSk9qDcXhcM9LNSe4sdhx8a9mAPrZ4sMLW+tmxl5ZuGtPUcdFu+MPP2jbgiWAZ6Pfe5soGFMd+0Db5Vrog==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + picocolors@1.1.0: + resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + + pseudomap@1.0.2: + resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + read-yaml-file@1.1.0: + resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} + engines: {node: '>=6'} + + readdirp@4.0.2: + resolution: {integrity: sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==} + engines: {node: '>= 14.16.0'} + + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + + shebang-command@1.2.0: + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} + engines: {node: '>=0.10.0'} + + shebang-regex@1.0.0: + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} + engines: {node: '>=0.10.0'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + spawndamnit@2.0.0: + resolution: {integrity: sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + term-size@2.2.1: + resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} + engines: {node: '>=8'} + + tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + typescript@5.6.3: + resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} + engines: {node: '>=14.17'} + hasBin: true + + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + + yallist@2.1.2: + resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} + +snapshots: + + '@babel/runtime@7.25.7': + dependencies: + regenerator-runtime: 0.14.1 + + '@changesets/apply-release-plan@7.0.5': + dependencies: + '@changesets/config': 3.0.3 + '@changesets/get-version-range-type': 0.4.0 + '@changesets/git': 3.0.1 + '@changesets/should-skip-package': 0.1.1 + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + detect-indent: 6.1.0 + fs-extra: 7.0.1 + lodash.startcase: 4.4.0 + outdent: 0.5.0 + prettier: 2.8.8 + resolve-from: 5.0.0 + semver: 7.6.3 + + '@changesets/assemble-release-plan@6.0.4': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.2 + '@changesets/should-skip-package': 0.1.1 + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + semver: 7.6.3 + + '@changesets/changelog-git@0.2.0': + dependencies: + '@changesets/types': 6.0.0 + + '@changesets/cli@2.27.9': + dependencies: + '@changesets/apply-release-plan': 7.0.5 + '@changesets/assemble-release-plan': 6.0.4 + '@changesets/changelog-git': 0.2.0 + '@changesets/config': 3.0.3 + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.2 + '@changesets/get-release-plan': 4.0.4 + '@changesets/git': 3.0.1 + '@changesets/logger': 0.1.1 + '@changesets/pre': 2.0.1 + '@changesets/read': 0.6.1 + '@changesets/should-skip-package': 0.1.1 + '@changesets/types': 6.0.0 + '@changesets/write': 0.3.2 + '@manypkg/get-packages': 1.1.3 + ansi-colors: 4.1.3 + ci-info: 3.9.0 + enquirer: 2.4.1 + external-editor: 3.1.0 + fs-extra: 7.0.1 + mri: 1.2.0 + p-limit: 2.3.0 + package-manager-detector: 0.2.0 + picocolors: 1.1.0 + resolve-from: 5.0.0 + semver: 7.6.3 + spawndamnit: 2.0.0 + term-size: 2.2.1 + + '@changesets/config@3.0.3': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.2 + '@changesets/logger': 0.1.1 + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + micromatch: 4.0.8 + + '@changesets/errors@0.2.0': + dependencies: + extendable-error: 0.1.7 + + '@changesets/get-dependents-graph@2.1.2': + dependencies: + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + picocolors: 1.1.0 + semver: 7.6.3 + + '@changesets/get-release-plan@4.0.4': + dependencies: + '@changesets/assemble-release-plan': 6.0.4 + '@changesets/config': 3.0.3 + '@changesets/pre': 2.0.1 + '@changesets/read': 0.6.1 + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + + '@changesets/get-version-range-type@0.4.0': {} + + '@changesets/git@3.0.1': + dependencies: + '@changesets/errors': 0.2.0 + '@manypkg/get-packages': 1.1.3 + is-subdir: 1.2.0 + micromatch: 4.0.8 + spawndamnit: 2.0.0 + + '@changesets/logger@0.1.1': + dependencies: + picocolors: 1.1.0 + + '@changesets/parse@0.4.0': + dependencies: + '@changesets/types': 6.0.0 + js-yaml: 3.14.1 + + '@changesets/pre@2.0.1': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + + '@changesets/read@0.6.1': + dependencies: + '@changesets/git': 3.0.1 + '@changesets/logger': 0.1.1 + '@changesets/parse': 0.4.0 + '@changesets/types': 6.0.0 + fs-extra: 7.0.1 + p-filter: 2.1.0 + picocolors: 1.1.0 + + '@changesets/should-skip-package@0.1.1': + dependencies: + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + + '@changesets/types@4.1.0': {} + + '@changesets/types@6.0.0': {} + + '@changesets/write@0.3.2': + dependencies: + '@changesets/types': 6.0.0 + fs-extra: 7.0.1 + human-id: 1.0.2 + prettier: 2.8.8 + + '@manypkg/find-root@1.1.0': + dependencies: + '@babel/runtime': 7.25.7 + '@types/node': 12.20.55 + find-up: 4.1.0 + fs-extra: 8.1.0 + + '@manypkg/get-packages@1.1.3': + dependencies: + '@babel/runtime': 7.25.7 + '@changesets/types': 4.1.0 + '@manypkg/find-root': 1.1.0 + fs-extra: 8.1.0 + globby: 11.1.0 + read-yaml-file: 1.1.0 + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + + '@types/node@12.20.55': {} + + '@types/node@22.7.4': + dependencies: + undici-types: 6.19.8 + + ansi-colors@4.1.3: {} + + ansi-regex@5.0.1: {} + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + array-union@2.1.0: {} + + better-path-resolve@1.0.0: + dependencies: + is-windows: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + chardet@0.7.0: {} + + chokidar@4.0.1: + dependencies: + readdirp: 4.0.2 + + ci-info@3.9.0: {} + + cross-spawn@5.1.0: + dependencies: + lru-cache: 4.1.5 + shebang-command: 1.2.0 + which: 1.3.1 + + detect-indent@6.1.0: {} + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + enquirer@2.4.1: + dependencies: + ansi-colors: 4.1.3 + strip-ansi: 6.0.1 + + esprima@4.0.1: {} + + extendable-error@0.1.7: {} + + external-editor@3.1.0: + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + + fast-glob@3.3.2: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fastq@1.17.1: + dependencies: + reusify: 1.0.4 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + fs-extra@7.0.1: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs-extra@8.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + + graceful-fs@4.2.11: {} + + human-id@1.0.2: {} + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + ignore@5.3.2: {} + + is-extglob@2.1.1: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + is-subdir@1.2.0: + dependencies: + better-path-resolve: 1.0.0 + + is-windows@1.0.2: {} + + isexe@2.0.0: {} + + js-yaml@3.14.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + jsonfile@4.0.0: + optionalDependencies: + graceful-fs: 4.2.11 + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + lodash.startcase@4.4.0: {} + + lru-cache@4.1.5: + dependencies: + pseudomap: 1.0.2 + yallist: 2.1.2 + + merge2@1.4.1: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mri@1.2.0: {} + + os-tmpdir@1.0.2: {} + + outdent@0.5.0: {} + + p-filter@2.1.0: + dependencies: + p-map: 2.1.0 + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-map@2.1.0: {} + + p-try@2.2.0: {} + + package-manager-detector@0.2.0: {} + + path-exists@4.0.0: {} + + path-type@4.0.0: {} + + picocolors@1.1.0: {} + + picomatch@2.3.1: {} + + pify@4.0.1: {} + + prettier@2.8.8: {} + + pseudomap@1.0.2: {} + + queue-microtask@1.2.3: {} + + read-yaml-file@1.1.0: + dependencies: + graceful-fs: 4.2.11 + js-yaml: 3.14.1 + pify: 4.0.1 + strip-bom: 3.0.0 + + readdirp@4.0.2: {} + + regenerator-runtime@0.14.1: {} + + resolve-from@5.0.0: {} + + reusify@1.0.4: {} + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safer-buffer@2.1.2: {} + + semver@7.6.3: {} + + shebang-command@1.2.0: + dependencies: + shebang-regex: 1.0.0 + + shebang-regex@1.0.0: {} + + signal-exit@3.0.7: {} + + slash@3.0.0: {} + + spawndamnit@2.0.0: + dependencies: + cross-spawn: 5.1.0 + signal-exit: 3.0.7 + + sprintf-js@1.0.3: {} + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-bom@3.0.0: {} + + term-size@2.2.1: {} + + tmp@0.0.33: + dependencies: + os-tmpdir: 1.0.2 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + typescript@5.6.3: {} + + undici-types@6.19.8: {} + + universalify@0.1.2: {} + + which@1.3.1: + dependencies: + isexe: 2.0.0 + + yallist@2.1.2: {} diff --git a/packages/maxmsp-ts/src/index.ts b/packages/maxmsp-ts/src/index.ts new file mode 100644 index 0000000..6e9b6cf --- /dev/null +++ b/packages/maxmsp-ts/src/index.ts @@ -0,0 +1,439 @@ +import { exec, spawn } from "child_process"; +import * as fs from "fs/promises"; +import * as path from "path"; +import chokidar from "chokidar"; + +interface Dependency { + alias: string; + files: string[]; + path: string; +} + +interface Config { + output_path: string; + dependencies: Record; +} + +interface AddOptions { + alias?: string; + files?: string; + path?: string; +} + +const [, , command, ...args] = process.argv; + +const configFilePath = path.join(process.cwd(), "maxmsp.config.json"); + +// Function to sanitize library names +function sanitizeName(name: string): string { + return name.replace(/[/.]/g, "-"); // Replace / and . with - +} + +// Function to read or create the config file +async function readOrCreateConfig(): Promise { + try { + await fs.access(configFilePath); // Check if the config file exists + const configContent = await fs.readFile(configFilePath, "utf-8"); + return JSON.parse(configContent) as Config; // Cast to Config type + } catch { + const initialConfig: Config = { + output_path: "lib", + dependencies: {}, + }; + await fs.writeFile(configFilePath, JSON.stringify(initialConfig, null, 2)); + console.log("maxmsp.config.json created."); + return initialConfig; + } +} + +// Function to save the config file +async function saveConfig(config: Config) { + await fs.writeFile(configFilePath, JSON.stringify(config, null, 2)); +} + +// Function to copy and rename files for dependencies +async function copyAndRenameFiles( + src: string, + dest: string, + alias: string, + files: string[] +) { + try { + // Create the full destination path based on tsconfig output dir and relative path + const targetDir = dest; // Use dest directly, which includes the relative path + await fs.mkdir(targetDir, { recursive: true }); + + for (let file of files) { + const srcPath = path.join(src, file); + const newName = `${alias}_${file}`; // Prepend alias to the original file name + const destPath = path.join(targetDir, newName); // Use targetDir + + await fs.copyFile(srcPath, destPath); + console.log(`Copied ${srcPath} to ${destPath}`); + } + } catch (error) { + console.error(`Error copying files from ${src} to ${dest}:`, error); + } +} + +// Function to replace require statements in a file +async function replaceInFile( + filePath: string, + alias: string, + packageName: string, + effectivePath: string, + config: Config +) { + try { + let content = await fs.readFile(filePath, "utf8"); + + // Construct the new require path based on config.output_path + const newRequirePath = config.output_path + ? `require("lib/${effectivePath}/${alias}_index.js")` + : `require("${alias}_index.js")`; // No lib/ prefix when output_path is empty + + // Replace require statements for the specific packageName + content = content + .replace(`require("${packageName}")`, newRequirePath) + .replace(`require('${packageName}')`, newRequirePath); + + await fs.writeFile(filePath, content, "utf8"); + console.log(`Updated require statements in ${filePath}`); + } catch (error) { + console.error(`Error processing file ${filePath}:`, error); + } +} + +// Function to get output directory from tsconfig.json +async function getTsConfigOutputDir(): Promise { + const tsConfigPath = path.join(process.cwd(), "tsconfig.json"); + + try { + const tsConfigContent = await fs.readFile(tsConfigPath, "utf-8"); + const tsConfig = JSON.parse(tsConfigContent); + + // Return outDir if it exists, otherwise return a default value + return tsConfig.compilerOptions?.outDir || "dist"; // Default to "dist" if not specified + } catch (error) { + console.error(`Error reading tsconfig.json:`, error); + return "dist"; // Fallback output directory + } +} + +// Post-build command logic +async function postBuild() { + const config = await readOrCreateConfig(); + + // Get the output directory from tsconfig.json + const tsConfigOutputDir = await getTsConfigOutputDir(); + + // Define output directory based on config + const outputDir = config.output_path + ? path.join(tsConfigOutputDir, config.output_path) // Full path for output + : tsConfigOutputDir; // Use tsConfigOutputDir directly if output_path is empty + + for (const [ + packageName, + { alias, files, path: relativePath }, + ] of Object.entries(config.dependencies)) { + // Use libraryName if alias is empty + const effectiveAlias = alias || sanitizeName(packageName); + + // Use sanitized library name if path is empty, otherwise use provided path + const effectivePath = relativePath + ? relativePath + : sanitizeName(packageName); + + const sourceDir = path.join( + process.cwd(), + "node_modules", + packageName, + "dist" + ); + + // Construct target directory based on whether we have a relative path + const targetDir = relativePath + ? path.join(outputDir, effectivePath) // e.g., tsconfigOutputDir/lib/lol + : outputDir; + + // Copy and rename files for each dependency + await copyAndRenameFiles(sourceDir, targetDir, effectiveAlias, files); + + // Replace require statements in all JavaScript files except those in the lib folder + await replaceRequireStatements( + tsConfigOutputDir, + packageName, + effectiveAlias, + effectivePath, + config + ); + } + + console.log("Post-build completed successfully."); +} + +// Function to replace require statements in JavaScript files +async function replaceRequireStatements( + baseDir: string, + packageName: string, + alias: string, + effectivePath: string, + config: Config +) { + try { + const libFolder = path.join(baseDir, "lib"); + + // Read all JavaScript files recursively from baseDir + const jsFiles = await getAllJsFiles(baseDir); + + for (const filePath of jsFiles) { + if (!filePath.startsWith(libFolder)) { + // Skip any file in the lib folder + console.log(`Updating require statements in ${filePath}`); + // Pass effectivePath and config for replacement + await replaceInFile(filePath, alias, packageName, effectivePath, config); + } + } + } catch (error) { + console.error(`Error replacing require statements:`, error); + } +} + +// Function to get all JavaScript files recursively from a directory +async function getAllJsFiles(dir: string): Promise { + let results: string[] = []; + + const list = await fs.readdir(dir); + + for (const file of list) { + const filePath = path.join(dir, file); + const stat = await fs.stat(filePath); + + if (stat && stat.isDirectory()) { + results = results.concat(await getAllJsFiles(filePath)); // Recurse into subdirectory + } else if (path.extname(file) === ".js") { + results.push(filePath); // Add JS file to results + } + } + + return results; +} + +// Init command logic +async function init() { + await readOrCreateConfig(); +} + +// Function to check if a library is installed +async function isLibraryInstalled(libraryName: string): Promise { + const packageJsonPath = path.join(process.cwd(), "package.json"); + + try { + const packageJsonContent = await fs.readFile(packageJsonPath, "utf-8"); + const packageJson = JSON.parse(packageJsonContent); + + // Check both dependencies and devDependencies + return ( + (packageJson.dependencies && packageJson.dependencies[libraryName]) || + (packageJson.devDependencies && packageJson.devDependencies[libraryName]) + ); + } catch (error) { + console.error(`Error reading package.json:`, error); + return false; + } +} + +// Add command logic +async function add(libraryName: string, options: AddOptions) { + const config = await readOrCreateConfig(); + + // Check if the library is installed + const isInstalled = await isLibraryInstalled(libraryName); + if (!isInstalled) { + console.error( + `${libraryName} is not installed. Please install it with pnpm i -D ${libraryName}` + ); + process.exit(1); + } + + // Default values for the new dependency + const alias = options.alias || libraryName; + + // Process the files option if provided + let files: string[] = []; + if (typeof options.files === "string") { + files = options.files.split(",").map((file) => file.trim()); + } else { + files = ["index.js"]; + } + + const pathValue = options.path || ""; + + // Add dependency + config.dependencies[libraryName] = { alias, files, path: pathValue }; + + await saveConfig(config); + console.log(`Added dependency ${libraryName} with alias ${alias}.`); +} + +// Remove command logic +async function remove(libraryName: string) { + const config = await readOrCreateConfig(); + + // Remove dependency if it exists + if (config.dependencies[libraryName]) { + delete config.dependencies[libraryName]; + await saveConfig(config); + console.log(`Removed dependency ${libraryName}.`); + } else { + console.error(`Dependency ${libraryName} not found.`); + } +} + +// Build command logic +async function build() { + return new Promise((resolve, reject) => { + const tsc = spawn( + process.platform === "win32" ? "npx.cmd" : "npx", + ["tsc"], + { stdio: "inherit", shell: true } + ); + + tsc.on("close", async (code) => { + if (code !== 0) { + reject(new Error(`TypeScript compilation failed with code ${code}`)); + return; + } + + try { + await postBuild(); + resolve(true); + } catch (postBuildError) { + reject(postBuildError); + } + }); + + tsc.on("error", (error) => reject(error)); + }); +} + +// Dev command logic with file watching +async function dev() { + const srcDir = path.join(process.cwd(), "src"); + + console.log("Starting watch mode in " + srcDir); + + // Watch for changes in .ts and .json files within src directory + const watcher = chokidar.watch(srcDir, { + ignored: /(^|[\/\\])\../, // Ignore dotfiles + persistent: true, + usePolling: true, // Enable polling + interval: 100, // Polling interval in milliseconds + }); + + watcher.on("ready", () => { + console.log("Initial scan complete. Watching for file changes..."); + + // Initial build on start + build().catch((err) => console.error("Initial build failed:", err.message)); + }); + + watcher.on("change", (filePath: string) => { + console.log(`File ${filePath} has been changed.`); + + // Run build on change + build() + .then(() => { + console.log(`Build completed successfully after change in ${filePath}`); + }) + .catch((err) => { + console.error(`Build failed after change in ${filePath}:`, err.message); + }); + }); + + watcher.on("add", (filePath: string) => { + console.log(`File ${filePath} has been added.`); + + // Optionally trigger a build if new files are added + build() + .then(() => { + console.log(`Build completed successfully after adding ${filePath}`); + }) + .catch((err) => { + console.error(`Build failed after adding ${filePath}:`, err.message); + }); + }); + + watcher.on("unlink", (filePath: string) => { + console.log(`File ${filePath} has been removed.`); + + // Optionally handle file removal if needed + }); + + watcher.on("error", (error: unknown) => { + console.error("Watcher error:", error); + }); + + process.on("SIGINT", () => { + console.log("Watch mode terminated."); + watcher.close(); + process.exit(0); + }); +} + +// Command handling +(async () => { + switch (command) { + case "build": + try { + await build(); + console.log("Build and post-build completed successfully."); + } catch (err) { + console.error("Build failed:", err); + process.exit(1); + } + break; + + case "dev": + dev(); // Call the new dev function with watching capability. + break; + + case "init": + await init(); + break; + + case "add": + const libraryNameToAdd = args[0]; + const optionsToAdd: AddOptions = {}; + + args.forEach((arg, index) => { + if (arg === "--alias") optionsToAdd.alias = args[index + 1]; + if (arg === "--files") optionsToAdd.files = args[index + 1]; + if (arg === "--path") optionsToAdd.path = args[index + 1]; + }); + + if (!libraryNameToAdd) { + console.error("Please specify a library name to add."); + process.exit(1); + } + + await add(libraryNameToAdd, optionsToAdd); + break; + + case "rm": + const libraryNameToRemove = args[0]; + + if (!libraryNameToRemove) { + console.error("Please specify a library name to remove."); + process.exit(1); + } + + await remove(libraryNameToRemove); + break; + + default: + console.log( + "Unknown command. Use build, dev, init, add , or rm ." + ); + } +})(); diff --git a/packages/maxmsp-ts/tsconfig.json b/packages/maxmsp-ts/tsconfig.json new file mode 100644 index 0000000..18798da --- /dev/null +++ b/packages/maxmsp-ts/tsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "target": "ESNext", + "module": "esnext", + "moduleResolution": "node", + "baseUrl": ".", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "outDir": "./dist", + "rootDir": "./src" + }, + "include": ["src/**/*.ts"], + "exclude": ["node_modules", "**/*.spec.ts"] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c1919f5..7a29301 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -23,9 +23,9 @@ importers: apps/kebricide: devDependencies: - '@aptrn/maxmsp-ts': - specifier: file:../../../maxmsp-ts - version: file:../maxmsp-ts + '@codekiln/maxmsp-ts': + specifier: workspace:* + version: link:../../packages/maxmsp-ts '@my-username/my-library': specifier: workspace:* version: link:../../packages/my-library @@ -51,6 +51,22 @@ importers: specifier: ^5.6.2 version: 5.7.3 + packages/maxmsp-ts: + dependencies: + chokidar: + specifier: ^4.0.1 + version: 4.0.3 + devDependencies: + '@changesets/cli': + specifier: ^2.27.9 + version: 2.27.12 + '@types/node': + specifier: ^22.7.4 + version: 22.13.1 + typescript: + specifier: ^5.6.2 + version: 5.7.3 + packages/my-library: devDependencies: '@rollup/plugin-commonjs': @@ -100,10 +116,6 @@ packages: resolution: {integrity: sha512-JWX+n3ClyHxT9yaQ7aoAE4r0YODKCmwgGJkK5QLKzQ0LCzhTrBYNaE3HpEUnAulLeyULrvvvqyw23uWzF9Wpfw==} hasBin: true - '@aptrn/maxmsp-ts@file:../maxmsp-ts': - resolution: {directory: ../maxmsp-ts, type: directory} - hasBin: true - '@babel/code-frame@7.26.2': resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} engines: {node: '>=6.9.0'} @@ -1839,10 +1851,6 @@ snapshots: dependencies: chokidar: 4.0.3 - '@aptrn/maxmsp-ts@file:../maxmsp-ts': - dependencies: - chokidar: 4.0.3 - '@babel/code-frame@7.26.2': dependencies: '@babel/helper-validator-identifier': 7.25.9 From 85da14276781bd0869b38c7281b5483d5fce1799 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=E2=88=8Er?= <140930+codekiln@users.noreply.github.com> Date: Tue, 11 Feb 2025 05:36:30 -0500 Subject: [PATCH 2/3] chore: update maxmsp-ts package configuration and build scripts --- apps/kebricide/package.json | 4 ++-- packages/maxmsp-ts/.github/workflows/publish.yml | 12 ++---------- packages/maxmsp-ts/package.json | 4 ++-- 3 files changed, 6 insertions(+), 14 deletions(-) diff --git a/apps/kebricide/package.json b/apps/kebricide/package.json index 02679a8..d1e03a4 100644 --- a/apps/kebricide/package.json +++ b/apps/kebricide/package.json @@ -3,8 +3,8 @@ "version": "0.0.1", "description": "Kebricide Max for Live Device", "scripts": { - "build": "pnpm maxmsp build", - "dev": "pnpm maxmsp dev" + "build": "node ../../packages/maxmsp-ts/dist/index.js build", + "dev": "node ../../packages/maxmsp-ts/dist/index.js dev" }, "keywords": [ "maxmsp", diff --git a/packages/maxmsp-ts/.github/workflows/publish.yml b/packages/maxmsp-ts/.github/workflows/publish.yml index 98373c4..228c5d8 100644 --- a/packages/maxmsp-ts/.github/workflows/publish.yml +++ b/packages/maxmsp-ts/.github/workflows/publish.yml @@ -22,14 +22,6 @@ jobs: version: 9 - uses: actions/setup-node@v3 with: - node-version: 20 + node-version: 22 cache: "pnpm" - - run: pnpm install --frozen-lockfile - - name: Create Release Pull Request or Publish - id: changesets - uses: changesets/action@v1 - with: - publish: pnpm run release - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + - run: pnpm install --frozen-lockfile \ No newline at end of file diff --git a/packages/maxmsp-ts/package.json b/packages/maxmsp-ts/package.json index 52f3359..2c2f194 100644 --- a/packages/maxmsp-ts/package.json +++ b/packages/maxmsp-ts/package.json @@ -2,7 +2,7 @@ "name": "@codekiln/maxmsp-ts", "version": "0.0.1", "description": "CLI tool for building typescript projects and dependencies for usage in MaxMsp js object, adapted for Max for Live", - "main": "index.js", + "main": "dist/index.js", "type": "module", "bin": { "maxmsp": "dist/index.js" @@ -12,7 +12,7 @@ "README.md" ], "scripts": { - "build": "tsc", + "build": "tsc && chmod +x dist/index.js", "dev": "tsc --watch" }, "keywords": [ From 1274263110d1d873692cb9b9206eecd7081fc6a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=E2=88=8Er?= <140930+codekiln@users.noreply.github.com> Date: Tue, 11 Feb 2025 05:39:39 -0500 Subject: [PATCH 3/3] fix: warning no output files found for build WARNING no output files found for task kebricide#build. Please check your `outputs` key in `turbo.json` WARNING no output files found for task maxmsp-test#build. Please check your `outputs` key in `turbo.json` --- turbo.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/turbo.json b/turbo.json index 447d269..1c99c5d 100644 --- a/turbo.json +++ b/turbo.json @@ -5,7 +5,11 @@ "tasks": { "build": { "dependsOn": ["^build"], - "outputs": ["dist/**"] + "outputs": [ + "dist/**", + "Project/**", + "Code/**" + ] }, "dev": { "cache": false,