@agimon-ai/po-build 0.0.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -0
- package/README.md +96 -0
- package/dist/_virtual/_rolldown/runtime.cjs +1 -0
- package/dist/browserFile.cjs +1 -0
- package/dist/browserFile.d.mts +2 -0
- package/dist/browserFile.mjs +1 -0
- package/dist/constants/contributions.cjs +2 -0
- package/dist/constants/contributions.cjs.map +1 -0
- package/dist/constants/contributions.mjs +2 -0
- package/dist/constants/contributions.mjs.map +1 -0
- package/dist/constants/layout.cjs +2 -0
- package/dist/constants/layout.cjs.map +1 -0
- package/dist/constants/layout.d.mts +56 -0
- package/dist/constants/layout.d.mts.map +1 -0
- package/dist/constants/layout.mjs +2 -0
- package/dist/constants/layout.mjs.map +1 -0
- package/dist/index.cjs +1 -0
- package/dist/index.d.mts +17 -0
- package/dist/index.mjs +1 -0
- package/dist/services/browserFile/index.cjs +2 -0
- package/dist/services/browserFile/index.cjs.map +1 -0
- package/dist/services/browserFile/index.d.mts +22 -0
- package/dist/services/browserFile/index.d.mts.map +1 -0
- package/dist/services/browserFile/index.mjs +2 -0
- package/dist/services/browserFile/index.mjs.map +1 -0
- package/dist/services/filename/index.cjs +2 -0
- package/dist/services/filename/index.cjs.map +1 -0
- package/dist/services/filename/index.d.mts +29 -0
- package/dist/services/filename/index.d.mts.map +1 -0
- package/dist/services/filename/index.mjs +2 -0
- package/dist/services/filename/index.mjs.map +1 -0
- package/dist/services/generate/index.cjs +3 -0
- package/dist/services/generate/index.cjs.map +1 -0
- package/dist/services/generate/index.d.mts +15 -0
- package/dist/services/generate/index.d.mts.map +1 -0
- package/dist/services/generate/index.mjs +3 -0
- package/dist/services/generate/index.mjs.map +1 -0
- package/dist/services/generate/type.d.mts +28 -0
- package/dist/services/generate/type.d.mts.map +1 -0
- package/dist/services/identity/index.cjs +2 -0
- package/dist/services/identity/index.cjs.map +1 -0
- package/dist/services/identity/index.mjs +2 -0
- package/dist/services/identity/index.mjs.map +1 -0
- package/dist/services/renderClient/index.cjs +3 -0
- package/dist/services/renderClient/index.cjs.map +1 -0
- package/dist/services/renderClient/index.mjs +3 -0
- package/dist/services/renderClient/index.mjs.map +1 -0
- package/dist/services/renderEntry/index.cjs +7 -0
- package/dist/services/renderEntry/index.cjs.map +1 -0
- package/dist/services/renderEntry/index.d.mts +18 -0
- package/dist/services/renderEntry/index.d.mts.map +1 -0
- package/dist/services/renderEntry/index.mjs +7 -0
- package/dist/services/renderEntry/index.mjs.map +1 -0
- package/dist/services/renderEntry/type.d.mts +16 -0
- package/dist/services/renderEntry/type.d.mts.map +1 -0
- package/dist/services/renderMcpWidgets/index.cjs +3 -0
- package/dist/services/renderMcpWidgets/index.cjs.map +1 -0
- package/dist/services/renderMcpWidgets/index.mjs +3 -0
- package/dist/services/renderMcpWidgets/index.mjs.map +1 -0
- package/dist/services/resolveTarget/index.cjs +2 -0
- package/dist/services/resolveTarget/index.cjs.map +1 -0
- package/dist/services/resolveTarget/index.d.mts +18 -0
- package/dist/services/resolveTarget/index.d.mts.map +1 -0
- package/dist/services/resolveTarget/index.mjs +2 -0
- package/dist/services/resolveTarget/index.mjs.map +1 -0
- package/dist/services/resolveTarget/type.d.mts +30 -0
- package/dist/services/resolveTarget/type.d.mts.map +1 -0
- package/dist/services/scan/index.cjs +2 -0
- package/dist/services/scan/index.cjs.map +1 -0
- package/dist/services/scan/index.d.mts +8 -0
- package/dist/services/scan/index.d.mts.map +1 -0
- package/dist/services/scan/index.mjs +2 -0
- package/dist/services/scan/index.mjs.map +1 -0
- package/dist/services/scan/type.d.mts +25 -0
- package/dist/services/scan/type.d.mts.map +1 -0
- package/dist/services/segments/index.cjs +2 -0
- package/dist/services/segments/index.cjs.map +1 -0
- package/dist/services/segments/index.d.mts +26 -0
- package/dist/services/segments/index.d.mts.map +1 -0
- package/dist/services/segments/index.mjs +2 -0
- package/dist/services/segments/index.mjs.map +1 -0
- package/dist/services/syncManifest/index.cjs +2 -0
- package/dist/services/syncManifest/index.cjs.map +1 -0
- package/dist/services/syncManifest/index.d.mts +21 -0
- package/dist/services/syncManifest/index.d.mts.map +1 -0
- package/dist/services/syncManifest/index.mjs +2 -0
- package/dist/services/syncManifest/index.mjs.map +1 -0
- package/dist/services/syncManifest/type.d.mts +15 -0
- package/dist/services/syncManifest/type.d.mts.map +1 -0
- package/dist/services/tsdownPreset/index.cjs +2 -0
- package/dist/services/tsdownPreset/index.cjs.map +1 -0
- package/dist/services/tsdownPreset/index.d.mts +89 -0
- package/dist/services/tsdownPreset/index.d.mts.map +1 -0
- package/dist/services/tsdownPreset/index.mjs +2 -0
- package/dist/services/tsdownPreset/index.mjs.map +1 -0
- package/dist/services/unistylesBabel/index.cjs +2 -0
- package/dist/services/unistylesBabel/index.cjs.map +1 -0
- package/dist/services/unistylesBabel/index.d.mts +17 -0
- package/dist/services/unistylesBabel/index.d.mts.map +1 -0
- package/dist/services/unistylesBabel/index.mjs +2 -0
- package/dist/services/unistylesBabel/index.mjs.map +1 -0
- package/dist/services/unistylesBabel/type.d.mts +13 -0
- package/dist/services/unistylesBabel/type.d.mts.map +1 -0
- package/dist/services/writeGenerated/index.cjs +2 -0
- package/dist/services/writeGenerated/index.cjs.map +1 -0
- package/dist/services/writeGenerated/index.d.mts +23 -0
- package/dist/services/writeGenerated/index.d.mts.map +1 -0
- package/dist/services/writeGenerated/index.mjs +2 -0
- package/dist/services/writeGenerated/index.mjs.map +1 -0
- package/dist/tsdown.cjs +1 -0
- package/dist/tsdown.d.mts +3 -0
- package/dist/tsdown.mjs +1 -0
- package/dist/types/extensionGraph.d.mts +75 -0
- package/dist/types/extensionGraph.d.mts.map +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["createRequire","path","fs","require_runtime","node_fs","node_path","node_module","BABEL_CORE","UNISTYLES_PLUGIN","TRANSFORMED_EXTENSIONS","loadBabel","requireFromPackage","packageDir","babel","loaded","plugin","error","reason","fileOf","id","queryAt","isAuthoredSource","file","relative","sourceDir","unistylesBabel","root","code","result"],"sources":["../../../src/services/unistylesBabel/index.ts"],"sourcesContent":["import fs from 'node:fs';\nimport { createRequire } from 'node:module';\nimport path from 'node:path';\n\nimport type { BabelCore, TransformResult, UnistylesBabelPlugin } from './type';\n\n/** The authored source root, package-relative. Unistyles resolves it against Babel's root. */\nconst SOURCE_ROOT = 'src';\nconst BABEL_CORE = '@babel/core';\nconst UNISTYLES_PLUGIN = 'react-native-unistyles/plugin';\n/** Both specifiers the Unistyles rewrite reacts to contain this, so a file without it has nothing to rewrite. */\nconst REACT_NATIVE_MARKER = 'react-native';\nconst TRANSFORMED_EXTENSIONS: readonly string[] = ['.ts', '.tsx'];\n\ninterface LoadedBabel {\n readonly babel: BabelCore;\n readonly plugin: unknown;\n}\n\n/**\n * Loads Babel and the Unistyles plugin from the extension package, not from po-build.\n *\n * po-build stays free of both: only a package that ships `.native` files pays\n * for them, and the copy it resolves is the one its own lockfile pinned.\n */\nfunction loadBabel(packageDir: string): LoadedBabel {\n const requireFromPackage = createRequire(path.join(packageDir, 'package.json'));\n try {\n const babel = requireFromPackage(BABEL_CORE) as BabelCore;\n const loaded = requireFromPackage(UNISTYLES_PLUGIN) as unknown;\n const plugin =\n typeof loaded === 'function' ? loaded : (loaded as { default?: unknown } | null | undefined)?.default;\n if (typeof plugin !== 'function') throw new Error(`${UNISTYLES_PLUGIN} does not export a Babel plugin`);\n return { babel, plugin };\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n throw new Error(\n `[po-build] The native build needs ${BABEL_CORE} and react-native-unistyles, resolved from ${packageDir}. ` +\n `Add both to that package's devDependencies. ${reason}`,\n );\n }\n}\n\n/** The file a module id names, or undefined for a virtual module. */\nfunction fileOf(id: string): string | undefined {\n if (id.startsWith('\\0')) return undefined;\n const queryAt = id.indexOf('?');\n return queryAt < 0 ? id : id.slice(0, queryAt);\n}\n\n/** Whether a file is authored TypeScript under the package's own `src`. */\nfunction isAuthoredSource(file: string, sourceDir: string): boolean {\n if (file.endsWith('.d.ts') || !TRANSFORMED_EXTENSIONS.includes(path.extname(file))) return false;\n const relative = path.relative(sourceDir, file);\n return relative !== '' && !relative.startsWith('..') && !path.isAbsolute(relative);\n}\n\n/**\n * Runs the Unistyles Babel rewrite over a package's native source before rolldown bundles it.\n *\n * Unistyles finds `StyleSheet.create` and swaps React Native components for its\n * own at build time, which is what lets a theme change restyle without a React\n * render. Metro would run this for an app; a composition is bundled by\n * rolldown instead, so the rewrite runs here, in the transform hook, while the\n * source is still ESM.\n *\n * Only `.ts` and `.tsx` files under `<packageDir>/src` are touched. The TypeScript and JSX\n * syntax is parsed and printed back unchanged, and rolldown strips it after.\n */\nexport function unistylesBabel(packageDir: string): UnistylesBabelPlugin {\n // Real paths on both sides: rolldown hands the transform resolved ids, and\n // Unistyles matches the filename against `<root>/src` as a plain substring.\n const root = fs.realpathSync(packageDir);\n const sourceDir = path.join(root, SOURCE_ROOT);\n let loaded: LoadedBabel | undefined;\n\n return {\n name: 'po-unistyles-babel',\n async transform(code: string, id: string): Promise<TransformResult | undefined> {\n const file = fileOf(id);\n if (file === undefined || !isAuthoredSource(file, sourceDir) || !code.includes(REACT_NATIVE_MARKER))\n return undefined;\n\n loaded ??= loadBabel(root);\n const result = await loaded.babel.transformAsync(code, {\n filename: file,\n cwd: root,\n root,\n babelrc: false,\n configFile: false,\n sourceMaps: true,\n parserOpts: { plugins: ['typescript', 'jsx'] },\n plugins: [[loaded.plugin, { root: SOURCE_ROOT }]],\n });\n if (typeof result?.code !== 'string') return undefined;\n return { code: result.code, map: result.map ?? null };\n },\n };\n}\n"],"mappings":"2KAOA,MACMO,EAAa,cACbC,EAAmB,gCAGnBC,EAA4C,CAAC,MAAO,MAAM,EAahE,SAASC,EAAU,EAAiC,CAClD,IAAMC,GAAA,EAAqBX,EAAAA,cAAAA,CAAcC,EAAAA,QAAK,KAAKW,EAAY,cAAc,CAAC,EAC9E,GAAI,CACF,IAAMC,EAAQF,EAAmBJ,CAAU,EACrCO,EAASH,EAAmBH,CAAgB,EAC5CO,EACJ,OAAOD,GAAW,WAAaA,EAAUA,GAAqD,QAChG,GAAI,OAAOC,GAAW,WAAY,MAAU,MAAM,GAAGP,EAAiB,gCAAgC,EACtG,MAAO,CAAE,QAAO,QAAO,CACzB,OAASQ,EAAO,CACd,IAAMC,EAASD,aAAiB,MAAQA,EAAM,QAAU,OAAOA,CAAK,EACpE,MAAU,MACR,qCAAqCT,EAAW,6CAA6CK,EAAW,gDACvDK,GACnD,CACF,CACF,CAGA,SAASC,EAAO,EAAgC,CAC9C,GAAIC,EAAG,WAAW,IAAI,EAAG,OACzB,IAAMC,EAAUD,EAAG,QAAQ,GAAG,EAC9B,OAAOC,EAAU,EAAID,EAAKA,EAAG,MAAM,EAAGC,CAAO,CAC/C,CAGA,SAASC,EAAiB,EAAc,EAA4B,CAClE,GAAIC,EAAK,SAAS,OAAO,GAAK,CAACb,EAAuB,SAASR,EAAAA,QAAK,QAAQqB,CAAI,CAAC,EAAG,MAAO,GAC3F,IAAMC,EAAWtB,EAAAA,QAAK,SAASuB,EAAWF,CAAI,EAC9C,OAAOC,IAAa,IAAM,CAACA,EAAS,WAAW,IAAI,GAAK,CAACtB,EAAAA,QAAK,WAAWsB,CAAQ,CACnF,CAcA,SAAgBE,EAAe,EAA0C,CAGvE,IAAMC,EAAOxB,EAAAA,QAAG,aAAaU,CAAU,EACjCY,EAAYvB,EAAAA,QAAK,KAAKyB,EAAM,KAAW,EACzCZ,EAEJ,MAAO,CACL,KAAM,qBACN,MAAM,UAAU,EAAc,EAAkD,CAC9E,IAAMQ,EAAOJ,EAAOC,CAAE,EACtB,GAAIG,IAAS,IAAA,IAAa,CAACD,EAAiBC,EAAME,CAAS,GAAK,CAACG,EAAK,SAAS,cAAmB,EAChG,OAEF,IAAWjB,EAAUgB,CAAI,EACzB,IAAME,EAAS,MAAMd,EAAO,MAAM,eAAea,EAAM,CACrD,SAAUL,EACV,IAAKI,EACL,OACA,QAAS,GACT,WAAY,GACZ,WAAY,GACZ,WAAY,CAAE,QAAS,CAAC,aAAc,KAAK,CAAE,EAC7C,QAAS,CAAC,CAACZ,EAAO,OAAQ,CAAE,KAAM,KAAY,CAAC,CAAC,CAClD,CAAC,EACD,GAAI,OAAOc,GAAQ,MAAS,SAC5B,MAAO,CAAE,KAAMA,EAAO,KAAM,IAAKA,EAAO,KAAO,IAAK,CACtD,CACF,CACF"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { UnistylesBabelPlugin } from "./type.mjs";
|
|
2
|
+
//#region src/services/unistylesBabel/index.d.ts
|
|
3
|
+
/**
|
|
4
|
+
* Runs the Unistyles Babel rewrite over a package's native source before rolldown bundles it.
|
|
5
|
+
*
|
|
6
|
+
* Unistyles finds `StyleSheet.create` and swaps React Native components for its
|
|
7
|
+
* own at build time, which is what lets a theme change restyle without a React
|
|
8
|
+
* render. Metro would run this for an app; a composition is bundled by
|
|
9
|
+
* rolldown instead, so the rewrite runs here, in the transform hook, while the
|
|
10
|
+
* source is still ESM.
|
|
11
|
+
*
|
|
12
|
+
* Only `.ts` and `.tsx` files under `<packageDir>/src` are touched. The TypeScript and JSX
|
|
13
|
+
* syntax is parsed and printed back unchanged, and rolldown strips it after.
|
|
14
|
+
*/
|
|
15
|
+
export declare function unistylesBabel(packageDir: string): UnistylesBabelPlugin;
|
|
16
|
+
//#endregion
|
|
17
|
+
//# sourceMappingURL=index.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../../../src/services/unistylesBabel/index.ts"],"mappings":";;;;;;;;;;;;;;wBAqEgB,eAAe,qBAAqB"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{createRequire as e}from"node:module";import t from"node:fs";import n from"node:path";const r=`@babel/core`,i=`react-native-unistyles/plugin`,a=[`.ts`,`.tsx`];function o(t){let a=e(n.join(t,`package.json`));try{let e=a(r),t=a(i),n=typeof t==`function`?t:t?.default;if(typeof n!=`function`)throw Error(`${i} does not export a Babel plugin`);return{babel:e,plugin:n}}catch(e){let n=e instanceof Error?e.message:String(e);throw Error(`[po-build] The native build needs ${r} and react-native-unistyles, resolved from ${t}. Add both to that package's devDependencies. ${n}`)}}function s(e){if(e.startsWith(`\0`))return;let t=e.indexOf(`?`);return t<0?e:e.slice(0,t)}function c(e,t){if(e.endsWith(`.d.ts`)||!a.includes(n.extname(e)))return!1;let r=n.relative(t,e);return r!==``&&!r.startsWith(`..`)&&!n.isAbsolute(r)}function l(e){let r=t.realpathSync(e),i=n.join(r,`src`),a;return{name:`po-unistyles-babel`,async transform(e,t){let n=s(t);if(n===void 0||!c(n,i)||!e.includes(`react-native`))return;a??=o(r);let l=await a.babel.transformAsync(e,{filename:n,cwd:r,root:r,babelrc:!1,configFile:!1,sourceMaps:!0,parserOpts:{plugins:[`typescript`,`jsx`]},plugins:[[a.plugin,{root:`src`}]]});if(typeof l?.code==`string`)return{code:l.code,map:l.map??null}}}}export{l as unistylesBabel};
|
|
2
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["fs","path","BABEL_CORE","UNISTYLES_PLUGIN","TRANSFORMED_EXTENSIONS","loadBabel","requireFromPackage","createRequire","packageDir","babel","loaded","plugin","error","reason","fileOf","id","queryAt","isAuthoredSource","file","relative","sourceDir","unistylesBabel","root","code","result"],"sources":["../../../src/services/unistylesBabel/index.ts"],"sourcesContent":["import fs from 'node:fs';\nimport { createRequire } from 'node:module';\nimport path from 'node:path';\n\nimport type { BabelCore, TransformResult, UnistylesBabelPlugin } from './type';\n\n/** The authored source root, package-relative. Unistyles resolves it against Babel's root. */\nconst SOURCE_ROOT = 'src';\nconst BABEL_CORE = '@babel/core';\nconst UNISTYLES_PLUGIN = 'react-native-unistyles/plugin';\n/** Both specifiers the Unistyles rewrite reacts to contain this, so a file without it has nothing to rewrite. */\nconst REACT_NATIVE_MARKER = 'react-native';\nconst TRANSFORMED_EXTENSIONS: readonly string[] = ['.ts', '.tsx'];\n\ninterface LoadedBabel {\n readonly babel: BabelCore;\n readonly plugin: unknown;\n}\n\n/**\n * Loads Babel and the Unistyles plugin from the extension package, not from po-build.\n *\n * po-build stays free of both: only a package that ships `.native` files pays\n * for them, and the copy it resolves is the one its own lockfile pinned.\n */\nfunction loadBabel(packageDir: string): LoadedBabel {\n const requireFromPackage = createRequire(path.join(packageDir, 'package.json'));\n try {\n const babel = requireFromPackage(BABEL_CORE) as BabelCore;\n const loaded = requireFromPackage(UNISTYLES_PLUGIN) as unknown;\n const plugin =\n typeof loaded === 'function' ? loaded : (loaded as { default?: unknown } | null | undefined)?.default;\n if (typeof plugin !== 'function') throw new Error(`${UNISTYLES_PLUGIN} does not export a Babel plugin`);\n return { babel, plugin };\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n throw new Error(\n `[po-build] The native build needs ${BABEL_CORE} and react-native-unistyles, resolved from ${packageDir}. ` +\n `Add both to that package's devDependencies. ${reason}`,\n );\n }\n}\n\n/** The file a module id names, or undefined for a virtual module. */\nfunction fileOf(id: string): string | undefined {\n if (id.startsWith('\\0')) return undefined;\n const queryAt = id.indexOf('?');\n return queryAt < 0 ? id : id.slice(0, queryAt);\n}\n\n/** Whether a file is authored TypeScript under the package's own `src`. */\nfunction isAuthoredSource(file: string, sourceDir: string): boolean {\n if (file.endsWith('.d.ts') || !TRANSFORMED_EXTENSIONS.includes(path.extname(file))) return false;\n const relative = path.relative(sourceDir, file);\n return relative !== '' && !relative.startsWith('..') && !path.isAbsolute(relative);\n}\n\n/**\n * Runs the Unistyles Babel rewrite over a package's native source before rolldown bundles it.\n *\n * Unistyles finds `StyleSheet.create` and swaps React Native components for its\n * own at build time, which is what lets a theme change restyle without a React\n * render. Metro would run this for an app; a composition is bundled by\n * rolldown instead, so the rewrite runs here, in the transform hook, while the\n * source is still ESM.\n *\n * Only `.ts` and `.tsx` files under `<packageDir>/src` are touched. The TypeScript and JSX\n * syntax is parsed and printed back unchanged, and rolldown strips it after.\n */\nexport function unistylesBabel(packageDir: string): UnistylesBabelPlugin {\n // Real paths on both sides: rolldown hands the transform resolved ids, and\n // Unistyles matches the filename against `<root>/src` as a plain substring.\n const root = fs.realpathSync(packageDir);\n const sourceDir = path.join(root, SOURCE_ROOT);\n let loaded: LoadedBabel | undefined;\n\n return {\n name: 'po-unistyles-babel',\n async transform(code: string, id: string): Promise<TransformResult | undefined> {\n const file = fileOf(id);\n if (file === undefined || !isAuthoredSource(file, sourceDir) || !code.includes(REACT_NATIVE_MARKER))\n return undefined;\n\n loaded ??= loadBabel(root);\n const result = await loaded.babel.transformAsync(code, {\n filename: file,\n cwd: root,\n root,\n babelrc: false,\n configFile: false,\n sourceMaps: true,\n parserOpts: { plugins: ['typescript', 'jsx'] },\n plugins: [[loaded.plugin, { root: SOURCE_ROOT }]],\n });\n if (typeof result?.code !== 'string') return undefined;\n return { code: result.code, map: result.map ?? null };\n },\n };\n}\n"],"mappings":"4FAOA,MACME,EAAa,cACbC,EAAmB,gCAGnBC,EAA4C,CAAC,MAAO,MAAM,EAahE,SAASC,EAAU,EAAiC,CAClD,IAAMC,EAAqBC,EAAcN,EAAK,KAAKO,EAAY,cAAc,CAAC,EAC9E,GAAI,CACF,IAAMC,EAAQH,EAAmBJ,CAAU,EACrCQ,EAASJ,EAAmBH,CAAgB,EAC5CQ,EACJ,OAAOD,GAAW,WAAaA,EAAUA,GAAqD,QAChG,GAAI,OAAOC,GAAW,WAAY,MAAU,MAAM,GAAGR,EAAiB,gCAAgC,EACtG,MAAO,CAAE,QAAO,QAAO,CACzB,OAASS,EAAO,CACd,IAAMC,EAASD,aAAiB,MAAQA,EAAM,QAAU,OAAOA,CAAK,EACpE,MAAU,MACR,qCAAqCV,EAAW,6CAA6CM,EAAW,gDACvDK,GACnD,CACF,CACF,CAGA,SAASC,EAAO,EAAgC,CAC9C,GAAIC,EAAG,WAAW,IAAI,EAAG,OACzB,IAAMC,EAAUD,EAAG,QAAQ,GAAG,EAC9B,OAAOC,EAAU,EAAID,EAAKA,EAAG,MAAM,EAAGC,CAAO,CAC/C,CAGA,SAASC,EAAiB,EAAc,EAA4B,CAClE,GAAIC,EAAK,SAAS,OAAO,GAAK,CAACd,EAAuB,SAASH,EAAK,QAAQiB,CAAI,CAAC,EAAG,MAAO,GAC3F,IAAMC,EAAWlB,EAAK,SAASmB,EAAWF,CAAI,EAC9C,OAAOC,IAAa,IAAM,CAACA,EAAS,WAAW,IAAI,GAAK,CAAClB,EAAK,WAAWkB,CAAQ,CACnF,CAcA,SAAgBE,EAAe,EAA0C,CAGvE,IAAMC,EAAOtB,EAAG,aAAaQ,CAAU,EACjCY,EAAYnB,EAAK,KAAKqB,EAAM,KAAW,EACzCZ,EAEJ,MAAO,CACL,KAAM,qBACN,MAAM,UAAU,EAAc,EAAkD,CAC9E,IAAMQ,EAAOJ,EAAOC,CAAE,EACtB,GAAIG,IAAS,IAAA,IAAa,CAACD,EAAiBC,EAAME,CAAS,GAAK,CAACG,EAAK,SAAS,cAAmB,EAChG,OAEF,IAAWlB,EAAUiB,CAAI,EACzB,IAAME,EAAS,MAAMd,EAAO,MAAM,eAAea,EAAM,CACrD,SAAUL,EACV,IAAKI,EACL,OACA,QAAS,GACT,WAAY,GACZ,WAAY,GACZ,WAAY,CAAE,QAAS,CAAC,aAAc,KAAK,CAAE,EAC7C,QAAS,CAAC,CAACZ,EAAO,OAAQ,CAAE,KAAM,KAAY,CAAC,CAAC,CAClD,CAAC,EACD,GAAI,OAAOc,GAAQ,MAAS,SAC5B,MAAO,CAAE,KAAMA,EAAO,KAAM,IAAKA,EAAO,KAAO,IAAK,CACtD,CACF,CACF"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
//#region src/services/unistylesBabel/type.d.ts
|
|
2
|
+
/** The rolldown transform result: the rewritten source and its map. */
|
|
3
|
+
export interface TransformResult {
|
|
4
|
+
readonly code: string;
|
|
5
|
+
readonly map: object | null;
|
|
6
|
+
}
|
|
7
|
+
/** The rolldown plugin shape this service returns, without importing rolldown's types. */
|
|
8
|
+
export interface UnistylesBabelPlugin {
|
|
9
|
+
readonly name: string;
|
|
10
|
+
transform(code: string, id: string): Promise<TransformResult | undefined>;
|
|
11
|
+
}
|
|
12
|
+
//#endregion
|
|
13
|
+
//# sourceMappingURL=type.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type.d.mts","names":[],"sources":["../../../src/services/unistylesBabel/type.ts"],"mappings":";;iBA2BiB;WACN;WACA;;;iBAIM;WACN;EACT,UAAU,cAAc,aAAa,QAAQ"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require("../../_virtual/_rolldown/runtime.cjs");let t=require("node:fs");t=e.__toESM(t,1);let n=require("node:path");n=e.__toESM(n,1);var r=class extends Error{stale;constructor(e){super(`Stale generated files: ${e.join(`, `)}. Run the package's build to regenerate them.`),this.stale=e,this.name=`StaleGeneratedError`}};function i(e,i,a=!1,o=[]){let s=[];for(let[r,o]of i){let i=n.default.join(e,r);(t.default.existsSync(i)?t.default.readFileSync(i,`utf8`):void 0)!==o&&(s.push(r),!a&&(t.default.mkdirSync(n.default.dirname(i),{recursive:!0}),t.default.writeFileSync(i,o)))}for(let r of o){if(i.has(r))continue;let o=n.default.join(e,r);t.default.existsSync(o)&&(s.push(r),a||t.default.rmSync(o))}if(a&&s.length>0)throw new r(s);return{changed:s}}exports.StaleGeneratedError=r,exports.writeGenerated=i;
|
|
2
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["path","fs","require_runtime","node_fs","node_path","StaleGeneratedError","stale","writeGenerated","changed","relative","contents","files","absolute","packageDir","managed","check"],"sources":["../../../src/services/writeGenerated/index.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\n/** What a sync pass did, or would have done. */\nexport interface WriteResult {\n /** Package-relative paths whose contents changed. */\n readonly changed: readonly string[];\n}\n\nexport class StaleGeneratedError extends Error {\n constructor(readonly stale: readonly string[]) {\n super(`Stale generated files: ${stale.join(', ')}. Run the package's build to regenerate them.`);\n this.name = 'StaleGeneratedError';\n }\n}\n\n/**\n * Write-if-changed locally, throw on stale under an explicit `check`.\n *\n * Generated entries are ignored build inputs, so normal and CI builds create\n * them. Explicit check mode remains available to callers that need to compare\n * an existing generated tree without changing it.\n *\n * Writing only on a real change matters for watch mode: an unconditional\n * write would retrigger the watcher that called it.\n */\nexport function writeGenerated(\n packageDir: string,\n files: ReadonlyMap<string, string>,\n check = false,\n managed: readonly string[] = [],\n): WriteResult {\n const changed: string[] = [];\n\n for (const [relative, contents] of files) {\n const absolute = path.join(packageDir, relative);\n const existing = fs.existsSync(absolute) ? fs.readFileSync(absolute, 'utf8') : undefined;\n if (existing === contents) continue;\n changed.push(relative);\n if (check) continue;\n fs.mkdirSync(path.dirname(absolute), { recursive: true });\n fs.writeFileSync(absolute, contents);\n }\n\n for (const relative of managed) {\n if (files.has(relative)) continue;\n const absolute = path.join(packageDir, relative);\n if (!fs.existsSync(absolute)) continue;\n changed.push(relative);\n if (!check) fs.rmSync(absolute);\n }\n\n if (check && changed.length > 0) throw new StaleGeneratedError(changed);\n return { changed };\n}\n"],"mappings":"8IASA,IAAaK,EAAb,cAAyC,KAAM,CACxB,MAArB,YAAY,EAAmC,CAC7C,MAAM,0BAA0BC,EAAM,KAAK,IAAI,EAAE,8CAA8C,EAD5E,KAAA,MAAAA,EAEnB,KAAK,KAAO,qBACd,CACF,EAYA,SAAgBC,EACd,EACA,EACA,EAAQ,GACR,EAA6B,CAAC,EACjB,CACb,IAAMC,EAAoB,CAAC,EAE3B,IAAK,GAAM,CAACC,EAAUC,KAAaC,EAAO,CACxC,IAAMC,EAAWZ,EAAAA,QAAK,KAAKa,EAAYJ,CAAQ,GAC9BR,EAAAA,QAAG,WAAWW,CAAQ,EAAIX,EAAAA,QAAG,aAAaW,EAAU,MAAM,EAAI,IAAA,MAC9DF,IACjBF,EAAQ,KAAKC,CAAQ,EACjB,KACJN,EAAA,QAAG,UAAUH,EAAAA,QAAK,QAAQY,CAAQ,EAAG,CAAE,UAAW,EAAK,CAAC,EACxDT,EAAA,QAAG,cAAcS,EAAUF,CAAQ,GACrC,CAEA,IAAK,IAAMD,KAAYK,EAAS,CAC9B,GAAIH,EAAM,IAAIF,CAAQ,EAAG,SACzB,IAAMG,EAAWZ,EAAAA,QAAK,KAAKa,EAAYJ,CAAQ,EAC1CR,EAAAA,QAAG,WAAWW,CAAQ,IAC3BJ,EAAQ,KAAKC,CAAQ,EAChBM,GAAOZ,EAAA,QAAG,OAAOS,CAAQ,EAChC,CAEA,GAAIG,GAASP,EAAQ,OAAS,EAAG,MAAM,IAAIH,EAAoBG,CAAO,EACtE,MAAO,CAAE,SAAQ,CACnB"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
//#region src/services/writeGenerated/index.d.ts
|
|
2
|
+
/** What a sync pass did, or would have done. */
|
|
3
|
+
export interface WriteResult {
|
|
4
|
+
/** Package-relative paths whose contents changed. */
|
|
5
|
+
readonly changed: readonly string[];
|
|
6
|
+
}
|
|
7
|
+
export declare class StaleGeneratedError extends Error {
|
|
8
|
+
readonly stale: readonly string[];
|
|
9
|
+
constructor(stale: readonly string[]);
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Write-if-changed locally, throw on stale under an explicit `check`.
|
|
13
|
+
*
|
|
14
|
+
* Generated entries are ignored build inputs, so normal and CI builds create
|
|
15
|
+
* them. Explicit check mode remains available to callers that need to compare
|
|
16
|
+
* an existing generated tree without changing it.
|
|
17
|
+
*
|
|
18
|
+
* Writing only on a real change matters for watch mode: an unconditional
|
|
19
|
+
* write would retrigger the watcher that called it.
|
|
20
|
+
*/
|
|
21
|
+
export declare function writeGenerated(packageDir: string, files: ReadonlyMap<string, string>, check?: boolean, managed?: readonly string[]): WriteResult;
|
|
22
|
+
//#endregion
|
|
23
|
+
//# sourceMappingURL=index.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../../../src/services/writeGenerated/index.ts"],"mappings":";;iBAIiB;;WAEN;;qBAGE,4BAA4B;WAClB;EAArB,YAAqB;;;;;;;;;;;;wBAgBP,eACd,oBACA,OAAO,6BACP,iBACA,8BACC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import e from"node:fs";import t from"node:path";var n=class extends Error{stale;constructor(e){super(`Stale generated files: ${e.join(`, `)}. Run the package's build to regenerate them.`),this.stale=e,this.name=`StaleGeneratedError`}};function r(r,i,a=!1,o=[]){let s=[];for(let[n,o]of i){let i=t.join(r,n);(e.existsSync(i)?e.readFileSync(i,`utf8`):void 0)!==o&&(s.push(n),!a&&(e.mkdirSync(t.dirname(i),{recursive:!0}),e.writeFileSync(i,o)))}for(let n of o){if(i.has(n))continue;let o=t.join(r,n);e.existsSync(o)&&(s.push(n),a||e.rmSync(o))}if(a&&s.length>0)throw new n(s);return{changed:s}}export{n as StaleGeneratedError,r as writeGenerated};
|
|
2
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["fs","path","StaleGeneratedError","stale","writeGenerated","changed","relative","contents","files","absolute","packageDir","managed","check"],"sources":["../../../src/services/writeGenerated/index.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\n/** What a sync pass did, or would have done. */\nexport interface WriteResult {\n /** Package-relative paths whose contents changed. */\n readonly changed: readonly string[];\n}\n\nexport class StaleGeneratedError extends Error {\n constructor(readonly stale: readonly string[]) {\n super(`Stale generated files: ${stale.join(', ')}. Run the package's build to regenerate them.`);\n this.name = 'StaleGeneratedError';\n }\n}\n\n/**\n * Write-if-changed locally, throw on stale under an explicit `check`.\n *\n * Generated entries are ignored build inputs, so normal and CI builds create\n * them. Explicit check mode remains available to callers that need to compare\n * an existing generated tree without changing it.\n *\n * Writing only on a real change matters for watch mode: an unconditional\n * write would retrigger the watcher that called it.\n */\nexport function writeGenerated(\n packageDir: string,\n files: ReadonlyMap<string, string>,\n check = false,\n managed: readonly string[] = [],\n): WriteResult {\n const changed: string[] = [];\n\n for (const [relative, contents] of files) {\n const absolute = path.join(packageDir, relative);\n const existing = fs.existsSync(absolute) ? fs.readFileSync(absolute, 'utf8') : undefined;\n if (existing === contents) continue;\n changed.push(relative);\n if (check) continue;\n fs.mkdirSync(path.dirname(absolute), { recursive: true });\n fs.writeFileSync(absolute, contents);\n }\n\n for (const relative of managed) {\n if (files.has(relative)) continue;\n const absolute = path.join(packageDir, relative);\n if (!fs.existsSync(absolute)) continue;\n changed.push(relative);\n if (!check) fs.rmSync(absolute);\n }\n\n if (check && changed.length > 0) throw new StaleGeneratedError(changed);\n return { changed };\n}\n"],"mappings":"gDASA,IAAaE,EAAb,cAAyC,KAAM,CACxB,MAArB,YAAY,EAAmC,CAC7C,MAAM,0BAA0BC,EAAM,KAAK,IAAI,EAAE,8CAA8C,EAD5E,KAAA,MAAAA,EAEnB,KAAK,KAAO,qBACd,CACF,EAYA,SAAgBC,EACd,EACA,EACA,EAAQ,GACR,EAA6B,CAAC,EACjB,CACb,IAAMC,EAAoB,CAAC,EAE3B,IAAK,GAAM,CAACC,EAAUC,KAAaC,EAAO,CACxC,IAAMC,EAAWR,EAAK,KAAKS,EAAYJ,CAAQ,GAC9BN,EAAG,WAAWS,CAAQ,EAAIT,EAAG,aAAaS,EAAU,MAAM,EAAI,IAAA,MAC9DF,IACjBF,EAAQ,KAAKC,CAAQ,EACjB,KACJN,EAAG,UAAUC,EAAK,QAAQQ,CAAQ,EAAG,CAAE,UAAW,EAAK,CAAC,EACxDT,EAAG,cAAcS,EAAUF,CAAQ,GACrC,CAEA,IAAK,IAAMD,KAAYK,EAAS,CAC9B,GAAIH,EAAM,IAAIF,CAAQ,EAAG,SACzB,IAAMG,EAAWR,EAAK,KAAKS,EAAYJ,CAAQ,EAC1CN,EAAG,WAAWS,CAAQ,IAC3BJ,EAAQ,KAAKC,CAAQ,EAChBM,GAAOZ,EAAG,OAAOS,CAAQ,EAChC,CAEA,GAAIG,GAASP,EAAQ,OAAS,EAAG,MAAM,IAAIH,EAAoBG,CAAO,EACtE,MAAO,CAAE,SAAQ,CACnB"}
|
package/dist/tsdown.cjs
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./services/unistylesBabel/index.cjs"),t=require("./services/tsdownPreset/index.cjs");exports.poExtension=t.poExtension,exports.unistylesBabel=e.unistylesBabel;
|
package/dist/tsdown.mjs
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{unistylesBabel as e}from"./services/unistylesBabel/index.mjs";import{poExtension as t}from"./services/tsdownPreset/index.mjs";export{t as poExtension,e as unistylesBabel};
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
//#region src/types/extensionGraph.d.ts
|
|
2
|
+
/** The scopes a contribution can mount at, in nesting order. */
|
|
3
|
+
export type ExtensionScope = 'global' | 'workspace' | 'session';
|
|
4
|
+
/** Which half of the package a contribution belongs to. */
|
|
5
|
+
export type ExtensionSide = 'backend' | 'frontend';
|
|
6
|
+
/**
|
|
7
|
+
* What a scanned file is, beyond which surface it feeds.
|
|
8
|
+
*
|
|
9
|
+
* `root` is the scope's constructor, as Next.js spells a layout: it runs
|
|
10
|
+
* before anything below it, builds whatever that subtree shares, and every
|
|
11
|
+
* routed file under it receives the result as part of its mount context. It is
|
|
12
|
+
* also where a scope's teardown goes, because it is the only file that can see
|
|
13
|
+
* the whole lifetime.
|
|
14
|
+
*/
|
|
15
|
+
export type EntryRole = 'contribution' | 'escape-hatch' | 'root';
|
|
16
|
+
/** One gate folder and the id it names. */
|
|
17
|
+
export interface ExtensionGate {
|
|
18
|
+
readonly kind: string;
|
|
19
|
+
readonly id: string;
|
|
20
|
+
}
|
|
21
|
+
/** One dynamic route segment, as Next.js spells it. */
|
|
22
|
+
export interface RouteParam {
|
|
23
|
+
readonly name: string;
|
|
24
|
+
readonly catchAll: boolean;
|
|
25
|
+
}
|
|
26
|
+
/** One route segment below a routed surface: a literal, or a parameter. */
|
|
27
|
+
export type RouteSegment = {
|
|
28
|
+
readonly literal: string;
|
|
29
|
+
} | {
|
|
30
|
+
readonly param: RouteParam;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* One scanned file and everything its path declares about it.
|
|
34
|
+
*
|
|
35
|
+
* The scan produces these and nothing else. Turning them into host
|
|
36
|
+
* contributions is the generator's job, so this stays a description of the
|
|
37
|
+
* tree rather than of any one host.
|
|
38
|
+
*/
|
|
39
|
+
export interface ExtensionEntry {
|
|
40
|
+
/** Package-relative POSIX path. */
|
|
41
|
+
readonly file: string;
|
|
42
|
+
readonly scope: ExtensionScope;
|
|
43
|
+
readonly side: ExtensionSide;
|
|
44
|
+
/** Gates wrapping this contribution, outermost first. */
|
|
45
|
+
readonly gates: readonly ExtensionGate[];
|
|
46
|
+
/** Surface folder, such as `tool`. Absent for the escape hatch. */
|
|
47
|
+
readonly surface: string | undefined;
|
|
48
|
+
/** Route path below a routed surface. Empty for every other surface. */
|
|
49
|
+
readonly route: readonly RouteSegment[];
|
|
50
|
+
/** Contribution identity, from the filename. */
|
|
51
|
+
readonly name: string;
|
|
52
|
+
/** Relationship target, such as the slot a fill names. */
|
|
53
|
+
readonly target: string | undefined;
|
|
54
|
+
/** Platform this file serves. Undefined only for a file the scan has already reported. */
|
|
55
|
+
readonly platform: string | undefined;
|
|
56
|
+
/** Helper-declared cardinality. Omitted means exactly one contribution. */
|
|
57
|
+
readonly cardinality?: 'optional' | 'many' | 'collection';
|
|
58
|
+
/** Whether this declares a contribution, a scope root, or the escape hatch. */
|
|
59
|
+
readonly role: EntryRole;
|
|
60
|
+
}
|
|
61
|
+
/** Something the scan skipped, and why. Never fatal. */
|
|
62
|
+
export interface ExtensionNotice {
|
|
63
|
+
/** Package-relative POSIX path of the file or folder skipped. */
|
|
64
|
+
readonly path: string;
|
|
65
|
+
readonly message: string;
|
|
66
|
+
}
|
|
67
|
+
/** Everything one package's routing root declares. */
|
|
68
|
+
export interface ExtensionGraph {
|
|
69
|
+
/** Package-relative POSIX path of the routing root that was scanned. */
|
|
70
|
+
readonly root: string;
|
|
71
|
+
readonly entries: readonly ExtensionEntry[];
|
|
72
|
+
readonly notices: readonly ExtensionNotice[];
|
|
73
|
+
}
|
|
74
|
+
//#endregion
|
|
75
|
+
//# sourceMappingURL=extensionGraph.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extensionGraph.d.mts","names":[],"sources":["../../src/types/extensionGraph.ts"],"mappings":";;YACY;;YAGA;;;;;;;;;;YAWA;;iBAGK;WACN;WACA;;;iBAIM;WACN;WACA;;;YAIC;WAA0B;;WAA+B,OAAO;;;;;;;;;iBAS3D;;WAEN;WACA,OAAO;WACP,MAAM;;WAEN,gBAAgB;;WAEhB;;WAEA,gBAAgB;;WAEhB;;WAEA;;WAEA;;WAEA;;WAEA,MAAM;;;iBAIA;;WAEN;WACA;;;iBAIM;;WAEN;WACA,kBAAkB;WAClB,kBAAkB"}
|
package/package.json
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@agimon-ai/po-build",
|
|
3
|
+
"version": "0.0.0-alpha.0",
|
|
4
|
+
"description": "Folder-convention scanner and build presets for Po extensions.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"ai",
|
|
7
|
+
"build",
|
|
8
|
+
"coding-agent",
|
|
9
|
+
"developer-tools",
|
|
10
|
+
"file-based-routing",
|
|
11
|
+
"pi-package",
|
|
12
|
+
"po",
|
|
13
|
+
"tsdown",
|
|
14
|
+
"typescript"
|
|
15
|
+
],
|
|
16
|
+
"homepage": "https://agimon.ai",
|
|
17
|
+
"bugs": {
|
|
18
|
+
"url": "https://github.com/AgiFlow/po/issues"
|
|
19
|
+
},
|
|
20
|
+
"license": "MIT",
|
|
21
|
+
"author": "Vuong Ngo",
|
|
22
|
+
"repository": {
|
|
23
|
+
"type": "git",
|
|
24
|
+
"url": "git+https://github.com/AgiFlow/po.git",
|
|
25
|
+
"directory": "packages/core/po-build"
|
|
26
|
+
},
|
|
27
|
+
"files": [
|
|
28
|
+
"dist"
|
|
29
|
+
],
|
|
30
|
+
"type": "module",
|
|
31
|
+
"main": "./dist/index.cjs",
|
|
32
|
+
"types": "./dist/index.d.mts",
|
|
33
|
+
"jsnext:main": "./dist/index.mjs",
|
|
34
|
+
"exports": {
|
|
35
|
+
".": {
|
|
36
|
+
"types": "./dist/index.d.mts",
|
|
37
|
+
"import": "./dist/index.mjs",
|
|
38
|
+
"require": "./dist/index.cjs"
|
|
39
|
+
},
|
|
40
|
+
"./browserFile": {
|
|
41
|
+
"types": "./dist/browserFile.d.mts",
|
|
42
|
+
"import": "./dist/browserFile.mjs",
|
|
43
|
+
"require": "./dist/browserFile.cjs"
|
|
44
|
+
},
|
|
45
|
+
"./tsdown": {
|
|
46
|
+
"types": "./dist/tsdown.d.mts",
|
|
47
|
+
"import": "./dist/tsdown.mjs",
|
|
48
|
+
"require": "./dist/tsdown.cjs"
|
|
49
|
+
},
|
|
50
|
+
"./package.json": "./package.json"
|
|
51
|
+
},
|
|
52
|
+
"publishConfig": {
|
|
53
|
+
"access": "public"
|
|
54
|
+
},
|
|
55
|
+
"devDependencies": {
|
|
56
|
+
"@types/node": "26.6.4",
|
|
57
|
+
"@vitest/coverage-v8": "5.0.3",
|
|
58
|
+
"tsdown": "0.23.0",
|
|
59
|
+
"typescript": "7.0.2",
|
|
60
|
+
"vitest": "5.0.3"
|
|
61
|
+
},
|
|
62
|
+
"engines": {
|
|
63
|
+
"node": ">=24"
|
|
64
|
+
},
|
|
65
|
+
"scripts": {
|
|
66
|
+
"build": "tsdown",
|
|
67
|
+
"test": "vitest --run",
|
|
68
|
+
"typecheck": "tsc --noEmit",
|
|
69
|
+
"lint": "oxlint . && oxfmt . --check",
|
|
70
|
+
"fixcode": "oxlint . --fix && oxfmt ."
|
|
71
|
+
}
|
|
72
|
+
}
|