🚚 chore(vm): migrate to typescript part 1#235
Conversation
Signed-off-by: SimonShiki <sinangentoo@gmail.com>
Signed-off-by: SimonShiki <sinangentoo@gmail.com>
Signed-off-by: SimonShiki <sinangentoo@gmail.com>
Signed-off-by: SimonShiki <sinangentoo@gmail.com>
Signed-off-by: SimonShiki <sinangentoo@gmail.com>
Signed-off-by: SimonShiki <sinangentoo@gmail.com>
Signed-off-by: SimonShiki <sinangentoo@gmail.com>
This reverts commit e456e21.
Signed-off-by: SimonShiki <sinangentoo@gmail.com>
Signed-off-by: SimonShiki <sinangentoo@gmail.com>
Deploying clipcc-preview with
|
| Latest commit: |
c57f136
|
| Status: | ✅ Deploy successful! |
| Preview URL: | https://3f61ba7a.clipcc-preview.pages.dev |
| Branch Preview URL: | https://feat-ts-vm.clipcc-preview.pages.dev |
Signed-off-by: SimonShiki <sinangentoo@gmail.com>
Signed-off-by: SimonShiki <sinangentoo@gmail.com>
Signed-off-by: SimonShiki <sinangentoo@gmail.com>
Signed-off-by: SimonShiki <sinangentoo@gmail.com>
Signed-off-by: SimonShiki <sinangentoo@gmail.com>
Signed-off-by: SimonShiki <sinangentoo@gmail.com>
Signed-off-by: SimonShiki <sinangentoo@gmail.com>
Signed-off-by: SimonShiki <sinangentoo@gmail.com>
Signed-off-by: SimonShiki <sinangentoo@gmail.com>
Signed-off-by: SimonShiki <sinangentoo@gmail.com>
Signed-off-by: SimonShiki <sinangentoo@gmail.com>
Signed-off-by: SimonShiki <sinangentoo@gmail.com>
Signed-off-by: SimonShiki <sinangentoo@gmail.com>
Signed-off-by: SimonShiki <sinangentoo@gmail.com>
Signed-off-by: SimonShiki <sinangentoo@gmail.com>
Signed-off-by: SimonShiki <sinangentoo@gmail.com>
Signed-off-by: SimonShiki <sinangentoo@gmail.com>
Signed-off-by: SimonShiki <sinangentoo@gmail.com>
Signed-off-by: SimonShiki <sinangentoo@gmail.com>
Signed-off-by: SimonShiki <sinangentoo@gmail.com>
There was a problem hiding this comment.
Pull request overview
This PR is the first step of migrating packages/vm toward TypeScript, aiming to keep runtime behavior stable while enabling mixed JS/TS builds and updating internal imports/types accordingly.
Changes:
- Switch VM webpack entrypoints/exports from
src/index.jstosrc/index.ts, and update eslint/test resolution to accept.ts. - Migrate a large set of VM utilities/engine/blocks modules from JS to TS (plus schema typings), updating internal import specifiers to extensionless paths.
- Adjust unit/integration tests for the new module resolution behavior and replace the dispatch unit test Worker implementation with a local in-process fake worker.
Reviewed changes
Copilot reviewed 212 out of 216 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
| pnpm-lock.yaml | Lockfile updates for newly added dev deps/types. |
| packages/vm/webpack.config.js | Point webpack entries at src/index.ts and allow .ts resolution. |
| packages/vm/tsconfig.test.json | Removed test-only tsconfig. |
| packages/vm/tsconfig.json | Emit declarations only to dist/types/ and adjust emit options. |
| packages/vm/tsconfig.dts.json | Removed dedicated d.ts build config. |
| packages/vm/test/unit/vm_collectAssets.js | Update import specifier to extensionless path. |
| packages/vm/test/unit/virtual-machine.js | Update import specifiers to extensionless paths. |
| packages/vm/test/unit/util_xml.js | Update import specifier to extensionless path. |
| packages/vm/test/unit/util_variable.js | Update import specifier to extensionless path. |
| packages/vm/test/unit/util_timer.js | Update import specifier to extensionless path. |
| packages/vm/test/unit/util_task-queue.js | Update imports to extensionless paths (including fixtures). |
| packages/vm/test/unit/util_string.js | Update import specifier to extensionless path. |
| packages/vm/test/unit/util_rateLimiter.js | Update import specifier to extensionless path. |
| packages/vm/test/unit/util_new-block-ids.js | Update import specifier to extensionless path. |
| packages/vm/test/unit/util_math.js | Update import specifier to extensionless path. |
| packages/vm/test/unit/util_cast.js | Update import specifier to extensionless path. |
| packages/vm/test/unit/sprites_rendered-target.js | Update import specifier to extensionless path. |
| packages/vm/test/unit/spec.js | Update import specifier to extensionless path. |
| packages/vm/test/unit/serialization_sb3.js | Update import specifier to extensionless path. |
| packages/vm/test/unit/mock-timer.js | Update fixture import to extensionless path. |
| packages/vm/test/unit/maybe_format_message.js | Update import specifier to extensionless path. |
| packages/vm/test/unit/io_userData.js | Update import specifier to extensionless path. |
| packages/vm/test/unit/io_mousewheel.js | Update import specifiers to extensionless paths. |
| packages/vm/test/unit/io_keyboard.js | Update import specifier to extensionless path. |
| packages/vm/test/unit/io_joystick.js | Update import specifier to extensionless path. |
| packages/vm/test/unit/io_cloud.js | Update import specifier to extensionless path. |
| packages/vm/test/unit/io_clock.js | Update import specifier to extensionless path. |
| packages/vm/test/unit/extension_video_sensing.js | Update import specifier to extensionless path. |
| packages/vm/test/unit/extension_conversion.js | Update import specifier to extensionless path. |
| packages/vm/test/unit/engine_variable.js | Update import specifier to extensionless path. |
| packages/vm/test/unit/engine_thread.js | Update import specifiers to extensionless paths. |
| packages/vm/test/unit/engine_target.js | Update import specifiers to extensionless paths. |
| packages/vm/test/unit/engine_sequencer.js | Update import specifiers to extensionless paths + whitespace cleanup. |
| packages/vm/test/unit/engine_runtime.js | Update import specifier to extensionless path. |
| packages/vm/test/unit/engine_mutation-adapter.js | Update import specifier to extensionless path. |
| packages/vm/test/unit/engine_blocks.js | Update import specifiers to extensionless paths. |
| packages/vm/test/unit/engine_adapter.js | Update import specifier to extensionless path. |
| packages/vm/test/unit/dispatch.js | Use fake worker + update dispatch API usage. |
| packages/vm/test/unit/blocks_sounds.js | Update import specifier to extensionless path. |
| packages/vm/test/unit/blocks_sensing.js | Update import specifiers to extensionless paths. |
| packages/vm/test/unit/blocks_procedures.js | Update import specifier to extensionless path. |
| packages/vm/test/unit/blocks_operators.js | Update import specifier to extensionless path. |
| packages/vm/test/unit/blocks_operators_infinity.js | Update import specifier to extensionless path. |
| packages/vm/test/unit/blocks_motion.js | Update import specifiers to extensionless paths + whitespace cleanup. |
| packages/vm/test/unit/blocks_looks.js | Update import specifiers to extensionless paths. |
| packages/vm/test/unit/blocks_event.js | Update import specifiers to extensionless paths. |
| packages/vm/test/unit/blocks_data.js | Update import specifier to extensionless path. |
| packages/vm/test/unit/blocks_data_infinity.js | Update import specifier to extensionless path. |
| packages/vm/test/unit/blocks_control.js | Update imports + adjust mocked util interface for new BlockUtility API. |
| packages/vm/test/integration/variable_special_chars_sb3.js | Update import specifiers to extensionless paths. |
| packages/vm/test/integration/variable_special_chars_sb2.js | Update import specifiers to extensionless paths. |
| packages/vm/test/integration/variable_monitor_reset.js | Update import specifier to extensionless path. |
| packages/vm/test/integration/unknown-opcode.js | Update import specifier to extensionless path. |
| packages/vm/test/integration/unknown-opcode-in-c-block.js | Update import specifier to extensionless path. |
| packages/vm/test/integration/unknown-opcode-as-reporter-block.js | Update import specifier to extensionless path. |
| packages/vm/test/integration/stack-click.js | Update import specifier to extensionless path. |
| packages/vm/test/integration/sprite3_missing_svg.js | Update import specifier to extensionless path. |
| packages/vm/test/integration/sprite3_missing_png.js | Update import specifier to extensionless path. |
| packages/vm/test/integration/sprite3_corrupted_svg.js | Update import specifier to extensionless path. |
| packages/vm/test/integration/sprite3_corrupted_png.js | Update import specifier to extensionless path. |
| packages/vm/test/integration/sprite2_missing_svg.js | Update import specifier to extensionless path. |
| packages/vm/test/integration/sprite2_missing_png.js | Update import specifier to extensionless path. |
| packages/vm/test/integration/sprite2_corrupted_svg.js | Update import specifier to extensionless path. |
| packages/vm/test/integration/sprite2_corrupted_png.js | Update import specifier to extensionless path. |
| packages/vm/test/integration/sound.js | Update import specifiers to extensionless paths. |
| packages/vm/test/integration/sensing.js | Update import specifier to extensionless path. |
| packages/vm/test/integration/sb3-roundtrip.js | Update import specifiers to extensionless paths. |
| packages/vm/test/integration/sb3_missing_svg.js | Update import specifier to extensionless path. |
| packages/vm/test/integration/sb3_missing_sound.js | Update import specifier to extensionless path. |
| packages/vm/test/integration/sb3_missing_png.js | Update import specifier to extensionless path. |
| packages/vm/test/integration/sb3_corrupted_svg.js | Update import specifier to extensionless path. |
| packages/vm/test/integration/sb3_corrupted_sound.js | Update import specifier to extensionless path. |
| packages/vm/test/integration/sb3_corrupted_png.js | Update import specifier to extensionless path. |
| packages/vm/test/integration/sb2-import-extension-monitors.js | Update import specifier to extensionless path. |
| packages/vm/test/integration/sb2_missing_svg.js | Update import specifier to extensionless path. |
| packages/vm/test/integration/sb2_missing_png.js | Update import specifier to extensionless path. |
| packages/vm/test/integration/sb2_corrupted_svg.js | Update import specifier to extensionless path. |
| packages/vm/test/integration/sb2_corrupted_png.js | Update import specifier to extensionless path. |
| packages/vm/test/integration/saythink-and-wait.js | Update import specifiers to extensionless paths. |
| packages/vm/test/integration/running_project_changed_state.js | Update import specifier to extensionless path. |
| packages/vm/test/integration/procedure.js | Update import specifier to extensionless path. |
| packages/vm/test/integration/pen.js | Update import specifiers to extensionless paths. |
| packages/vm/test/integration/offline-custom-assets.js | Update import specifier to extensionless path. |
| packages/vm/test/integration/motion.js | Update import specifier to extensionless path. |
| packages/vm/test/integration/monitors_sb3.js | Update import specifiers to extensionless paths. |
| packages/vm/test/integration/monitors_sb2.js | Update import specifier to extensionless path. |
| packages/vm/test/integration/monitors_sb2_to_sb3.js | Update import specifier to extensionless path. |
| packages/vm/test/integration/monitor-threads-run-every-frame.js | Update import specifiers to extensionless paths. |
| packages/vm/test/integration/looks.js | Update import specifier to extensionless path. |
| packages/vm/test/integration/load-extensions.js | Update import specifiers to extensionless paths. |
| packages/vm/test/integration/list-monitor-rename.js | Update import specifier to extensionless path. |
| packages/vm/test/integration/internal-extension.js | Update import specifiers to extensionless paths. |
| packages/vm/test/integration/import-sb2-from-object.js | Update import specifier to extensionless path. |
| packages/vm/test/integration/import-sb.js | Update import specifier to extensionless path. |
| packages/vm/test/integration/hat-threads-run-every-frame.js | Update import specifiers to extensionless paths. |
| packages/vm/test/integration/hat-execution-order.js | Update import specifier to extensionless path. |
| packages/vm/test/integration/execute.js | Update import specifier to extensionless path. |
| packages/vm/test/integration/event.js | Update import specifier to extensionless path. |
| packages/vm/test/integration/data.js | Update import specifier to extensionless path. |
| packages/vm/test/integration/control.js | Update import specifier to extensionless path. |
| packages/vm/test/integration/complex.js | Update import specifier to extensionless path. |
| packages/vm/test/integration/comments.js | Update import specifier to extensionless path. |
| packages/vm/test/integration/comments_sb3.js | Update import specifier to extensionless path. |
| packages/vm/test/integration/cloud_variables_sb3.js | Update import specifier to extensionless path. |
| packages/vm/test/integration/cloud_variables_sb2.js | Update import specifier to extensionless path. |
| packages/vm/test/integration/clone-cleanup.js | Update import specifier to extensionless path. |
| packages/vm/test/integration/broadcast_special_chars_sb3.js | Update import specifiers to extensionless paths. |
| packages/vm/test/integration/broadcast_special_chars_sb2.js | Update import specifiers to extensionless paths. |
| packages/vm/test/integration/block_to_workspace_comment_import.js | Update import specifier to extensionless path. |
| packages/vm/test/integration/block_to_workspace_comment_import_no_scripts.js | Update import specifier to extensionless path. |
| packages/vm/test/fixtures/fake-worker.js | Add in-process Worker stub for dispatch tests. |
| packages/vm/test/fixtures/dispatch-test-worker.js | Update imports to extensionless paths. |
| packages/vm/test/extra/performance.js | Update import specifier to extensionless path. |
| packages/vm/src/virtual-machine.js | Update internal imports + TS-friendly JSDoc type import. |
| packages/vm/src/util/xml-escape.ts | Migrate xml escape util to TS. |
| packages/vm/src/util/variable-util.ts | Migrate variable util to TS + add explicit types. |
| packages/vm/src/util/uid.ts | Migrate uid generator to TS. |
| packages/vm/src/util/timer.ts | Migrate timer to TS + add property/method typings. |
| packages/vm/src/util/task-queue.ts | Migrate task queue to TS + add task record types. |
| packages/vm/src/util/string-util.ts | Migrate string util to TS + improve typing. |
| packages/vm/src/util/scratch-link-websocket.ts | Migrate scratch-link websocket wrapper to TS. |
| packages/vm/src/util/rateLimiter.ts | Migrate rate limiter to TS. |
| packages/vm/src/util/new-block-ids.ts | Migrate new-block-ids to TS + use schema types. |
| packages/vm/src/util/maybe-format-message.ts | Migrate maybe-format-message to TS. |
| packages/vm/src/util/maybe-format-message.js | Remove JS version (replaced by TS). |
| packages/vm/src/util/math-util.ts | Migrate math util to TS. |
| packages/vm/src/util/log.ts | Add TS log module using nanolog. |
| packages/vm/src/util/jsonrpc.ts | Migrate jsonrpc to TS. |
| packages/vm/src/util/jsonrpc.js | Remove JS version (replaced by TS). |
| packages/vm/src/util/get-monitor-id.ts | Migrate get-monitor-id to TS. |
| packages/vm/src/util/fetch-with-timeout.ts | Migrate fetch-with-timeout to TS. |
| packages/vm/src/util/color.ts | Export RGB/HSV interfaces + TS formatting changes. |
| packages/vm/src/util/clone.ts | Migrate clone util to TS. |
| packages/vm/src/util/cast.ts | Migrate cast util to TS + type refinements. |
| packages/vm/src/util/base64-util.ts | Migrate base64 util to TS + typings. |
| packages/vm/src/types/global.d.ts | Add ambient typings for decode-html and global clipcc. |
| packages/vm/src/sprites/sprite.ts | Migrate Sprite to TS + add costume/sound typings. |
| packages/vm/src/sprites/rendered-target.js | Update imports + add isRenderedTarget helper export. |
| packages/vm/src/serialization/schema.ts | Add typed VM block schema used at runtime/serialization. |
| packages/vm/src/serialization/sb3.js | Update imports to extensionless paths. |
| packages/vm/src/serialization/sb2.js | Update imports to extensionless paths. |
| packages/vm/src/serialization/sb2_specmap.js | Update imports to extensionless paths. |
| packages/vm/src/serialization/migration.js | Update log import to extensionless path. |
| packages/vm/src/serialization/deserialize-assets.js | Update log import to extensionless path. |
| packages/vm/src/playground/benchmark.js | Update VM import to extensionless path. |
| packages/vm/src/io/video.js | Update import to extensionless path. |
| packages/vm/src/io/userData.ts | Migrate userData device to TS. |
| packages/vm/src/io/mouseWheel.ts | Migrate mouseWheel device to TS. |
| packages/vm/src/io/mouse.js | Update import to extensionless path. |
| packages/vm/src/io/keyboard.ts | Migrate keyboard device to TS. |
| packages/vm/src/io/joystick.ts | Migrate joystick device to TS. |
| packages/vm/src/io/cloud.js | Update imports to extensionless paths. |
| packages/vm/src/io/clock.ts | Migrate clock device to TS. |
| packages/vm/src/io/bt.js | Update JSONRPC import to TS module path. |
| packages/vm/src/io/ble.js | Update JSONRPC import to TS module path. |
| packages/vm/src/index.ts | Export VM + add schema type re-export. |
| packages/vm/src/import/load-sound.js | Update imports to extensionless paths. |
| packages/vm/src/import/load-costume.js | Update imports to extensionless paths + doc tweaks. |
| packages/vm/src/extensions/scratch3_wedo2/index.js | Update util imports to extensionless paths. |
| packages/vm/src/extensions/scratch3_video_sensing/index.js | Update util imports to extensionless paths. |
| packages/vm/src/extensions/scratch3_translate/index.js | Update util imports to extensionless paths. |
| packages/vm/src/extensions/scratch3_text2speech/index.js | Update util imports to extensionless paths. |
| packages/vm/src/extensions/scratch3_speech2text/index.js | Update util imports to extensionless paths. |
| packages/vm/src/extensions/scratch3_pen/index.js | Update util/engine imports to extensionless paths. |
| packages/vm/src/extensions/scratch3_music/index.js | Update util imports to extensionless paths. |
| packages/vm/src/extensions/scratch3_microbit/index.js | Update util imports to extensionless paths. |
| packages/vm/src/extensions/scratch3_makeymakey/index.js | Update util imports to extensionless paths. |
| packages/vm/src/extensions/scratch3_gdx_for/scratch-link-device-adapter.js | Update Base64Util import to extensionless path. |
| packages/vm/src/extensions/scratch3_gdx_for/index.js | Update log/math imports to extensionless paths. |
| packages/vm/src/extensions/scratch3_ev3/index.js | Update util imports to extensionless paths. |
| packages/vm/src/extensions/scratch3_boost/index.js | Update util imports to extensionless paths. |
| packages/vm/src/extension-support/extension-worker.js | Update dispatch import to extensionless path. |
| packages/vm/src/extension-support/extension-metadata.ts | TS typing adjustments for extension metadata. |
| packages/vm/src/extension-support/extension-manager.js | Update imports + switch to public dispatch remote-check API. |
| packages/vm/src/extension-support/define-messages.ts | Migrate define-messages helper to TS. |
| packages/vm/src/extension-support/define-messages.js | Remove JS version (replaced by TS). |
| packages/vm/src/engine/variable.ts | Migrate Variable to TS + add VariableType enum. |
| packages/vm/src/engine/target.js | Update imports + TS-friendly JSDoc type import. |
| packages/vm/src/engine/stage-layering.ts | Add StageLayer enum + keep layering constants. |
| packages/vm/src/engine/scratch-blocks-constants.ts | TS/const-assertion tweaks to scratch-blocks constants. |
| packages/vm/src/engine/mutation-adapter.ts | Migrate mutation-adapter to TS + domhandler typing. |
| packages/vm/src/engine/monitor-record.ts | Migrate MonitorRecord to TS. |
| packages/vm/src/engine/monitor-record.js | Remove JS version (replaced by TS). |
| packages/vm/src/engine/execute.js | Update imports to extensionless paths. |
| packages/vm/src/engine/blocks-execute-cache.ts | Migrate blocks execute cache helper to TS. |
| packages/vm/src/engine/blocks-execute-cache.js | Remove JS version (replaced by TS). |
| packages/vm/src/engine/blocks-runtime-cache.ts | Migrate runtime script cache helper to TS. |
| packages/vm/src/engine/blocks.js | Update imports + refine JSDoc type references to new schema types. |
| packages/vm/src/engine/block-utility.js | Remove JS version (replaced by TS implementation). |
| packages/vm/src/dispatch/worker-dispatch.ts | Migrate worker-dispatch to TS. |
| packages/vm/src/dispatch/central-dispatch.ts | Migrate central-dispatch to TS + tighten encapsulation. |
| packages/vm/src/blocks/scratch3_procedures.ts | Add TS typings for procedures blocks. |
| packages/vm/src/blocks/scratch3_operators.ts | Add TS typings for operators blocks. |
| packages/vm/src/blocks/scratch3_motion.ts | Add TS typings for motion blocks + updated glide timer handling. |
| packages/vm/src/blocks/scratch3_event.ts | Add TS typings for event blocks. |
| packages/vm/src/blocks/scratch3_data.ts | Add TS typings for data blocks + monitor update typing. |
| packages/vm/src/blocks/scratch3_control.ts | Add TS typings for control blocks + typed execution context. |
| packages/vm/src/blocks/category_prototype.ts | Add shared TS types/interfaces for block categories. |
| packages/vm/package.json | Update exports + build:types command + add TS-related dev deps. |
| packages/vm/eslint.config.js | Enable TS lint config and include .ts files for src/tests. |
| packages/render/src/RenderWebGL.js | JSDoc tweak for return type description. |
| packages/gui/src/types.d.ts | Add global clipcc metadata typing. |
| packages/block/src/index.ts | Export additional types/events from block package. |
Files not reviewed (1)
- pnpm-lock.yaml: Language not supported
Comments suppressed due to low confidence (4)
packages/vm/src/sprites/sprite.ts:126
createCloneis documented/used as optional-argument API, but the TypeScript signature requiresoptLayerGroup: StageLayer. Call sites (e.g.RenderedTarget.makeClone()/duplicate()) callcreateClone()with no args and this method already handles missing values at runtime. Make the parameter optional (or give it a default) so the type definition matches actual behavior and avoids TS errors for migrated callers.
packages/vm/src/engine/stage-layering.ts:5- Avoid
const enumhere: this package’s runtime build is transpiled via@babel/preset-typescript(webpack usesbabel-loader), andconst enumis not reliably supported/inlined by Babel. This can lead to runtime breakage or unexpected emitted code. Prefer a normalenumor aas constobject + union type.
packages/vm/src/engine/variable.ts:14 VariableTypeis declared as an exportedconst enum, but VM runtime code references it at runtime (viaVariable.SCALAR_TYPEetc) and the build is Babel-transpiled.const enumis not reliably handled by Babel’s TypeScript transform and can cause runtime failures or unexpected output. Use a normalenumoras conststring literals instead.
packages/vm/src/dispatch/central-dispatch.ts:23workerClassused to be a public escape hatch to let Node/test environments provide a custom Worker implementation (e.g. TinyWorker). Marking itprivatemakes that customization a TS type error and is an API breaking change (the unit tests in this PR still rely on settingdispatch.workerClass). Consider keeping it public or adding an explicit setter/config method.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| global.self = workerSelf; | ||
| global.postMessage = workerSelf.postMessage; | ||
| global.close = workerSelf.close; | ||
| global.addEventListener = workerSelf.addEventListener; | ||
|
|
| }, | ||
| "scripts": { | ||
| "build:types": "tsc --project ./tsconfig.dts.json", | ||
| "build:types": "tsc", |
There was a problem hiding this comment.
test types should also get resolved if they use ts.
|
Requires #219
Description
Migrate some files that not heavily coupling runtime to TypeScript.
Proposed Changes
Test Coverage
None
Additional Context
The runtime-related changes will be splitted to another pr for better readability.
Recommend to squash merge esm, but normal merge ts part 1 + part 2
For AI Reviewers
In this migration, the type annotations involved should, to the greatest extent possible, remain zero‑overhead and must not introduce any substantially breaking logic changes. Exceptions are allowed only when:
The original code genuinely has serious defects, and the fix will not potentially affect a large body of other code that depends on this part of the source.
The fix does not alter the original execution logic (for example, it merely performs a type check earlier and bails out (Eg: returns early or throw error), where that bail‑out is a behavior that would have occurred under the original logic anyway).
You need to pay special attention to changes that tangibly affect runtime behavior, and verify whether the change—viewed either as a caller or a callee—has any impact on the other invocations involved.
preserve ALL original comment descriptions except type annotation (Eg: @type {Runtime}, since we've migrated them into typescript native syntax)