Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
104 commits
Select commit Hold shift + click to select a range
277dfa0
fix: typo
Jul 4, 2025
014e5fe
feat: connect websocket, code injection
Jul 6, 2025
990ae11
feat: polyfill
Jul 8, 2025
a07e641
feat: devtool
Jul 8, 2025
79b4803
feat: import renderer
Jul 8, 2025
b6c214c
rollback
Jul 8, 2025
f205cd4
chore: delete
Jul 8, 2025
b086ecc
chore: clean
Jul 8, 2025
107a44a
feat: polyfill
Jul 10, 2025
ce03967
chore: naming
Jul 10, 2025
4a63999
chore: delete console.log
Jul 10, 2025
f32eb9d
feat: navigation
Jul 11, 2025
107622a
feat: renderer monkeypatch
Jul 11, 2025
78ab56c
chore: delete console
Jul 11, 2025
12dd958
refact: babelPlugin -> grantie.config.ts plugin
Jul 14, 2025
78245c6
refact: seperate babel
Jul 14, 2025
db00d5b
chore: directory
Jul 14, 2025
4a31c11
chore: name
Jul 14, 2025
e0fc868
chore: directory 2
Jul 14, 2025
5a633e6
chore: sync for main
Jul 14, 2025
b806a82
chore: delete empty function
Jul 14, 2025
4a934b3
refact: dependency, bundling
Jul 15, 2025
ed1a977
refact: dependencies
Jul 15, 2025
7cdd30e
fix: port -> this._port
Jul 16, 2025
4e6d604
feat: watchFolders
Jul 21, 2025
8ee4ec9
feat: reporter
Jul 22, 2025
d689fd7
chore: lint, type
Jul 23, 2025
4cb2a71
chore: eng
Jul 23, 2025
5d05f37
chore: sync
Jul 23, 2025
9cfa809
chore: vitest
Jul 23, 2025
b11cfc4
refact: path
Jul 23, 2025
c4a03dc
chore: externals
Jul 23, 2025
feb5072
refact: seperate responsibility
Jul 23, 2025
c2eac6b
chore: dependencies
Jul 23, 2025
d1fc434
chore: notice
Jul 23, 2025
7b6d723
refact: delete 0.73+
Jul 24, 2025
7238b75
feat: add jsx visitor (for __source)
Aug 21, 2025
a58889d
feat: visitor order
Aug 21, 2025
80ddd67
chore: yarn
Aug 21, 2025
af300b5
chore: changeset
Aug 26, 2025
0b115fb
chore: annotation
Aug 26, 2025
d08c8bd
chore: changeset
Aug 26, 2025
54e111d
feat(react-native): Add setIosSwipeGestureEnabled (#111)
heecheolman Aug 28, 2025
03833c6
chore: version packages (#112)
github-actions[bot] Aug 28, 2025
01a85ce
fix(babel-preset-granite): apply plugin-transform-flow-strip-types fi…
heecheolman Aug 30, 2025
15eb0e3
chore: version packages (#114)
github-actions[bot] Aug 30, 2025
936a62b
ci: add autofix.ci (#115)
manudeli Sep 1, 2025
3aa6dd9
feat: Add dist/ folder to .gitignore template for granite-app (#109)
guesung Sep 1, 2025
c2d49c3
fix(react-native): handle undefined initialScheme in useInitialRouteN…
guesung Sep 3, 2025
92af089
fix(react-native): avoid multiple app registrations without throwing …
leegeunhyeok Sep 3, 2025
0ad44f8
chore: version packages (#118)
github-actions[bot] Sep 15, 2025
0f8aa67
feat(mpack): configure InspectorProxy (#121)
leegeunhyeok Sep 17, 2025
d9f4699
chore: version packages (#122)
github-actions[bot] Sep 17, 2025
0fd577b
feat(react-native): add getInitialUrl (#123)
leegeunhyeok Sep 22, 2025
f427f8c
chore: version packages (#124)
github-actions[bot] Sep 22, 2025
91c49e6
update package.json files (#126)
leegeunhyeok Sep 25, 2025
a73a068
chore: version packages (#127)
github-actions[bot] Sep 26, 2025
c2c4ba1
fix(router): useParams used from is strict: true
gronxb Sep 29, 2025
5b14b1c
Revert "fix(router): useParams used from is strict: true"
gronxb Sep 29, 2025
ade042a
(docs): Docs/readme ko create (#133)
kss2002 Oct 10, 2025
2e031ae
fix(router): useParams used from is strict: true (#129)
gronxb Oct 13, 2025
fe33b05
ci: oidc (#130)
manudeli Oct 13, 2025
ad9c010
refactor(native): update exports for LottieView, FastImage, PagerView…
minsoo-web Oct 13, 2025
f136e13
refactor: update default polyfills (#131)
leegeunhyeok Oct 13, 2025
3a610c3
feat: add useIsInitialScreen export in index(for user's import) (#125)
jingjing2222 Oct 13, 2025
1a85c27
chore: version packages (#134)
github-actions[bot] Oct 13, 2025
c57c21f
ci: provenance (#136)
manudeli Oct 13, 2025
f08405f
chore: version packages (#137)
github-actions[bot] Oct 13, 2025
94f651d
Revert "chore: version packages (#137)" (#139)
leegeunhyeok Oct 13, 2025
dd39e5c
chore: add repository metadata to package.json files for deployment-m…
manudeli Oct 13, 2025
34a40c2
chore: version packages (#140)
github-actions[bot] Oct 13, 2025
dc8db9c
feat(router): add initialState in router type (for deeplink) (#141)
jingjing2222 Oct 14, 2025
0c9405f
feat: support additional metro config options from granite.config.ts …
jingjing2222 Oct 15, 2025
062507e
chore: version packages (#142)
github-actions[bot] Oct 21, 2025
f85d5f8
feat(docs): darkModeSwitchLabel Add Features 🚀 (#144)
kss2002 Oct 24, 2025
8ad17dd
(feat): brand site favicon.ico add 🔥 (#145)
kss2002 Oct 25, 2025
75a70f4
fix: release semaphore in finally clause (#149)
hoseungme Oct 28, 2025
f9d1fef
fix: escape `from` string when creating RegExp (#148)
hoseungme Oct 28, 2025
e27fc45
chore: version packages (#150)
github-actions[bot] Oct 28, 2025
5113b3b
feat: expose metro resolver options (#152)
leegeunhyeok Nov 5, 2025
104ef23
chore: off codecov (#157)
gronxb Nov 14, 2025
78d83ac
feat(router): screenOptions in Route (#156)
gronxb Nov 14, 2025
d23886a
feat: expose resolveRequest option (#154)
leegeunhyeok Nov 14, 2025
21bd344
feat(router): supports standard schema (#158)
gronxb Nov 17, 2025
9d8e763
fix: update `ScrollViewInertialBackground` default color to respect b…
SnowSuno Nov 17, 2025
85c517b
chore: version packages (#153)
github-actions[bot] Nov 17, 2025
cbf3503
chore: bump version up babel (#159)
leegeunhyeok Nov 24, 2025
6ce1d65
fix(react-native): VisibilityChangedProvider only Provider (#163)
gronxb Nov 25, 2025
83c041a
chore: version packages (#162)
github-actions[bot] Nov 25, 2025
9648bae
fix(router): type infer incorrect undefined (#165)
gronxb Nov 27, 2025
fa1aeb5
chore: version packages (#166)
github-actions[bot] Nov 27, 2025
389712e
chore: delete 0.72 renderer, internal
Dec 16, 2025
f764b36
feat: remain only 0.81
Dec 16, 2025
ce7738f
feat: import from radon ide (extension folder)
Dec 16, 2025
b5ca4e8
chore: lint
Dec 16, 2025
7cf2978
chore: type
Dec 16, 2025
9773397
chore: build success
Dec 16, 2025
0051a5e
Merge branch 'main' into feat/radon
Dec 16, 2025
449c84f
chore: delete unnecessary reporter
Dec 16, 2025
a0ae156
chore: path
Dec 16, 2025
270fdca
feat: build success
Dec 18, 2025
9eff4ef
chore: cleanup
Dec 18, 2025
440e5cc
feat: local is 1.14.0
Dec 18, 2025
7f917f0
[autofix.ci] apply automated fixes
autofix-ci[bot] Dec 18, 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
5 changes: 5 additions & 0 deletions .changeset/angry-ads-pick.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@granite-js/plugin-radon': patch
---

add radon plugin
1 change: 1 addition & 0 deletions eslint.config.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ module.exports = tseslint.config(
'.pnp.*',
'.yarn/',
'**/.granite/',
'packages/plugin-radon/src/lib/vendor/**/*',
],
},
eslint.configs.recommended,
Expand Down
4 changes: 2 additions & 2 deletions packages/create-granite-app/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,13 +29,13 @@
"test:no-parallel": "vitest --no-watch --coverage"
},
"devDependencies": {
"@types/kill-port": "^2.0.1",
"@types/kill-port": "2.0.1",
"@types/node": "^22.10.2",
"@types/yargs": "^17.0.33",
"@vitest/coverage-v8": "^4.0.12",
"es-toolkit": "^1.39.8",
"execa": "^9.5.2",
"kill-port": "^2.0.1",
"kill-port": "2.0.1",
"tsup": "^8.5.0",
"typescript": "5.8.3",
"vitest": "^4.0.12",
Expand Down
18 changes: 17 additions & 1 deletion packages/mpack/src/metro/enhancedResolver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ const resolvers = new Map();

interface CreateResolverOptions {
conditionNames?: string[];
extraNodeModules?: Record<string, string>;
monorepoRoot?: string;
}

export function createResolver(rootPath: string, options?: CreateResolverOptions) {
Expand All @@ -45,11 +47,12 @@ export function createResolver(rootPath: string, options?: CreateResolverOptions
conditionNames: options?.conditionNames ?? [...RESOLVER_EXPORTS_MAP_CONDITIONS, 'require', 'node', 'default'],
mainFiles: ['index'],
modules: ['node_modules', path.join(rootPath, 'src')],
alias: options?.extraNodeModules ?? {},
});

function resolve(context: MetroResolutionContext, request: string) {
for (const nativeModule of NATIVE_MODULES) {
if (request === nativeModule) {
if (request === nativeModule || request.startsWith(nativeModule + '/')) {
return {
type: 'sourceFile',
filePath: resolver({}, rootPath, request),
Expand Down Expand Up @@ -78,6 +81,19 @@ export function createResolver(rootPath: string, options?: CreateResolverOptions
request = `${request}/`;
}

const isPackageImport = !(request.startsWith('.') || request.startsWith('/'));
if (isPackageImport) {
try {
const resolveResult = resolver({}, rootPath, request);
return {
type: 'sourceFile',
filePath: resolveResult,
};
} catch {
// noop: If package resolution fails from rootPath, fall through to try resolving from originModulePath below
}
}

try {
const resolveResult = resolver({}, path.dirname(context.originModulePath), request);

Expand Down
11 changes: 9 additions & 2 deletions packages/mpack/src/metro/getMetroConfig.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ export async function getMetroConfig({ rootPath }: GetMetroConfig, additionalCon
additionalConfig?.resolver?.resolveRequest ??
createResolver(rootPath, {
conditionNames: additionalConfig?.resolver?.conditionNames,
extraNodeModules: additionalConfig?.resolver?.extraNodeModules,
});

return mergeConfig(defaultConfig, {
Expand All @@ -58,7 +59,8 @@ export async function getMetroConfig({ rootPath }: GetMetroConfig, additionalCon
inlineRequires: false,
},
}),
babelTransformerPath: require.resolve('metro-react-native-babel-transformer'),
babelTransformerPath:
additionalConfig?.transformer?.babelTransformerPath || require.resolve('metro-react-native-babel-transformer'),
asyncRequireModulePath: require.resolve('metro-runtime/src/modules/asyncRequire'),
unstable_collectDependenciesPath: resolveVendors('metro/src/ModuleGraph/worker/collectDependencies'),
unstable_allowRequireContext: true,
Expand Down Expand Up @@ -87,11 +89,15 @@ export async function getMetroConfig({ rootPath }: GetMetroConfig, additionalCon
resolverMainFields: additionalConfig?.resolver?.resolverMainFields ?? RESOLVER_MAIN_FIELDS,
},
serializer: {
getModulesRunBeforeMainModule: () => [resolveFromRoot('react-native/Libraries/Core/InitializeCore', rootPath)],
getModulesRunBeforeMainModule: () => [
resolveFromRoot('react-native/Libraries/Core/InitializeCore', rootPath),
...(additionalConfig?.serializer?.getModulesRunBeforeMainModule?.() ?? []),
],
getPolyfills: () => [
...require(path.join(reactNativePath, 'rn-get-polyfills'))(),
...(additionalConfig?.serializer?.getPolyfills?.() ?? []),
],
processModuleFilter: additionalConfig?.serializer?.processModuleFilter,
},
symbolicator: {
customizeFrame: (frame: { file: string }) => {
Expand All @@ -103,6 +109,7 @@ export async function getMetroConfig({ rootPath }: GetMetroConfig, additionalCon
port: DEV_SERVER_DEFAULT_PORT,
},
reporter: additionalConfig?.reporter,
cacheVersion: additionalConfig?.cacheVersion,
...(process.env.METRO_RESET_CACHE !== 'false' ? { resetCache: true } : {}),
});
}
Expand Down
1 change: 1 addition & 0 deletions packages/mpack/src/operations/serve.ts
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ export async function runServer({
const resolvedConfig = await resolveConfig(config);
const { middlewares = [], inspectorProxy, ...additionalMetroConfig } = resolvedConfig?.metro ?? {};
const baseConfig = await getMetroConfig({ rootPath: config.cwd }, additionalMetroConfig);

const metroConfig = mergeConfig(baseConfig, {
server: { port },
reporter,
Expand Down
13 changes: 12 additions & 1 deletion packages/plugin-core/src/types/MetroConfig.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import type Module from 'node:module';
import * as babel from '@babel/core';
import type { MetroConfig } from './vendors/metro';

Expand All @@ -6,8 +7,18 @@ export interface AdditionalMetroConfig extends MetroConfig {
* Partial support for some options only
*
* - `getPolyfills`
* - `getModulesRunBeforeMainModule`
* - `processModuleFilter`
*/
serializer?: MetroConfig['serializer'];
serializer?: MetroConfig['serializer'] & {
/**
* Filter function to determine which modules should be included in the bundle
* @param module - The module to filter
* @returns true if the module should be included, false otherwise
*/
processModuleFilter?: (module: Module) => boolean;
getModulesRunBeforeMainModule?: () => string[];
};
/**
* Partial support for some options only
*
Expand Down
1 change: 1 addition & 0 deletions packages/plugin-core/src/types/vendors/metro.ts
Original file line number Diff line number Diff line change
Expand Up @@ -224,4 +224,5 @@ export interface MetroConfig {
readonly reporter?: {
update: (event: ReportableEvent) => void;
};
readonly cacheVersion?: string;
}
202 changes: 202 additions & 0 deletions packages/plugin-radon/LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,202 @@

Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

1. Definitions.

"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.

"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.

"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.

"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.

"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.

"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.

"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).

"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.

"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."

"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.

2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.

3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.

4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:

(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and

(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and

(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and

(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.

You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.

5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.

6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.

7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.

8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.

9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work.

To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.

Copyright 2025 Viva Republica, Inc

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Loading
Loading