Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
88 commits
Select commit Hold shift + click to select a range
ad4511d
feat: Introduce `defineSdk` helper and types for structured SDK defin…
jwelmac Dec 10, 2025
f1be48e
build: use path package install for @global/runtime_types
jwelmac Dec 10, 2025
00d53d2
build: add node typing to fix tsup config lint errors
jwelmac Dec 10, 2025
dd52c17
feat: use defineSdk to wrap sdk for type generation
jwelmac Dec 10, 2025
8034b2c
feat: add script to generate .d.ts duing tsup build
jwelmac Dec 10, 2025
6a42334
feat: generate typed dart source file from dts
jwelmac Dec 10, 2025
38e75c6
feat: add additional init parameters
jwelmac Dec 10, 2025
62caee0
feat: update source file
jwelmac Dec 10, 2025
cdd3e7d
feat: add pretty_node example demonstrating use of generated dart file
jwelmac Dec 10, 2025
bdf163b
build: use path for globe_runtime dependency
jwelmac Dec 11, 2025
8104dea
build: update tsup and typescript dependencies
jwelmac Dec 11, 2025
dc07b04
refactor: move runtime types package to folder
jwelmac Dec 11, 2025
51b7380
feat: add dart source generator node package
jwelmac Dec 11, 2025
f771a49
chore: add globe dart source generator package
jwelmac Dec 11, 2025
4afa618
refactor: use dart source generator on tsup success
jwelmac Dec 11, 2025
7932c95
fix: intiArgs types for consistency
jwelmac Dec 11, 2025
0239f2d
feat(dart_source_generator): update lookups when parsing init args an…
jwelmac Dec 12, 2025
d952a8e
feat(dart_source_generator): update type mappers
jwelmac Dec 12, 2025
562248f
refactor(dart_source_generator): convert snake_case or kebab-case to …
jwelmac Dec 12, 2025
4741704
feat(dart_source_generator): add tests
jwelmac Dec 12, 2025
3781aec
chore(dart_source_generator): remove runtime import as prefix
jwelmac Dec 12, 2025
8f4476e
feat(dart_source_generator): update code to handle multiple files
jwelmac Dec 12, 2025
0a7d6f3
test(dart_source_generator): update tests for changes for multiple fi…
jwelmac Dec 12, 2025
1c161df
test(dart_source_generator): move tests to folder to match package st…
jwelmac Dec 12, 2025
5f71554
feat(runtime_types): enforce stricer typing for SDK
jwelmac Dec 12, 2025
3d48c9c
feat(dart_source_generator): display InitArgs found if not tuple
jwelmac Dec 12, 2025
9521ba8
build(dart_source_generator): setup for generate script
jwelmac Dec 12, 2025
8cc6d76
feat(dart_source_generator): add bin command to generate dart source
jwelmac Dec 12, 2025
9bef3f8
test(dart_source_generator): dart source generation
jwelmac Dec 12, 2025
1bca5ef
feat(runtime_types): improve sdk type generation
jwelmac Dec 12, 2025
1a27ab3
feat(pretty_node): remove tsup and add generate script
jwelmac Dec 12, 2025
f3b4ab0
feat(pretty_node): update generated dart file
jwelmac Dec 12, 2025
85d6503
chore(pretty_node): remove unused packages
jwelmac Dec 12, 2025
28b3bbe
test(dart_source_generator): clean up generate test comments
jwelmac Dec 13, 2025
285c1cb
fix(runtime): add callbackId type for send_error
jwelmac Dec 14, 2025
ed0b239
feat(dart_source_generator): add new types and wrappers
jwelmac Dec 14, 2025
4cebe60
feat(dart_source_generator): update type extraction and mapping
jwelmac Dec 14, 2025
20ddc97
feat(dart_source_generator): filter files and generate individually
jwelmac Dec 14, 2025
4a7bbe1
test(dart_source_generator): update tests
jwelmac Dec 14, 2025
555f34c
chore(pretty_node): update dependencies
jwelmac Dec 14, 2025
cd2aa78
feat(pretty_node): update example and output
jwelmac Dec 14, 2025
90bbf7b
feat(dart_source_generator): cleanup post generation and improve logging
jwelmac Dec 14, 2025
97c6a09
feat(dart_source_generator): add watch mode
jwelmac Dec 14, 2025
b22b27d
feat(dart_source_generator): process all sub-folders in input folder
jwelmac Dec 14, 2025
15ea60a
chore(dart_source_generator): add tslog dependency
jwelmac Dec 14, 2025
16d9fc2
feat(dart_source_generator): allow user to enable verbose logging
jwelmac Dec 14, 2025
d121aaa
chore(pretty_node): update dart_source_generator
jwelmac Dec 14, 2025
599ea1e
feat(dart_source_generator): update the usage
jwelmac Dec 14, 2025
f84219c
feat(pretty_node): add full example
jwelmac Dec 14, 2025
34d3b9c
feat(dart_source_generator): exit once complete if not watching
jwelmac Dec 14, 2025
3b564a5
docs(dart_source_generator): add README
jwelmac Dec 14, 2025
355cc05
feat(runtime_types): complete index.js to reproduce declaration file
jwelmac Dec 14, 2025
51d7f16
docs(runtime_types): add README
jwelmac Dec 14, 2025
d02c23b
docs(runtime_types): update README return typing
jwelmac Dec 14, 2025
38b7c4d
docs(runtime): Introduce `@globe/dart_source_generator` as the recomm…
jwelmac Dec 14, 2025
09b3e41
feat(dart_source_generator): Add generated file header comments to D…
jwelmac Dec 14, 2025
cfa8bb5
chore(pretty_node): update generated code
jwelmac Dec 14, 2025
333b206
docs(runtime): update recommended approach with project structure
jwelmac Dec 15, 2025
79a0963
docs(runtime): update example and doc links
jwelmac Dec 15, 2025
18cc67c
feat(examples): move full_example to own folder
jwelmac Dec 16, 2025
2a524c7
feat(dart_source_generator): ignore node_modules folder
jwelmac Dec 17, 2025
dda981d
feat(dart_source_generator): return boolean indicating if generation …
jwelmac Dec 17, 2025
83c273a
feat: add Apache License 2.0 to dart_source_generator and runtime_typ…
jwelmac Dec 19, 2025
151078c
feat(runtime_types): accomodate optional init function
jwelmac Dec 19, 2025
49ad136
feat(dart_source_generator): update tsdown
jwelmac Dec 19, 2025
11b8edf
feat(dart_source_generator): ensure relative paths are properly proce…
jwelmac Dec 21, 2025
88886c4
test(dart_source_generator): relative paths are properly processed
jwelmac Dec 21, 2025
3a76a19
feat(dart_source_generator): ensure directory exists before writing d…
jwelmac Dec 21, 2025
65a2aad
chore(dart_source_generator): add text-case dependency
jwelmac Dec 21, 2025
7476bbc
refactor(dart_source_generator): remove utils text transformers
jwelmac Dec 21, 2025
002f80e
refactor(dart_source_generator): use text-case text transformers
jwelmac Dec 21, 2025
826a3bc
feat(dart_source_generator): generate dart comments from JSDoc comments
jwelmac Dec 21, 2025
07e3ed0
test(dart_source_generator): update valid file content to a more comp…
jwelmac Dec 21, 2025
4bfc0af
fix(dart_source_generator): ensure nested dart file with snake_case name
jwelmac Dec 21, 2025
a88d4b2
feat(runtime_types): update SDK typing to enable init documentation e…
jwelmac Dec 21, 2025
8e5380b
feat(dart_source_generator): ensure init documentation extraction
jwelmac Dec 21, 2025
1c02297
test(dart_source_generator): use separate folders for generate tests
jwelmac Dec 21, 2025
002d95e
test(dart_source_generator): add test for documentation parsing
jwelmac Dec 21, 2025
6a115c6
docs(dart_source_generator): update README
jwelmac Dec 22, 2025
0ceb1c7
chore(full_example): update generated dart file
jwelmac Dec 22, 2025
337955b
chore(dart_source_generator): ensure explicit dependency version
jwelmac Dec 22, 2025
c2b7f72
refactor(dart_source_generator): introduce `maxLength` constant for d…
jwelmac Dec 22, 2025
96f5613
chore(dart_source_generator): cleanup ast parser
jwelmac Dec 22, 2025
6240904
refactor(dart_source_generator): adding paragraph in js doc comment c…
jwelmac Dec 22, 2025
378d15c
refactor(dart_source_generator): add backticks around return type
jwelmac Dec 22, 2025
4cddaae
test(dart_source_generator): clean up entire test folder after all ge…
jwelmac Dec 22, 2025
27a1328
chore(full_example): update generated source file
jwelmac Dec 22, 2025
d94a110
feat(examples): add example demonstrating preserving documentation fr…
jwelmac Dec 22, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions examples/full_example/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# full_example

