[web] Move libraries to a shared location

These libraries will be shared between the dart2js and DDC runtimes.

Also renames the `shared` directory to `synced` to avoid confusion.
Synced directories are copied to be in sync with the compilers and
runtimes.

Change-Id: Ic36076938741d7102792f09413666de0033da3a4
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/238300
Reviewed-by: Mayank Patke <fishythefish@google.com>
Reviewed-by: Ivan Inozemtsev <iinozemtsev@google.com>
Reviewed-by: Stephen Adams <sra@google.com>
Commit-Queue: Nicholas Shahan <nshahan@google.com>
Reviewed-by: Nate Bosch <nbosch@google.com>
diff --git a/pkg/compiler/lib/src/js/rewrite_async.dart b/pkg/compiler/lib/src/js/rewrite_async.dart
index 7cc6ec9..82d1662 100644
--- a/pkg/compiler/lib/src/js/rewrite_async.dart
+++ b/pkg/compiler/lib/src/js/rewrite_async.dart
@@ -9,7 +9,7 @@
 import 'dart:collection';
 import 'dart:math' show max;
 
-import 'package:js_runtime/shared/async_await_error_codes.dart' as error_codes;
+import 'package:js_runtime/synced/async_await_error_codes.dart' as error_codes;
 
 import '../common.dart';
 import '../io/source_information.dart' show SourceInformation;
