deep-proxy #1
@ -1,11 +1,13 @@
 | 
			
		||||
{
 | 
			
		||||
    "imports": {
 | 
			
		||||
        "react": "https://esm.sh/preact@10.18.1/compat",
 | 
			
		||||
        "react/": "https://esm.sh/preact@10.18.1/compat/"
 | 
			
		||||
        "react/": "https://esm.sh/preact@10.18.1/compat/",
 | 
			
		||||
		"preact-render-to-string": "https://esm.sh/preact-render-to-string@6.5.7?deps=preact@10.18.1"
 | 
			
		||||
    },
 | 
			
		||||
	"tasks": {"go": "deno run -A styler.tsx"},
 | 
			
		||||
	"compilerOptions": {
 | 
			
		||||
		"jsx": "react-jsx",
 | 
			
		||||
		"jsxImportSource": "react",
 | 
			
		||||
		"lib": ["deno.window","dom","dom.asynciterable"]
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										21
									
								
								deno.lock
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								deno.lock
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,21 @@
 | 
			
		||||
{
 | 
			
		||||
  "version": "3",
 | 
			
		||||
  "redirects": {
 | 
			
		||||
    "https://esm.sh/v128/@types/react@~18.3/index.d.ts": "https://esm.sh/v128/@types/react@18.2.38/index.d.ts",
 | 
			
		||||
    "https://esm.sh/v135/@types/react-dom@~18.3/server~.d.ts": "https://esm.sh/v135/@types/react-dom@18.3.0/server~.d.ts"
 | 
			
		||||
  },
 | 
			
		||||
  "remote": {
 | 
			
		||||
    "https://esm.sh/preact-render-to-string@6.5.7?deps=preact@10.18.1": "1d9e844b000fd2bf592142f98e6a6c9c3c10953ac90bef90a67ded5e28667279",
 | 
			
		||||
    "https://esm.sh/preact@10.18.1/compat/jsx-runtime": "d9addc942dc9b5eb507c622e7ad93d5594093f5d31e461d4125f7a1ab475f932",
 | 
			
		||||
    "https://esm.sh/react-dom@18.3.1/server": "90e374c5323303d5315c780b19e5d6297ec5a569f9cee1df28ee1030dd23af9c",
 | 
			
		||||
    "https://esm.sh/react@18.3.1": "52480d4c00855e4f76843caa4f2818eb001671523740cbf064cbd108721c29c8",
 | 
			
		||||
    "https://esm.sh/stable/preact@10.18.1/denonext/compat.js": "cb1028add6b66ecea904a750ad9887f21c5a42c17303c4c317710866c290efa7",
 | 
			
		||||
    "https://esm.sh/stable/preact@10.18.1/denonext/compat/jsx-runtime.js": "16e3c12a4942f4f3027f6f3c5a0686ef00a80d70a4fb08097b702f4ddd5d488f",
 | 
			
		||||
    "https://esm.sh/stable/preact@10.18.1/denonext/hooks.js": "cb7e8c9973e6a224348eaa51fba21e13f239839e403f751b29894a258a6d16d0",
 | 
			
		||||
    "https://esm.sh/stable/preact@10.18.1/denonext/jsx-runtime.js": "be3f1ff4c3c03b08ed19d69428e35bf3d90360a8e081a2e60075ddfd38fd86df",
 | 
			
		||||
    "https://esm.sh/stable/preact@10.18.1/denonext/preact.mjs": "b2ad171554b90f2be0f30b1318f63d0df90420b2bdb727fddd97193daa177f84",
 | 
			
		||||
    "https://esm.sh/stable/react@18.3.1/denonext/react.mjs": "fc048ffc55366baf7669519127d186761db72046e2bebf35fe8d0de3964defa3",
 | 
			
		||||
    "https://esm.sh/v135/preact-render-to-string@6.5.7/X-ZC9wcmVhY3RAMTAuMTguMQ/denonext/preact-render-to-string.mjs": "80d81cb9eeee0b973a136113bd8ff22288b5d40d3dae15f91838dbc72356e095",
 | 
			
		||||
    "https://esm.sh/v135/react-dom@18.3.1/denonext/server.js": "b4db56f16b45002b5e9b127a9938ab45b12f39825161dffe875920510c524878"
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										11
									
								
								dump.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								dump.html
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,11 @@
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
  <head>
 | 
			
		||||
    <meta name="viewport" content="width=device-width, initial-s" />
 | 
			
		||||
    <style>.Face-sans_lg{ @media(min-width:1024px){ font-family:sans-serif; }}
 | 
			
		||||
.Pad-large_md{ @media(min-width:767px){ padding:3rem; }}
 | 
			
		||||
.Pad-small_lg{ @media(min-width:1024px){ padding:1rem; }}</style>
 | 
			
		||||
  </head>
 | 
			
		||||
  <body>
 | 
			
		||||
    <div class="Face-sans_lg Pad-large_md Pad-small_lg">hello!</div>
 | 
			
		||||
  </body>
 | 
			
		||||
</html>
 | 
			
		||||
							
								
								
									
										4
									
								
								gale.tsx
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								gale.tsx
									
									
									
									
									
								
							@ -1,6 +1,6 @@
 | 
			
		||||
 | 
			
		||||
const typeface = {
 | 
			
		||||
    sans: "sans serif",
 | 
			
		||||
    sans: "sans-serif",
 | 
			
		||||
    serif: "Times New Roman"
 | 
			
		||||
};
 | 
			
		||||
const sizes = {
 | 
			
		||||
@ -88,7 +88,7 @@ export function config<T>(obj:T)
 | 
			
		||||
            const rules = [];
 | 
			
		||||
            for(const [key, value] of styles.entries())
 | 
			
		||||
            {
 | 
			
		||||
                rules.push(key+value);
 | 
			
		||||
                rules.push("."+key+value);
 | 
			
		||||
            }
 | 
			
		||||
            return rules.join("\n");
 | 
			
		||||
        },
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										28
									
								
								styler.tsx
									
									
									
									
									
								
							
							
						
						
									
										28
									
								
								styler.tsx
									
									
									
									
									
								
							@ -1,8 +1,30 @@
 | 
			
		||||
import Gale from "./gale-custom.tsx";
 | 
			
		||||
import Render from "preact-render-to-string";
 | 
			
		||||
 | 
			
		||||
const classes = Gale.Q.lg( Gale.Face.sans, Gale.Q.md(Gale.Pad.large), Gale.Pad.small );
 | 
			
		||||
 | 
			
		||||
console.log(classes);
 | 
			
		||||
const html = Render(<div className={Gale.Q.lg( Gale.Face.sans, Gale.Q.md(Gale.Pad.large), Gale.Pad.small )}>
 | 
			
		||||
  hello!
 | 
			
		||||
</div>)
 | 
			
		||||
 | 
			
		||||
console.log(Gale.Sheet());
 | 
			
		||||
const css = Gale.Sheet();
 | 
			
		||||
 | 
			
		||||
Deno.writeTextFile(
 | 
			
		||||
"dump.html",
 | 
			
		||||
`<!DOCTYPE html>
 | 
			
		||||
  <head>
 | 
			
		||||
    <meta name="viewport" content="width=device-width, initial-s" />
 | 
			
		||||
    <style>${css}</style>
 | 
			
		||||
  </head>
 | 
			
		||||
  <body>
 | 
			
		||||
    ${html}
 | 
			
		||||
  </body>
 | 
			
		||||
</html>`
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
/* idea:
 | 
			
		||||
Gale.Table(
 | 
			
		||||
      [,        "md"   ], {
 | 
			
		||||
 Face:["serif", "sans" ],
 | 
			
		||||
  Pad:["small", "large"]
 | 
			
		||||
})
 | 
			
		||||
*/
 | 
			
		||||
							
								
								
									
										19
									
								
								type-experiments-01.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								type-experiments-01.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,19 @@
 | 
			
		||||
//////////////////////
 | 
			
		||||
type OriginalType = {
 | 
			
		||||
    key1: { sub1: string; sub2: string };
 | 
			
		||||
    key2: { subA: string; subB: string };
 | 
			
		||||
  };
 | 
			
		||||
  
 | 
			
		||||
  type ValidKeys = keyof OriginalType;
 | 
			
		||||
  type ValidSubKeys<K extends ValidKeys> = keyof OriginalType[K];
 | 
			
		||||
  
 | 
			
		||||
  type EnforcedRecord = {
 | 
			
		||||
    [K in ValidKeys]: ValidSubKeys<K>[];
 | 
			
		||||
  };
 | 
			
		||||
  
 | 
			
		||||
  // Example usage:
 | 
			
		||||
  const example: EnforcedRecord = {
 | 
			
		||||
    key1: ['sub1', 'sub2'],
 | 
			
		||||
    key2: ['subA', 'subB', "sub1"], // last is invalid
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										22
									
								
								type-experiments-02.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								type-experiments-02.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,22 @@
 | 
			
		||||
type OriginalType = {
 | 
			
		||||
  key1: { sub1: string; sub2: string };
 | 
			
		||||
  key2: { subA: string; subB: string };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
type ValidKeys = keyof OriginalType;
 | 
			
		||||
type ValidSubKeys<K extends ValidKeys> = keyof OriginalType[K];
 | 
			
		||||
 | 
			
		||||
type FixedLengthArray<T, L extends number> = [T, ...T[]] & { length: L };
 | 
			
		||||
 | 
			
		||||
type EnforcedRecord<L extends number> = {
 | 
			
		||||
  [K in ValidKeys]: FixedLengthArray<ValidSubKeys<K>, L>;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// Example usage:
 | 
			
		||||
const example: EnforcedRecord<2> = {
 | 
			
		||||
  key1: ['sub1', 'sub2'], // Valid
 | 
			
		||||
  key2: ['subA', 'subB'], // Valid
 | 
			
		||||
  // key1: ['sub1'], // Invalid, TypeScript will give an error
 | 
			
		||||
  // key2: ['subA', 'subB', 'subC'], // Invalid, TypeScript will give an error
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										27
									
								
								type-experiments-03.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								type-experiments-03.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,27 @@
 | 
			
		||||
type OriginalType = {
 | 
			
		||||
  key1: { sub1: string; sub2: string };
 | 
			
		||||
  key2: { subA: string; subB: string };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
type ValidKeys = keyof OriginalType;
 | 
			
		||||
type ValidSubKeys<K extends ValidKeys> = keyof OriginalType[K];
 | 
			
		||||
 | 
			
		||||
type FixedLengthArray<T, L extends number> = [T, ...T[]] & { length: L };
 | 
			
		||||
 | 
			
		||||
type EnforcedRecord<L extends number> = {
 | 
			
		||||
  [K in ValidKeys]: FixedLengthArray<ValidSubKeys<K>, L>;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const createTable = <T extends { length: number }>(
 | 
			
		||||
  cols: T,
 | 
			
		||||
  rows: EnforcedRecord<T['length']>
 | 
			
		||||
) => {
 | 
			
		||||
  return { cols, rows };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Example usage:
 | 
			
		||||
const cols = ["a", "b", "c"] as const;
 | 
			
		||||
const table = createTable(cols, {
 | 
			
		||||
  key1: ['sub1', 'sub2', 'sub1', 'sub1'], // invalid because too long
 | 
			
		||||
  key2: ['subA', 'subB', 'sub1'], // invalid because bad key
 | 
			
		||||
});
 | 
			
		||||
							
								
								
									
										30
									
								
								type-experiments-04.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								type-experiments-04.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,30 @@
 | 
			
		||||
type OriginalType = {
 | 
			
		||||
  key1: { sub1: string; sub2: string };
 | 
			
		||||
  key2: { subA: string; subB: string };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
type ValidKeys = keyof OriginalType;
 | 
			
		||||
type ValidSubKeys<K extends ValidKeys> = keyof OriginalType[K];
 | 
			
		||||
 | 
			
		||||
type FixedLengthArray<T, L extends number> = T[] & { length: L };
 | 
			
		||||
 | 
			
		||||
type EnforcedRecord<L extends number> = {
 | 
			
		||||
  [K in ValidKeys]: FixedLengthArray<ValidSubKeys<K>, L>;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
type FixedArr<Arr, Length extends number> = Arr & { length: Length };
 | 
			
		||||
function Func<L extends number>(arr1:FixedArr<string[], L>)
 | 
			
		||||
{
 | 
			
		||||
  return arr1.length;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
const test = Func<3>(["a", "b", "c"])
 | 
			
		||||
 | 
			
		||||
// Example usage:
 | 
			
		||||
const example: EnforcedRecord<2> = {
 | 
			
		||||
  key1: ['sub1', 'sub2', 'sub1'], // Valid
 | 
			
		||||
  key2: ['subA', 'subB'], // Valid
 | 
			
		||||
  // key1: ['sub1'], // Invalid, TypeScript will give an error
 | 
			
		||||
  // key2: ['subA', 'subB', 'subC'], // Invalid, TypeScript will give an error
 | 
			
		||||
};
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user