This example showcases how to use the runtime with `Typescript` and `Node Modules`.

## Install the runtime

- `dart pub global activate globe_cli`

- `globe runtime install`

## Run the code

- `pnpm install`

- `pnpm run generate`

- `dart run lib/full_example.dart`
81 changes: 81 additions & 0 deletions examples/full_example/lib/full_example.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
import 'dart:async';
import 'dart:io';

import 'package:full_example/full_example_source.dart';

void main() async {
final fullExample = await FullExample.create(language: 'en', verbose: true);

final prettyBytes = await fullExample.makePrettyBytes(569943344333884);
print('Pretty Bytes: $prettyBytes');

final prettyMs = await fullExample.makePrettyMs(8003333);
print('Pretty MS: $prettyMs');

final sum = await fullExample.calculateSum(10, 20);
print('Sum: $sum');

final average = await fullExample.calculateAverage([10, 20, 30, 40, 50]);
print('Average: $average');

final isValid = await fullExample.isValid('a');
print('Is Valid: $isValid');

final bytes = await fullExample.generateBytes(10);
print('Bytes: $bytes');

final metadata = await fullExample.getMetadata('1');
print('Metadata: $metadata');

final items = await fullExample.getItems(10);
print('Items: $items');

final uniqueValues =
await fullExample.getUniqueValues([1, 2, 2, 3, 3, 3, 4, 5, 4]);
print('Unique Values: $uniqueValues');

final messages = await fullExample.streamMessages(10);
final completer = Completer<void>();
messages.listen((message) {
print('Message: $message');
}, onDone: completer.complete);

await completer.future;

final integers = await fullExample.streamIntegers(10);
final integerCompleter = Completer<void>();
integers.listen((integer) {
print('Integer: $integer');
}, onDone: integerCompleter.complete);

await integerCompleter.future;

final randomNumbers = await fullExample.streamRandomNumbers(10);
final randomNumbersCompleter = Completer<void>();
randomNumbers.listen((randomNumber) {
print('Random Number: $randomNumber');
}, onDone: randomNumbersCompleter.complete);

await randomNumbersCompleter.future;

final updates = await fullExample.streamUpdates(10);
final updatesCompleter = Completer<void>();
updates.listen((update) {
print('Update: $update');
}, onDone: updatesCompleter.complete);

await updatesCompleter.future;

final batches = await fullExample.streamBatches(10, 10);
final batchesCompleter = Completer<void>();
batches.listen((batch) {
print('Batch: $batch');
}, onDone: batchesCompleter.complete);

await batchesCompleter.future;

print('Done');
fullExample.dispose();

exit(0);
}
231 changes: 231 additions & 0 deletions examples/full_example/lib/full_example.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,231 @@
import pretty_bytes from "pretty-bytes";
import pretty_ms from "pretty-ms";
import {
defineSdk,
returnString,
returnInt,
returnDouble,
returnBoolean,
returnUint8Array,
returnMap,
returnList,
returnSet,
streamString,
streamInt,
streamNumber,
streamMap,
streamList,
} from "@globe/runtime_types";

type Language = "en" | "fr" | "es";

type ModuleState = {
language: Language;
verbose: boolean;
};

// ======================================================
// Single Value Functions - All Supported Types
// ======================================================

// String return (Dart: String, JS: string)
const make_pretty_bytes = returnString(
(state: ModuleState, value: number, callbackId: number) => {
const str = pretty_bytes(value, { locale: state.language });
Dart.send_value(callbackId, new TextEncoder().encode(str));
}
);

// String return (Dart: String, JS: string)
const make_pretty_ms = returnString(
(state: ModuleState, value: number, callbackId: number) => {
const str = pretty_ms(value, { verbose: state.verbose });
Dart.send_value(callbackId, new TextEncoder().encode(str));
}
);

// Int return (Dart: int, JS: number)
const calculate_sum = returnInt(
(state: ModuleState, a: number, b: number, callbackId: number) => {
const result = Math.floor(a + b);
Dart.send_value(callbackId, new TextEncoder().encode(result.toString()));
}
);

// Double return (Dart: double, JS: number)
const calculate_average = returnDouble(
(state: ModuleState, values: number[], callbackId: number) => {
const sum = values.reduce((acc, val) => acc + val, 0);
const avg = sum / values.length;
Dart.send_value(callbackId, new TextEncoder().encode(avg.toString()));
}
);