diff --git a/pkg/compiler/lib/src/js_backend/backend_usage.dart b/pkg/compiler/lib/src/js_backend/backend_usage.dart
index 7e08bd6..37ef534 100644
--- a/pkg/compiler/lib/src/js_backend/backend_usage.dart
+++ b/pkg/compiler/lib/src/js_backend/backend_usage.dart
@@ -161,7 +161,8 @@
     if (_isValidEntity(element)) return true;
     SourceSpan span = _frontendStrategy.spanFromSpannable(element, element);
     if (library.canonicalUri.isScheme('dart') &&
-        span.uri.path.contains('_internal/js_runtime/lib/')) {
+        (span.uri.path.contains('_internal/js_runtime/lib') ||
+            span.uri.path.contains('_internal/js_shared/lib'))) {
       // TODO(johnniwinther): We should be more precise about these.
       return true;
     } else {
diff --git a/pkg/compiler/lib/src/js_backend/namer.dart b/pkg/compiler/lib/src/js_backend/namer.dart
index 3f90fc2..392e4e5 100644
--- a/pkg/compiler/lib/src/js_backend/namer.dart
+++ b/pkg/compiler/lib/src/js_backend/namer.dart
@@ -9,7 +9,7 @@
 import 'package:front_end/src/api_unstable/dart2js.dart'
     show $0, $9, $A, $Z, $_, $a, $g, $s, $z;
 
-import 'package:js_runtime/shared/embedded_names.dart' show JsGetName;
+import 'package:js_runtime/synced/embedded_names.dart' show JsGetName;
 
 import '../closure.dart';
 import '../common.dart';
diff --git a/pkg/compiler/lib/src/js_backend/runtime_types_new.dart b/pkg/compiler/lib/src/js_backend/runtime_types_new.dart
index 2f8816e..a0f4161 100644
--- a/pkg/compiler/lib/src/js_backend/runtime_types_new.dart
+++ b/pkg/compiler/lib/src/js_backend/runtime_types_new.dart
@@ -6,7 +6,7 @@
 
 library js_backend.runtime_types_new;
 
-import 'package:js_runtime/shared/recipe_syntax.dart';
+import 'package:js_shared/synced/recipe_syntax.dart';
 
 import '../common/elements.dart' show CommonElements, JCommonElements;
 import '../elements/entities.dart';
diff --git a/pkg/compiler/lib/src/js_emitter/class_stub_generator.dart b/pkg/compiler/lib/src/js_emitter/class_stub_generator.dart
index 78a6912..0e14253 100644
--- a/pkg/compiler/lib/src/js_emitter/class_stub_generator.dart
+++ b/pkg/compiler/lib/src/js_emitter/class_stub_generator.dart
@@ -6,7 +6,7 @@
 
 library dart2js.js_emitter.class_stub_generator;
 
-import 'package:js_runtime/shared/embedded_names.dart'
+import 'package:js_runtime/synced/embedded_names.dart'
     show TearOffParametersPropertyNames;
 
 import '../common/elements.dart' show CommonElements;
diff --git a/pkg/compiler/lib/src/js_emitter/interceptor_stub_generator.dart b/pkg/compiler/lib/src/js_emitter/interceptor_stub_generator.dart
index 7ba3a7f..5251365 100644
--- a/pkg/compiler/lib/src/js_emitter/interceptor_stub_generator.dart
+++ b/pkg/compiler/lib/src/js_emitter/interceptor_stub_generator.dart
@@ -6,7 +6,7 @@
 
 library dart2js.js_emitter.interceptor_stub_generator;
 
-import 'package:js_runtime/shared/embedded_names.dart' as embeddedNames;
+import 'package:js_runtime/synced/embedded_names.dart' as embeddedNames;
 
 import '../common/elements.dart';
 import '../constants/values.dart';
diff --git a/pkg/compiler/lib/src/js_emitter/main_call_stub_generator.dart b/pkg/compiler/lib/src/js_emitter/main_call_stub_generator.dart
index 6098493..c6af592 100644
--- a/pkg/compiler/lib/src/js_emitter/main_call_stub_generator.dart
+++ b/pkg/compiler/lib/src/js_emitter/main_call_stub_generator.dart
@@ -7,7 +7,7 @@
 library dart2js.js_emitter.main_call_stub_generator;
 
 import 'package:compiler/src/options.dart';
-import 'package:js_runtime/shared/embedded_names.dart' as embeddedNames;
+import 'package:js_runtime/synced/embedded_names.dart' as embeddedNames;
 
 import '../common/elements.dart';
 import '../elements/entities.dart';
diff --git a/pkg/compiler/lib/src/js_emitter/native_generator.dart b/pkg/compiler/lib/src/js_emitter/native_generator.dart
index 71e6414..a47b6be 100644
--- a/pkg/compiler/lib/src/js_emitter/native_generator.dart
+++ b/pkg/compiler/lib/src/js_emitter/native_generator.dart
@@ -6,7 +6,7 @@
 
 library dart2js.js_emitter.native_generator;
 
-import 'package:js_runtime/shared/embedded_names.dart' as embeddedNames;
+import 'package:js_runtime/synced/embedded_names.dart' as embeddedNames;
 
 import '../js/js.dart' as jsAst;
 import '../js/js.dart' show js;
diff --git a/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart b/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart
index f0ca9812..9ff95c5 100644
--- a/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart
@@ -8,7 +8,7 @@
 
 import 'dart:convert' show JsonEncoder;
 
-import 'package:js_runtime/shared/embedded_names.dart'
+import 'package:js_runtime/synced/embedded_names.dart'
     show
         ARRAY_RTI_PROPERTY,
         DEFERRED_INITIALIZED,
diff --git a/pkg/compiler/lib/src/kernel/element_map_impl.dart b/pkg/compiler/lib/src/kernel/element_map_impl.dart
index 476b906..f28ab293 100644
--- a/pkg/compiler/lib/src/kernel/element_map_impl.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart
@@ -6,7 +6,7 @@
 
 import 'package:front_end/src/api_prototype/constant_evaluator.dart' as ir;
 import 'package:front_end/src/api_unstable/dart2js.dart' as ir;
-import 'package:js_runtime/shared/embedded_names.dart';
+import 'package:js_runtime/synced/embedded_names.dart';
 import 'package:kernel/ast.dart' as ir;
 import 'package:kernel/class_hierarchy.dart' as ir;
 import 'package:kernel/core_types.dart' as ir;
diff --git a/pkg/compiler/lib/src/ssa/builder.dart b/pkg/compiler/lib/src/ssa/builder.dart
index 8721f91..cc26197 100644
--- a/pkg/compiler/lib/src/ssa/builder.dart
+++ b/pkg/compiler/lib/src/ssa/builder.dart
@@ -4,7 +4,7 @@
 
 // @dart = 2.10
 
-import 'package:js_runtime/shared/embedded_names.dart';
+import 'package:js_runtime/synced/embedded_names.dart';
 import 'package:kernel/ast.dart' as ir;
 
 import '../closure.dart';
diff --git a/pkg/compiler/pubspec.yaml b/pkg/compiler/pubspec.yaml
index 22f0ac4..f3dfd26 100644
--- a/pkg/compiler/pubspec.yaml
+++ b/pkg/compiler/pubspec.yaml
@@ -17,6 +17,7 @@
   front_end: any
   js_ast: any
   js_runtime: any
+  js_shared: any
   kernel: any
 
 dev_dependencies:
diff --git a/pkg/js_runtime/README.md b/pkg/js_runtime/README.md
index 5f60952..02f263b 100644
--- a/pkg/js_runtime/README.md
+++ b/pkg/js_runtime/README.md
@@ -3,7 +3,7 @@
 This package contains code that is shared between the dart2js compiler and the
 dart2js runtime libraries.
 
-*Important*: all code under the `lib/shared/` must be kept in sync with the
-runtime at all times (in `sdk/lib/_internal/js_runtime/lib/shared`). The
+*Important*: all code under the `lib/synced/` must be kept in sync with the
+runtime at all times (in `sdk/lib/_internal/js_runtime/lib/synced`). The
 `test/in_sync_test.dart` test verifies this.
 
diff --git a/pkg/js_runtime/lib/shared/async_await_error_codes.dart b/pkg/js_runtime/lib/synced/async_await_error_codes.dart
similarity index 100%
rename from pkg/js_runtime/lib/shared/async_await_error_codes.dart
rename to pkg/js_runtime/lib/synced/async_await_error_codes.dart
diff --git a/pkg/js_runtime/lib/shared/embedded_names.dart b/pkg/js_runtime/lib/synced/embedded_names.dart
similarity index 100%
rename from pkg/js_runtime/lib/shared/embedded_names.dart
rename to pkg/js_runtime/lib/synced/embedded_names.dart
diff --git a/pkg/js_runtime/test/in_sync_test.dart b/pkg/js_runtime/test/in_sync_test.dart
index 4dbef635..5dab586 100644
--- a/pkg/js_runtime/test/in_sync_test.dart
+++ b/pkg/js_runtime/test/in_sync_test.dart
@@ -11,9 +11,9 @@
 import 'package:expect/expect.dart';
 
 void main(List<String> argv) {
-  var packageDir = Platform.script.resolve('../lib/shared/');
+  var packageDir = Platform.script.resolve('../lib/synced/');
   var sdkDir = Platform.script
-      .resolve('../../../sdk/lib/_internal/js_runtime/lib/shared/');
+      .resolve('../../../sdk/lib/_internal/js_runtime/lib/synced/');
   var rPackageDir =
       relativizeUri(Directory.current.uri, packageDir, Platform.isWindows);
   var rSdkDir =
diff --git a/pkg/js_shared/OWNERS b/pkg/js_shared/OWNERS
new file mode 100644
index 0000000..f5bd90c
--- /dev/null
+++ b/pkg/js_shared/OWNERS
@@ -0,0 +1 @@
+file:/tools/OWNERS_WEB
diff --git a/pkg/js_shared/README.md b/pkg/js_shared/README.md
new file mode 100644
index 0000000..cce9c2e
--- /dev/null
+++ b/pkg/js_shared/README.md
@@ -0,0 +1,13 @@
+# Package `js_shared`:
+
+This code is a compile time dependency of dart2js and DDC. It is imported as
+a `package:` import by both compilers.
+
+There is an exact copy in the SDK of the libraries in the
+`pkg/js_shared/lib/synced` sub-directory.
+Those libraries are imported as `dart:` imports by the dart2js and DDC runtime
+libraries.
+
+*Important*: all code under `pkg/js_shared/lib/synced` must be kept in sync with
+the runtime (in `sdk/lib/_internal/js_shared/lib/synced`) at all times. The
+`test/in_sync_test.dart` test verifies this.
diff --git a/pkg/js_runtime/lib/shared/recipe_syntax.dart b/pkg/js_shared/lib/synced/recipe_syntax.dart
similarity index 98%
rename from pkg/js_runtime/lib/shared/recipe_syntax.dart
rename to pkg/js_shared/lib/synced/recipe_syntax.dart
index 7305491..3ccec60 100644
--- a/pkg/js_runtime/lib/shared/recipe_syntax.dart
+++ b/pkg/js_shared/lib/synced/recipe_syntax.dart
@@ -6,8 +6,8 @@
 
 /// Constants and predicates used for encoding and decoding type recipes.
 ///
-/// This library is shared between the compiler and the runtime system.
-library dart2js._recipe_syntax;
+/// This library is synchronized between the compiler and the runtime system.
+library js_shared._recipe_syntax;
 
 abstract class Recipe {
   Recipe._();
diff --git a/pkg/js_shared/pubspec.yaml b/pkg/js_shared/pubspec.yaml
new file mode 100644
index 0000000..6424aac
--- /dev/null
+++ b/pkg/js_shared/pubspec.yaml
@@ -0,0 +1,10 @@
+name: js_shared
+# This package is not intended for consumption on pub.dev. DO NOT publish.
+publish_to: none
+
+environment:
+  sdk: '>=2.12.0 <3.0.0'
+
+dev_dependencies:
+  expect: any
+  _fe_analyzer_shared: any
diff --git a/pkg/js_shared/test/in_sync_test.dart b/pkg/js_shared/test/in_sync_test.dart
new file mode 100644
index 0000000..e10c4d6
--- /dev/null
+++ b/pkg/js_shared/test/in_sync_test.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2022, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Test to verify that this package is in-sync with shared runtime libraries.
+import 'dart:io';
+
+import 'package:_fe_analyzer_shared/src/util/relativize.dart';
+import 'package:expect/expect.dart';
+
+void main(List<String> argv) {
+  var packageDir = Platform.script.resolve('../lib/synced/');
+  var sdkDir = Platform.script
+      .resolve('../../../sdk/lib/_internal/js_shared/lib/synced/');
+  var rPackageDir =
+      relativizeUri(Directory.current.uri, packageDir, Platform.isWindows);
+  var rSdkDir =
+      relativizeUri(Directory.current.uri, sdkDir, Platform.isWindows);
+
+  for (var file in Directory.fromUri(sdkDir).listSync()) {
+    if (file is File) {
+      var filename = file.uri.pathSegments.last;
+      var packageFile = File.fromUri(packageDir.resolve(filename));
+      Expect.isTrue(
+          packageFile.existsSync(),
+          "$filename not in sync. Please update it by running:\n"
+          "  cp $rSdkDir$filename $rPackageDir$filename");
+      var original = file.readAsBytesSync();
+      var copy = packageFile.readAsBytesSync();
+      Expect.listEquals(
+          original,
+          copy,
+          "$filename not in sync. Please update it by running:\n"
+          "  cp $rSdkDir$filename $rPackageDir$filename");
+    }
+  }
+}
diff --git a/pkg/pkg.status b/pkg/pkg.status
index 2aef55f..b7d1949 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -140,6 +140,7 @@
 front_end/test/hot_reload_e2e_test: Skip
 frontend_server/test/*: SkipByDesign # Only meant to run on vm
 js_runtime/test/*: SkipByDesign # Only meant to run on vm
+js_shared/test/*: SkipByDesign # Only meant to run on vm
 vm/test/*: SkipByDesign # Only meant to run on vm
 vm_service/test/*: SkipByDesign # Uses dart:io
 vm_snapshot_analysis/test/*: SkipByDesign # Only meant to run on vm
diff --git a/sdk/lib/_internal/js_runtime/lib/shared/recipe_syntax.dart b/sdk/lib/_internal/js_runtime/lib/shared/recipe_syntax.dart
deleted file mode 100644
index 7305491..0000000
--- a/sdk/lib/_internal/js_runtime/lib/shared/recipe_syntax.dart
+++ /dev/null
@@ -1,239 +0,0 @@
-// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// @dart=2.12
-
-/// Constants and predicates used for encoding and decoding type recipes.
-///
-/// This library is shared between the compiler and the runtime system.
-library dart2js._recipe_syntax;
-
-abstract class Recipe {
-  Recipe._();
-
-  // Operators.
-
-  static const int separator = _comma;
-  static const String separatorString = _commaString;
-
-  static const int toType = _semicolon;
-  static const String toTypeString = _semicolonString;
-
-  static const int pushErased = _hash;
-  static const String pushErasedString = _hashString;
-  static const int pushDynamic = _at;
-  static const String pushDynamicString = _atString;
-  static const int pushVoid = _tilde;
-  static const String pushVoidString = _tildeString;
-
-  static const int wrapStar = _asterisk;
-  static const String wrapStarString = _asteriskString;
-  static const int wrapQuestion = _question;
-  static const String wrapQuestionString = _questionString;
-  static const int wrapFutureOr = _slash;
-  static const String wrapFutureOrString = _slashString;
-
-  static const int startTypeArguments = _lessThan;
-  static const String startTypeArgumentsString = _lessThanString;
-  static const int endTypeArguments = _greaterThan;
-  static const String endTypeArgumentsString = _greaterThanString;
-
-  static const int startFunctionArguments = _leftParen;
-  static const String startFunctionArgumentsString = _leftParenString;
-  static const int endFunctionArguments = _rightParen;
-  static const String endFunctionArgumentsString = _rightParenString;
-  static const int startOptionalGroup = _leftBracket;
-  static const String startOptionalGroupString = _leftBracketString;
-  static const int endOptionalGroup = _rightBracket;
-  static const String endOptionalGroupString = _rightBracketString;
-  static const int startNamedGroup = _leftBrace;
-  static const String startNamedGroupString = _leftBraceString;
-  static const int endNamedGroup = _rightBrace;
-  static const String endNamedGroupString = _rightBraceString;
-  static const int nameSeparator = _colon;
-  static const String nameSeparatorString = _colonString;
-  static const int requiredNameSeparator = _exclamation;
-  static const String requiredNameSeparatorString = _exclamationString;
-
-  static const int genericFunctionTypeParameterIndex = _circumflex;
-  static const String genericFunctionTypeParameterIndexString =
-      _circumflexString;
-
-  static const int extensionOp = _ampersand;
-  static const String extensionOpString = _ampersandString;
-  static const int pushNeverExtension = 0;
-  static const String pushNeverExtensionString = '$pushNeverExtension';
-  static const int pushAnyExtension = 1;
-  static const String pushAnyExtensionString = '$pushAnyExtension';
-
-  // Number and name components.
-
-  static bool isDigit(int code) => code >= _digit0 && code <= _digit9;
-  static int digitValue(int code) => code - _digit0;
-
-  static bool isIdentifierStart(int ch) =>
-      (((ch | 32) - _lowercaseA) & 0xffff) < 26 ||
-      (ch == _underscore) ||
-      (ch == _dollar);
-
-  static const int period = _period;
-
-  // Private names.
-
-  static const int _formfeed = 0x0C;
-  static const String _formfeedString = '\f';
-
-  static const int _space = 0x20;
-  static const String _spaceString = ' ';
-  static const int _exclamation = 0x21;
-  static const String _exclamationString = '!';
-  static const int _hash = 0x23;
-  static const String _hashString = '#';
-  static const int _dollar = 0x24;
-  static const String _dollarString = r'$';
-  static const int _percent = 0x25;
-  static const String _percentString = '%';
-  static const int _ampersand = 0x26;
-  static const String _ampersandString = '&';
-  static const int _apostrophe = 0x27;
-  static const String _apostropheString = "'";
-  static const int _leftParen = 0x28;
-  static const String _leftParenString = '(';
-  static const int _rightParen = 0x29;
-  static const String _rightParenString = ')';
-  static const int _asterisk = 0x2A;
-  static const String _asteriskString = '*';
-  static const int _plus = 0x2B;
-  static const String _plusString = '+';
-  static const int _comma = 0x2C;
-  static const String _commaString = ',';
-  static const int _minus = 0x2D;
-  static const String _minusString = '-';
-  static const int _period = 0x2E;
-  static const String _periodString = '.';
-  static const int _slash = 0x2F;
-  static const String _slashString = '/';
-
-  static const int _digit0 = 0x30;
-  static const int _digit9 = 0x39;
-
-  static const int _colon = 0x3A;
-  static const String _colonString = ':';
-  static const int _semicolon = 0x3B;
-  static const String _semicolonString = ';';
-  static const int _lessThan = 0x3C;
-  static const String _lessThanString = '<';
-  static const int _equals = 0x3D;
-  static const String _equalsString = '=';
-  static const int _greaterThan = 0x3E;
-  static const String _greaterThanString = '>';
-  static const int _question = 0x3F;
-  static const String _questionString = '?';
-  static const int _at = 0x40;
-  static const String _atString = '@';
-
-  static const int _uppercaseA = 0x41;
-  static const int _uppercaseZ = 0x5A;
-
-  static const int _leftBracket = 0x5B;
-  static const String _leftBracketString = '[';
-  static const int _backslash = 0x5C;
-  static const String _backslashString = r'\';
-  static const int _rightBracket = 0x5D;
-  static const String _rightBracketString = ']';
-  static const int _circumflex = 0x5E;
-  static const String _circumflexString = '^';
-  static const int _underscore = 0x5F;
-  static const String _underscoreString = '_';
-  static const int _backtick = 0x60;
-  static const String _backtickString = '`';
-
-  static const int _lowercaseA = 0x61;
-  static const int _lowercaseZ = 0x7A;
-
-  static const int _leftBrace = 0x7B;
-  static const String _leftBraceString = '{';
-  static const int _vertical = 0x7C;
-  static const String _verticalString = '|';
-  static const int _rightBrace = 0x7D;
-  static const String _rightBraceString = '}';
-  static const int _tilde = 0x7E;
-  static const String _tildeString = '~';
-
-  static void testEquivalence() {
-    void test(String label, int charCode, String str) {
-      if (String.fromCharCode(charCode) != str) {
-        throw StateError("$label: String.fromCharCode($charCode) != $str");
-      }
-    }
-
-    void testExtension(String label, int op, String str) {
-      if ('$op' != str) {
-        throw StateError("$label: $op.toString() != $str");
-      }
-    }
-
-    test("separator", separator, separatorString);
-    test("toType", toType, toTypeString);
-    test("pushErased", pushErased, pushErasedString);
-    test("pushDynamic", pushDynamic, pushDynamicString);
-    test("pushVoid", pushVoid, pushVoidString);
-    test("wrapStar", wrapStar, wrapStarString);
-    test("wrapQuestion", wrapQuestion, wrapQuestionString);
-    test("wrapFutureOr", wrapFutureOr, wrapFutureOrString);
-    test("startTypeArguments", startTypeArguments, startTypeArgumentsString);
-    test("endTypeArguments", endTypeArguments, endTypeArgumentsString);
-    test("startFunctionArguments", startFunctionArguments,
-        startFunctionArgumentsString);
-    test("endFunctionArguments", endFunctionArguments,
-        endFunctionArgumentsString);
-    test("startOptionalGroup", startOptionalGroup, startOptionalGroupString);
-    test("endOptionalGroup", endOptionalGroup, endOptionalGroupString);
-    test("startNamedGroup", startNamedGroup, startNamedGroupString);
-    test("endNamedGroup", endNamedGroup, endNamedGroupString);
-    test("nameSeparator", nameSeparator, nameSeparatorString);
-    test("requiredNameSeparator", requiredNameSeparator,
-        requiredNameSeparatorString);
-    test("genericFunctionTypeParameterIndex", genericFunctionTypeParameterIndex,
-        genericFunctionTypeParameterIndexString);
-    test("extensionOp", extensionOp, extensionOpString);
-    testExtension(
-        "pushNeverExtension", pushNeverExtension, pushNeverExtensionString);
-    testExtension("pushAnyExtension", pushAnyExtension, pushAnyExtensionString);
-
-    test("_formfeed", _formfeed, _formfeedString);
-    test("_space", _space, _spaceString);
-    test("_exclamation", _exclamation, _exclamationString);
-    test("_hash", _hash, _hashString);
-    test("_dollar", _dollar, _dollarString);
-    test("_percent", _percent, _percentString);
-    test("_ampersand", _ampersand, _ampersandString);
-    test("_apostrophe", _apostrophe, _apostropheString);
-    test("_leftParen", _leftParen, _leftParenString);
-    test("_rightParen", _rightParen, _rightParenString);
-    test("_asterisk", _asterisk, _asteriskString);
-    test("_plus", _plus, _plusString);
-    test("_comma", _comma, _commaString);
-    test("_minus", _minus, _minusString);
-    test("_period", _period, _periodString);
-    test("_slash", _slash, _slashString);
-    test("_colon", _colon, _colonString);
-    test("_semicolon", _semicolon, _semicolonString);
-    test("_lessThan", _lessThan, _lessThanString);
-    test("_equals", _equals, _equalsString);
-    test("_greaterThan", _greaterThan, _greaterThanString);
-    test("_question", _question, _questionString);
-    test("_at", _at, _atString);
-    test("_leftBracket", _leftBracket, _leftBracketString);
-    test("_backslash", _backslash, _backslashString);
-    test("_rightBracket", _rightBracket, _rightBracketString);
-    test("_circumflex", _circumflex, _circumflexString);
-    test("_underscore", _underscore, _underscoreString);
-    test("_backtick", _backtick, _backtickString);
-    test("_leftBrace", _leftBrace, _leftBraceString);
-    test("_vertical", _vertical, _verticalString);
-    test("_rightBrace", _rightBrace, _rightBraceString);
-    test("_tilde", _tilde, _tildeString);
-  }
-}
diff --git a/sdk/lib/_internal/js_runtime/lib/shared/async_await_error_codes.dart b/sdk/lib/_internal/js_runtime/lib/synced/async_await_error_codes.dart
similarity index 100%
rename from sdk/lib/_internal/js_runtime/lib/shared/async_await_error_codes.dart
rename to sdk/lib/_internal/js_runtime/lib/synced/async_await_error_codes.dart
diff --git a/sdk/lib/_internal/js_runtime/lib/shared/embedded_names.dart b/sdk/lib/_internal/js_runtime/lib/synced/embedded_names.dart
similarity index 100%
rename from sdk/lib/_internal/js_runtime/lib/shared/embedded_names.dart
rename to sdk/lib/_internal/js_runtime/lib/synced/embedded_names.dart
diff --git a/sdk/lib/_internal/js_runtime/lib/rti.dart b/sdk/lib/_internal/js_shared/lib/rti.dart
similarity index 100%
rename from sdk/lib/_internal/js_runtime/lib/rti.dart
rename to sdk/lib/_internal/js_shared/lib/rti.dart
diff --git a/pkg/js_runtime/lib/shared/recipe_syntax.dart b/sdk/lib/_internal/js_shared/lib/synced/recipe_syntax.dart
similarity index 98%
copy from pkg/js_runtime/lib/shared/recipe_syntax.dart
copy to sdk/lib/_internal/js_shared/lib/synced/recipe_syntax.dart
index 7305491..3ccec60 100644
--- a/pkg/js_runtime/lib/shared/recipe_syntax.dart
+++ b/sdk/lib/_internal/js_shared/lib/synced/recipe_syntax.dart
@@ -6,8 +6,8 @@
 
 /// Constants and predicates used for encoding and decoding type recipes.
 ///
-/// This library is shared between the compiler and the runtime system.
-library dart2js._recipe_syntax;
+/// This library is synchronized between the compiler and the runtime system.
+library js_shared._recipe_syntax;
 
 abstract class Recipe {
   Recipe._();
diff --git a/sdk/lib/_internal/sdk_library_metadata/lib/libraries.dart b/sdk/lib/_internal/sdk_library_metadata/lib/libraries.dart
index 49845a2..5a357e5 100644
--- a/sdk/lib/_internal/sdk_library_metadata/lib/libraries.dart
+++ b/sdk/lib/_internal/sdk_library_metadata/lib/libraries.dart
@@ -147,7 +147,7 @@
       categories: "", documented: false, platforms: DART2JS_PLATFORM),
   "_late_helper": const LibraryInfo("_internal/js_runtime/lib/late_helper.dart",
       categories: "", documented: false, platforms: DART2JS_PLATFORM),
-  "_rti": const LibraryInfo("_internal/js_runtime/lib/rti.dart",
+  "_rti": const LibraryInfo("_internal/js_shared/lib/rti.dart",
       categories: "", documented: false, platforms: DART2JS_PLATFORM),
   "_dart2js_runtime_metrics": const LibraryInfo(
       "_internal/js_runtime/lib/dart2js_runtime_metrics.dart",
@@ -172,17 +172,17 @@
       documented: false,
       platforms: DART2JS_PLATFORM),
   "_js_embedded_names": const LibraryInfo(
-      "_internal/js_runtime/lib/shared/embedded_names.dart",
+      "_internal/js_runtime/lib/synced/embedded_names.dart",
       categories: "",
       documented: false,
       platforms: DART2JS_PLATFORM),
   "_async_await_error_codes": const LibraryInfo(
-      "_internal/js_runtime/lib/shared/async_await_error_codes.dart",
+      "_internal/js_runtime/lib/synced/async_await_error_codes.dart",
       categories: "",
       documented: false,
       platforms: DART2JS_PLATFORM),
   "_recipe_syntax": const LibraryInfo(
-      "_internal/js_runtime/lib/shared/recipe_syntax.dart",
+      "_internal/js_shared/lib/synced/recipe_syntax.dart",
       categories: "",
       documented: false,
       platforms: DART2JS_PLATFORM),
diff --git a/sdk/lib/libraries.json b/sdk/lib/libraries.json
index b72ab82..6f33d88 100644
--- a/sdk/lib/libraries.json
+++ b/sdk/lib/libraries.json
@@ -369,7 +369,7 @@
         "uri": "_internal/js_runtime/lib/late_helper.dart"
       },
       "_rti": {
-        "uri": "_internal/js_runtime/lib/rti.dart"
+        "uri": "_internal/js_shared/lib/rti.dart"
       },
       "_interceptors": {
         "uri": "_internal/js_runtime/lib/interceptors.dart"
@@ -384,13 +384,13 @@
         "uri": "_internal/js_runtime/lib/js_primitives.dart"
       },
       "_js_embedded_names": {
-        "uri": "_internal/js_runtime/lib/shared/embedded_names.dart"
+        "uri": "_internal/js_runtime/lib/synced/embedded_names.dart"
       },
       "_async_await_error_codes": {
-        "uri": "_internal/js_runtime/lib/shared/async_await_error_codes.dart"
+        "uri": "_internal/js_runtime/lib/synced/async_await_error_codes.dart"
       },
       "_recipe_syntax": {
-        "uri": "_internal/js_runtime/lib/shared/recipe_syntax.dart"
+        "uri": "_internal/js_shared/lib/synced/recipe_syntax.dart"
       }
     }
   },
diff --git a/sdk/lib/libraries.yaml b/sdk/lib/libraries.yaml
index 92231cb..ed11fa5 100644
--- a/sdk/lib/libraries.yaml
+++ b/sdk/lib/libraries.yaml
@@ -337,7 +337,7 @@
       uri: "_internal/js_runtime/lib/late_helper.dart"
 
     _rti:
-      uri: "_internal/js_runtime/lib/rti.dart"
+      uri: "_internal/js_shared/lib/rti.dart"
 
     _interceptors:
       uri: "_internal/js_runtime/lib/interceptors.dart"
@@ -352,13 +352,13 @@
       uri: "_internal/js_runtime/lib/js_primitives.dart"
 
     _js_embedded_names:
-      uri: "_internal/js_runtime/lib/shared/embedded_names.dart"
+      uri: "_internal/js_runtime/lib/synced/embedded_names.dart"
 
     _async_await_error_codes:
-      uri: "_internal/js_runtime/lib/shared/async_await_error_codes.dart"
+      uri: "_internal/js_runtime/lib/synced/async_await_error_codes.dart"
 
     _recipe_syntax:
-      uri: "_internal/js_runtime/lib/shared/recipe_syntax.dart"
+      uri: "_internal/js_shared/lib/synced/recipe_syntax.dart"
 
 dartdevc:
     libraries: