Files
sdk/pkg/dwds/tool/build.dart
Jessy Yameogo e1d687cb9e [dwds][dwds_test_common] Base copy of DWDS and DWDS_TEST_COMMON from webdev@e43744b235531f409ab5e2f1271178943569697a
This CL migrates the `dwds` and `dwds_test_common` packages into the Dart SDK
repository.

Key Changes:
- Migration: Moved source code and tests into `pkg/dwds` & `pkg/dwds_test_common`.
- Linting and path resolution were updated in https://github.com/dart-lang/webdev/pull/2797, https://github.com/dart-lang/webdev/pull/2798 & https://github.com/dart-lang/webdev/pull/2799 to support both environments (webdev and sdk).


Testing:
- All tests passing locally.
- CI try bots are green.

Design Doc: http://goto.google.com/migrating-webdev and http://goto.google.com/migrating-dwds

Fixes https://github.com/dart-lang/sdk/issues/62100
Fixes https://github.com/dart-lang/sdk/issues/62101
Fixes https://github.com/dart-lang/sdk/issues/62102
Fixes https://github.com/dart-lang/sdk/issues/62103

Cq-Include-Trybots: luci.dart.try:pkg-win-release-try,pkg-win-release-arm64-try,pkg-mac-release-try,pkg-mac-release-arm64-try,pkg-linux-release-try,pkg-linux-release-arm64-try,pkg-linux-debug-try
Change-Id: Icc2bf9a86efb79d04a67053962a4548fe6e894f7
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/494640
Reviewed-by: Nicholas Shahan <nshahan@google.com>
Reviewed-by: Nate Biggs <natebiggs@google.com>
Reviewed-by: Ivan Inozemtsev <iinozemtsev@google.com>
Reviewed-by: Ben Konyi <bkonyi@google.com>
Reviewed-by: Mark Zhou <markzipan@google.com>
2026-04-23 13:18:18 -07:00

88 lines
2.7 KiB
Dart

// Copyright (c) 2026, 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.
import 'dart:convert';
import 'dart:io';
import 'package:crypto/crypto.dart';
void main() async {
// 1. Extract the version from pubspec.yaml
final pubspec = File('pubspec.yaml').readAsStringSync();
final versionMatch = RegExp(r'version: (.*)').firstMatch(pubspec);
final version = versionMatch?.group(1);
if (version == null) {
throw Exception('Failed to find version in pubspec.yaml');
}
// 2. Generate lib/src/version.dart
final versionFile = File('lib/src/version.dart');
versionFile.writeAsStringSync('''
// Generated code. Do not modify.
const packageVersion = '$version';
''');
// 3. Compile the web client to JavaScript
print('Compiling client.js...');
final result = await Process.run(Platform.executable, [
'compile',
'js',
'-O1',
'--no-source-maps',
'-o',
'lib/src/injected/client.js',
'web/client.dart',
]);
if (result.exitCode != 0) {
print('Failed to compile client.js');
print(result.stdout);
print(result.stderr);
exit(result.exitCode);
}
print('Compilation successful');
// 4. Clean up the generated .deps file
final depsFile = File('lib/src/injected/client.js.deps');
if (depsFile.existsSync()) {
depsFile.deleteSync();
}
// 5. Generate injected_client_js.dart
print('Generating injected_client_js.dart...');
final clientDartString = File(
'web/client.dart',
).readAsStringSync().replaceAll('\r\n', '\n');
final clientDartHash = sha256
.convert(utf8.encode(clientDartString))
.toString();
final compiledJs = File('lib/src/injected/client.js').readAsStringSync();
final lines = compiledJs.replaceAll('\r\n', '\n').split('\n');
// Escape JS payload line-by-line using jsonEncode for multiline readability,
// ensure newlines are preserved identically, and manually escape the dollar
// sign ($) to avoid Dart interpolation.
final safeDartString = [
for (var i = 0; i < lines.length; i++)
jsonEncode(
i == lines.length - 1 ? lines[i] : '${lines[i]}\n',
).replaceAll(r'$', r'\$'),
].join('\n');
final injectedClientJsFile = File('lib/src/handlers/injected_client_js.dart');
injectedClientJsFile.writeAsStringSync('''
// Generated code. Do not modify.
// Emits the transpiled client.js directly into a statically embeddable string.
// dart format off
const injectedClientJs = $safeDartString;
const clientDartHash = '$clientDartHash';
''');
print('Successfully packed client.js into injected_client_js.dart');
}