// Boolean return (Dart: bool, JS: boolean)
const is_valid = returnBoolean(
(state: ModuleState, value: string, callbackId: number) => {
const isValid = value.length > 0;
Dart.send_value(callbackId, JsonPayload.encode(isValid)!);
}
);

// Uint8Array return (Dart: List<int>, JS: Uint8Array)
const generate_bytes = returnUint8Array(
(state: ModuleState, length: number, callbackId: number) => {
const bytes = new Uint8Array(length);
for (let i = 0; i < length; i++) {
bytes[i] = Math.floor(Math.random() * 256);
}
Dart.send_value(callbackId, bytes);
}
);

// Map return (Dart: Map<dynamic, dynamic>, JS: object)
const get_metadata = returnMap(
(state: ModuleState, id: string, callbackId: number) => {
const metadata = {
id,
language: state.language,
timestamp: Date.now(),
nested: {
key: "value",
},
};
const encoded = JsonPayload.encode(metadata);
if (encoded) {
Dart.send_value(callbackId, encoded);
}
}
);

// List return (Dart: List<dynamic>, JS: object)
const get_items = returnList(
(state: ModuleState, count: number, callbackId: number) => {
const items = Array.from({ length: count }, (_, i) => ({
id: i,
name: `Item ${i}`,
}));
const encoded = JsonPayload.encode(items);
if (encoded) {
Dart.send_value(callbackId, encoded);
}
}
);

// Set return (Dart: Set<dynamic>, JS: object)
const get_unique_values = returnSet(
(state: ModuleState, values: number[], callbackId: number) => {
const uniqueValues = [...new Set(values)];
const encoded = JsonPayload.encode(uniqueValues);
if (encoded) {
Dart.send_value(callbackId, encoded);
}
}
);

// ======================================================
// Streaming Functions - All Supported Types
// ======================================================

// Stream<String> (Dart: Stream<String>, JS: string)
const stream_messages = streamString(
(state: ModuleState, count: number, callbackId: number) => {
for (let i = 0; i < count; i++) {
const message = `Message ${i + 1} in ${state.language}`;
Dart.stream_value(callbackId, new TextEncoder().encode(message));
}
Dart.stream_value_end(callbackId);
}
);

// Stream<int> (Dart: Stream<int>, JS: number)
const stream_integers = streamInt(
(state: ModuleState, max: number, callbackId: number) => {
for (let i = 0; i < max; i++) {
Dart.stream_value(callbackId, new TextEncoder().encode(i.toString()));
}
Dart.stream_value_end(callbackId);
}
);

// Stream<num> (Dart: Stream<num>, JS: number)
const stream_random_numbers = streamNumber(
(state: ModuleState, count: number, callbackId: number) => {
for (let i = 0; i < count; i++) {
const num = Math.random() * 1000;
Dart.stream_value(callbackId, new TextEncoder().encode(num.toString()));
}
Dart.stream_value_end(callbackId);
}
);

// Stream<Map<dynamic, dynamic>> (Dart: Stream<Map<dynamic, dynamic>>, JS: object)
const stream_updates = streamMap(
async (state: ModuleState, count: number, callbackId: number) => {
for (let i = 0; i < count; i++) {
const update = {
index: i,
timestamp: Date.now(),
language: state.language,
};
// Pause for 100ms
await new Promise((resolve) => setTimeout(resolve, 100));
const encoded = JsonPayload.encode(update);
if (encoded) {
Dart.stream_value(callbackId, encoded);
}
}
Dart.stream_value_end(callbackId);
}
);

// Stream<List<dynamic>> (Dart: Stream<List<dynamic>>, JS: object)
const stream_batches = streamList(
(
state: ModuleState,
batchCount: number,
batchSize: number,
callbackId: number
) => {
for (let i = 0; i < batchCount; i++) {
const batch = Array.from(
{ length: batchSize },
(_, j) => i * batchSize + j
);
const encoded = JsonPayload.encode(batch);
if (encoded) {
Dart.stream_value(callbackId, encoded);
}
}
Dart.stream_value_end(callbackId);
}
);

// ======================================================
// SDK Definition
// ======================================================

export default defineSdk({
init(language: Language = "en", verbose: boolean = false): ModuleState {
return { language, verbose };
},
functions: {
// Single value functions
make_pretty_bytes,
make_pretty_ms,
calculate_sum,
calculate_average,
is_valid,
generate_bytes,
get_metadata,
get_items,
get_unique_values,

// Streaming functions
stream_messages,
stream_integers,
stream_random_numbers,
stream_updates,
stream_batches,
},
});
Loading