diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 1e7117f..53c29ba 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -13,4 +13,5 @@ jobs: node-version: 20 - run: corepack enable - run: yarn install --immutable + - run: yarn lint - run: yarn test diff --git a/package.json b/package.json index 6c395d3..9c897f5 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "scripts": { "dev": "yarn workspace @immutable/devtools-extension run dev", "build": "yarn workspaces foreach --all -pt run build", + "lint": "yarn workspaces foreach --all -pt run lint", "test": "yarn workspaces foreach --all -pt run test", "version": "node build/update-version.js && git add packages/extension/extension/manifest.json && git add packages/*/package.json && yarn" }, @@ -22,6 +23,7 @@ "@babel/preset-env": "^7.27.2", "@rollup/plugin-babel": "^6.0.4", "@rollup/plugin-node-resolve": "^16.0.1", - "rollup": "^4.41.0" + "rollup": "^4.41.0", + "ts-node": "^10.9.2" } } diff --git a/packages/devtools/babel.config.json b/packages/devtools/babel.config.json index 8aa924d..3313ff9 100644 --- a/packages/devtools/babel.config.json +++ b/packages/devtools/babel.config.json @@ -1,3 +1,3 @@ { - "presets": ["@babel/preset-env"] -} \ No newline at end of file + "presets": ["@babel/preset-env", "@babel/preset-typescript"] +} diff --git a/packages/devtools/jest.config.js b/packages/devtools/jest.config.js deleted file mode 100644 index 2a7f5c4..0000000 --- a/packages/devtools/jest.config.js +++ /dev/null @@ -1,7 +0,0 @@ -/** @type {import('jest').Config} */ -const config = { - // ignore the files named "test.js" - testPathIgnorePatterns: ['/test.js'], -}; - -export default config; diff --git a/packages/devtools/jest.config.ts b/packages/devtools/jest.config.ts new file mode 100644 index 0000000..5b27db1 --- /dev/null +++ b/packages/devtools/jest.config.ts @@ -0,0 +1,7 @@ +import { Config } from 'jest'; + +const config: Config = { + testPathIgnorePatterns: ['/test.js'], +}; + +export default config; diff --git a/packages/devtools/package.json b/packages/devtools/package.json index fe1b047..c637cae 100644 --- a/packages/devtools/package.json +++ b/packages/devtools/package.json @@ -3,12 +3,21 @@ "type": "module", "version": "2.1.1", "description": "Chrome Dev Tools formatter for the Immutable JS library", - "exports": "./dist/index.js", + "exports": { + ".": { + "import": "./dist/index.js", + "types": "./dist/index.d.ts" + } + }, "files": [ "dist" ], "scripts": { - "build": "rollup -c", + "build:types": "tsc", + "build:module": "rollup -c", + "build": "yarn run build:types && yarn run build:module", + "lint:types": "tsc --noEmit", + "lint": "yarn run lint:types", "prepublishOnly": "npm run-script build", "test": "jest" }, @@ -22,12 +31,14 @@ "devDependencies": { "@babel/core": "^7.27.1", "@babel/preset-env": "^7.27.2", + "@babel/preset-typescript": "^7.27.1", "@jest/globals": "^29.7.0", "@rollup/plugin-babel": "^6.0.4", "immutable": "^5.1.2", "immutable3": "^3.8.1", "jest": "^29.7.0", - "rollup": "^4.40.2" + "rollup": "^4.40.2", + "typescript": "^5.8.0" }, "engines": { "node": ">=18" diff --git a/packages/devtools/rollup.config.js b/packages/devtools/rollup.config.ts similarity index 80% rename from packages/devtools/rollup.config.js rename to packages/devtools/rollup.config.ts index 10f59f9..b6285ec 100644 --- a/packages/devtools/rollup.config.js +++ b/packages/devtools/rollup.config.ts @@ -1,4 +1,5 @@ import fs from 'node:fs'; +import type { RollupOptions } from 'rollup'; import { babel } from '@rollup/plugin-babel'; import nodeResolve from '@rollup/plugin-node-resolve'; @@ -25,14 +26,20 @@ function injectDemoSource() { }; } -const config = [ +const config: Array = [ { - input: 'src/index.js', + input: 'src/index.ts', output: { dir: 'dist', format: 'es', }, - plugins: [babel({ babelHelpers: 'bundled' })], + plugins: [ + babel({ + babelHelpers: 'bundled', + extensions: ['.js', '.ts'], + exclude: 'node_modules/**', + }), + ], }, { input: 'demo/demo.js', diff --git a/packages/devtools/src/createFormatter.test.js b/packages/devtools/src/createFormatter.test.ts similarity index 99% rename from packages/devtools/src/createFormatter.test.js rename to packages/devtools/src/createFormatter.test.ts index 92c50e3..2722bc6 100644 --- a/packages/devtools/src/createFormatter.test.js +++ b/packages/devtools/src/createFormatter.test.ts @@ -7,7 +7,7 @@ describe('List', () => { const list = List(); const { ListFormatter } = createFormatters({ List, isList }); - + const formatted = ListFormatter.header(list); expect(formatted).toEqual([ 'span', @@ -21,7 +21,6 @@ describe('List', () => { ], ['span', '[0]'], ]); - expect(ListFormatter.hasBody(list)).toBe(false); }); }); diff --git a/packages/devtools/src/createFormatters.js b/packages/devtools/src/createFormatters.js deleted file mode 100644 index b388acd..0000000 --- a/packages/devtools/src/createFormatters.js +++ /dev/null @@ -1,247 +0,0 @@ -const orange = 'light-dark(rgb(232,98,0), rgb(255, 150, 50))'; -const purple = 'light-dark( #881391, #D48CE6)'; -const gray = 'light-dark(rgb(119,119,119), rgb(201, 201, 201))'; - -const listStyle = {style: 'list-style-type: none; padding: 0; margin: 0 0 0 12px; font-style: normal; position: relative'}; -const immutableNameStyle = { - style: `color: ${orange}; position: relative`, -}; -const keyStyle = { style: `color: ${purple}` }; -const defaultValueKeyStyle = { style: `color: ${gray}` }; -const alteredValueKeyStyle = { style: `color: ${purple}; font-weight: bolder` }; -const inlineValuesStyle = { - style: `color: ${gray}; font-style: italic; position: relative`, -}; -const nullStyle = { style: `color: ${gray}` }; - -export default function createFormatter(Immutable) { - - const isRecord = maybeRecord => { - if (maybeRecord && - maybeRecord._values === undefined // in v3 record - && maybeRecord._map === undefined // in v4 record - ) { - // don't detect Immutable.Record.prototype as a Record instance - return - } - // Immutable v4 - if (maybeRecord['@@__IMMUTABLE_RECORD__@@']) { - // There's also a Immutable.Record.isRecord we could use, but then the - // Immutable instance passed into createFormatter has to be the same - // version as the one used to create the Immutable object. - // That's especially a problem for the Chrome extension. - return true - } - // Immutable v3 - return !!( - maybeRecord['@@__IMMUTABLE_KEYED__@@'] && - maybeRecord['@@__IMMUTABLE_ITERABLE__@@'] && - maybeRecord._defaultValues !== undefined) - } - - const reference = (object, config) => { - if (typeof object === 'undefined') - return ['span', nullStyle, 'undefined']; - else if (object === null) - return ['span', nullStyle, 'null']; - - return ['object', {object, config}]; - }; - - const renderIterableHeader = (iterable, name = 'Iterable') => - ['span', ['span', immutableNameStyle, name], ['span', `[${iterable.size}]`]]; - - - const getKeySeq = collection => collection.toSeq().map((v, k) => k).toIndexedSeq() - - const hasBody = (collection, config) => - getKeySeq(collection).size > 0 && !(config && config.noPreview); - - const renderIterableBody = (collection, mapper, options = {}) => { - if (options.sorted) { - collection = collection.sortBy((value, key) => key); - } - const children = collection - .map(mapper) - .toList(); - - const jsList = [] - // Can't just call toJS because that will also call toJS on children inside the list - children.forEach(child => jsList.push(child)) - - return [ 'ol', listStyle, ...children ]; - } - - const RecordFormatter = { - header(record, config) { - if (!(isRecord(record))) - return null; - - const defaults = record.clear(); - const changed = !Immutable.is(defaults, record); - - if (config && config.noPreview) - return ['span', changed ? immutableNameStyle : nullStyle, - record._name || record.constructor.name || 'Record']; - - let inlinePreview; - if (!changed) { - inlinePreview = ['span', inlineValuesStyle, '{}']; - } else { - const preview = getKeySeq(record) - .reduce((preview, key) => { - if (Immutable.is(defaults.get(key), record.get(key))) - return preview; - if (preview.length) - preview.push(', '); - - preview.push(['span', {}, - ['span', keyStyle, key + ': '], - reference(record.get(key), {noPreview: true}) - ]); - return preview; - }, []); - inlinePreview = ['span', inlineValuesStyle, '{', ...preview, '}']; - } - return ['span', {}, - ['span', immutableNameStyle, record._name || record.constructor.name || 'Record'], - ' ', inlinePreview - ]; - }, - hasBody, - body(record) { - const defaults = record.clear(); - const children = getKeySeq(record) - .toJS() - .map(key => { - const style = Immutable.is(defaults.get(key), record.get(key)) - ? defaultValueKeyStyle : alteredValueKeyStyle; - return [ - 'li', {}, - ['span', style, key + ': '], - reference(record.get(key)) - ] - }); - return [ 'ol', listStyle, ...children ]; - } - }; - - const ListFormatter = { - header(o) { - if (!Immutable.isList(o)) - return null; - return renderIterableHeader(o, 'List'); - }, - hasBody, - body(o) { - return renderIterableBody(o, (value, key) => - ['li', ['span', keyStyle, key + ': '], reference(value)] - ); - } - }; - - const StackFormatter = { - header(o) { - if (!Immutable.isStack(o)) - return null; - return renderIterableHeader(o, 'Stack'); - }, - hasBody, - body(o) { - return renderIterableBody(o, (value, key) => - ['li', ['span', keyStyle, key + ': '], reference(value)] - ); - } - }; - - const MapFormatter = { - header(o) { - if (!Immutable.isMap(o)) - return null; - return renderIterableHeader(o, 'Map'); - }, - hasBody, - body(o) { - return renderIterableBody(o, (value, key) => - ['li', {}, '{', reference(key), ' => ', reference(value), '}'], - {sorted: true} - ); - } - }; - - const OrderedMapFormatter = { - header(o) { - if (!Immutable.isOrderedMap(o)) - return null; - return renderIterableHeader(o, 'OrderedMap'); - }, - hasBody, - body(o) { - return renderIterableBody(o, (value, key) => - ['li', {}, '{', reference(key), ' => ', reference(value), '}'] - ); - } - }; - - const SetFormatter = { - header(o) { - if (!Immutable.isSet(o)) - return null; - return renderIterableHeader(o, 'Set'); - }, - hasBody, - body(o) { - return renderIterableBody(o, value => - ['li', reference(value)], - {sorted: true} - ); - } - }; - - const OrderedSetFormatter = { - header(o) { - if (!Immutable.isOrderedSet(o)) - return null; - return renderIterableHeader(o, 'OrderedSet'); - }, - hasBody, - body(o) { - return renderIterableBody(o, value => - ['li', reference(value)] - ); - } - }; - - const RangeFormatter = { - header(o) { - if (!Immutable.isSeq(o)) - return null; - - // there is no proper way to check if the object is a Range for now - if ( - typeof o._start === 'undefined' || - typeof o._end === 'undefined' || - typeof o._step === 'undefined' || - typeof o.toString !== 'function' - ) { - return null - } - - const out = o.toString().replace(/^Range /, ''); - - return ['span', ['span', immutableNameStyle, 'Range'], ['span', out]]; - }, - hasBody: () => false, - }; - - return { - RecordFormatter, - OrderedMapFormatter, - OrderedSetFormatter, - ListFormatter, - MapFormatter, - SetFormatter, - StackFormatter, - RangeFormatter - } -} \ No newline at end of file diff --git a/packages/devtools/src/createFormatters.ts b/packages/devtools/src/createFormatters.ts new file mode 100644 index 0000000..8fed87e --- /dev/null +++ b/packages/devtools/src/createFormatters.ts @@ -0,0 +1,289 @@ +const orange = 'light-dark(rgb(232,98,0), rgb(255, 150, 50))'; +const purple = 'light-dark( #881391, #D48CE6)'; +const gray = 'light-dark(rgb(119,119,119), rgb(201, 201, 201))'; + +const listStyle = { + style: + 'list-style-type: none; padding: 0; margin: 0 0 0 12px; font-style: normal; position: relative', +}; +const immutableNameStyle = { + style: `color: ${orange}; position: relative`, +}; +const keyStyle = { style: `color: ${purple}` }; +const defaultValueKeyStyle = { style: `color: ${gray}` }; +const alteredValueKeyStyle = { style: `color: ${purple}; font-weight: bolder` }; +const inlineValuesStyle = { + style: `color: ${gray}; font-style: italic; position: relative`, +}; +const nullStyle = { style: `color: ${gray}` }; + +export type DevToolsFormatter = { + header: (object: any, config?: any) => any; + hasBody: (object: any, config?: any) => boolean; + body?: (object: any) => any; +}; + +export type ImmutableDevtoolsFormatters = { + RecordFormatter: DevToolsFormatter; + OrderedMapFormatter: DevToolsFormatter; + OrderedSetFormatter: DevToolsFormatter; + ListFormatter: DevToolsFormatter; + MapFormatter: DevToolsFormatter; + SetFormatter: DevToolsFormatter; + StackFormatter: DevToolsFormatter; + RangeFormatter: DevToolsFormatter; +}; + +export default function createFormatters( + Immutable: any +): ImmutableDevtoolsFormatters { + const isRecord = (maybeRecord: any) => { + if ( + maybeRecord && + maybeRecord._values === undefined && // in v3 record + maybeRecord._map === undefined // in v4 record + ) { + // don't detect Immutable.Record.prototype as a Record instance + return; + } + // Immutable v4 + if (maybeRecord['@@__IMMUTABLE_RECORD__@@']) { + // There's also a Immutable.Record.isRecord we could use, but then the + // Immutable instance passed into createFormatter has to be the same + // version as the one used to create the Immutable object. + // That's especially a problem for the Chrome extension. + return true; + } + // Immutable v3 + return !!( + maybeRecord['@@__IMMUTABLE_KEYED__@@'] && + maybeRecord['@@__IMMUTABLE_ITERABLE__@@'] && + maybeRecord._defaultValues !== undefined + ); + }; + + const reference = (object: any, config?: any) => { + if (typeof object === 'undefined') return ['span', nullStyle, 'undefined']; + else if (object === null) return ['span', nullStyle, 'null']; + return ['object', { object, config }]; + }; + + const renderIterableHeader = (iterable: any, name = 'Iterable') => [ + 'span', + ['span', immutableNameStyle, name], + ['span', `[${iterable.size}]`], + ]; + + const getKeySeq = (collection: any) => + collection + .toSeq() + .map((v: any, k: any) => k) + .toIndexedSeq(); + + const hasBody = (collection: any, config?: any) => + getKeySeq(collection).size > 0 && !(config && config.noPreview); + + const renderIterableBody = ( + collection: any, + mapper: any, + options: any = {} + ) => { + if (options.sorted) { + collection = collection.sortBy((value: any, key: any) => key); + } + const children = collection.map(mapper).toList(); + const jsList: any[] = []; + children.forEach((child: any) => jsList.push(child)); + return ['ol', listStyle, ...children]; + }; + + const RecordFormatter: DevToolsFormatter = { + header(record: any, config?: any) { + if (!isRecord(record)) return null; + + const defaults = record.clear(); + const changed = !Immutable.is(defaults, record); + + if (config && config.noPreview) + return [ + 'span', + changed ? immutableNameStyle : nullStyle, + record._name || record.constructor.name || 'Record', + ]; + + let inlinePreview; + if (!changed) { + inlinePreview = ['span', inlineValuesStyle, '{}']; + } else { + const preview = getKeySeq(record).reduce((preview: any, key: any) => { + if (Immutable.is(defaults.get(key), record.get(key))) return preview; + if (preview.length) preview.push(', '); + + preview.push([ + 'span', + {}, + ['span', keyStyle, key + ': '], + reference(record.get(key), { noPreview: true }), + ]); + return preview; + }, []); + inlinePreview = ['span', inlineValuesStyle, '{', ...preview, '}']; + } + return [ + 'span', + {}, + [ + 'span', + immutableNameStyle, + record._name || record.constructor.name || 'Record', + ], + ' ', + inlinePreview, + ]; + }, + hasBody, + body(record: any) { + const defaults = record.clear(); + const children = getKeySeq(record) + .toJS() + .map((key: any) => { + const style = Immutable.is(defaults.get(key), record.get(key)) + ? defaultValueKeyStyle + : alteredValueKeyStyle; + return [ + 'li', + {}, + ['span', style, key + ': '], + reference(record.get(key)), + ]; + }); + return ['ol', listStyle, ...children]; + }, + }; + + const ListFormatter: DevToolsFormatter = { + header(o: any) { + if (!Immutable.isList(o)) return null; + return renderIterableHeader(o, 'List'); + }, + hasBody, + body(o: any) { + return renderIterableBody(o, (value: any, key: any) => [ + 'li', + ['span', keyStyle, key + ': '], + reference(value), + ]); + }, + }; + + const StackFormatter: DevToolsFormatter = { + header(o: any) { + if (!Immutable.isStack(o)) return null; + return renderIterableHeader(o, 'Stack'); + }, + hasBody, + body(o: any) { + return renderIterableBody(o, (value: any, key: any) => [ + 'li', + ['span', keyStyle, key + ': '], + reference(value), + ]); + }, + }; + + const MapFormatter: DevToolsFormatter = { + header(o: any) { + if (!Immutable.isMap(o)) return null; + return renderIterableHeader(o, 'Map'); + }, + hasBody, + body(o: any) { + return renderIterableBody( + o, + (value: any, key: any) => [ + 'li', + {}, + '{', + reference(key), + ' => ', + reference(value), + '}', + ], + { sorted: true } + ); + }, + }; + + const OrderedMapFormatter: DevToolsFormatter = { + header(o: any) { + if (!Immutable.isOrderedMap(o)) return null; + return renderIterableHeader(o, 'OrderedMap'); + }, + hasBody, + body(o: any) { + return renderIterableBody(o, (value: any, key: any) => [ + 'li', + {}, + '{', + reference(key), + ' => ', + reference(value), + '}', + ]); + }, + }; + + const SetFormatter: DevToolsFormatter = { + header(o: any) { + if (!Immutable.isSet(o)) return null; + return renderIterableHeader(o, 'Set'); + }, + hasBody, + body(o: any) { + return renderIterableBody(o, (value: any) => ['li', reference(value)], { + sorted: true, + }); + }, + }; + + const OrderedSetFormatter: DevToolsFormatter = { + header(o: any) { + if (!Immutable.isOrderedSet(o)) return null; + return renderIterableHeader(o, 'OrderedSet'); + }, + hasBody, + body(o: any) { + return renderIterableBody(o, (value: any) => ['li', reference(value)]); + }, + }; + + const RangeFormatter: DevToolsFormatter = { + header(o: any) { + if (!Immutable.isSeq(o)) return null; + if ( + typeof o._start === 'undefined' || + typeof o._end === 'undefined' || + typeof o._step === 'undefined' || + typeof o.toString !== 'function' + ) { + return null; + } + + const out = o.toString().replace(/^Range /, ''); + + return ['span', ['span', immutableNameStyle, 'Range'], ['span', out]]; + }, + hasBody: () => false, + }; + + return { + RecordFormatter, + OrderedMapFormatter, + OrderedSetFormatter, + ListFormatter, + MapFormatter, + SetFormatter, + StackFormatter, + RangeFormatter, + }; +} diff --git a/packages/devtools/src/index.js b/packages/devtools/src/index.ts similarity index 62% rename from packages/devtools/src/index.js rename to packages/devtools/src/index.ts index 9274360..1244c2d 100644 --- a/packages/devtools/src/index.js +++ b/packages/devtools/src/index.ts @@ -1,15 +1,19 @@ -import createFormatters from './createFormatters'; +// TypeScript entry point for devtools package +import createFormatters, { + DevToolsFormatter, + ImmutableDevtoolsFormatters, +} from './createFormatters.ts'; // Check for globally defined Immutable and add an install method to it. +declare const Immutable: any; + if (typeof Immutable !== 'undefined') { - Immutable.installDevTools = install.bind(null, Immutable); + (Immutable as any).installDevTools = install.bind(null, Immutable); } -// I imagine most people are using Immutable as a CommonJS module though... - let installed = false; -function install(Immutable) { - const gw = typeof window === 'undefined' ? global : window; +function install(Immutable: any) { + const gw = typeof window === 'undefined' ? (global as any) : (window as any); // Don't install more than once. if (installed === true) { @@ -44,3 +48,5 @@ function install(Immutable) { } export default install; + +export type { DevToolsFormatter, ImmutableDevtoolsFormatters }; diff --git a/packages/devtools/tsconfig.json b/packages/devtools/tsconfig.json new file mode 100644 index 0000000..5e02bb5 --- /dev/null +++ b/packages/devtools/tsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "allowImportingTsExtensions": true, + "emitDeclarationOnly": true, + "target": "ES2020", + "module": "ESNext", + "moduleResolution": "Node", + "declaration": true, + "outDir": "dist", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true + }, + "include": ["src/index.ts"] +} diff --git a/yarn.lock b/yarn.lock index a795ba7..ac3b9ba 100644 --- a/yarn.lock +++ b/yarn.lock @@ -430,7 +430,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-jsx@npm:^7.7.2": +"@babel/plugin-syntax-jsx@npm:^7.27.1, @babel/plugin-syntax-jsx@npm:^7.7.2": version: 7.27.1 resolution: "@babel/plugin-syntax-jsx@npm:7.27.1" dependencies: @@ -529,7 +529,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-typescript@npm:^7.7.2": +"@babel/plugin-syntax-typescript@npm:^7.27.1, @babel/plugin-syntax-typescript@npm:^7.7.2": version: 7.27.1 resolution: "@babel/plugin-syntax-typescript@npm:7.27.1" dependencies: @@ -1092,6 +1092,21 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-typescript@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-typescript@npm:7.27.1" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.27.1" + "@babel/helper-create-class-features-plugin": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.27.1" + "@babel/plugin-syntax-typescript": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/48f1db5de17a0f9fc365ff4fb046010aedc7aad813a7aa42fb73fcdab6442f9e700dde2cc0481086e01b0dae662ae4d3e965a52cde154f0f146d243a8ac68e93 + languageName: node + linkType: hard + "@babel/plugin-transform-unicode-escapes@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-transform-unicode-escapes@npm:7.27.1" @@ -1231,6 +1246,21 @@ __metadata: languageName: node linkType: hard +"@babel/preset-typescript@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/preset-typescript@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-validator-option": "npm:^7.27.1" + "@babel/plugin-syntax-jsx": "npm:^7.27.1" + "@babel/plugin-transform-modules-commonjs": "npm:^7.27.1" + "@babel/plugin-transform-typescript": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/cba6ca793d915f8aff9fe2f13b0dfbf5fd3f2e9a17f17478ec9878e9af0d206dcfe93154b9fd353727f16c1dca7c7a3ceb4943f8d28b216235f106bc0fbbcaa3 + languageName: node + linkType: hard + "@babel/template@npm:^7.27.1, @babel/template@npm:^7.27.2, @babel/template@npm:^7.3.3": version: 7.27.2 resolution: "@babel/template@npm:7.27.2" @@ -1274,6 +1304,15 @@ __metadata: languageName: node linkType: hard +"@cspotcode/source-map-support@npm:^0.8.0": + version: 0.8.1 + resolution: "@cspotcode/source-map-support@npm:0.8.1" + dependencies: + "@jridgewell/trace-mapping": "npm:0.3.9" + checksum: 10c0/05c5368c13b662ee4c122c7bfbe5dc0b613416672a829f3e78bc49a357a197e0218d6e74e7c66cfcd04e15a179acab080bd3c69658c9fbefd0e1ccd950a07fc6 + languageName: node + linkType: hard + "@immutable/devtools-extension@workspace:packages/extension": version: 0.0.0-use.local resolution: "@immutable/devtools-extension@workspace:packages/extension" @@ -1299,6 +1338,7 @@ __metadata: "@rollup/plugin-babel": "npm:^6.0.4" "@rollup/plugin-node-resolve": "npm:^16.0.1" rollup: "npm:^4.41.0" + ts-node: "npm:^10.9.2" languageName: unknown linkType: soft @@ -1351,12 +1391,14 @@ __metadata: dependencies: "@babel/core": "npm:^7.27.1" "@babel/preset-env": "npm:^7.27.2" + "@babel/preset-typescript": "npm:^7.27.1" "@jest/globals": "npm:^29.7.0" "@rollup/plugin-babel": "npm:^6.0.4" immutable: "npm:^5.1.2" immutable3: "npm:^3.8.1" jest: "npm:^29.7.0" rollup: "npm:^4.40.2" + typescript: "npm:^5.8.0" languageName: unknown linkType: soft @@ -1601,7 +1643,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/resolve-uri@npm:^3.1.0": +"@jridgewell/resolve-uri@npm:^3.0.3, @jridgewell/resolve-uri@npm:^3.1.0": version: 3.1.2 resolution: "@jridgewell/resolve-uri@npm:3.1.2" checksum: 10c0/d502e6fb516b35032331406d4e962c21fe77cdf1cbdb49c6142bcbd9e30507094b18972778a6e27cbad756209cfe34b1a27729e6fa08a2eb92b33943f680cf1e @@ -1622,6 +1664,16 @@ __metadata: languageName: node linkType: hard +"@jridgewell/trace-mapping@npm:0.3.9": + version: 0.3.9 + resolution: "@jridgewell/trace-mapping@npm:0.3.9" + dependencies: + "@jridgewell/resolve-uri": "npm:^3.0.3" + "@jridgewell/sourcemap-codec": "npm:^1.4.10" + checksum: 10c0/fa425b606d7c7ee5bfa6a31a7b050dd5814b4082f318e0e4190f991902181b4330f43f4805db1dd4f2433fd0ed9cc7a7b9c2683f1deeab1df1b0a98b1e24055b + languageName: node + linkType: hard + "@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": version: 0.3.25 resolution: "@jridgewell/trace-mapping@npm:0.3.25" @@ -1879,6 +1931,34 @@ __metadata: languageName: node linkType: hard +"@tsconfig/node10@npm:^1.0.7": + version: 1.0.11 + resolution: "@tsconfig/node10@npm:1.0.11" + checksum: 10c0/28a0710e5d039e0de484bdf85fee883bfd3f6a8980601f4d44066b0a6bcd821d31c4e231d1117731c4e24268bd4cf2a788a6787c12fc7f8d11014c07d582783c + languageName: node + linkType: hard + +"@tsconfig/node12@npm:^1.0.7": + version: 1.0.11 + resolution: "@tsconfig/node12@npm:1.0.11" + checksum: 10c0/dddca2b553e2bee1308a056705103fc8304e42bb2d2cbd797b84403a223b25c78f2c683ec3e24a095e82cd435387c877239bffcb15a590ba817cd3f6b9a99fd9 + languageName: node + linkType: hard + +"@tsconfig/node14@npm:^1.0.0": + version: 1.0.3 + resolution: "@tsconfig/node14@npm:1.0.3" + checksum: 10c0/67c1316d065fdaa32525bc9449ff82c197c4c19092b9663b23213c8cbbf8d88b6ed6a17898e0cbc2711950fbfaf40388938c1c748a2ee89f7234fc9e7fe2bf44 + languageName: node + linkType: hard + +"@tsconfig/node16@npm:^1.0.2": + version: 1.0.4 + resolution: "@tsconfig/node16@npm:1.0.4" + checksum: 10c0/05f8f2734e266fb1839eb1d57290df1664fe2aa3b0fdd685a9035806daa635f7519bf6d5d9b33f6e69dd545b8c46bd6e2b5c79acb2b1f146e885f7f11a42a5bb + languageName: node + linkType: hard + "@types/babel__core@npm:^7.1.14": version: 7.20.5 resolution: "@types/babel__core@npm:7.20.5" @@ -2007,6 +2087,24 @@ __metadata: languageName: node linkType: hard +"acorn-walk@npm:^8.1.1": + version: 8.3.4 + resolution: "acorn-walk@npm:8.3.4" + dependencies: + acorn: "npm:^8.11.0" + checksum: 10c0/76537ac5fb2c37a64560feaf3342023dadc086c46da57da363e64c6148dc21b57d49ace26f949e225063acb6fb441eabffd89f7a3066de5ad37ab3e328927c62 + languageName: node + linkType: hard + +"acorn@npm:^8.11.0, acorn@npm:^8.4.1": + version: 8.14.1 + resolution: "acorn@npm:8.14.1" + bin: + acorn: bin/acorn + checksum: 10c0/dbd36c1ed1d2fa3550140000371fcf721578095b18777b85a79df231ca093b08edc6858d75d6e48c73e431c174dcf9214edbd7e6fa5911b93bd8abfa54e47123 + languageName: node + linkType: hard + "agent-base@npm:^7.1.0, agent-base@npm:^7.1.2": version: 7.1.3 resolution: "agent-base@npm:7.1.3" @@ -2070,6 +2168,13 @@ __metadata: languageName: node linkType: hard +"arg@npm:^4.1.0": + version: 4.1.3 + resolution: "arg@npm:4.1.3" + checksum: 10c0/070ff801a9d236a6caa647507bdcc7034530604844d64408149a26b9e87c2f97650055c0f049abd1efc024b334635c01f29e0b632b371ac3f26130f4cf65997a + languageName: node + linkType: hard + "argparse@npm:^1.0.7": version: 1.0.10 resolution: "argparse@npm:1.0.10" @@ -2426,6 +2531,13 @@ __metadata: languageName: node linkType: hard +"create-require@npm:^1.1.0": + version: 1.1.1 + resolution: "create-require@npm:1.1.1" + checksum: 10c0/157cbc59b2430ae9a90034a5f3a1b398b6738bf510f713edc4d4e45e169bc514d3d99dd34d8d01ca7ae7830b5b8b537e46ae8f3c8f932371b0875c0151d7ec91 + languageName: node + linkType: hard + "cross-spawn@npm:^7.0.3, cross-spawn@npm:^7.0.6": version: 7.0.6 resolution: "cross-spawn@npm:7.0.6" @@ -2482,6 +2594,13 @@ __metadata: languageName: node linkType: hard +"diff@npm:^4.0.1": + version: 4.0.2 + resolution: "diff@npm:4.0.2" + checksum: 10c0/81b91f9d39c4eaca068eb0c1eb0e4afbdc5bb2941d197f513dd596b820b956fef43485876226d65d497bebc15666aa2aa82c679e84f65d5f2bfbf14ee46e32c1 + languageName: node + linkType: hard + "eastasianwidth@npm:^0.2.0": version: 0.2.0 resolution: "eastasianwidth@npm:0.2.0" @@ -3632,6 +3751,13 @@ __metadata: languageName: node linkType: hard +"make-error@npm:^1.1.1": + version: 1.3.6 + resolution: "make-error@npm:1.3.6" + checksum: 10c0/171e458d86854c6b3fc46610cfacf0b45149ba043782558c6875d9f42f222124384ad0b468c92e996d815a8a2003817a710c0a160e49c1c394626f76fa45396f + languageName: node + linkType: hard + "make-fetch-happen@npm:^14.0.3": version: 14.0.3 resolution: "make-fetch-happen@npm:14.0.3" @@ -4553,6 +4679,44 @@ __metadata: languageName: node linkType: hard +"ts-node@npm:^10.9.2": + version: 10.9.2 + resolution: "ts-node@npm:10.9.2" + dependencies: + "@cspotcode/source-map-support": "npm:^0.8.0" + "@tsconfig/node10": "npm:^1.0.7" + "@tsconfig/node12": "npm:^1.0.7" + "@tsconfig/node14": "npm:^1.0.0" + "@tsconfig/node16": "npm:^1.0.2" + acorn: "npm:^8.4.1" + acorn-walk: "npm:^8.1.1" + arg: "npm:^4.1.0" + create-require: "npm:^1.1.0" + diff: "npm:^4.0.1" + make-error: "npm:^1.1.1" + v8-compile-cache-lib: "npm:^3.0.1" + yn: "npm:3.1.1" + peerDependencies: + "@swc/core": ">=1.2.50" + "@swc/wasm": ">=1.2.50" + "@types/node": "*" + typescript: ">=2.7" + peerDependenciesMeta: + "@swc/core": + optional: true + "@swc/wasm": + optional: true + bin: + ts-node: dist/bin.js + ts-node-cwd: dist/bin-cwd.js + ts-node-esm: dist/bin-esm.js + ts-node-script: dist/bin-script.js + ts-node-transpile-only: dist/bin-transpile.js + ts-script: dist/bin-script-deprecated.js + checksum: 10c0/5f29938489f96982a25ba650b64218e83a3357d76f7bede80195c65ab44ad279c8357264639b7abdd5d7e75fc269a83daa0e9c62fd8637a3def67254ecc9ddc2 + languageName: node + linkType: hard + "type-detect@npm:4.0.8": version: 4.0.8 resolution: "type-detect@npm:4.0.8" @@ -4567,6 +4731,26 @@ __metadata: languageName: node linkType: hard +"typescript@npm:^5.8.0": + version: 5.8.3 + resolution: "typescript@npm:5.8.3" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10c0/5f8bb01196e542e64d44db3d16ee0e4063ce4f3e3966df6005f2588e86d91c03e1fb131c2581baf0fb65ee79669eea6e161cd448178986587e9f6844446dbb48 + languageName: node + linkType: hard + +"typescript@patch:typescript@npm%3A^5.8.0#optional!builtin": + version: 5.8.3 + resolution: "typescript@patch:typescript@npm%3A5.8.3#optional!builtin::version=5.8.3&hash=5786d5" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10c0/39117e346ff8ebd87ae1510b3a77d5d92dae5a89bde588c747d25da5c146603a99c8ee588c7ef80faaf123d89ed46f6dbd918d534d641083177d5fac38b8a1cb + languageName: node + linkType: hard + "undici-types@npm:~6.21.0": version: 6.21.0 resolution: "undici-types@npm:6.21.0" @@ -4637,6 +4821,13 @@ __metadata: languageName: node linkType: hard +"v8-compile-cache-lib@npm:^3.0.1": + version: 3.0.1 + resolution: "v8-compile-cache-lib@npm:3.0.1" + checksum: 10c0/bdc36fb8095d3b41df197f5fb6f11e3a26adf4059df3213e3baa93810d8f0cc76f9a74aaefc18b73e91fe7e19154ed6f134eda6fded2e0f1c8d2272ed2d2d391 + languageName: node + linkType: hard + "v8-to-istanbul@npm:^9.0.1": version: 9.3.0 resolution: "v8-to-istanbul@npm:9.3.0" @@ -4768,6 +4959,13 @@ __metadata: languageName: node linkType: hard +"yn@npm:3.1.1": + version: 3.1.1 + resolution: "yn@npm:3.1.1" + checksum: 10c0/0732468dd7622ed8a274f640f191f3eaf1f39d5349a1b72836df484998d7d9807fbea094e2f5486d6b0cd2414aad5775972df0e68f8604db89a239f0f4bf7443 + languageName: node + linkType: hard + "yocto-queue@npm:^0.1.0": version: 0.1.0 resolution: "yocto-queue@npm:0.1.0"